Files
2025-10-12 13:42:02 +02:00

188 lines
5.3 KiB
JavaScript

import { defineMessages, injectIntl } from "react-intl";
import { connect } from "react-redux";
import { showAlertForError } from "../../../actions/alerts";
import { initBlockModal } from "../../../actions/blocks";
import { initBoostModal } from "../../../actions/boosts";
import {
replyCompose,
mentionCompose,
directCompose,
} from "../../../actions/compose";
import {
reblog,
favourite,
unreblog,
unfavourite,
pin,
unpin,
} from "../../../actions/interactions";
import { openModal } from "../../../actions/modal";
import { initMuteModal } from "../../../actions/mutes";
import { initReport } from "../../../actions/reports";
import {
muteStatus,
unmuteStatus,
deleteStatus,
hideStatus,
revealStatus,
} from "../../../actions/statuses";
import { boostModal, deleteModal } from "../../../initial_state";
import { makeGetStatus, makeGetPictureInPicture } from "../../../selectors";
import DetailedStatus from "../components/detailed_status";
const messages = defineMessages({
deleteConfirm: { id: "confirmations.delete.confirm", defaultMessage: "Delete" },
deleteMessage: { id: "confirmations.delete.message", defaultMessage: "Are you sure you want to delete this status?" },
redraftConfirm: { id: "confirmations.redraft.confirm", defaultMessage: "Delete & redraft" },
redraftMessage: { id: "confirmations.redraft.message", defaultMessage: "Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned." },
replyConfirm: { id: "confirmations.reply.confirm", defaultMessage: "Reply" },
replyMessage: { id: "confirmations.reply.message", defaultMessage: "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?" },
});
const makeMapStateToProps = () => {
const getStatus = makeGetStatus();
const getPictureInPicture = makeGetPictureInPicture();
const mapStateToProps = (state, props) => ({
status: getStatus(state, props),
domain: state.getIn(["meta", "domain"]),
pictureInPicture: getPictureInPicture(state, props),
});
return mapStateToProps;
};
const mapDispatchToProps = (dispatch, { intl }) => ({
onReply (status, router) {
dispatch((_, getState) => {
let state = getState();
if (state.getIn(["compose", "text"]).trim().length !== 0) {
dispatch(openModal({
modalType: "CONFIRM",
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(status, router)),
},
}));
} else {
dispatch(replyCompose(status, router));
}
});
},
onModalReblog (status, privacy) {
dispatch(reblog(status, privacy));
},
onReblog (status, e) {
if (status.get("reblogged")) {
dispatch(unreblog(status));
} else {
if (e.shiftKey || !boostModal) {
this.onModalReblog(status);
} else {
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
}
}
},
onFavourite (status) {
if (status.get("favourited")) {
dispatch(unfavourite(status));
} else {
dispatch(favourite(status));
}
},
onPin (status) {
if (status.get("pinned")) {
dispatch(unpin(status));
} else {
dispatch(pin(status));
}
},
onEmbed (status) {
dispatch(openModal({
modalType: "EMBED",
modalProps: {
id: status.get("id"),
onError: error => dispatch(showAlertForError(error)),
},
}));
},
onDelete (status, history, withRedraft = false) {
if (!deleteModal) {
dispatch(deleteStatus(status.get("id"), history, withRedraft));
} else {
dispatch(openModal({
modalType: "CONFIRM",
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get("id"), history, withRedraft)),
},
}));
}
},
onDirect (account, router) {
dispatch(directCompose(account, router));
},
onMention (account, router) {
dispatch(mentionCompose(account, router));
},
onOpenMedia (media, index, lang) {
dispatch(openModal({
modalType: "MEDIA",
modalProps: { media, index, lang },
}));
},
onOpenVideo (media, lang, options) {
dispatch(openModal({
modalType: "VIDEO",
modalProps: { media, lang, options },
}));
},
onBlock (status) {
const account = status.get("account");
dispatch(initBlockModal(account));
},
onReport (status) {
dispatch(initReport(status.get("account"), status));
},
onMute (account) {
dispatch(initMuteModal(account));
},
onMuteConversation (status) {
if (status.get("muted")) {
dispatch(unmuteStatus(status.get("id")));
} else {
dispatch(muteStatus(status.get("id")));
}
},
onToggleHidden (status) {
if (status.get("hidden")) {
dispatch(revealStatus(status.get("id")));
} else {
dispatch(hideStatus(status.get("id")));
}
},
});
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(DetailedStatus));