import PropTypes from "prop-types"; import { FormattedMessage, injectIntl, defineMessages } from "react-intl"; import classNames from "classnames"; import { Link } from "react-router-dom"; import ImmutablePropTypes from "react-immutable-proptypes"; import ImmutablePureComponent from "react-immutable-pure-component"; import { connect } from "react-redux"; import { followAccount, unfollowAccount, unblockAccount, unmuteAccount, } from "mastodon/actions/accounts"; import { openModal } from "mastodon/actions/modal"; import { Avatar } from "mastodon/components/avatar"; import Button from "mastodon/components/button"; import { DisplayName } from "mastodon/components/display_name"; import { ShortNumber } from "mastodon/components/short_number"; import { autoPlayGif, me, unfollowModal } from "mastodon/initial_state"; import { makeGetAccount } from "mastodon/selectors"; const messages = defineMessages({ unfollow: { id: "account.unfollow", defaultMessage: "Unfollow" }, follow: { id: "account.follow", defaultMessage: "Follow" }, cancel_follow_request: { id: "account.cancel_follow_request", defaultMessage: "Withdraw follow request" }, cancelFollowRequestConfirm: { id: "confirmations.cancel_follow_request.confirm", defaultMessage: "Withdraw request" }, requested: { id: "account.requested", defaultMessage: "Awaiting approval. Click to cancel follow request" }, unblock: { id: "account.unblock_short", defaultMessage: "Unblock" }, unmute: { id: "account.unmute_short", defaultMessage: "Unmute" }, unfollowConfirm: { id: "confirmations.unfollow.confirm", defaultMessage: "Unfollow" }, edit_profile: { id: "account.edit_profile", defaultMessage: "Edit profile" }, }); const makeMapStateToProps = () => { const getAccount = makeGetAccount(); const mapStateToProps = (state, { id }) => ({ account: getAccount(state, id), }); return mapStateToProps; }; const mapDispatchToProps = (dispatch, { intl }) => ({ onFollow(account) { if (account.getIn(["relationship", "following"])) { if (unfollowModal) { dispatch( openModal({ modalType: "CONFIRM", modalProps: { message: ( @{account.get("acct")} }} /> ), confirm: intl.formatMessage(messages.unfollowConfirm), onConfirm: () => dispatch(unfollowAccount(account.get("id"))), } }), ); } else { dispatch(unfollowAccount(account.get("id"))); } } else if (account.getIn(["relationship", "requested"])) { if (unfollowModal) { dispatch(openModal({ modalType: "CONFIRM", modalProps: { message: @{account.get("acct")} }} />, confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), onConfirm: () => dispatch(unfollowAccount(account.get("id"))), }, })); } else { dispatch(unfollowAccount(account.get("id"))); } } else { dispatch(followAccount(account.get("id"))); } }, onBlock(account) { if (account.getIn(["relationship", "blocking"])) { dispatch(unblockAccount(account.get("id"))); } }, onMute(account) { if (account.getIn(["relationship", "muting"])) { dispatch(unmuteAccount(account.get("id"))); } }, }); class AccountCard extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, intl: PropTypes.object.isRequired, onFollow: PropTypes.func.isRequired, onBlock: PropTypes.func.isRequired, onMute: PropTypes.func.isRequired, }; handleMouseEnter = ({ currentTarget }) => { if (autoPlayGif) { return; } const emojis = currentTarget.querySelectorAll(".custom-emoji"); for (var i = 0; i < emojis.length; i++) { let emoji = emojis[i]; emoji.src = emoji.getAttribute("data-original"); } }; handleMouseLeave = ({ currentTarget }) => { if (autoPlayGif) { return; } const emojis = currentTarget.querySelectorAll(".custom-emoji"); for (var i = 0; i < emojis.length; i++) { let emoji = emojis[i]; emoji.src = emoji.getAttribute("data-static"); } }; handleFollow = () => { this.props.onFollow(this.props.account); }; handleBlock = () => { this.props.onBlock(this.props.account); }; handleMute = () => { this.props.onMute(this.props.account); }; handleEditProfile = () => { window.open("/settings/profile", "_blank"); }; render() { const { account, intl } = this.props; let actionBtn; if (me !== account.get("id")) { if (!account.get("relationship")) { // Wait until the relationship is loaded actionBtn = ""; } else if (account.getIn(["relationship", "requested"])) { actionBtn =