static contextTypes = {
router: PropTypes.object,
+ identity: PropTypes.object,
};
static propTypes = {
collapsedContent.push(moveButtons);
}
- if (children || (multiColumn && this.props.onPin)) {
+ if (this.context.identity.signedIn && (children || (multiColumn && this.props.onPin))) {
collapseButton = (
<button
className={collapsibleButtonClassName}
export default @injectIntl
class Poll extends ImmutablePureComponent {
+ static contextTypes = {
+ identity: PropTypes.object,
+ };
+
static propTypes = {
poll: ImmutablePropTypes.map,
intl: PropTypes.object.isRequired,
</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>}
static contextTypes = {
router: PropTypes.object,
+ identity: PropTypes.object,
};
static propTypes = {
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');
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>);
}
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>
);
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');
}
}
+ &.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 {
background: lighten($ui-base-color, 8%);
}
}
+
+ &:disabled {
+ color: $dark-text-color;
+ cursor: default;
+ }
}
.column-header__collapsible {
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