sforkowany z mirror/soapbox
Notifications: refactor makeGetNotification, pass the full rebuilt notification all the way through
rodzic
03541ccc6f
commit
acf316faf6
|
@ -36,7 +36,6 @@ class Notification extends ImmutablePureComponent {
|
|||
onFavourite: PropTypes.func.isRequired,
|
||||
onReblog: PropTypes.func.isRequired,
|
||||
onToggleHidden: PropTypes.func.isRequired,
|
||||
status: ImmutablePropTypes.map,
|
||||
intl: PropTypes.object.isRequired,
|
||||
getScrollPosition: PropTypes.func,
|
||||
updateScrollBottom: PropTypes.func,
|
||||
|
@ -58,7 +57,7 @@ class Notification extends ImmutablePureComponent {
|
|||
const { notification } = this.props;
|
||||
|
||||
if (notification.get('status')) {
|
||||
this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}/posts/${notification.get('status')}`);
|
||||
this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}/posts/${notification.getIn(['status', 'id'])}`);
|
||||
} else {
|
||||
this.handleOpenProfile();
|
||||
}
|
||||
|
@ -77,17 +76,20 @@ class Notification extends ImmutablePureComponent {
|
|||
}
|
||||
|
||||
handleHotkeyFavourite = () => {
|
||||
const { status } = this.props;
|
||||
const { notification } = this.props;
|
||||
const status = notification.get('status');
|
||||
if (status) this.props.onFavourite(status);
|
||||
}
|
||||
|
||||
handleHotkeyBoost = e => {
|
||||
const { status } = this.props;
|
||||
const { notification } = this.props;
|
||||
const status = notification.get('status');
|
||||
if (status) this.props.onReblog(status, e);
|
||||
}
|
||||
|
||||
handleHotkeyToggleHidden = () => {
|
||||
const { status } = this.props;
|
||||
const { notification } = this.props;
|
||||
const status = notification.get('status');
|
||||
if (status) this.props.onToggleHidden(status);
|
||||
}
|
||||
|
||||
|
@ -105,12 +107,30 @@ class Notification extends ImmutablePureComponent {
|
|||
};
|
||||
}
|
||||
|
||||
renderFollow(notification, account, link) {
|
||||
renderLink = account => {
|
||||
return (
|
||||
<bdi>
|
||||
<Permalink
|
||||
className='notification__display-name'
|
||||
href={`/@${account.get('acct')}`}
|
||||
title={account.get('acct')}
|
||||
to={`/@${account.get('acct')}`}
|
||||
dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }}
|
||||
/>
|
||||
</bdi>
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
renderFollow(notification) {
|
||||
const { intl } = this.props;
|
||||
|
||||
const account = notification.get('account');
|
||||
const link = this.renderLink(account);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow', defaultMessage: '{name} followed you' }, { name: account.get('acct') }), notification.get('created_at'))}>
|
||||
<div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow', defaultMessage: '{name} followed you' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
<div className='notification__message'>
|
||||
<div className='notification__icon-wrapper'>
|
||||
<Icon src={require('@tabler/icons/icons/user-plus.svg')} />
|
||||
|
@ -121,18 +141,21 @@ class Notification extends ImmutablePureComponent {
|
|||
</span>
|
||||
</div>
|
||||
|
||||
<AccountContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />
|
||||
<AccountContainer id={notification.getIn(['account', 'id'])} withNote={false} hidden={this.props.hidden} />
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
}
|
||||
|
||||
renderFollowRequest(notification, account, link) {
|
||||
renderFollowRequest(notification) {
|
||||
const { intl, unread } = this.props;
|
||||
|
||||
const account = notification.get('account');
|
||||
const link = this.renderLink(account);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className={classNames('notification notification-follow-request focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: account.get('acct') }), notification.get('created_at'))}>
|
||||
<div className={classNames('notification notification-follow-request focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
<div className='notification__message'>
|
||||
<div className='notification__icon-wrapper'>
|
||||
<Icon src={require('@tabler/icons/icons/user.svg')} />
|
||||
|
@ -143,7 +166,7 @@ class Notification extends ImmutablePureComponent {
|
|||
</span>
|
||||
</div>
|
||||
|
||||
<FollowRequestContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />
|
||||
<FollowRequestContainer id={notification.getIn(['account', 'id'])} withNote={false} hidden={this.props.hidden} />
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
|
@ -153,7 +176,7 @@ class Notification extends ImmutablePureComponent {
|
|||
return (
|
||||
<div className='notification notification-mention' tabIndex='0'>
|
||||
<StatusContainer
|
||||
id={notification.get('status')}
|
||||
id={notification.getIn(['status', 'id'])}
|
||||
withDismiss
|
||||
hidden={this.props.hidden}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
|
@ -168,9 +191,12 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderChatMention(notification, link) {
|
||||
renderChatMention(notification) {
|
||||
const { intl } = this.props;
|
||||
|
||||
const account = notification.get('account');
|
||||
const link = this.renderLink(account);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className='notification notification-chat-mention focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.chat_mention', defaultMessage: '{name} sent you a message' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
|
@ -195,9 +221,12 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderEmojiReact(notification, link) {
|
||||
renderEmojiReact(notification) {
|
||||
const { intl } = this.props;
|
||||
|
||||
const account = notification.get('account');
|
||||
const link = this.renderLink(account);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className='notification notification-emoji-react focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.pleroma:emoji_reaction', defaultMessage: '{name} reacted to your post' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
|
@ -212,7 +241,7 @@ class Notification extends ImmutablePureComponent {
|
|||
</div>
|
||||
|
||||
<StatusContainer
|
||||
id={notification.get('status')}
|
||||
id={notification.getIn(['status', 'id'])}
|
||||
account={notification.get('account')}
|
||||
muted
|
||||
withDismiss
|
||||
|
@ -227,9 +256,12 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderFavourite(notification, link) {
|
||||
renderFavourite(notification) {
|
||||
const { intl } = this.props;
|
||||
|
||||
const account = notification.get('account');
|
||||
const link = this.renderLink(account);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.favourite', defaultMessage: '{name} liked your post' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
|
@ -244,7 +276,7 @@ class Notification extends ImmutablePureComponent {
|
|||
</div>
|
||||
|
||||
<StatusContainer
|
||||
id={notification.get('status')}
|
||||
id={notification.getIn(['status', 'id'])}
|
||||
account={notification.get('account')}
|
||||
muted
|
||||
withDismiss
|
||||
|
@ -259,9 +291,12 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderReblog(notification, link) {
|
||||
renderReblog(notification) {
|
||||
const { intl } = this.props;
|
||||
|
||||
const account = notification.get('account');
|
||||
const link = this.renderLink(account);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.reblog', defaultMessage: '{name} reposted your post' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
|
@ -276,7 +311,7 @@ class Notification extends ImmutablePureComponent {
|
|||
</div>
|
||||
|
||||
<StatusContainer
|
||||
id={notification.get('status')}
|
||||
id={notification.getIn(['status', 'id'])}
|
||||
account={notification.get('account')}
|
||||
muted
|
||||
withDismiss
|
||||
|
@ -308,7 +343,7 @@ class Notification extends ImmutablePureComponent {
|
|||
</div>
|
||||
|
||||
<StatusContainer
|
||||
id={notification.get('status')}
|
||||
id={notification.getIn(['status', 'id'])}
|
||||
account={notification.get('account')}
|
||||
muted
|
||||
withDismiss
|
||||
|
@ -323,14 +358,17 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderMove(notification, account, targetAccount, link) {
|
||||
renderMove(notification) {
|
||||
const { intl } = this.props;
|
||||
|
||||
const targetLink = <bdi><Permalink className='notification__display-name' href={`/@${targetAccount.get('acct')}`} to={`/@${targetAccount.get('acct')}`}>{targetAccount.get('acct')}</Permalink></bdi>;
|
||||
const account = notification.get('account');
|
||||
const target = notification.get('target');
|
||||
const link = this.renderLink(account);
|
||||
const targetLink = this.renderLink(target);
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className='notification notification-move focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.move', defaultMessage: '{name} moved to {targetName}' }, { name: account.get('acct'), targetName: targetAccount.get('acct') }), notification.get('created_at'))}>
|
||||
<div className='notification notification-move focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.move', defaultMessage: '{name} moved to {targetName}' }, { name: notification.getIn(['account', 'acct']), targetName: notification.getIn(['target', 'acct']) }), notification.get('created_at'))}>
|
||||
<div className='notification__message'>
|
||||
<div className='notification__icon-wrapper'>
|
||||
<Icon src={require('@tabler/icons/icons/briefcase.svg')} />
|
||||
|
@ -341,7 +379,7 @@ class Notification extends ImmutablePureComponent {
|
|||
</span>
|
||||
</div>
|
||||
|
||||
<AccountContainer id={targetAccount.get('id')} withNote={false} hidden={this.props.hidden} />
|
||||
<AccountContainer id={notification.getIn(['target', 'id'])} withNote={false} hidden={this.props.hidden} />
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
|
@ -349,30 +387,26 @@ class Notification extends ImmutablePureComponent {
|
|||
|
||||
render() {
|
||||
const { notification } = this.props;
|
||||
const account = notification.get('account');
|
||||
const targetAccount = notification.get('target');
|
||||
const displayNameHtml = { __html: account.get('display_name_html') };
|
||||
const link = <bdi><Permalink className='notification__display-name' href={`/@${account.get('acct')}`} title={account.get('acct')} to={`/@${account.get('acct')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;
|
||||
|
||||
switch(notification.get('type')) {
|
||||
case 'follow':
|
||||
return this.renderFollow(notification, account, link);
|
||||
return this.renderFollow(notification);
|
||||
case 'follow_request':
|
||||
return this.renderFollowRequest(notification, account, link);
|
||||
return this.renderFollowRequest(notification);
|
||||
case 'mention':
|
||||
return this.renderMention(notification);
|
||||
case 'favourite':
|
||||
return this.renderFavourite(notification, link);
|
||||
return this.renderFavourite(notification);
|
||||
case 'reblog':
|
||||
return this.renderReblog(notification, link);
|
||||
return this.renderReblog(notification);
|
||||
case 'poll':
|
||||
return this.renderPoll(notification);
|
||||
case 'move':
|
||||
return this.renderMove(notification, account, targetAccount, link);
|
||||
return this.renderMove(notification);
|
||||
case 'pleroma:emoji_reaction':
|
||||
return this.renderEmojiReact(notification, link);
|
||||
return this.renderEmojiReact(notification);
|
||||
case 'pleroma:chat_mention':
|
||||
return this.renderChatMention(notification, link);
|
||||
return this.renderChatMention(notification);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { connect } from 'react-redux';
|
||||
import { makeGetNotification, makeGetStatus } from '../../../selectors';
|
||||
import { makeGetNotification } from '../../../selectors';
|
||||
import Notification from '../components/notification';
|
||||
import { openModal } from '../../../actions/modal';
|
||||
import { mentionCompose } from '../../../actions/compose';
|
||||
|
@ -17,13 +17,10 @@ import { getSettings } from 'soapbox/actions/settings';
|
|||
|
||||
const makeMapStateToProps = () => {
|
||||
const getNotification = makeGetNotification();
|
||||
const getStatus = makeGetStatus();
|
||||
|
||||
const mapStateToProps = (state, props) => {
|
||||
const notification = getNotification(state, props.notification, props.accountId, props.targetId);
|
||||
return {
|
||||
notification: notification,
|
||||
status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,
|
||||
notification: getNotification(state, props.notification),
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -152,8 +152,6 @@ class Notifications extends React.PureComponent {
|
|||
<NotificationContainer
|
||||
key={item.get('id')}
|
||||
notification={item}
|
||||
accountId={item.get('account')}
|
||||
targetId={item.get('target')}
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
/>
|
||||
|
|
|
@ -182,11 +182,12 @@ export const getAlerts = createSelector([getAlertsBase], (base) => {
|
|||
|
||||
export const makeGetNotification = () => {
|
||||
return createSelector([
|
||||
(_, base) => base,
|
||||
(state, _, accountId) => state.getIn(['accounts', accountId]),
|
||||
(state, _, __, targetId) => state.getIn(['accounts', targetId]),
|
||||
], (base, account, target) => {
|
||||
return base.set('account', account).set('target', target);
|
||||
(state, notification) => notification,
|
||||
(state, notification) => state.getIn(['accounts', notification.get('account')]),
|
||||
(state, notification) => state.getIn(['accounts', notification.get('target')]),
|
||||
(state, notification) => state.getIn(['statuses', notification.get('status')]),
|
||||
], (notification, account, target, status) => {
|
||||
return notification.merge({ account, target, status });
|
||||
});
|
||||
};
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue