pupilfirst/pupilfirst

View on GitHub
app/presenters/users/sessions/new_presenter.rb

Summary

Maintainability
A
30 mins
Test Coverage
C
74%
module Users
  module Sessions
    class NewPresenter < ApplicationPresenter
      def page_title
        "#{I18n.t("presenters.users.sessions_new.page_title.title")} | #{school_name}"
      end

      def props
        {
          school_name: school_name,
          fqdn: view.current_host,
          oauth_host: oauth_host
        }
      end

      def school_name
        @school_name ||= current_school.name
      end

      def oauth_host
        @oauth_host ||= Rails.application.secrets.sso_domain
      end

      def providers
        default_providers = %i[google facebook github]

        if Rails.application.secrets.sso[:discord][:key].present?
          default_providers = default_providers + [:discord]
        end

        if Rails.env.development?
          [:developer] + default_providers
        else
          default_providers
        end
      end

      def button_classes(provider)
        default_classes =
          "flex justify-center items-center px-3 py-2 leading-snug border border-transparent rounded-lg cursor-pointer font-semibold mt-4 w-full "

        default_classes +
          case (provider)
          when :facebook
            "federated-sigin-in__facebook-btn"
          when :github
            "federated-sigin-in__github-btn"
          when :google
            "federated-sigin-in__google-btn"
          when :discord
            "federated-sigin-in__discord-btn"
          when :developer
            "bg-primary-500 hover:bg-primary-400 text-white"
          else
            raise_unexpected_provider(provider)
          end
      end

      def federated_login_url(provider)
        provider_key =
          case (provider)
          when :google
            "google"
          when :facebook
            "facebook"
          when :github
            "github"
          when :discord
            "discord"
          when :developer
            "developer"
          else
            raise_unexpected_provider(provider)
          end

        "//#{oauth_host}/oauth/#{provider_key}?fqdn=#{view.current_host}&session_id=#{encoded_private_session_id}"
      end

      def encoded_private_session_id
        @encoded_private_session_id ||=
          Base64.urlsafe_encode64(session.id.private_id)
      end

      def session
        return view.session if view.session.loaded?

        view.session[:init] = true
        view.session
      end

      def icon_classes(provider)
        case provider
        when :google
          "fab fa-google"
        when :facebook
          "fab fa-facebook-f me-1"
        when :github
          "fab fa-github"
        when :discord
          "fab fa-discord"
        when :developer
          "fas fa-laptop-code"
        else
          raise_unexpected_provider(provider)
        end
      end

      def button_text(provider)
        key =
          case provider
          when :google
            "continue_with_google"
          when :facebook
            "continue_with_facebook"
          when :github
            "continue_with_github"
          when :discord
            "continue_with_discord"
          when :developer
            "continue_as_developer"
          else
            raise_unexpected_provider(provider)
          end

        I18n.t("presenters.users.sessions_new.button_text.#{key}")
      end

      def raise_unexpected_provider(provider)
        raise "Was asked to handle unexpected provider: #{provider}"
      end
    end
  end
end