]> cat aescling's git repositories - mastodon.git/commitdiff
Add sign-up button to logged-out web UI (#19250)
authorEugen Rochko <eugen@zeonfederated.com>
Thu, 29 Sep 2022 04:21:51 +0000 (06:21 +0200)
committeraescling <aescling+gitlab@cat.family>
Thu, 17 Nov 2022 03:35:14 +0000 (22:35 -0500)
app/javascript/mastodon/components/column_header.js
app/javascript/mastodon/components/poll.js
app/javascript/mastodon/components/status_content.js
app/javascript/mastodon/features/ui/components/link_footer.js
app/javascript/mastodon/features/ui/components/sign_in_banner.js
app/javascript/mastodon/initial_state.js
app/javascript/styles/mastodon/components.scss
app/serializers/initial_state_serializer.rb

index cbbc490a83b9d7cedaffc477420590b9fd2ba0db..5b2e166276e7c6a91fa216302f8603cffc7d2cf0 100644 (file)
@@ -17,6 +17,7 @@ class ColumnHeader extends React.PureComponent {
 
   static contextTypes = {
     router: PropTypes.object,
+    identity: PropTypes.object,
   };
 
   static propTypes = {
@@ -145,7 +146,7 @@ class ColumnHeader extends React.PureComponent {
       collapsedContent.push(moveButtons);
     }
 
-    if (children || (multiColumn && this.props.onPin)) {
+    if (this.context.identity.signedIn && (children || (multiColumn && this.props.onPin))) {
       collapseButton = (
         <button
           className={collapsibleButtonClassName}
index 85aa28816ca2bcecc2784bc2f3727e0986426ac2..3e643168e6899d8f7769c9d611cbb82a5109e598 100644 (file)
@@ -34,6 +34,10 @@ const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => {
 export default @injectIntl
 class Poll extends ImmutablePureComponent {
 
+  static contextTypes = {
+    identity: PropTypes.object,
+  };
+
   static propTypes = {
     poll: ImmutablePropTypes.map,
     intl: PropTypes.object.isRequired,
@@ -217,7 +221,7 @@ class Poll extends ImmutablePureComponent {
         </ul>
 
         <div className='poll__footer'>
-          {!showResults && <button className='button button-secondary' disabled={disabled} onClick={this.handleVote}><FormattedMessage id='poll.vote' defaultMessage='Vote' /></button>}
+          {!showResults && <button className='button button-secondary' disabled={disabled || !this.context.identity.signedIn} onClick={this.handleVote}><FormattedMessage id='poll.vote' defaultMessage='Vote' /></button>}
           {showResults && !this.props.disabled && <span><button className='poll__link' onClick={this.handleRefresh}><FormattedMessage id='poll.refresh' defaultMessage='Refresh' /></button> · </span>}
           {votesCount}
           {poll.get('expires_at') && <span> · {timeRemaining}</span>}
index 43e938d4e3d77682ced9f4143219a952bf3caee2..a88c5f084169627a2613da235172a49566318340 100644 (file)
@@ -15,6 +15,7 @@ class StatusContent extends React.PureComponent {
 
   static contextTypes = {
     router: PropTypes.object,
+    identity: PropTypes.object,
   };
 
   static propTypes = {
@@ -180,7 +181,7 @@ class StatusContent extends React.PureComponent {
     const hidden = this.props.onExpandedToggle ? !this.props.expanded : this.state.hidden;
     const renderReadMore = this.props.onClick && status.get('collapsed');
     const renderViewThread = this.props.showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id']);
-    const renderTranslate = this.props.onTranslate && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('contentHtml').length > 0 && intl.locale !== status.get('language');
+    const renderTranslate = this.context.identity.signedIn && this.props.onTranslate && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('contentHtml').length > 0 && intl.locale !== status.get('language');
     const language = preloadedLanguages.find(lang => lang[0] === status.get('language'));
     const languageName = language ? language[2] : status.get('language');
 
index 95cd6cf8ea2e134cc668070e9420656622bbfe6a..8817bb6c166e0d8c422602a60539dcb21b0bf8dd 100644 (file)
@@ -56,7 +56,7 @@ class LinkFooter extends React.PureComponent {
       items.push(<a key='invites' href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a>);
     }
 
-    if (withHotkeys) {
+    if (signedIn && withHotkeys) {
       items.push(<Link key='hotkeys' to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link>);
     }
 
index c8403a8adbd37db6f055bdf4c36ff2d87ab2270a..5ff4ee2a868f4bafafffb695ad3d5e1cd5a91449 100644 (file)
@@ -1,10 +1,12 @@
 import React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { registrationsOpen } from 'mastodon/initial_state';
 
 const SignInBanner = () => (
   <div className='sign-in-banner'>
     <p><FormattedMessage id='sign_in_banner.text' defaultMessage='Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.' /></p>
     <a href='/auth/sign_in' className='button button--block'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Sign in' /></a>
+    <a href={registrationsOpen ? '/auth/sign_up' : 'https://joinmastodon.org/servers'} className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /></a>
   </div>
 );
 
index c48f8920260f66a66f7c63a75c14d1f961fd53f4..3587bb32a20b9780209bd432578b37a1aebed91f 100644 (file)
@@ -15,6 +15,7 @@ export const me = getMeta('me');
 export const searchEnabled = getMeta('search_enabled');
 export const maxChars = (initialState && initialState.max_toot_chars) || 500;
 export const limitedFederationMode = getMeta('limited_federation_mode');
+export const registrationsOpen = getMeta('registrations_open');
 export const repository = getMeta('repository');
 export const source_url = getMeta('source_url');
 export const version = getMeta('version');
index dd137f76763861bd0c01fe0f65577c64040f9b4c..a75437b1c2e978265f35b18535a6c812d1a90d3b 100644 (file)
     }
   }
 
+  &.button-tertiary {
+    background: transparent;
+    padding: 6px 17px;
+    color: $highlight-text-color;
+    border: 1px solid $highlight-text-color;
+
+    &:active,
+    &:focus,
+    &:hover {
+      background: $ui-highlight-color;
+      color: $primary-text-color;
+      border: 0;
+      padding: 7px 18px;
+    }
+
+    &:disabled {
+      opacity: 0.5;
+    }
+  }
+
   &.button--block {
     display: block;
     width: 100%;
     color: $darker-text-color;
     margin-bottom: 20px;
   }
+
+  .button {
+    margin-bottom: 10px;
+  }
 }
 
 .emojione {
@@ -3671,6 +3695,11 @@ a.status-card.compact:hover {
       background: lighten($ui-base-color, 8%);
     }
   }
+
+  &:disabled {
+    color: $dark-text-color;
+    cursor: default;
+  }
 }
 
 .column-header__collapsible {
index 763c05880e9d24939e20748aa4256b721846ca3d..45a5cda6f9205838ba513b18e8b365da3deaabd0 100644 (file)
@@ -40,6 +40,7 @@ class InitialStateSerializer < ActiveModel::Serializer
       mascot: instance_presenter.mascot&.file&.url,
       profile_directory: Setting.profile_directory,
       trends: Setting.trends,
+      registrations_open: Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode,
     }
 
     if object.current_account