import React from 'react'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; import { initAccountNoteModal } from 'soapbox/actions/account-notes'; import { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount, pinAccount, unpinAccount, subscribeAccount, unsubscribeAccount, removeFromFollowers, } from 'soapbox/actions/accounts'; import { verifyUser, unverifyUser, setDonor, removeDonor, promoteToAdmin, promoteToModerator, demoteToUser, suggestUsers, unsuggestUsers, } from 'soapbox/actions/admin'; import { launchChat } from 'soapbox/actions/chats'; import { mentionCompose, directCompose, } from 'soapbox/actions/compose'; import { blockDomain, unblockDomain } from 'soapbox/actions/domain_blocks'; import { openModal } from 'soapbox/actions/modals'; import { deactivateUserModal, deleteUserModal } from 'soapbox/actions/moderation'; import { initMuteModal } from 'soapbox/actions/mutes'; import { initReport } from 'soapbox/actions/reports'; import { getSettings } from 'soapbox/actions/settings'; import snackbar from 'soapbox/actions/snackbar'; import { makeGetAccount } from 'soapbox/selectors'; import Header from '../components/header'; const messages = defineMessages({ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' }, blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' }, userVerified: { id: 'admin.users.user_verified_message', defaultMessage: '@{acct} was verified' }, userUnverified: { id: 'admin.users.user_unverified_message', defaultMessage: '@{acct} was unverified' }, setDonor: { id: 'admin.users.set_donor_message', defaultMessage: '@{acct} was set as a donor' }, removeDonor: { id: 'admin.users.remove_donor_message', defaultMessage: '@{acct} was removed as a donor' }, promotedToAdmin: { id: 'admin.users.actions.promote_to_admin_message', defaultMessage: '@{acct} was promoted to an admin' }, promotedToModerator: { id: 'admin.users.actions.promote_to_moderator_message', defaultMessage: '@{acct} was promoted to a moderator' }, demotedToModerator: { id: 'admin.users.actions.demote_to_moderator_message', defaultMessage: '@{acct} was demoted to a moderator' }, demotedToUser: { id: 'admin.users.actions.demote_to_user_message', defaultMessage: '@{acct} was demoted to a regular user' }, userSuggested: { id: 'admin.users.user_suggested_message', defaultMessage: '@{acct} was suggested' }, userUnsuggested: { id: 'admin.users.user_unsuggested_message', defaultMessage: '@{acct} was unsuggested' }, removeFromFollowersConfirm: { id: 'confirmations.remove_from_followers.confirm', defaultMessage: 'Remove' }, }); const makeMapStateToProps = () => { const getAccount = makeGetAccount(); const mapStateToProps = (state, { accountId }) => ({ account: getAccount(state, accountId), }); return mapStateToProps; }; const mapDispatchToProps = (dispatch, { intl }) => ({ onFollow(account) { dispatch((_, getState) => { const unfollowModal = getSettings(getState()).get('unfollowModal'); if (account.relationship?.following || account.relationship?.requested) { if (unfollowModal) { dispatch(openModal('CONFIRM', { message: @{account.get('acct')} }} />, confirm: intl.formatMessage(messages.unfollowConfirm), onConfirm: () => dispatch(unfollowAccount(account.get('id'))), })); } else { dispatch(unfollowAccount(account.get('id'))); } } else { dispatch(followAccount(account.get('id'))); } }); }, onBlock(account) { if (account.relationship?.blocking) { dispatch(unblockAccount(account.get('id'))); } else { dispatch(openModal('CONFIRM', { icon: require('@tabler/icons/ban.svg'), heading: , message: @{account.get('acct')} }} />, confirm: intl.formatMessage(messages.blockConfirm), onConfirm: () => dispatch(blockAccount(account.get('id'))), secondary: intl.formatMessage(messages.blockAndReport), onSecondary: () => { dispatch(blockAccount(account.get('id'))); dispatch(initReport(account)); }, })); } }, onMention(account) { dispatch(mentionCompose(account)); }, onDirect(account) { dispatch(directCompose(account)); }, onReblogToggle(account) { if (account.relationship?.showing_reblogs) { dispatch(followAccount(account.get('id'), { reblogs: false })); } else { dispatch(followAccount(account.get('id'), { reblogs: true })); } }, onSubscriptionToggle(account) { if (account.relationship?.subscribing) { dispatch(unsubscribeAccount(account.get('id'))); } else { dispatch(subscribeAccount(account.get('id'))); } }, onNotifyToggle(account) { if (account.relationship?.notifying) { dispatch(followAccount(account.get('id'), { notify: false })); } else { dispatch(followAccount(account.get('id'), { notify: true })); } }, onEndorseToggle(account) { if (account.relationship?.endorsed) { dispatch(unpinAccount(account.get('id'))); } else { dispatch(pinAccount(account.get('id'))); } }, onReport(account) { dispatch(initReport(account)); }, onMute(account) { if (account.relationship?.muting) { dispatch(unmuteAccount(account.get('id'))); } else { dispatch(initMuteModal(account)); } }, onBlockDomain(domain) { dispatch(openModal('CONFIRM', { icon: require('@tabler/icons/ban.svg'), heading: , message: {domain} }} />, confirm: intl.formatMessage(messages.blockDomainConfirm), onConfirm: () => dispatch(blockDomain(domain)), })); }, onUnblockDomain(domain) { dispatch(unblockDomain(domain)); }, onAddToList(account) { dispatch(openModal('LIST_ADDER', { accountId: account.get('id'), })); }, onChat(account, router) { dispatch(launchChat(account.get('id'), router)); }, onDeactivateUser(account) { dispatch(deactivateUserModal(intl, account.get('id'))); }, onDeleteUser(account) { dispatch(deleteUserModal(intl, account.get('id'))); }, onVerifyUser(account) { const message = intl.formatMessage(messages.userVerified, { acct: account.get('acct') }); dispatch(verifyUser(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onUnverifyUser(account) { const message = intl.formatMessage(messages.userUnverified, { acct: account.get('acct') }); dispatch(unverifyUser(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onSetDonor(account) { const message = intl.formatMessage(messages.setDonor, { acct: account.get('acct') }); dispatch(setDonor(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onRemoveDonor(account) { const message = intl.formatMessage(messages.removeDonor, { acct: account.get('acct') }); dispatch(removeDonor(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onPromoteToAdmin(account) { const message = intl.formatMessage(messages.promotedToAdmin, { acct: account.get('acct') }); dispatch(promoteToAdmin(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onPromoteToModerator(account) { const messageType = account.admin ? messages.demotedToModerator : messages.promotedToModerator; const message = intl.formatMessage(messageType, { acct: account.get('acct') }); dispatch(promoteToModerator(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onDemoteToUser(account) { const message = intl.formatMessage(messages.demotedToUser, { acct: account.get('acct') }); dispatch(demoteToUser(account.get('id'))) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onSuggestUser(account) { const message = intl.formatMessage(messages.userSuggested, { acct: account.get('acct') }); dispatch(suggestUsers([account.get('id')])) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onUnsuggestUser(account) { const message = intl.formatMessage(messages.userUnsuggested, { acct: account.get('acct') }); dispatch(unsuggestUsers([account.get('id')])) .then(() => dispatch(snackbar.success(message))) .catch(() => {}); }, onShowNote(account) { dispatch(initAccountNoteModal(account)); }, onRemoveFromFollowers(account) { dispatch((_, getState) => { const unfollowModal = getSettings(getState()).get('unfollowModal'); if (unfollowModal) { dispatch(openModal('CONFIRM', { message: @{account.get('acct')} }} />, confirm: intl.formatMessage(messages.removeFromFollowersConfirm), onConfirm: () => dispatch(removeFromFollowers(account.get('id'))), })); } else { dispatch(removeFromFollowers(account.get('id'))); } }); }, }); export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Header));