Implement missing hotkeys for notifications (#9927)

This commit is contained in:
ThibG 2019-01-27 17:54:54 +01:00 committed by Eugen Rochko
parent e2a5be6e9a
commit ec5bd8b8bb
2 changed files with 79 additions and 8 deletions

View File

@ -29,6 +29,10 @@ class Notification extends ImmutablePureComponent {
onMoveUp: PropTypes.func.isRequired, onMoveUp: PropTypes.func.isRequired,
onMoveDown: PropTypes.func.isRequired, onMoveDown: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired, onMention: PropTypes.func.isRequired,
onFavourite: PropTypes.func.isRequired,
onReblog: PropTypes.func.isRequired,
onToggleHidden: PropTypes.func.isRequired,
status: PropTypes.option,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
}; };
@ -64,14 +68,32 @@ class Notification extends ImmutablePureComponent {
onMention(notification.get('account'), this.context.router.history); onMention(notification.get('account'), this.context.router.history);
} }
handleHotkeyFavourite = () => {
const { status } = this.props;
if (status) this.props.onFavourite(status);
}
handleHotkeyBoost = e => {
const { status } = this.props;
if (status) this.props.onReblog(status, e);
}
handleHotkeyToggleHidden = () => {
const { status } = this.props;
if (status) this.props.onToggleHidden(status);
}
getHandlers () { getHandlers () {
return { return {
moveUp: this.handleMoveUp, reply: this.handleMention,
moveDown: this.handleMoveDown, favourite: this.handleHotkeyFavourite,
boost: this.handleHotkeyBoost,
mention: this.handleMention,
open: this.handleOpen, open: this.handleOpen,
openProfile: this.handleOpenProfile, openProfile: this.handleOpenProfile,
mention: this.handleMention, moveUp: this.handleMoveUp,
reply: this.handleMention, moveDown: this.handleMoveDown,
toggleHidden: this.handleHotkeyToggleHidden,
}; };
} }

View File

@ -1,14 +1,31 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { makeGetNotification } from '../../../selectors'; import { makeGetNotification, makeGetStatus } from '../../../selectors';
import Notification from '../components/notification'; import Notification from '../components/notification';
import { openModal } from '../../../actions/modal';
import { mentionCompose } from '../../../actions/compose'; import { mentionCompose } from '../../../actions/compose';
import {
reblog,
favourite,
unreblog,
unfavourite,
} from '../../../actions/interactions';
import {
hideStatus,
revealStatus,
} from '../../../actions/statuses';
import { boostModal } from '../../../initial_state';
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getNotification = makeGetNotification(); const getNotification = makeGetNotification();
const getStatus = makeGetStatus();
const mapStateToProps = (state, props) => ({ const mapStateToProps = (state, props) => {
notification: getNotification(state, props.notification, props.accountId), const notification = getNotification(state, props.notification, props.accountId);
}); return {
notification: notification,
status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,
};
};
return mapStateToProps; return mapStateToProps;
}; };
@ -17,6 +34,38 @@ const mapDispatchToProps = dispatch => ({
onMention: (account, router) => { onMention: (account, router) => {
dispatch(mentionCompose(account, router)); dispatch(mentionCompose(account, router));
}, },
onModalReblog (status) {
dispatch(reblog(status));
},
onReblog (status, e) {
if (status.get('reblogged')) {
dispatch(unreblog(status));
} else {
if (e.shiftKey || !boostModal) {
this.onModalReblog(status);
} else {
dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));
}
}
},
onFavourite (status) {
if (status.get('favourited')) {
dispatch(unfavourite(status));
} else {
dispatch(favourite(status));
}
},
onToggleHidden (status) {
if (status.get('hidden')) {
dispatch(revealStatus(status.get('id')));
} else {
dispatch(hideStatus(status.get('id')));
}
},
}); });
export default connect(makeMapStateToProps, mapDispatchToProps)(Notification); export default connect(makeMapStateToProps, mapDispatchToProps)(Notification);