@@ -94,15 +94,15 @@ class Header extends ImmutablePureComponent { | |||
let menu = []; | |||
if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) { | |||
info.push(<span className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>); | |||
info.push(<span key='followed_by' className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>); | |||
} else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) { | |||
info.push(<span className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>); | |||
info.push(<span key='blocked' className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>); | |||
} | |||
if (me !== account.get('id') && account.getIn(['relationship', 'muting'])) { | |||
info.push(<span className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>); | |||
info.push(<span key='muted' className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>); | |||
} else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) { | |||
info.push(<span className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>); | |||
info.push(<span key='domain_blocked' className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>); | |||
} | |||
if (me !== account.get('id')) { | |||
@@ -111,7 +111,7 @@ class Header extends ImmutablePureComponent { | |||
} else if (account.getIn(['relationship', 'requested'])) { | |||
actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />; | |||
} else if (!account.getIn(['relationship', 'blocking'])) { | |||
actionBtn = <Button className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />; | |||
actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />; | |||
} else if (account.getIn(['relationship', 'blocking'])) { | |||
actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />; | |||
} | |||
@@ -14,14 +14,17 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; | |||
import { FormattedMessage } from 'react-intl'; | |||
import { fetchAccountIdentityProofs } from '../../actions/identity_proofs'; | |||
const emptyList = ImmutableList(); | |||
const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => { | |||
const path = withReplies ? `${accountId}:with_replies` : accountId; | |||
return { | |||
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], ImmutableList()), | |||
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()), | |||
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList), | |||
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList), | |||
isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']), | |||
hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']), | |||
hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']), | |||
blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false), | |||
}; | |||
}; | |||
@@ -37,6 +40,7 @@ class AccountTimeline extends ImmutablePureComponent { | |||
isLoading: PropTypes.bool, | |||
hasMore: PropTypes.bool, | |||
withReplies: PropTypes.bool, | |||
blockedBy: PropTypes.bool, | |||
}; | |||
componentWillMount () { | |||
@@ -44,9 +48,11 @@ class AccountTimeline extends ImmutablePureComponent { | |||
this.props.dispatch(fetchAccount(accountId)); | |||
this.props.dispatch(fetchAccountIdentityProofs(accountId)); | |||
if (!withReplies) { | |||
this.props.dispatch(expandAccountFeaturedTimeline(accountId)); | |||
} | |||
this.props.dispatch(expandAccountTimeline(accountId, { withReplies })); | |||
} | |||
@@ -54,9 +60,11 @@ class AccountTimeline extends ImmutablePureComponent { | |||
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) { | |||
this.props.dispatch(fetchAccount(nextProps.params.accountId)); | |||
this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId)); | |||
if (!nextProps.withReplies) { | |||
this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId)); | |||
} | |||
this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies })); | |||
} | |||
} | |||
@@ -66,7 +74,7 @@ class AccountTimeline extends ImmutablePureComponent { | |||
} | |||
render () { | |||
const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore } = this.props; | |||
const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy } = this.props; | |||
if (!statusIds && isLoading) { | |||
return ( | |||
@@ -76,6 +84,8 @@ class AccountTimeline extends ImmutablePureComponent { | |||
); | |||
} | |||
const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />; | |||
return ( | |||
<Column> | |||
<ColumnBackButton /> | |||
@@ -84,13 +94,13 @@ class AccountTimeline extends ImmutablePureComponent { | |||
prepend={<HeaderContainer accountId={this.props.params.accountId} />} | |||
alwaysPrepend | |||
scrollKey='account_timeline' | |||
statusIds={statusIds} | |||
statusIds={blockedBy ? emptyList : statusIds} | |||
featuredStatusIds={featuredStatusIds} | |||
isLoading={isLoading} | |||
hasMore={hasMore} | |||
onLoadMore={this.handleLoadMore} | |||
shouldUpdateScroll={shouldUpdateScroll} | |||
emptyMessage={<FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />} | |||
emptyMessage={emptyMessage} | |||
/> | |||
</Column> | |||
); | |||
@@ -20,6 +20,7 @@ import ScrollableList from '../../components/scrollable_list'; | |||
const mapStateToProps = (state, props) => ({ | |||
accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']), | |||
hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']), | |||
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false), | |||
}); | |||
export default @connect(mapStateToProps) | |||
@@ -31,6 +32,7 @@ class Followers extends ImmutablePureComponent { | |||
shouldUpdateScroll: PropTypes.func, | |||
accountIds: ImmutablePropTypes.list, | |||
hasMore: PropTypes.bool, | |||
blockedBy: PropTypes.bool, | |||
}; | |||
componentWillMount () { | |||
@@ -50,7 +52,7 @@ class Followers extends ImmutablePureComponent { | |||
}, 300, { leading: true }); | |||
render () { | |||
const { shouldUpdateScroll, accountIds, hasMore } = this.props; | |||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy } = this.props; | |||
if (!accountIds) { | |||
return ( | |||
@@ -60,7 +62,7 @@ class Followers extends ImmutablePureComponent { | |||
); | |||
} | |||
const emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />; | |||
const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />; | |||
return ( | |||
<Column> | |||
@@ -75,7 +77,7 @@ class Followers extends ImmutablePureComponent { | |||
alwaysPrepend | |||
emptyMessage={emptyMessage} | |||
> | |||
{accountIds.map(id => | |||
{blockedBy ? [] : accountIds.map(id => | |||
<AccountContainer key={id} id={id} withNote={false} /> | |||
)} | |||
</ScrollableList> | |||
@@ -20,6 +20,7 @@ import ScrollableList from '../../components/scrollable_list'; | |||
const mapStateToProps = (state, props) => ({ | |||
accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']), | |||
hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']), | |||
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false), | |||
}); | |||
export default @connect(mapStateToProps) | |||
@@ -31,6 +32,7 @@ class Following extends ImmutablePureComponent { | |||
shouldUpdateScroll: PropTypes.func, | |||
accountIds: ImmutablePropTypes.list, | |||
hasMore: PropTypes.bool, | |||
blockedBy: PropTypes.bool, | |||
}; | |||
componentWillMount () { | |||
@@ -50,7 +52,7 @@ class Following extends ImmutablePureComponent { | |||
}, 300, { leading: true }); | |||
render () { | |||
const { shouldUpdateScroll, accountIds, hasMore } = this.props; | |||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy } = this.props; | |||
if (!accountIds) { | |||
return ( | |||
@@ -60,7 +62,7 @@ class Following extends ImmutablePureComponent { | |||
); | |||
} | |||
const emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />; | |||
const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />; | |||
return ( | |||
<Column> | |||
@@ -75,7 +77,7 @@ class Following extends ImmutablePureComponent { | |||
alwaysPrepend | |||
emptyMessage={emptyMessage} | |||
> | |||
{accountIds.map(id => | |||
{blockedBy ? [] : accountIds.map(id => | |||
<AccountContainer key={id} id={id} withNote={false} /> | |||
)} | |||
</ScrollableList> | |||
@@ -99,9 +99,9 @@ | |||
} | |||
} | |||
&:active, | |||
&:focus, | |||
&:hover { | |||
&:active:not(:disabled), | |||
&:focus:not(:disabled), | |||
&:hover:not(:disabled) { | |||
background: lighten($ui-highlight-color, 10%); | |||
svg path:last-child { | |||