54 lines
1.7 KiB
Ruby
54 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module NavBarProfileConcern
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
# Override this method on controller basis for more precise context or custom logic
|
|
def nav_bar_profile
|
|
end
|
|
|
|
def fallback_nav_bar_profile
|
|
return :guest if current_user.blank?
|
|
|
|
nav_bar_profile_from_referrer || default_nav_bar_profile_for_user
|
|
end
|
|
|
|
private
|
|
|
|
def nav_bar_user_or_guest
|
|
# when instanciating manually the controller (see below),
|
|
# we don't have request and current_user would fail
|
|
request && current_user ? :user : :guest
|
|
end
|
|
|
|
# Shared controllers (search, errors, release notes…) don't have specific context
|
|
# Simple attempt to try to re-use the profile from the previous page
|
|
# so user does'not feel lost.
|
|
def nav_bar_profile_from_referrer
|
|
# detect context from referer, simple (no detection when refreshing the page)
|
|
params = Rails.application.routes.recognize_path(request&.referer)
|
|
|
|
controller_class = "#{params[:controller].camelize}Controller".safe_constantize
|
|
return if controller_class.nil?
|
|
|
|
controller_instance = controller_class.new
|
|
controller_instance.try(:nav_bar_profile)
|
|
rescue StandardError => e # we don't want broken logic in nav bar profile to fail the request
|
|
Sentry.capture_exception(e)
|
|
|
|
nil
|
|
end
|
|
|
|
# Fallback for shared controllers from user account
|
|
# to the more relevant profile.
|
|
def default_nav_bar_profile_for_user
|
|
return :gestionnaire if current_user.gestionnaire?
|
|
return :administrateur if current_user.administrateur?
|
|
return :instructeur if current_user.instructeur?
|
|
return :expert if current_user.expert?
|
|
|
|
:user
|
|
end
|
|
end
|
|
end
|