~cytrogen/masto-fe

120f5802c011fa62eb417d5434c54f33506f6a69 — CSDUMMI 2 years ago a5768d3
Add direct link to the Single-Sign On provider if there is only one sign up method available (#26083)

M .rubocop_todo.yml => .rubocop_todo.yml +1 -1
@@ 135,7 135,7 @@ Lint/UselessAssignment:

# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
  Max: 143
  Max: 146

# Configuration parameters: CountBlocks, Max.
Metrics/BlockNesting:

M app/controllers/concerns/web_app_controller_concern.rb => app/controllers/concerns/web_app_controller_concern.rb +1 -1
@@ 11,7 11,7 @@ module WebAppControllerConcern
  end

  def skip_csrf_meta_tags?
    current_user.nil?
    !(ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1) && current_user.nil?
  end

  def set_app_body_class

M app/javascript/mastodon/features/interaction_modal/index.jsx => app/javascript/mastodon/features/interaction_modal/index.jsx +35 -10
@@ 13,7 13,7 @@ import { openModal, closeModal } from 'mastodon/actions/modal';
import api from 'mastodon/api';
import Button from 'mastodon/components/button';
import { Icon }  from 'mastodon/components/icon';
import { registrationsOpen } from 'mastodon/initial_state';
import { registrationsOpen, sso_redirect } from 'mastodon/initial_state';

const messages = defineMessages({
  loginPrompt: { id: 'interaction_modal.login.prompt', defaultMessage: 'Domain of your home server, e.g. mastodon.social' },


@@ 331,18 331,36 @@ class InteractionModal extends React.PureComponent {
    }

    let signupButton;
    let signUpOrSignInButton;

    if (registrationsOpen) {
      signupButton = (
        <a href='/auth/sign_up' className='link-button'>
          <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
    if (sso_redirect) {
      signUpOrSignInButton = (
        <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'>
          <FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' />
        </a>
      );
      )
    } else {
      signupButton = (
        <button className='link-button' onClick={this.handleSignupClick}>
          <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
        </button>
      if(registrationsOpen) {
        signupButton = (
          <a href='/auth/sign_up' className='link-button'>
            <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
          </a>
        );
      } else {
        signupButton = (
          <button className='button button--block button-tertiary' onClick={this.handleSignupClick}>
            <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
          </button>
        );
      }

      signUpOrSignInButton = (
        <>
          <a href='/auth/sign_in' className='button button--block'>
            <FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' />
          </a>
          {signupButton}
        </>
      );
    }



@@ 353,6 371,13 @@ class InteractionModal extends React.PureComponent {
          <p>{actionDescription} <strong><FormattedMessage id='interaction_modal.sign_in' defaultMessage='You are not logged in to this server. Where is your account hosted?' /></strong></p>
        </div>

        <div className='interaction-modal__choices'>
          <div className='interaction-modal__choices__choice'>
            <h3><FormattedMessage id='interaction_modal.on_this_server' defaultMessage='On this server' /></h3>
            {signUpOrSignInButton}
          </div>
        </div>

        <IntlLoginForm resourceUrl={url} />

        <p className='hint'><FormattedMessage id='interaction_modal.sign_in_hint' defaultMessage="Tip: That's the website where you signed up. If you don't remember, look for the welcome e-mail in your inbox. You can also enter your full username! (e.g. @Mastodon@mastodon.social)" /></p>

M app/javascript/mastodon/features/ui/components/header.jsx => app/javascript/mastodon/features/ui/components/header.jsx +26 -19
@@ 12,7 12,7 @@ import { fetchServer } from 'mastodon/actions/server';
import { Avatar } from 'mastodon/components/avatar';
import { Icon } from 'mastodon/components/icon';
import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo';
import { registrationsOpen, me } from 'mastodon/initial_state';
import { registrationsOpen, me, sso_redirect } from 'mastodon/initial_state';

const Account = connect(state => ({
  account: state.getIn(['accounts', me]),


@@ 73,28 73,35 @@ class Header extends PureComponent {
        </>
      );
    } else {
      let signupButton;

      if (registrationsOpen) {
        signupButton = (
          <a href={signupUrl} className='button'>
            <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
          </a>
        );
      if (sso_redirect) {
        content = (
            <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
        )
      } else {
        signupButton = (
          <button className='button' onClick={openClosedRegistrationsModal}>
            <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
          </button>
        let signupButton;

        if (registrationsOpen) {
          signupButton = (
            <a href={signupUrl} className='button'>
              <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
            </a>
          );
        } else {
          signupButton = (
            <button className='button' onClick={openClosedRegistrationsModal}>
              <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
            </button>
          );
        }

        content = (
          <>
            {signupButton}
            <a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a>
          </>
        );
      }

      content = (
        <>
          {signupButton}
          <a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a>
        </>
      );
    }

    return (

M app/javascript/mastodon/features/ui/components/sign_in_banner.jsx => app/javascript/mastodon/features/ui/components/sign_in_banner.jsx +11 -2
@@ 4,7 4,7 @@ import { FormattedMessage } from 'react-intl';


import { openModal } from 'mastodon/actions/modal';
import { registrationsOpen } from 'mastodon/initial_state';
import { registrationsOpen, sso_redirect } from 'mastodon/initial_state';
import { useAppDispatch, useAppSelector } from 'mastodon/store';

const SignInBanner = () => {


@@ 17,7 17,16 @@ const SignInBanner = () => {

  let signupButton;

  const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up');
      const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up');

      if (sso_redirect) {
    return (
      <div className='sign-in-banner'>
        <p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p>
        <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
      </div>
    )
  }

  if (registrationsOpen) {
    signupButton = (

M app/javascript/mastodon/initial_state.js => app/javascript/mastodon/initial_state.js +2 -0
@@ 80,6 80,7 @@
 * @property {boolean} use_blurhash
 * @property {boolean=} use_pending_items
 * @property {string} version
 * @property {string} sso_redirect
 */

/**


@@ 141,5 142,6 @@ export const version = getMeta('version');
export const languages = initialState?.languages;
// @ts-expect-error
export const statusPageUrl = getMeta('status_page_url');
export const sso_redirect = getMeta('sso_redirect');

export default initialState;

M app/javascript/mastodon/locales/en.json => app/javascript/mastodon/locales/en.json +1 -0
@@ 598,6 598,7 @@
  "server_banner.server_stats": "Server stats:",
  "sign_in_banner.create_account": "Create account",
  "sign_in_banner.sign_in": "Login",
  "sign_in_banner.sso_redirect": "Login or Register",
  "sign_in_banner.text": "Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.",
  "status.admin_account": "Open moderation interface for @{name}",
  "status.admin_domain": "Open moderation interface for {domain}",

M app/serializers/initial_state_serializer.rb => app/serializers/initial_state_serializer.rb +5 -0
@@ 32,6 32,7 @@ class InitialStateSerializer < ActiveModel::Serializer
      single_user_mode: Rails.configuration.x.single_user_mode,
      trends_as_landing_page: Setting.trends_as_landing_page,
      status_page_url: Setting.status_page_url,
      sso_redirect: sso_redirect,
    }

    if object.current_account


@@ 108,4 109,8 @@ class InitialStateSerializer < ActiveModel::Serializer
  def instance_presenter
    @instance_presenter ||= InstancePresenter.new
  end

  def sso_redirect
    "/auth/auth/#{Devise.omniauth_providers[0]}" if ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1
  end
end