Add reblog menu with force modal

This commit is contained in:
KMY 2023-05-18 12:25:56 +09:00
parent 3c2840510d
commit f832b5698a
7 changed files with 42 additions and 2 deletions

View file

@ -79,6 +79,7 @@ class Status extends ImmutablePureComponent {
onEmojiReact: PropTypes.func, onEmojiReact: PropTypes.func,
onUnEmojiReact: PropTypes.func, onUnEmojiReact: PropTypes.func,
onReblog: PropTypes.func, onReblog: PropTypes.func,
onReblogForceModal: PropTypes.func,
onDelete: PropTypes.func, onDelete: PropTypes.func,
onDirect: PropTypes.func, onDirect: PropTypes.func,
onMention: PropTypes.func, onMention: PropTypes.func,

View file

@ -24,6 +24,7 @@ const messages = defineMessages({
more: { id: 'status.more', defaultMessage: 'More' }, more: { id: 'status.more', defaultMessage: 'More' },
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' }, replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
reblog: { id: 'status.reblog', defaultMessage: 'Boost' }, reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
cancelReblog: { id: 'status.cancel_reblog', defaultMessage: 'Unboost' },
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' }, reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
@ -69,6 +70,7 @@ class StatusActionBar extends ImmutablePureComponent {
onFavourite: PropTypes.func, onFavourite: PropTypes.func,
onEmojiReact: PropTypes.func, onEmojiReact: PropTypes.func,
onReblog: PropTypes.func, onReblog: PropTypes.func,
onReblogForceModal: PropTypes.func,
onDelete: PropTypes.func, onDelete: PropTypes.func,
onDirect: PropTypes.func, onDirect: PropTypes.func,
onMention: PropTypes.func, onMention: PropTypes.func,
@ -151,6 +153,10 @@ class StatusActionBar extends ImmutablePureComponent {
} }
}; };
handleReblogForceModalClick = e => {
this.props.onReblogForceModal(this.props.status, e);
};
handleBookmarkClick = () => { handleBookmarkClick = () => {
this.props.onBookmark(this.props.status); this.props.onBookmark(this.props.status);
}; };
@ -272,6 +278,7 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push(null); menu.push(null);
menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancelReblog : messages.reblog), action: this.handleReblogForceModalClick });
menu.push({ text: intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark), action: this.handleBookmarkClick }); menu.push({ text: intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark), action: this.handleBookmarkClick });
if (writtenByMe && pinnableStatus) { if (writtenByMe && pinnableStatus) {

View file

@ -110,6 +110,10 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
} }
}, },
onReblogForceModal (status) {
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
},
onFavourite (status) { onFavourite (status) {
if (status.get('favourited')) { if (status.get('favourited')) {
dispatch(unfavourite(status)); dispatch(unfavourite(status));

View file

@ -54,6 +54,14 @@ const mapDispatchToProps = dispatch => ({
} }
}, },
onReblogForceModal (status) {
if (status.get('reblogged')) {
dispatch(unreblog(status));
} else {
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
}
},
onFavourite (status) { onFavourite (status) {
if (status.get('favourited')) { if (status.get('favourited')) {
dispatch(unfavourite(status)); dispatch(unfavourite(status));

View file

@ -61,6 +61,7 @@ class ActionBar extends React.PureComponent {
relationship: ImmutablePropTypes.map, relationship: ImmutablePropTypes.map,
onReply: PropTypes.func.isRequired, onReply: PropTypes.func.isRequired,
onReblog: PropTypes.func.isRequired, onReblog: PropTypes.func.isRequired,
onReblogForceModal: PropTypes.func.isRequired,
onFavourite: PropTypes.func.isRequired, onFavourite: PropTypes.func.isRequired,
onEmojiReact: PropTypes.func.isRequired, onEmojiReact: PropTypes.func.isRequired,
onBookmark: PropTypes.func.isRequired, onBookmark: PropTypes.func.isRequired,
@ -89,6 +90,10 @@ class ActionBar extends React.PureComponent {
this.props.onReblog(this.props.status, e); this.props.onReblog(this.props.status, e);
}; };
handleReblogForceModalClick = (e) => {
this.props.onReblogForceModal(this.props.status, e);
};
handleFavouriteClick = () => { handleFavouriteClick = () => {
this.props.onFavourite(this.props.status); this.props.onFavourite(this.props.status);
}; };
@ -208,6 +213,8 @@ class ActionBar extends React.PureComponent {
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy }); menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed }); menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
menu.push(null); menu.push(null);
menu.push({ text: intl.formatMessage(messages.reblog), action: this.handleReblogForceModalClick });
menu.push(null);
} }
if (writtenByMe) { if (writtenByMe) {

View file

@ -87,6 +87,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
} }
}, },
onReblogForceModal (status) {
if (status.get('reblogged')) {
dispatch(unreblog(status));
} else {
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
}
},
onFavourite (status) { onFavourite (status) {
if (status.get('favourited')) { if (status.get('favourited')) {
dispatch(unfavourite(status)); dispatch(unfavourite(status));

View file

@ -310,7 +310,7 @@ class Status extends ImmutablePureComponent {
this.props.dispatch(reblog(status, privacy)); this.props.dispatch(reblog(status, privacy));
}; };
handleReblogClick = (status, e) => { handleReblogClick = (status, e, force = false) => {
const { dispatch } = this.props; const { dispatch } = this.props;
const { signedIn } = this.context.identity; const { signedIn } = this.context.identity;
@ -318,7 +318,7 @@ class Status extends ImmutablePureComponent {
if (status.get('reblogged')) { if (status.get('reblogged')) {
dispatch(unreblog(status)); dispatch(unreblog(status));
} else { } else {
if ((e && e.shiftKey) || !boostModal) { if (!force && ((e && e.shiftKey) || !boostModal)) {
this.handleModalReblog(status); this.handleModalReblog(status);
} else { } else {
dispatch(initBoostModal({ status, onReblog: this.handleModalReblog })); dispatch(initBoostModal({ status, onReblog: this.handleModalReblog }));
@ -333,6 +333,10 @@ class Status extends ImmutablePureComponent {
} }
}; };
handleReblogForceModalClick = (status, e) => {
this.handleReblogClick(status, e, true);
};
handleBookmarkClick = (status) => { handleBookmarkClick = (status) => {
if (status.get('bookmarked')) { if (status.get('bookmarked')) {
this.props.dispatch(unbookmark(status)); this.props.dispatch(unbookmark(status));
@ -678,6 +682,7 @@ class Status extends ImmutablePureComponent {
onFavourite={this.handleFavouriteClick} onFavourite={this.handleFavouriteClick}
onEmojiReact={this.handleEmojiReact} onEmojiReact={this.handleEmojiReact}
onReblog={this.handleReblogClick} onReblog={this.handleReblogClick}
onReblogForceModal={this.handleReblogForceModalClick}
onBookmark={this.handleBookmarkClick} onBookmark={this.handleBookmarkClick}
onDelete={this.handleDeleteClick} onDelete={this.handleDeleteClick}
onEdit={this.handleEditClick} onEdit={this.handleEditClick}