From 02549d1b0fc00ea53152cecd8802f19c72c3695f Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 3 Jul 2020 12:50:39 +0200 Subject: [PATCH] Extract all locale-setting logic to a service --- .../spree/user_sessions_controller.rb | 4 +- app/helpers/i18n_helper.rb | 44 +----------- app/services/user_locale_setter.rb | 67 +++++++++++++++++++ 3 files changed, 70 insertions(+), 45 deletions(-) create mode 100644 app/services/user_locale_setter.rb diff --git a/app/controllers/spree/user_sessions_controller.rb b/app/controllers/spree/user_sessions_controller.rb index d48f700581..323fff9172 100644 --- a/app/controllers/spree/user_sessions_controller.rb +++ b/app/controllers/spree/user_sessions_controller.rb @@ -6,7 +6,6 @@ module Spree include Spree::Core::ControllerHelpers::Common include Spree::Core::ControllerHelpers::Order include Spree::Core::ControllerHelpers::SSL - include I18nHelper ssl_required :new, :create, :destroy, :update ssl_allowed :login_bar @@ -54,9 +53,8 @@ module Spree def ensure_valid_locale_persisted # When creating a new user session we have to wait until after a successful # login to be able to persist a locale on the current user - return unless spree_current_user && !available_locale?(spree_current_user.locale) - spree_current_user.update!(locale: I18n.default_locale) + UserLocaleSetter.ensure_valid_locale_persisted(spree_current_user) end end end diff --git a/app/helpers/i18n_helper.rb b/app/helpers/i18n_helper.rb index 83380e07dc..ce128b39f6 100644 --- a/app/helpers/i18n_helper.rb +++ b/app/helpers/i18n_helper.rb @@ -1,49 +1,9 @@ module I18nHelper def set_locale - save_locale_from_params - - # After logging in, check if the user chose a locale before - if current_user_locale.nil? && cookies[:locale] && available_locale?(params[:locale]) - spree_current_user&.update!(locale: params[:locale]) - end - - I18n.locale = valid_current_locale + UserLocaleSetter.new(spree_current_user, params[:locale], cookies).call end def valid_locale(user) - if user.present? && - user.locale.present? && - available_locale?(user.locale) - user.locale - else - I18n.default_locale - end - end - - def available_locale?(locale) - Rails.application.config.i18n.available_locales.include?(locale) - end - - private - - def save_locale_from_params - return unless params[:locale] && available_locale?(params[:locale]) - - spree_current_user&.update!(locale: params[:locale]) - cookies[:locale] = params[:locale] - end - - def current_user_locale - spree_current_user.andand.locale - end - - def valid_current_locale - if available_locale?(current_user_locale) - current_user_locale - elsif available_locale?(cookies[:locale]) - cookies[:locale] - else - I18n.default_locale - end + UserLocaleSetter.valid_locale_for_user(user) end end diff --git a/app/services/user_locale_setter.rb b/app/services/user_locale_setter.rb new file mode 100644 index 0000000000..c3dee48bf7 --- /dev/null +++ b/app/services/user_locale_setter.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +class UserLocaleSetter + def initialize(current_user, params_locale, cookies) + @current_user = current_user + @params_locale = params_locale + @cookies = cookies + end + + def call + save_locale_from_params + + # After logging in, check if the user chose a locale before + if current_user_locale.nil? && cookies[:locale] && available_locale?(params_locale) + current_user&.update!(locale: params_locale) + end + + I18n.locale = valid_current_locale + end + + def self.ensure_valid_locale_persisted(user) + return unless user && !available_locale?(user.locale) + + user.update!(locale: I18n.default_locale) + end + + def self.valid_locale_for_user(user) + if user.present? && user.locale.present? && available_locale?(user.locale) + user.locale + else + I18n.default_locale + end + end + + def self.available_locale?(locale) + Rails.application.config.i18n.available_locales.include?(locale) + end + + private + + attr_reader :current_user, :params_locale, :cookies + + def save_locale_from_params + return unless params_locale && available_locale?(params_locale) + + current_user&.update!(locale: params_locale) + cookies[:locale] = params_locale + end + + def available_locale?(locale) + self.class.available_locale?(locale) + end + + def current_user_locale + current_user.andand.locale + end + + def valid_current_locale + if available_locale?(current_user_locale) + current_user_locale + elsif available_locale?(cookies[:locale]) + cookies[:locale] + else + I18n.default_locale + end + end +end