import PropTypes from "prop-types"; import { defineMessages, injectIntl, FormattedMessage } from "react-intl"; import classNames from "classnames"; import ImmutablePropTypes from "react-immutable-proptypes"; import ImmutablePureComponent from "react-immutable-pure-component"; import { connect } from "react-redux"; import { changeBoostPrivacy } from "mastodon/actions/boosts"; import AttachmentList from "mastodon/components/attachment_list"; import { Icon } from "mastodon/components/icon"; import PrivacyDropdown from "mastodon/features/compose/components/privacy_dropdown"; import { Avatar } from "../../../components/avatar"; import Button from "../../../components/button"; import { DisplayName } from "../../../components/display_name"; import { RelativeTimestamp } from "../../../components/relative_timestamp"; import StatusContent from "../../../components/status_content"; const messages = defineMessages({ cancel_reblog: { id: "status.cancel_reblog_private", defaultMessage: "Unboost" }, reblog: { id: "status.reblog", defaultMessage: "Boost" }, public_short: { id: "privacy.public.short", defaultMessage: "Public" }, unlisted_short: { id: "privacy.unlisted.short", defaultMessage: "Unlisted" }, private_short: { id: "privacy.private.short", defaultMessage: "Followers only" }, direct_short: { id: "privacy.direct.short", defaultMessage: "Mentioned people only" }, }); const mapStateToProps = state => { return { privacy: state.getIn(["boosts", "new", "privacy"]), }; }; const mapDispatchToProps = dispatch => { return { onChangeBoostPrivacy(value) { dispatch(changeBoostPrivacy(value)); }, }; }; class BoostModal extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, }; static propTypes = { status: ImmutablePropTypes.map.isRequired, onReblog: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, onChangeBoostPrivacy: PropTypes.func.isRequired, privacy: PropTypes.string.isRequired, intl: PropTypes.object.isRequired, }; componentDidMount() { this.button.focus(); } handleReblog = () => { this.props.onReblog(this.props.status, this.props.privacy); this.props.onClose(); }; handleAccountClick = (e) => { if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { e.preventDefault(); this.props.onClose(); this.context.router.history.push(`/@${this.props.status.getIn(["account", "acct"])}`); } }; _findContainer = () => { return document.getElementsByClassName("modal-root__container")[0]; }; setRef = (c) => { this.button = c; }; render () { const { status, privacy, intl } = this.props; const buttonText = status.get("reblogged") ? messages.cancel_reblog : messages.reblog; const visibilityIconInfo = { "public": { icon: "globe", text: intl.formatMessage(messages.public_short) }, "unlisted": { icon: "unlock", text: intl.formatMessage(messages.unlisted_short) }, "private": { icon: "lock", text: intl.formatMessage(messages.private_short) }, "direct": { icon: "at", text: intl.formatMessage(messages.direct_short) }, }; const visibilityIcon = visibilityIconInfo[status.get("visibility")]; return (
{status.get("media_attachments").size > 0 && ( )}
Shift + }} />
{status.get("visibility") !== "private" && !status.get("reblogged") && ( )}
); } } export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(BoostModal));