[Glitch] Change routing paths to use usernames in web UI
Port 52e5c07948
to glitch-soc
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
parent
3622110778
commit
a7f6524c6b
|
@ -5,6 +5,10 @@ export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
|
||||||
export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
|
export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
|
||||||
export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL';
|
export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_LOOKUP_REQUEST = 'ACCOUNT_LOOKUP_REQUEST';
|
||||||
|
export const ACCOUNT_LOOKUP_SUCCESS = 'ACCOUNT_LOOKUP_SUCCESS';
|
||||||
|
export const ACCOUNT_LOOKUP_FAIL = 'ACCOUNT_LOOKUP_FAIL';
|
||||||
|
|
||||||
export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
|
export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
|
||||||
export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
|
export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
|
||||||
export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL';
|
export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL';
|
||||||
|
@ -104,6 +108,34 @@ export function fetchAccount(id) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const lookupAccount = acct => (dispatch, getState) => {
|
||||||
|
dispatch(lookupAccountRequest(acct));
|
||||||
|
|
||||||
|
api(getState).get('/api/v1/accounts/lookup', { params: { acct } }).then(response => {
|
||||||
|
dispatch(fetchRelationships([response.data.id]));
|
||||||
|
dispatch(importFetchedAccount(response.data));
|
||||||
|
dispatch(lookupAccountSuccess());
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(lookupAccountFail(acct, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const lookupAccountRequest = (acct) => ({
|
||||||
|
type: ACCOUNT_LOOKUP_REQUEST,
|
||||||
|
acct,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const lookupAccountSuccess = () => ({
|
||||||
|
type: ACCOUNT_LOOKUP_SUCCESS,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const lookupAccountFail = (acct, error) => ({
|
||||||
|
type: ACCOUNT_LOOKUP_FAIL,
|
||||||
|
acct,
|
||||||
|
error,
|
||||||
|
skipAlert: true,
|
||||||
|
});
|
||||||
|
|
||||||
export function fetchAccountRequest(id) {
|
export function fetchAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_FETCH_REQUEST,
|
type: ACCOUNT_FETCH_REQUEST,
|
||||||
|
|
|
@ -83,7 +83,7 @@ const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1);
|
||||||
|
|
||||||
export const ensureComposeIsVisible = (getState, routerHistory) => {
|
export const ensureComposeIsVisible = (getState, routerHistory) => {
|
||||||
if (!getState().getIn(['compose', 'mounted']) && window.innerWidth < COMPOSE_PANEL_BREAKPOINT) {
|
if (!getState().getIn(['compose', 'mounted']) && window.innerWidth < COMPOSE_PANEL_BREAKPOINT) {
|
||||||
routerHistory.push('/statuses/new');
|
routerHistory.push('/publish');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -176,7 +176,8 @@ export function submitCompose(routerHistory) {
|
||||||
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
|
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
|
||||||
},
|
},
|
||||||
}).then(function (response) {
|
}).then(function (response) {
|
||||||
if (routerHistory && routerHistory.location.pathname === '/statuses/new'
|
if (routerHistory
|
||||||
|
&& routerHistory.location.pathname === '/publish'
|
||||||
&& window.history.state
|
&& window.history.state
|
||||||
&& !getState().getIn(['compose', 'advanced_options', 'threaded_mode'])) {
|
&& !getState().getIn(['compose', 'advanced_options', 'threaded_mode'])) {
|
||||||
routerHistory.goBack();
|
routerHistory.goBack();
|
||||||
|
|
|
@ -128,7 +128,7 @@ class Account extends ImmutablePureComponent {
|
||||||
<Permalink
|
<Permalink
|
||||||
className='account small'
|
className='account small'
|
||||||
href={account.get('url')}
|
href={account.get('url')}
|
||||||
to={`/accounts/${account.get('id')}`}
|
to={`/@${account.get('acct')}`}
|
||||||
>
|
>
|
||||||
<div className='account__avatar-wrapper'>
|
<div className='account__avatar-wrapper'>
|
||||||
<Avatar
|
<Avatar
|
||||||
|
@ -144,7 +144,7 @@ class Account extends ImmutablePureComponent {
|
||||||
) : (
|
) : (
|
||||||
<div className='account'>
|
<div className='account'>
|
||||||
<div className='account__wrapper'>
|
<div className='account__wrapper'>
|
||||||
<Permalink key={account.get('id')} className='account__display-name' href={account.get('url')} to={`/accounts/${account.get('id')}`}>
|
<Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/@${account.get('acct')}`}>
|
||||||
<div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>
|
<div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>
|
||||||
{mute_expires_at}
|
{mute_expires_at}
|
||||||
<DisplayName account={account} />
|
<DisplayName account={account} />
|
||||||
|
|
|
@ -82,7 +82,7 @@ export default class AvatarComposite extends React.PureComponent {
|
||||||
<a
|
<a
|
||||||
href={account.get('url')}
|
href={account.get('url')}
|
||||||
target='_blank'
|
target='_blank'
|
||||||
onClick={(e) => this.props.onAccountClick(account.get('id'), e)}
|
onClick={(e) => this.props.onAccountClick(account.get('acct'), e)}
|
||||||
title={`@${account.get('acct')}`}
|
title={`@${account.get('acct')}`}
|
||||||
key={account.get('id')}
|
key={account.get('id')}
|
||||||
>
|
>
|
||||||
|
|
|
@ -61,7 +61,7 @@ export default class DisplayName extends React.PureComponent {
|
||||||
<a
|
<a
|
||||||
href={a.get('url')}
|
href={a.get('url')}
|
||||||
target='_blank'
|
target='_blank'
|
||||||
onClick={(e) => onAccountClick(a.get('id'), e)}
|
onClick={(e) => onAccountClick(a.get('acct'), e)}
|
||||||
title={`@${a.get('acct')}`}
|
title={`@${a.get('acct')}`}
|
||||||
rel='noopener noreferrer'
|
rel='noopener noreferrer'
|
||||||
>
|
>
|
||||||
|
@ -76,7 +76,7 @@ export default class DisplayName extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
suffix = (
|
suffix = (
|
||||||
<a href={account.get('url')} target='_blank' onClick={(e) => onAccountClick(account.get('id'), e)} rel='noopener noreferrer'>
|
<a href={account.get('url')} target='_blank' onClick={(e) => onAccountClick(account.get('acct'), e)} rel='noopener noreferrer'>
|
||||||
<span className='display-name__account'>@{acct}</span>
|
<span className='display-name__account'>@{acct}</span>
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
|
|
|
@ -52,7 +52,7 @@ const Hashtag = ({ hashtag }) => (
|
||||||
<div className='trends__item__name'>
|
<div className='trends__item__name'>
|
||||||
<Permalink
|
<Permalink
|
||||||
href={hashtag.get('url')}
|
href={hashtag.get('url')}
|
||||||
to={`/timelines/tag/${hashtag.get('name')}`}
|
to={`/tags/${hashtag.get('name')}`}
|
||||||
>
|
>
|
||||||
#<span>{hashtag.get('name')}</span>
|
#<span>{hashtag.get('name')}</span>
|
||||||
</Permalink>
|
</Permalink>
|
||||||
|
|
|
@ -346,7 +346,9 @@ class Status extends ImmutablePureComponent {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (destination === undefined) {
|
if (destination === undefined) {
|
||||||
destination = `/statuses/${
|
destination = `/@${
|
||||||
|
status.getIn(['reblog', 'account', 'acct'], status.getIn(['account', 'acct']))
|
||||||
|
}/${
|
||||||
status.getIn(['reblog', 'id'], status.get('id'))
|
status.getIn(['reblog', 'id'], status.get('id'))
|
||||||
}`;
|
}`;
|
||||||
}
|
}
|
||||||
|
@ -362,16 +364,6 @@ class Status extends ImmutablePureComponent {
|
||||||
this.setState({ showMedia: !this.state.showMedia });
|
this.setState({ showMedia: !this.state.showMedia });
|
||||||
}
|
}
|
||||||
|
|
||||||
handleAccountClick = (e) => {
|
|
||||||
if (this.context.router && e.button === 0) {
|
|
||||||
const id = e.currentTarget.getAttribute('data-id');
|
|
||||||
e.preventDefault();
|
|
||||||
let state = {...this.context.router.history.location.state};
|
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
|
||||||
this.context.router.history.push(`/accounts/${id}`, state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleExpandedToggle = () => {
|
handleExpandedToggle = () => {
|
||||||
if (this.props.status.get('spoiler_text')) {
|
if (this.props.status.get('spoiler_text')) {
|
||||||
this.setExpansion(!this.state.isExpanded);
|
this.setExpansion(!this.state.isExpanded);
|
||||||
|
@ -433,13 +425,13 @@ class Status extends ImmutablePureComponent {
|
||||||
handleHotkeyOpen = () => {
|
handleHotkeyOpen = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/statuses/${this.props.status.get('id')}`, state);
|
this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyOpenProfile = () => {
|
handleHotkeyOpenProfile = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyMoveUp = e => {
|
handleHotkeyMoveUp = e => {
|
||||||
|
|
|
@ -148,10 +148,10 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
handleOpen = () => {
|
handleOpen = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
if (state.mastodonModalKey) {
|
if (state.mastodonModalKey) {
|
||||||
this.context.router.history.replace(`/statuses/${this.props.status.get('id')}`, { mastodonBackSteps: (state.mastodonBackSteps || 0) + 1 });
|
this.context.router.history.replace(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, { mastodonBackSteps: (state.mastodonBackSteps || 0) + 1 });
|
||||||
} else {
|
} else {
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/statuses/${this.props.status.get('id')}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,7 @@ export default class StatusContent extends React.PureComponent {
|
||||||
|
|
||||||
onMentionClick = (mention, e) => {
|
onMentionClick = (mention, e) => {
|
||||||
if (this.props.parseClick) {
|
if (this.props.parseClick) {
|
||||||
this.props.parseClick(e, `/accounts/${mention.get('id')}`);
|
this.props.parseClick(e, `/@${mention.get('acct')}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ export default class StatusContent extends React.PureComponent {
|
||||||
hashtag = hashtag.replace(/^#/, '');
|
hashtag = hashtag.replace(/^#/, '');
|
||||||
|
|
||||||
if (this.props.parseClick) {
|
if (this.props.parseClick) {
|
||||||
this.props.parseClick(e, `/timelines/tag/${hashtag}`);
|
this.props.parseClick(e, `/tags/${hashtag}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +277,7 @@ export default class StatusContent extends React.PureComponent {
|
||||||
|
|
||||||
const mentionLinks = status.get('mentions').map(item => (
|
const mentionLinks = status.get('mentions').map(item => (
|
||||||
<Permalink
|
<Permalink
|
||||||
to={`/accounts/${item.get('id')}`}
|
to={`/@${item.get('acct')}`}
|
||||||
href={item.get('url')}
|
href={item.get('url')}
|
||||||
key={item.get('id')}
|
key={item.get('id')}
|
||||||
className='mention'
|
className='mention'
|
||||||
|
|
|
@ -19,14 +19,14 @@ export default class StatusHeader extends React.PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Handles clicks on account name/image
|
// Handles clicks on account name/image
|
||||||
handleClick = (id, e) => {
|
handleClick = (acct, e) => {
|
||||||
const { parseClick } = this.props;
|
const { parseClick } = this.props;
|
||||||
parseClick(e, `/accounts/${id}`);
|
parseClick(e, `/@${acct}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleAccountClick = (e) => {
|
handleAccountClick = (e) => {
|
||||||
const { status } = this.props;
|
const { status } = this.props;
|
||||||
this.handleClick(status.getIn(['account', 'id']), e);
|
this.handleClick(status.getIn(['account', 'acct']), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rendering.
|
// Rendering.
|
||||||
|
|
|
@ -17,7 +17,7 @@ export default class StatusPrepend extends React.PureComponent {
|
||||||
|
|
||||||
handleClick = (e) => {
|
handleClick = (e) => {
|
||||||
const { account, parseClick } = this.props;
|
const { account, parseClick } = this.props;
|
||||||
parseClick(e, `/accounts/${account.get('id')}`);
|
parseClick(e, `/${account.get('acct')}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
Message = () => {
|
Message = () => {
|
||||||
|
|
|
@ -23,14 +23,38 @@ store.dispatch(hydrateAction);
|
||||||
// load custom emojis
|
// load custom emojis
|
||||||
store.dispatch(fetchCustomEmojis());
|
store.dispatch(fetchCustomEmojis());
|
||||||
|
|
||||||
|
const createIdentityContext = state => ({
|
||||||
|
signedIn: !!state.meta.me,
|
||||||
|
accountId: state.meta.me,
|
||||||
|
accessToken: state.meta.access_token,
|
||||||
|
});
|
||||||
|
|
||||||
export default class Mastodon extends React.PureComponent {
|
export default class Mastodon extends React.PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
locale: PropTypes.string.isRequired,
|
locale: PropTypes.string.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static childContextTypes = {
|
||||||
|
identity: PropTypes.shape({
|
||||||
|
signedIn: PropTypes.bool.isRequired,
|
||||||
|
accountId: PropTypes.string,
|
||||||
|
accessToken: PropTypes.string,
|
||||||
|
}).isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
identity = createIdentityContext(initialState);
|
||||||
|
|
||||||
|
getChildContext() {
|
||||||
|
return {
|
||||||
|
identity: this.identity,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.disconnect = store.dispatch(connectUserStream());
|
if (this.identity.signedIn) {
|
||||||
|
this.disconnect = store.dispatch(connectUserStream());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
|
|
|
@ -62,17 +62,17 @@ class ActionBar extends React.PureComponent {
|
||||||
|
|
||||||
<div className='account__action-bar'>
|
<div className='account__action-bar'>
|
||||||
<div className='account__action-bar-links'>
|
<div className='account__action-bar-links'>
|
||||||
<NavLink isActive={this.isStatusesPageActive} activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
|
<NavLink isActive={this.isStatusesPageActive} activeClassName='active' className='account__action-bar__tab' to={`/@${account.get('acct')}`}>
|
||||||
<FormattedMessage id='account.posts' defaultMessage='Posts' />
|
<FormattedMessage id='account.posts' defaultMessage='Posts' />
|
||||||
<strong><FormattedNumber value={account.get('statuses_count')} /></strong>
|
<strong><FormattedNumber value={account.get('statuses_count')} /></strong>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
|
|
||||||
<NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}>
|
<NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/@${account.get('acct')}/following`}>
|
||||||
<FormattedMessage id='account.follows' defaultMessage='Follows' />
|
<FormattedMessage id='account.follows' defaultMessage='Follows' />
|
||||||
<strong><FormattedNumber value={account.get('following_count')} /></strong>
|
<strong><FormattedNumber value={account.get('following_count')} /></strong>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
|
|
||||||
<NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}>
|
<NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/@${account.get('acct')}/followers`}>
|
||||||
<FormattedMessage id='account.followers' defaultMessage='Followers' />
|
<FormattedMessage id='account.followers' defaultMessage='Followers' />
|
||||||
<strong>{ account.get('followers_count') < 0 ? '-' : <FormattedNumber value={account.get('followers_count')} /> }</strong>
|
<strong>{ account.get('followers_count') < 0 ? '-' : <FormattedNumber value={account.get('followers_count')} /> }</strong>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
|
|
|
@ -16,13 +16,24 @@ import LoadMore from 'flavours/glitch/components/load_more';
|
||||||
import MissingIndicator from 'flavours/glitch/components/missing_indicator';
|
import MissingIndicator from 'flavours/glitch/components/missing_indicator';
|
||||||
import { openModal } from 'flavours/glitch/actions/modal';
|
import { openModal } from 'flavours/glitch/actions/modal';
|
||||||
|
|
||||||
const mapStateToProps = (state, props) => ({
|
const mapStateToProps = (state, { params: { acct } }) => {
|
||||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
const accountId = state.getIn(['accounts_map', acct]);
|
||||||
attachments: getAccountGallery(state, props.params.accountId),
|
|
||||||
isLoading: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'isLoading']),
|
if (!accountId) {
|
||||||
hasMore: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'hasMore']),
|
return {
|
||||||
suspended: state.getIn(['accounts', props.params.accountId, 'suspended'], false),
|
isLoading: true,
|
||||||
});
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
accountId,
|
||||||
|
isAccount: !!state.getIn(['accounts', accountId]),
|
||||||
|
attachments: getAccountGallery(state, accountId),
|
||||||
|
isLoading: state.getIn(['timelines', `account:${accountId}:media`, 'isLoading']),
|
||||||
|
hasMore: state.getIn(['timelines', `account:${accountId}:media`, 'hasMore']),
|
||||||
|
suspended: state.getIn(['accounts', accountId, 'suspended'], false),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class LoadMoreMedia extends ImmutablePureComponent {
|
class LoadMoreMedia extends ImmutablePureComponent {
|
||||||
|
|
||||||
|
@ -50,7 +61,10 @@ export default @connect(mapStateToProps)
|
||||||
class AccountGallery extends ImmutablePureComponent {
|
class AccountGallery extends ImmutablePureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
params: PropTypes.object.isRequired,
|
params: PropTypes.shape({
|
||||||
|
acct: PropTypes.string.isRequired,
|
||||||
|
}).isRequired,
|
||||||
|
accountId: PropTypes.string,
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
attachments: ImmutablePropTypes.list.isRequired,
|
attachments: ImmutablePropTypes.list.isRequired,
|
||||||
isLoading: PropTypes.bool,
|
isLoading: PropTypes.bool,
|
||||||
|
@ -64,15 +78,29 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
width: 323,
|
width: 323,
|
||||||
};
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
_load () {
|
||||||
this.props.dispatch(fetchAccount(this.props.params.accountId));
|
const { accountId, dispatch } = this.props;
|
||||||
this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));
|
|
||||||
|
dispatch(expandAccountMediaTimeline(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentDidMount () {
|
||||||
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
this.props.dispatch(fetchAccount(nextProps.params.accountId));
|
|
||||||
this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));
|
if (accountId) {
|
||||||
|
this._load();
|
||||||
|
} else {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate (prevProps) {
|
||||||
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
|
|
||||||
|
if (prevProps.accountId !== accountId && accountId) {
|
||||||
|
this._load();
|
||||||
|
} else if (prevProps.params.acct !== acct) {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +124,7 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleLoadMore = maxId => {
|
handleLoadMore = maxId => {
|
||||||
this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId, { maxId }));
|
this.props.dispatch(expandAccountMediaTimeline(this.props.accountId, { maxId }));
|
||||||
};
|
};
|
||||||
|
|
||||||
handleLoadOlder = e => {
|
handleLoadOlder = e => {
|
||||||
|
@ -162,7 +190,7 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
|
|
||||||
<ScrollContainer scrollKey='account_gallery'>
|
<ScrollContainer scrollKey='account_gallery'>
|
||||||
<div className='scrollable scrollable--flex' onScroll={this.handleScroll}>
|
<div className='scrollable scrollable--flex' onScroll={this.handleScroll}>
|
||||||
<HeaderContainer accountId={this.props.params.accountId} />
|
<HeaderContainer accountId={this.props.accountId} />
|
||||||
|
|
||||||
{suspended ? (
|
{suspended ? (
|
||||||
<div className='empty-column-indicator'>
|
<div className='empty-column-indicator'>
|
||||||
|
|
|
@ -128,9 +128,9 @@ export default class Header extends ImmutablePureComponent {
|
||||||
|
|
||||||
{!hideTabs && (
|
{!hideTabs && (
|
||||||
<div className='account__section-headline'>
|
<div className='account__section-headline'>
|
||||||
<NavLink exact to={`/accounts/${account.get('id')}`}><FormattedMessage id='account.posts' defaultMessage='Toots' /></NavLink>
|
<NavLink exact to={`/@${account.get('acct')}`}><FormattedMessage id='account.posts' defaultMessage='Toots' /></NavLink>
|
||||||
<NavLink exact to={`/accounts/${account.get('id')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Toots with replies' /></NavLink>
|
<NavLink exact to={`/@${account.get('acct')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Toots with replies' /></NavLink>
|
||||||
<NavLink exact to={`/accounts/${account.get('id')}/media`}><FormattedMessage id='account.media' defaultMessage='Media' /></NavLink>
|
<NavLink exact to={`/@${account.get('acct')}/media`}><FormattedMessage id='account.media' defaultMessage='Media' /></NavLink>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -23,7 +23,7 @@ export default class MovedNote extends ImmutablePureComponent {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/accounts/${this.props.to.get('id')}`, state);
|
this.context.router.history.push(`/@${this.props.to.get('acct')}`, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { fetchAccount } from 'flavours/glitch/actions/accounts';
|
import { lookupAccount, fetchAccount } from 'flavours/glitch/actions/accounts';
|
||||||
import { expandAccountFeaturedTimeline, expandAccountTimeline } from 'flavours/glitch/actions/timelines';
|
import { expandAccountFeaturedTimeline, expandAccountTimeline } from 'flavours/glitch/actions/timelines';
|
||||||
import StatusList from '../../components/status_list';
|
import StatusList from '../../components/status_list';
|
||||||
import LoadingIndicator from '../../components/loading_indicator';
|
import LoadingIndicator from '../../components/loading_indicator';
|
||||||
|
@ -19,10 +19,19 @@ import TimelineHint from 'flavours/glitch/components/timeline_hint';
|
||||||
|
|
||||||
const emptyList = ImmutableList();
|
const emptyList = ImmutableList();
|
||||||
|
|
||||||
const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
|
const mapStateToProps = (state, { params: { acct }, withReplies = false }) => {
|
||||||
|
const accountId = state.getIn(['accounts_map', acct]);
|
||||||
|
|
||||||
|
if (!accountId) {
|
||||||
|
return {
|
||||||
|
isLoading: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const path = withReplies ? `${accountId}:with_replies` : accountId;
|
const path = withReplies ? `${accountId}:with_replies` : accountId;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
accountId,
|
||||||
remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),
|
remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),
|
||||||
remoteUrl: state.getIn(['accounts', accountId, 'url']),
|
remoteUrl: state.getIn(['accounts', accountId, 'url']),
|
||||||
isAccount: !!state.getIn(['accounts', accountId]),
|
isAccount: !!state.getIn(['accounts', accountId]),
|
||||||
|
@ -46,7 +55,10 @@ export default @connect(mapStateToProps)
|
||||||
class AccountTimeline extends ImmutablePureComponent {
|
class AccountTimeline extends ImmutablePureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
params: PropTypes.object.isRequired,
|
params: PropTypes.shape({
|
||||||
|
acct: PropTypes.string.isRequired,
|
||||||
|
}).isRequired,
|
||||||
|
accountId: PropTypes.string,
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
statusIds: ImmutablePropTypes.list,
|
statusIds: ImmutablePropTypes.list,
|
||||||
featuredStatusIds: ImmutablePropTypes.list,
|
featuredStatusIds: ImmutablePropTypes.list,
|
||||||
|
@ -60,25 +72,47 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
componentWillMount () {
|
_load () {
|
||||||
const { params: { accountId }, withReplies } = this.props;
|
const { accountId, withReplies, dispatch } = this.props;
|
||||||
|
|
||||||
this.props.dispatch(fetchAccount(accountId));
|
dispatch(fetchAccount(accountId));
|
||||||
this.props.dispatch(fetchAccountIdentityProofs(accountId));
|
dispatch(fetchAccountIdentityProofs(accountId));
|
||||||
if (!withReplies) {
|
if (!withReplies) {
|
||||||
this.props.dispatch(expandAccountFeaturedTimeline(accountId));
|
dispatch(expandAccountFeaturedTimeline(accountId));
|
||||||
|
}
|
||||||
|
dispatch(expandAccountTimeline(accountId, { withReplies }));
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
|
|
||||||
|
if (accountId) {
|
||||||
|
this._load();
|
||||||
|
} else {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate (prevProps) {
|
||||||
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
|
|
||||||
|
if (prevProps.accountId !== accountId && accountId) {
|
||||||
|
this._load();
|
||||||
|
} else if (prevProps.params.acct !== acct) {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
}
|
}
|
||||||
this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
|
const { dispatch } = this.props;
|
||||||
|
|
||||||
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
|
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
|
||||||
this.props.dispatch(fetchAccount(nextProps.params.accountId));
|
dispatch(fetchAccount(nextProps.params.accountId));
|
||||||
this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
|
dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
|
||||||
if (!nextProps.withReplies) {
|
if (!nextProps.withReplies) {
|
||||||
this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
|
dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
|
||||||
}
|
}
|
||||||
this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
|
dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +121,7 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleLoadMore = maxId => {
|
handleLoadMore = maxId => {
|
||||||
this.props.dispatch(expandAccountTimeline(this.props.params.accountId, { maxId, withReplies: this.props.withReplies }));
|
this.props.dispatch(expandAccountTimeline(this.props.accountId, { maxId, withReplies: this.props.withReplies }));
|
||||||
}
|
}
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
|
@ -131,7 +165,7 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
<ProfileColumnHeader onClick={this.handleHeaderClick} multiColumn={multiColumn} />
|
<ProfileColumnHeader onClick={this.handleHeaderClick} multiColumn={multiColumn} />
|
||||||
|
|
||||||
<StatusList
|
<StatusList
|
||||||
prepend={<HeaderContainer accountId={this.props.params.accountId} />}
|
prepend={<HeaderContainer accountId={this.props.accountId} />}
|
||||||
alwaysPrepend
|
alwaysPrepend
|
||||||
append={remoteMessage}
|
append={remoteMessage}
|
||||||
scrollKey='account_timeline'
|
scrollKey='account_timeline'
|
||||||
|
|
|
@ -87,7 +87,7 @@ class Header extends ImmutablePureComponent {
|
||||||
<Link
|
<Link
|
||||||
aria-label={intl.formatMessage(messages.home_timeline)}
|
aria-label={intl.formatMessage(messages.home_timeline)}
|
||||||
title={intl.formatMessage(messages.home_timeline)}
|
title={intl.formatMessage(messages.home_timeline)}
|
||||||
to='/timelines/home'
|
to='/home'
|
||||||
><Icon id='home' /></Link>
|
><Icon id='home' /></Link>
|
||||||
))}
|
))}
|
||||||
{renderForColumn('NOTIFICATIONS', (
|
{renderForColumn('NOTIFICATIONS', (
|
||||||
|
@ -106,14 +106,14 @@ class Header extends ImmutablePureComponent {
|
||||||
<Link
|
<Link
|
||||||
aria-label={intl.formatMessage(messages.community)}
|
aria-label={intl.formatMessage(messages.community)}
|
||||||
title={intl.formatMessage(messages.community)}
|
title={intl.formatMessage(messages.community)}
|
||||||
to='/timelines/public/local'
|
to='/public/local'
|
||||||
><Icon id='users' /></Link>
|
><Icon id='users' /></Link>
|
||||||
))}
|
))}
|
||||||
{renderForColumn('PUBLIC', (
|
{renderForColumn('PUBLIC', (
|
||||||
<Link
|
<Link
|
||||||
aria-label={intl.formatMessage(messages.public)}
|
aria-label={intl.formatMessage(messages.public)}
|
||||||
title={intl.formatMessage(messages.public)}
|
title={intl.formatMessage(messages.public)}
|
||||||
to='/timelines/public'
|
to='/public'
|
||||||
><Icon id='globe' /></Link>
|
><Icon id='globe' /></Link>
|
||||||
))}
|
))}
|
||||||
<a
|
<a
|
||||||
|
|
|
@ -15,13 +15,13 @@ export default class NavigationBar extends ImmutablePureComponent {
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<div className='drawer--account'>
|
<div className='drawer--account'>
|
||||||
<Permalink className='avatar' href={this.props.account.get('url')} to={`/accounts/${this.props.account.get('id')}`}>
|
<Permalink className='avatar' href={this.props.account.get('url')} to={`/@${this.props.account.get('acct')}`}>
|
||||||
<span style={{ display: 'none' }}>{this.props.account.get('acct')}</span>
|
<span style={{ display: 'none' }}>{this.props.account.get('acct')}</span>
|
||||||
<Avatar account={this.props.account} size={48} />
|
<Avatar account={this.props.account} size={48} />
|
||||||
</Permalink>
|
</Permalink>
|
||||||
|
|
||||||
<div className='navigation-bar__profile'>
|
<div className='navigation-bar__profile'>
|
||||||
<Permalink className='acct' href={this.props.account.get('url')} to={`/accounts/${this.props.account.get('id')}`}>
|
<Permalink className='acct' href={this.props.account.get('url')} to={`/@${this.props.account.get('acct')}`}>
|
||||||
<strong>@{this.props.account.get('acct')}</strong>
|
<strong>@{this.props.account.get('acct')}</strong>
|
||||||
</Permalink>
|
</Permalink>
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ class Conversation extends ImmutablePureComponent {
|
||||||
|
|
||||||
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete });
|
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete });
|
||||||
|
|
||||||
const names = accounts.map(a => <Permalink to={`/accounts/${a.get('id')}`} href={a.get('url')} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Permalink>).reduce((prev, cur) => [prev, ', ', cur]);
|
const names = accounts.map(a => <Permalink to={`/@${a.get('acct')}`} href={a.get('url')} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Permalink>).reduce((prev, cur) => [prev, ', ', cur]);
|
||||||
|
|
||||||
const handlers = {
|
const handlers = {
|
||||||
reply: this.handleReply,
|
reply: this.handleReply,
|
||||||
|
|
|
@ -213,7 +213,7 @@ class AccountCard extends ImmutablePureComponent {
|
||||||
<Permalink
|
<Permalink
|
||||||
className='directory__card__bar__name'
|
className='directory__card__bar__name'
|
||||||
href={account.get('url')}
|
href={account.get('url')}
|
||||||
to={`/accounts/${account.get('id')}`}
|
to={`/@${account.get('acct')}`}
|
||||||
>
|
>
|
||||||
<Avatar account={account} size={48} />
|
<Avatar account={account} size={48} />
|
||||||
<DisplayName account={account} />
|
<DisplayName account={account} />
|
||||||
|
|
|
@ -30,7 +30,7 @@ class AccountAuthorize extends ImmutablePureComponent {
|
||||||
return (
|
return (
|
||||||
<div className='account-authorize__wrapper'>
|
<div className='account-authorize__wrapper'>
|
||||||
<div className='account-authorize'>
|
<div className='account-authorize'>
|
||||||
<Permalink href={account.get('url')} to={`/accounts/${account.get('id')}`} className='detailed-status__display-name'>
|
<Permalink href={account.get('url')} to={`/@${account.get('acct')}`} className='detailed-status__display-name'>
|
||||||
<div className='account-authorize__avatar'><Avatar account={account} size={48} /></div>
|
<div className='account-authorize__avatar'><Avatar account={account} size={48} /></div>
|
||||||
<DisplayName account={account} />
|
<DisplayName account={account} />
|
||||||
</Permalink>
|
</Permalink>
|
||||||
|
|
|
@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { debounce } from 'lodash';
|
import { debounce } from 'lodash';
|
||||||
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
|
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
|
||||||
import {
|
import {
|
||||||
fetchAccount,
|
lookupAccount,
|
||||||
fetchFollowers,
|
fetchFollowers,
|
||||||
expandFollowers,
|
expandFollowers,
|
||||||
} from 'flavours/glitch/actions/accounts';
|
} from 'flavours/glitch/actions/accounts';
|
||||||
|
@ -19,14 +19,25 @@ import MissingIndicator from 'flavours/glitch/components/missing_indicator';
|
||||||
import ScrollableList from 'flavours/glitch/components/scrollable_list';
|
import ScrollableList from 'flavours/glitch/components/scrollable_list';
|
||||||
import TimelineHint from 'flavours/glitch/components/timeline_hint';
|
import TimelineHint from 'flavours/glitch/components/timeline_hint';
|
||||||
|
|
||||||
const mapStateToProps = (state, props) => ({
|
const mapStateToProps = (state, { params: { acct } }) => {
|
||||||
remote: !!(state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username'])),
|
const accountId = state.getIn(['accounts_map', acct]);
|
||||||
remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
|
|
||||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
if (!accountId) {
|
||||||
accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
|
return {
|
||||||
hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
|
isLoading: true,
|
||||||
isLoading: state.getIn(['user_lists', 'followers', props.params.accountId, 'isLoading'], true),
|
};
|
||||||
});
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
accountId,
|
||||||
|
remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),
|
||||||
|
remoteUrl: state.getIn(['accounts', accountId, 'url']),
|
||||||
|
isAccount: !!state.getIn(['accounts', accountId]),
|
||||||
|
accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']),
|
||||||
|
hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
const RemoteHint = ({ url }) => (
|
const RemoteHint = ({ url }) => (
|
||||||
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} />
|
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} />
|
||||||
|
@ -40,7 +51,10 @@ export default @connect(mapStateToProps)
|
||||||
class Followers extends ImmutablePureComponent {
|
class Followers extends ImmutablePureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
params: PropTypes.object.isRequired,
|
params: PropTypes.shape({
|
||||||
|
acct: PropTypes.string.isRequired,
|
||||||
|
}).isRequired,
|
||||||
|
accountId: PropTypes.string,
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
@ -51,32 +65,44 @@ class Followers extends ImmutablePureComponent {
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
componentWillMount () {
|
_load () {
|
||||||
if (!this.props.accountIds) {
|
const { accountId, dispatch } = this.props;
|
||||||
this.props.dispatch(fetchAccount(this.props.params.accountId));
|
|
||||||
this.props.dispatch(fetchFollowers(this.props.params.accountId));
|
dispatch(fetchFollowers(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
|
|
||||||
|
if (accountId) {
|
||||||
|
this._load();
|
||||||
|
} else {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentDidUpdate (prevProps) {
|
||||||
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
this.props.dispatch(fetchAccount(nextProps.params.accountId));
|
|
||||||
this.props.dispatch(fetchFollowers(nextProps.params.accountId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleHeaderClick = () => {
|
if (prevProps.accountId !== accountId && accountId) {
|
||||||
this.column.scrollTop();
|
this._load();
|
||||||
|
} else if (prevProps.params.acct !== acct) {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleLoadMore = debounce(() => {
|
handleLoadMore = debounce(() => {
|
||||||
this.props.dispatch(expandFollowers(this.props.params.accountId));
|
this.props.dispatch(expandFollowers(this.props.accountId));
|
||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
this.column = c;
|
this.column = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleHeaderClick = () => {
|
||||||
|
this.column.scrollTop();
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
|
const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
|
||||||
|
|
||||||
|
@ -115,7 +141,7 @@ class Followers extends ImmutablePureComponent {
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
|
||||||
alwaysPrepend
|
alwaysPrepend
|
||||||
append={remoteMessage}
|
append={remoteMessage}
|
||||||
emptyMessage={emptyMessage}
|
emptyMessage={emptyMessage}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { debounce } from 'lodash';
|
import { debounce } from 'lodash';
|
||||||
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
|
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
|
||||||
import {
|
import {
|
||||||
fetchAccount,
|
lookupAccount,
|
||||||
fetchFollowing,
|
fetchFollowing,
|
||||||
expandFollowing,
|
expandFollowing,
|
||||||
} from 'flavours/glitch/actions/accounts';
|
} from 'flavours/glitch/actions/accounts';
|
||||||
|
@ -19,14 +19,25 @@ import MissingIndicator from 'flavours/glitch/components/missing_indicator';
|
||||||
import ScrollableList from 'flavours/glitch/components/scrollable_list';
|
import ScrollableList from 'flavours/glitch/components/scrollable_list';
|
||||||
import TimelineHint from 'flavours/glitch/components/timeline_hint';
|
import TimelineHint from 'flavours/glitch/components/timeline_hint';
|
||||||
|
|
||||||
const mapStateToProps = (state, props) => ({
|
const mapStateToProps = (state, { params: { acct } }) => {
|
||||||
remote: !!(state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username'])),
|
const accountId = state.getIn(['accounts_map', acct]);
|
||||||
remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
|
|
||||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
if (!accountId) {
|
||||||
accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
|
return {
|
||||||
hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
|
isLoading: true,
|
||||||
isLoading: state.getIn(['user_lists', 'following', props.params.accountId, 'isLoading'], true),
|
};
|
||||||
});
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
accountId,
|
||||||
|
remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),
|
||||||
|
remoteUrl: state.getIn(['accounts', accountId, 'url']),
|
||||||
|
isAccount: !!state.getIn(['accounts', accountId]),
|
||||||
|
accountIds: state.getIn(['user_lists', 'following', accountId, 'items']),
|
||||||
|
hasMore: !!state.getIn(['user_lists', 'following', accountId, 'next']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'following', accountId, 'isLoading'], true),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
const RemoteHint = ({ url }) => (
|
const RemoteHint = ({ url }) => (
|
||||||
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.follows' defaultMessage='Follows' />} />
|
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.follows' defaultMessage='Follows' />} />
|
||||||
|
@ -40,7 +51,10 @@ export default @connect(mapStateToProps)
|
||||||
class Following extends ImmutablePureComponent {
|
class Following extends ImmutablePureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
params: PropTypes.object.isRequired,
|
params: PropTypes.shape({
|
||||||
|
acct: PropTypes.string.isRequired,
|
||||||
|
}).isRequired,
|
||||||
|
accountId: PropTypes.string,
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
@ -51,32 +65,44 @@ class Following extends ImmutablePureComponent {
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
componentWillMount () {
|
_load () {
|
||||||
if (!this.props.accountIds) {
|
const { accountId, dispatch } = this.props;
|
||||||
this.props.dispatch(fetchAccount(this.props.params.accountId));
|
|
||||||
this.props.dispatch(fetchFollowing(this.props.params.accountId));
|
dispatch(fetchFollowing(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
|
|
||||||
|
if (accountId) {
|
||||||
|
this._load();
|
||||||
|
} else {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentDidUpdate (prevProps) {
|
||||||
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
|
const { params: { acct }, accountId, dispatch } = this.props;
|
||||||
this.props.dispatch(fetchAccount(nextProps.params.accountId));
|
|
||||||
this.props.dispatch(fetchFollowing(nextProps.params.accountId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleHeaderClick = () => {
|
if (prevProps.accountId !== accountId && accountId) {
|
||||||
this.column.scrollTop();
|
this._load();
|
||||||
|
} else if (prevProps.params.acct !== acct) {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleLoadMore = debounce(() => {
|
handleLoadMore = debounce(() => {
|
||||||
this.props.dispatch(expandFollowing(this.props.params.accountId));
|
this.props.dispatch(expandFollowing(this.props.accountId));
|
||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
this.column = c;
|
this.column = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleHeaderClick = () => {
|
||||||
|
this.column.scrollTop();
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
|
const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
|
||||||
|
|
||||||
|
@ -115,7 +141,7 @@ class Following extends ImmutablePureComponent {
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
|
||||||
alwaysPrepend
|
alwaysPrepend
|
||||||
append={remoteMessage}
|
append={remoteMessage}
|
||||||
emptyMessage={emptyMessage}
|
emptyMessage={emptyMessage}
|
||||||
|
|
|
@ -87,7 +87,7 @@ class Content extends ImmutablePureComponent {
|
||||||
onMentionClick = (mention, e) => {
|
onMentionClick = (mention, e) => {
|
||||||
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.context.router.history.push(`/accounts/${mention.get('id')}`);
|
this.context.router.history.push(`/@${mention.get('acct')}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,14 +96,14 @@ class Content extends ImmutablePureComponent {
|
||||||
|
|
||||||
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.context.router.history.push(`/timelines/tag/${hashtag}`);
|
this.context.router.history.push(`/tags/${hashtag}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onStatusClick = (status, e) => {
|
onStatusClick = (status, e) => {
|
||||||
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.context.router.history.push(`/statuses/${status.get('id')}`);
|
this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);
|
||||||
const { fetchFollowRequests, multiColumn } = this.props;
|
const { fetchFollowRequests, multiColumn } = this.props;
|
||||||
|
|
||||||
if (!multiColumn && window.innerWidth >= NAVIGATION_PANEL_BREAKPOINT) {
|
if (!multiColumn && window.innerWidth >= NAVIGATION_PANEL_BREAKPOINT) {
|
||||||
this.context.router.history.replace('/timelines/home');
|
this.context.router.history.replace('/home');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);
|
||||||
|
|
||||||
if (multiColumn) {
|
if (multiColumn) {
|
||||||
if (!columns.find(item => item.get('id') === 'HOME')) {
|
if (!columns.find(item => item.get('id') === 'HOME')) {
|
||||||
navItems.push(<ColumnLink key='0' icon='home' text={intl.formatMessage(messages.home_timeline)} to='/timelines/home' />);
|
navItems.push(<ColumnLink key='0' icon='home' text={intl.formatMessage(messages.home_timeline)} to='/home' />);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!columns.find(item => item.get('id') === 'NOTIFICATIONS')) {
|
if (!columns.find(item => item.get('id') === 'NOTIFICATIONS')) {
|
||||||
|
@ -130,16 +130,16 @@ const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!columns.find(item => item.get('id') === 'COMMUNITY')) {
|
if (!columns.find(item => item.get('id') === 'COMMUNITY')) {
|
||||||
navItems.push(<ColumnLink key='2' icon='users' text={intl.formatMessage(messages.community_timeline)} to='/timelines/public/local' />);
|
navItems.push(<ColumnLink key='2' icon='users' text={intl.formatMessage(messages.community_timeline)} to='/public/local' />);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!columns.find(item => item.get('id') === 'PUBLIC')) {
|
if (!columns.find(item => item.get('id') === 'PUBLIC')) {
|
||||||
navItems.push(<ColumnLink key='3' icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/timelines/public' />);
|
navItems.push(<ColumnLink key='3' icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/public' />);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!multiColumn || !columns.find(item => item.get('id') === 'DIRECT')) {
|
if (!multiColumn || !columns.find(item => item.get('id') === 'DIRECT')) {
|
||||||
navItems.push(<ColumnLink key='4' icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />);
|
navItems.push(<ColumnLink key='4' icon='envelope' text={intl.formatMessage(messages.direct)} to='/conversations' />);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!multiColumn || !columns.find(item => item.get('id') === 'BOOKMARKS')) {
|
if (!multiColumn || !columns.find(item => item.get('id') === 'BOOKMARKS')) {
|
||||||
|
@ -160,7 +160,7 @@ const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);
|
||||||
<div key='9'>
|
<div key='9'>
|
||||||
<ColumnLink key='10' icon='bars' text={intl.formatMessage(messages.lists)} to='/lists' />
|
<ColumnLink key='10' icon='bars' text={intl.formatMessage(messages.lists)} to='/lists' />
|
||||||
{lists.filter(list => !columns.find(item => item.get('id') === 'LIST' && item.getIn(['params', 'id']) === list.get('id'))).map(list =>
|
{lists.filter(list => !columns.find(item => item.get('id') === 'LIST' && item.getIn(['params', 'id']) === list.get('id'))).map(list =>
|
||||||
<ColumnLink key={(11 + Number(list.get('id'))).toString()} to={`/timelines/list/${list.get('id')}`} icon='list-ul' text={list.get('title')} />
|
<ColumnLink key={(11 + Number(list.get('id'))).toString()} to={`/lists/${list.get('id')}`} icon='list-ul' text={list.get('title')} />
|
||||||
)}
|
)}
|
||||||
</div>,
|
</div>,
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -73,7 +73,7 @@ class Lists extends ImmutablePureComponent {
|
||||||
bindToDocument={!multiColumn}
|
bindToDocument={!multiColumn}
|
||||||
>
|
>
|
||||||
{lists.map(list =>
|
{lists.map(list =>
|
||||||
<ColumnLink key={list.get('id')} to={`/timelines/list/${list.get('id')}`} icon='list-ul' text={list.get('title')} />,
|
<ColumnLink key={list.get('id')} to={`/lists/${list.get('id')}`} icon='list-ul' text={list.get('title')} />,
|
||||||
)}
|
)}
|
||||||
</ScrollableList>
|
</ScrollableList>
|
||||||
</Column>
|
</Column>
|
||||||
|
|
|
@ -39,7 +39,7 @@ export default class NotificationFollow extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleOpenProfile = () => {
|
handleOpenProfile = () => {
|
||||||
const { notification } = this.props;
|
const { notification } = this.props;
|
||||||
this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);
|
this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMention = e => {
|
handleMention = e => {
|
||||||
|
@ -70,7 +70,7 @@ export default class NotificationFollow extends ImmutablePureComponent {
|
||||||
className='notification__display-name'
|
className='notification__display-name'
|
||||||
href={account.get('url')}
|
href={account.get('url')}
|
||||||
title={account.get('acct')}
|
title={account.get('acct')}
|
||||||
to={`/accounts/${account.get('id')}`}
|
to={`/@${account.get('acct')}`}
|
||||||
dangerouslySetInnerHTML={{ __html: displayName }}
|
dangerouslySetInnerHTML={{ __html: displayName }}
|
||||||
/></bdi>
|
/></bdi>
|
||||||
);
|
);
|
||||||
|
|
|
@ -45,7 +45,7 @@ class FollowRequest extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleOpenProfile = () => {
|
handleOpenProfile = () => {
|
||||||
const { notification } = this.props;
|
const { notification } = this.props;
|
||||||
this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);
|
this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMention = e => {
|
handleMention = e => {
|
||||||
|
@ -89,7 +89,7 @@ class FollowRequest extends ImmutablePureComponent {
|
||||||
className='notification__display-name'
|
className='notification__display-name'
|
||||||
href={account.get('url')}
|
href={account.get('url')}
|
||||||
title={account.get('acct')}
|
title={account.get('acct')}
|
||||||
to={`/accounts/${account.get('id')}`}
|
to={`/@${account.get('acct')}`}
|
||||||
dangerouslySetInnerHTML={{ __html: displayName }}
|
dangerouslySetInnerHTML={{ __html: displayName }}
|
||||||
/></bdi>
|
/></bdi>
|
||||||
);
|
);
|
||||||
|
@ -111,7 +111,7 @@ class FollowRequest extends ImmutablePureComponent {
|
||||||
|
|
||||||
<div className='account'>
|
<div className='account'>
|
||||||
<div className='account__wrapper'>
|
<div className='account__wrapper'>
|
||||||
<Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/accounts/${account.get('id')}`}>
|
<Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/@${account.get('acct')}`}>
|
||||||
<div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>
|
<div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>
|
||||||
<DisplayName account={account} />
|
<DisplayName account={account} />
|
||||||
</Permalink>
|
</Permalink>
|
||||||
|
|
|
@ -122,7 +122,7 @@ class Footer extends ImmutablePureComponent {
|
||||||
onClose();
|
onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
router.history.push(`/statuses/${status.get('id')}`);
|
router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Header extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='picture-in-picture__header'>
|
<div className='picture-in-picture__header'>
|
||||||
<Link to={`/statuses/${statusId}`} className='picture-in-picture__header__account'>
|
<Link to={`/@${account.get('acct')}/${statusId}`} className='picture-in-picture__header__account'>
|
||||||
<Avatar account={account} size={36} />
|
<Avatar account={account} size={36} />
|
||||||
<DisplayName account={account} />
|
<DisplayName account={account} />
|
||||||
</Link>
|
</Link>
|
||||||
|
|
|
@ -51,7 +51,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
@ -216,7 +216,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
reblogLink = (
|
reblogLink = (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<React.Fragment> · </React.Fragment>
|
<React.Fragment> · </React.Fragment>
|
||||||
<Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>
|
<Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`} className='detailed-status__link'>
|
||||||
<Icon id={reblogIcon} />
|
<Icon id={reblogIcon} />
|
||||||
<span className='detailed-status__reblogs'>
|
<span className='detailed-status__reblogs'>
|
||||||
<AnimatedNumber value={status.get('reblogs_count')} />
|
<AnimatedNumber value={status.get('reblogs_count')} />
|
||||||
|
@ -240,7 +240,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
|
|
||||||
if (this.context.router) {
|
if (this.context.router) {
|
||||||
favouriteLink = (
|
favouriteLink = (
|
||||||
<Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>
|
<Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`} className='detailed-status__link'>
|
||||||
<Icon id='star' />
|
<Icon id='star' />
|
||||||
<span className='detailed-status__favorites'>
|
<span className='detailed-status__favorites'>
|
||||||
<AnimatedNumber value={status.get('favourites_count')} />
|
<AnimatedNumber value={status.get('favourites_count')} />
|
||||||
|
|
|
@ -405,7 +405,7 @@ class Status extends ImmutablePureComponent {
|
||||||
handleHotkeyOpenProfile = () => {
|
handleHotkeyOpenProfile = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMoveUp = id => {
|
handleMoveUp = id => {
|
||||||
|
|
|
@ -69,7 +69,7 @@ class BoostModal extends ImmutablePureComponent {
|
||||||
this.props.onClose();
|
this.props.onClose();
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ class ColumnsArea extends ImmutablePureComponent {
|
||||||
const columnIndex = getIndex(this.context.router.history.location.pathname);
|
const columnIndex = getIndex(this.context.router.history.location.pathname);
|
||||||
|
|
||||||
if (singleColumn) {
|
if (singleColumn) {
|
||||||
const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/statuses/new' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><Icon id='pencil' /></Link>;
|
const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/publish' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><Icon id='pencil' /></Link>;
|
||||||
|
|
||||||
const content = columnIndex !== -1 ? (
|
const content = columnIndex !== -1 ? (
|
||||||
<ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }} disabled={!swipeToChangeColumns}>
|
<ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }} disabled={!swipeToChangeColumns}>
|
||||||
|
|
|
@ -49,7 +49,7 @@ class FavouriteModal extends ImmutablePureComponent {
|
||||||
this.props.onClose();
|
this.props.onClose();
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = {...this.context.router.history.location.state};
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class ListPanel extends ImmutablePureComponent {
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
{lists.map(list => (
|
{lists.map(list => (
|
||||||
<NavLink key={list.get('id')} className='column-link column-link--transparent' strict to={`/timelines/list/${list.get('id')}`}><Icon className='column-link__icon' id='list-ul' fixedWidth />{list.get('title')}</NavLink>
|
<NavLink key={list.get('id')} className='column-link column-link--transparent' strict to={`/lists/${list.get('id')}`}><Icon className='column-link__icon' id='list-ul' fixedWidth />{list.get('title')}</NavLink>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -112,15 +112,6 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
handleStatusClick = e => {
|
|
||||||
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
|
||||||
e.preventDefault();
|
|
||||||
this.context.router.history.push(`/statuses/${this.props.statusId}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._sendBackgroundColor();
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidUpdate (prevProps, prevState) {
|
componentDidUpdate (prevProps, prevState) {
|
||||||
if (prevState.index !== this.state.index) {
|
if (prevState.index !== this.state.index) {
|
||||||
this._sendBackgroundColor();
|
this._sendBackgroundColor();
|
||||||
|
|
|
@ -11,12 +11,12 @@ import TrendsContainer from 'flavours/glitch/features/getting_started/containers
|
||||||
|
|
||||||
const NavigationPanel = ({ onOpenSettings }) => (
|
const NavigationPanel = ({ onOpenSettings }) => (
|
||||||
<div className='navigation-panel'>
|
<div className='navigation-panel'>
|
||||||
<NavLink className='column-link column-link--transparent' to='/timelines/home' data-preview-title-id='column.home' data-preview-icon='home' ><Icon className='column-link__icon' id='home' fixedWidth /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>
|
<NavLink className='column-link column-link--transparent' to='/home' data-preview-title-id='column.home' data-preview-icon='home' ><Icon className='column-link__icon' id='home' fixedWidth /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>
|
||||||
<NavLink className='column-link column-link--transparent' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><NotificationsCounterIcon className='column-link__icon' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>
|
<NavLink className='column-link column-link--transparent' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><NotificationsCounterIcon className='column-link__icon' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>
|
||||||
<FollowRequestsNavLink />
|
<FollowRequestsNavLink />
|
||||||
<NavLink className='column-link column-link--transparent' to='/timelines/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><Icon className='column-link__icon' id='users' fixedWidth /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>
|
<NavLink className='column-link column-link--transparent' to='/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><Icon className='column-link__icon' id='users' fixedWidth /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>
|
||||||
<NavLink className='column-link column-link--transparent' exact to='/timelines/public' data-preview-title-id='column.public' data-preview-icon='globe' ><Icon className='column-link__icon' id='globe' fixedWidth /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>
|
<NavLink className='column-link column-link--transparent' exact to='/public' data-preview-title-id='column.public' data-preview-icon='globe' ><Icon className='column-link__icon' id='globe' fixedWidth /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>
|
||||||
<NavLink className='column-link column-link--transparent' to='/timelines/direct'><Icon className='column-link__icon' id='envelope' fixedWidth /><FormattedMessage id='navigation_bar.direct' defaultMessage='Direct messages' /></NavLink>
|
<NavLink className='column-link column-link--transparent' to='/conversations'><Icon className='column-link__icon' id='envelope' fixedWidth /><FormattedMessage id='navigation_bar.direct' defaultMessage='Direct messages' /></NavLink>
|
||||||
<NavLink className='column-link column-link--transparent' to='/bookmarks'><Icon className='column-link__icon' id='bookmark' fixedWidth /><FormattedMessage id='navigation_bar.bookmarks' defaultMessage='Bookmarks' /></NavLink>
|
<NavLink className='column-link column-link--transparent' to='/bookmarks'><Icon className='column-link__icon' id='bookmark' fixedWidth /><FormattedMessage id='navigation_bar.bookmarks' defaultMessage='Bookmarks' /></NavLink>
|
||||||
{profile_directory && <NavLink className='column-link column-link--transparent' to='/directory'><Icon className='column-link__icon' id='address-book-o' fixedWidth /><FormattedMessage id='getting_started.directory' defaultMessage='Profile directory' /></NavLink>}
|
{profile_directory && <NavLink className='column-link column-link--transparent' to='/directory'><Icon className='column-link__icon' id='address-book-o' fixedWidth /><FormattedMessage id='getting_started.directory' defaultMessage='Profile directory' /></NavLink>}
|
||||||
<NavLink className='column-link column-link--transparent' to='/lists'><Icon className='column-link__icon' id='list-ul' fixedWidth /><FormattedMessage id='navigation_bar.lists' defaultMessage='Lists' /></NavLink>
|
<NavLink className='column-link column-link--transparent' to='/lists'><Icon className='column-link__icon' id='list-ul' fixedWidth /><FormattedMessage id='navigation_bar.lists' defaultMessage='Lists' /></NavLink>
|
||||||
|
|
|
@ -79,7 +79,7 @@ const PageThree = ({ intl, myAccount }) => (
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p><FormattedMessage id='onboarding.page_three.search' defaultMessage='Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.' values={{ illustration: <Permalink to='/timelines/tag/illustration' href='/tags/illustration'>#illustration</Permalink>, introductions: <Permalink to='/timelines/tag/introductions' href='/tags/introductions'>#introductions</Permalink> }} /></p>
|
<p><FormattedMessage id='onboarding.page_three.search' defaultMessage='Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.' values={{ illustration: <Permalink to='/tag/illustration' href='/tags/illustration'>#illustration</Permalink>, introductions: <Permalink to='/tag/introductions' href='/tags/introductions'>#introductions</Permalink> }} /></p>
|
||||||
<p><FormattedMessage id='onboarding.page_three.profile' defaultMessage='Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.' /></p>
|
<p><FormattedMessage id='onboarding.page_three.profile' defaultMessage='Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.' /></p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -130,7 +130,7 @@ const PageSix = ({ admin, domain }) => {
|
||||||
if (admin) {
|
if (admin) {
|
||||||
adminSection = (
|
adminSection = (
|
||||||
<p>
|
<p>
|
||||||
<FormattedMessage id='onboarding.page_six.admin' defaultMessage="Your instance's admin is {admin}." values={{ admin: <Permalink href={admin.get('url')} to={`/accounts/${admin.get('id')}`}>@{admin.get('acct')}</Permalink> }} />
|
<FormattedMessage id='onboarding.page_six.admin' defaultMessage="Your instance's admin is {admin}." values={{ admin: <Permalink href={admin.get('url')} to={`/@${admin.get('acct')}`}>@{admin.get('acct')}</Permalink> }} />
|
||||||
<br />
|
<br />
|
||||||
<FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage="Please read {domain}'s {guidelines}!" values={{ domain, guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }} />
|
<FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage="Please read {domain}'s {guidelines}!" values={{ domain, guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }} />
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -8,10 +8,10 @@ import Icon from 'flavours/glitch/components/icon';
|
||||||
import NotificationsCounterIcon from './notifications_counter_icon';
|
import NotificationsCounterIcon from './notifications_counter_icon';
|
||||||
|
|
||||||
export const links = [
|
export const links = [
|
||||||
<NavLink className='tabs-bar__link' to='/timelines/home' data-preview-title-id='column.home' data-preview-icon='home' ><Icon id='home' fixedWidth /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>,
|
<NavLink className='tabs-bar__link' to='/home' data-preview-title-id='column.home' data-preview-icon='home' ><Icon id='home' fixedWidth /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>,
|
||||||
<NavLink className='tabs-bar__link' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><NotificationsCounterIcon /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>,
|
<NavLink className='tabs-bar__link' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><NotificationsCounterIcon /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>,
|
||||||
<NavLink className='tabs-bar__link' to='/timelines/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><Icon id='users' fixedWidth /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>,
|
<NavLink className='tabs-bar__link' to='/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><Icon id='users' fixedWidth /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>,
|
||||||
<NavLink className='tabs-bar__link' exact to='/timelines/public' data-preview-title-id='column.public' data-preview-icon='globe' ><Icon id='globe' fixedWidth /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>,
|
<NavLink className='tabs-bar__link' exact to='/public' data-preview-title-id='column.public' data-preview-icon='globe' ><Icon id='globe' fixedWidth /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>,
|
||||||
<NavLink className='tabs-bar__link optional' to='/search' data-preview-title-id='tabs_bar.search' data-preview-icon='bell' ><Icon id='search' fixedWidth /><FormattedMessage id='tabs_bar.search' defaultMessage='Search' /></NavLink>,
|
<NavLink className='tabs-bar__link optional' to='/search' data-preview-title-id='tabs_bar.search' data-preview-icon='bell' ><Icon id='search' fixedWidth /><FormattedMessage id='tabs_bar.search' defaultMessage='Search' /></NavLink>,
|
||||||
<NavLink className='tabs-bar__link' style={{ flexGrow: '0', flexBasis: '30px' }} to='/getting-started' data-preview-title-id='getting_started.heading' data-preview-icon='bars' ><Icon id='bars' fixedWidth /></NavLink>,
|
<NavLink className='tabs-bar__link' style={{ flexGrow: '0', flexBasis: '30px' }} to='/getting-started' data-preview-title-id='getting_started.heading' data-preview-icon='bars' ><Icon id='bars' fixedWidth /></NavLink>,
|
||||||
];
|
];
|
||||||
|
|
|
@ -78,6 +78,7 @@ const mapStateToProps = state => ({
|
||||||
hicolorPrivacyIcons: state.getIn(['local_settings', 'hicolor_privacy_icons']),
|
hicolorPrivacyIcons: state.getIn(['local_settings', 'hicolor_privacy_icons']),
|
||||||
moved: state.getIn(['accounts', me, 'moved']) && state.getIn(['accounts', state.getIn(['accounts', me, 'moved'])]),
|
moved: state.getIn(['accounts', me, 'moved']) && state.getIn(['accounts', state.getIn(['accounts', me, 'moved'])]),
|
||||||
firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION,
|
firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION,
|
||||||
|
username: state.getIn(['accounts', me, 'username']),
|
||||||
});
|
});
|
||||||
|
|
||||||
const keyMap = {
|
const keyMap = {
|
||||||
|
@ -190,7 +191,7 @@ class SwitchingColumnsArea extends React.PureComponent {
|
||||||
render () {
|
render () {
|
||||||
const { children, navbarUnder } = this.props;
|
const { children, navbarUnder } = this.props;
|
||||||
const singleColumn = this.state.mobile;
|
const singleColumn = this.state.mobile;
|
||||||
const redirect = singleColumn ? <Redirect from='/' to='/timelines/home' exact /> : <Redirect from='/' to='/getting-started' exact />;
|
const redirect = singleColumn ? <Redirect from='/' to='/home' exact /> : <Redirect from='/' to='/getting-started' exact />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ColumnsAreaContainer ref={this.setRef} singleColumn={singleColumn} navbarUnder={navbarUnder}>
|
<ColumnsAreaContainer ref={this.setRef} singleColumn={singleColumn} navbarUnder={navbarUnder}>
|
||||||
|
@ -198,32 +199,32 @@ class SwitchingColumnsArea extends React.PureComponent {
|
||||||
{redirect}
|
{redirect}
|
||||||
<WrappedRoute path='/getting-started' component={GettingStarted} content={children} />
|
<WrappedRoute path='/getting-started' component={GettingStarted} content={children} />
|
||||||
<WrappedRoute path='/keyboard-shortcuts' component={KeyboardShortcuts} content={children} />
|
<WrappedRoute path='/keyboard-shortcuts' component={KeyboardShortcuts} content={children} />
|
||||||
<WrappedRoute path='/timelines/home' component={HomeTimeline} content={children} />
|
|
||||||
<WrappedRoute path='/timelines/public' exact component={PublicTimeline} content={children} />
|
|
||||||
<WrappedRoute path='/timelines/public/local' exact component={CommunityTimeline} content={children} />
|
|
||||||
<WrappedRoute path='/timelines/direct' component={DirectTimeline} content={children} />
|
|
||||||
<WrappedRoute path='/timelines/tag/:id' component={HashtagTimeline} content={children} />
|
|
||||||
<WrappedRoute path='/timelines/list/:id' component={ListTimeline} content={children} />
|
|
||||||
|
|
||||||
|
<WrappedRoute path='/home' component={HomeTimeline} content={children} />
|
||||||
|
<WrappedRoute path='/public' exact component={PublicTimeline} content={children} />
|
||||||
|
<WrappedRoute path='/public/local' exact component={CommunityTimeline} content={children} />
|
||||||
|
<WrappedRoute path='/conversations' component={DirectTimeline} content={children} />
|
||||||
|
<WrappedRoute path='/tags/:id' component={HashtagTimeline} content={children} />
|
||||||
|
<WrappedRoute path='/lists/:id' component={ListTimeline} content={children} />
|
||||||
<WrappedRoute path='/notifications' component={Notifications} content={children} />
|
<WrappedRoute path='/notifications' component={Notifications} content={children} />
|
||||||
<WrappedRoute path='/favourites' component={FavouritedStatuses} content={children} />
|
<WrappedRoute path='/favourites' component={FavouritedStatuses} content={children} />
|
||||||
|
|
||||||
<WrappedRoute path='/bookmarks' component={BookmarkedStatuses} content={children} />
|
<WrappedRoute path='/bookmarks' component={BookmarkedStatuses} content={children} />
|
||||||
<WrappedRoute path='/pinned' component={PinnedStatuses} content={children} />
|
<WrappedRoute path='/pinned' component={PinnedStatuses} content={children} />
|
||||||
|
|
||||||
<WrappedRoute path='/start' component={FollowRecommendations} content={children} />
|
<WrappedRoute path='/start' component={FollowRecommendations} content={children} />
|
||||||
<WrappedRoute path='/search' component={Search} content={children} />
|
<WrappedRoute path='/search' component={Search} content={children} />
|
||||||
<WrappedRoute path='/directory' component={Directory} content={children} />
|
<WrappedRoute path='/directory' component={Directory} content={children} />
|
||||||
|
<WrappedRoute path='/publish' component={Compose} content={children} />
|
||||||
|
|
||||||
<WrappedRoute path='/statuses/new' component={Compose} content={children} />
|
<WrappedRoute path='/@:acct' exact component={AccountTimeline} content={children} />
|
||||||
<WrappedRoute path='/statuses/:statusId' exact component={Status} content={children} />
|
<WrappedRoute path='/@:acct/with_replies' component={AccountTimeline} content={children} componentParams={{ withReplies: true }} />
|
||||||
<WrappedRoute path='/statuses/:statusId/reblogs' component={Reblogs} content={children} />
|
<WrappedRoute path='/@:acct/followers' component={Followers} content={children} />
|
||||||
<WrappedRoute path='/statuses/:statusId/favourites' component={Favourites} content={children} />
|
<WrappedRoute path='/@:acct/following' component={Following} content={children} />
|
||||||
|
<WrappedRoute path='/@:acct/media' component={AccountGallery} content={children} />
|
||||||
<WrappedRoute path='/accounts/:accountId' exact component={AccountTimeline} content={children} />
|
<WrappedRoute path='/@:acct/:statusId' exact component={Status} content={children} />
|
||||||
<WrappedRoute path='/accounts/:accountId/with_replies' component={AccountTimeline} content={children} componentParams={{ withReplies: true }} />
|
<WrappedRoute path='/@:acct/:statusId/reblogs' component={Reblogs} content={children} />
|
||||||
<WrappedRoute path='/accounts/:accountId/followers' component={Followers} content={children} />
|
<WrappedRoute path='/@:acct/:statusId/favourites' component={Favourites} content={children} />
|
||||||
<WrappedRoute path='/accounts/:accountId/following' component={Following} content={children} />
|
|
||||||
<WrappedRoute path='/accounts/:accountId/media' component={AccountGallery} content={children} />
|
|
||||||
|
|
||||||
<WrappedRoute path='/follow_requests' component={FollowRequests} content={children} />
|
<WrappedRoute path='/follow_requests' component={FollowRequests} content={children} />
|
||||||
<WrappedRoute path='/blocks' component={Blocks} content={children} />
|
<WrappedRoute path='/blocks' component={Blocks} content={children} />
|
||||||
|
@ -265,6 +266,7 @@ class UI extends React.Component {
|
||||||
showFaviconBadge: PropTypes.bool,
|
showFaviconBadge: PropTypes.bool,
|
||||||
moved: PropTypes.map,
|
moved: PropTypes.map,
|
||||||
firstLaunch: PropTypes.bool,
|
firstLaunch: PropTypes.bool,
|
||||||
|
username: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
|
@ -517,7 +519,7 @@ class UI extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToHome = () => {
|
handleHotkeyGoToHome = () => {
|
||||||
this.props.history.push('/timelines/home');
|
this.props.history.push('/home');
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToNotifications = () => {
|
handleHotkeyGoToNotifications = () => {
|
||||||
|
@ -525,15 +527,15 @@ class UI extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToLocal = () => {
|
handleHotkeyGoToLocal = () => {
|
||||||
this.props.history.push('/timelines/public/local');
|
this.props.history.push('/public/local');
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToFederated = () => {
|
handleHotkeyGoToFederated = () => {
|
||||||
this.props.history.push('/timelines/public');
|
this.props.history.push('/public');
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToDirect = () => {
|
handleHotkeyGoToDirect = () => {
|
||||||
this.props.history.push('/timelines/direct');
|
this.props.history.push('/conversations');
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToStart = () => {
|
handleHotkeyGoToStart = () => {
|
||||||
|
@ -549,7 +551,7 @@ class UI extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToProfile = () => {
|
handleHotkeyGoToProfile = () => {
|
||||||
this.props.history.push(`/accounts/${me}`);
|
this.props.history.push(`/@${this.props.username}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleHotkeyGoToBlocked = () => {
|
handleHotkeyGoToBlocked = () => {
|
||||||
|
@ -616,7 +618,7 @@ class UI extends React.Component {
|
||||||
id='moved_to_warning'
|
id='moved_to_warning'
|
||||||
defaultMessage='This account is marked as moved to {moved_to_link}, and may thus not accept new follows.'
|
defaultMessage='This account is marked as moved to {moved_to_link}, and may thus not accept new follows.'
|
||||||
values={{ moved_to_link: (
|
values={{ moved_to_link: (
|
||||||
<PermaLink href={moved.get('url')} to={`/accounts/${moved.get('id')}`}>
|
<PermaLink href={moved.get('url')} to={`/@${moved.get('acct')}`}>
|
||||||
@{moved.get('acct')}
|
@{moved.get('acct')}
|
||||||
</PermaLink>
|
</PermaLink>
|
||||||
)}}
|
)}}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
|
||||||
|
import { Map as ImmutableMap } from 'immutable';
|
||||||
|
|
||||||
|
const initialState = ImmutableMap();
|
||||||
|
|
||||||
|
export default function accountsMap(state = initialState, action) {
|
||||||
|
switch(action.type) {
|
||||||
|
case ACCOUNT_IMPORT:
|
||||||
|
return state.set(action.account.acct, action.account.id);
|
||||||
|
case ACCOUNTS_IMPORT:
|
||||||
|
return state.withMutations(map => action.accounts.forEach(account => map.set(account.acct, account.id)));
|
||||||
|
default:
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
};
|
|
@ -40,6 +40,7 @@ import announcements from './announcements';
|
||||||
import markers from './markers';
|
import markers from './markers';
|
||||||
import account_notes from './account_notes';
|
import account_notes from './account_notes';
|
||||||
import picture_in_picture from './picture_in_picture';
|
import picture_in_picture from './picture_in_picture';
|
||||||
|
import accounts_map from './accounts_map';
|
||||||
|
|
||||||
const reducers = {
|
const reducers = {
|
||||||
announcements,
|
announcements,
|
||||||
|
@ -54,6 +55,7 @@ const reducers = {
|
||||||
status_lists,
|
status_lists,
|
||||||
accounts,
|
accounts,
|
||||||
accounts_counters,
|
accounts_counters,
|
||||||
|
accounts_map,
|
||||||
statuses,
|
statuses,
|
||||||
relationships,
|
relationships,
|
||||||
settings,
|
settings,
|
||||||
|
|
|
@ -12,21 +12,35 @@ export const getLinks = response => {
|
||||||
return LinkHeader.parse(value);
|
return LinkHeader.parse(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
let csrfHeader = {};
|
const csrfHeader = {};
|
||||||
|
|
||||||
function setCSRFHeader() {
|
const setCSRFHeader = () => {
|
||||||
const csrfToken = document.querySelector('meta[name=csrf-token]');
|
const csrfToken = document.querySelector('meta[name=csrf-token]');
|
||||||
|
|
||||||
if (csrfToken) {
|
if (csrfToken) {
|
||||||
csrfHeader['X-CSRF-Token'] = csrfToken.content;
|
csrfHeader['X-CSRF-Token'] = csrfToken.content;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
ready(setCSRFHeader);
|
ready(setCSRFHeader);
|
||||||
|
|
||||||
|
const authorizationHeaderFromState = getState => {
|
||||||
|
const accessToken = getState && getState().getIn(['meta', 'access_token'], '');
|
||||||
|
|
||||||
|
if (!accessToken) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
'Authorization': `Bearer ${accessToken}`,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export default getState => axios.create({
|
export default getState => axios.create({
|
||||||
headers: Object.assign(csrfHeader, getState ? {
|
headers: {
|
||||||
'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}`,
|
...csrfHeader,
|
||||||
} : {}),
|
...authorizationHeaderFromState(getState),
|
||||||
|
},
|
||||||
|
|
||||||
transformResponse: [function (data) {
|
transformResponse: [function (data) {
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue