# 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