/** @jsx createElement */ import { createElement, Component } from 'preact'; import b from 'bem-react-helper'; import { User, BlockedUser, Theme, BlockTTL } from '@app/common/types'; import { getHandleClickProps } from '@app/common/accessibility'; import { StoreState } from '@app/store'; import { defineMessages, IntlShape, FormattedMessage, useIntl } from 'react-intl'; interface Props { theme: Theme; intl: IntlShape; user: StoreState['user']; blockedUsers: BlockedUser[]; hiddenUsers: StoreState['hiddenUsers']; blockUser(id: User['id'], name: string, ttl: BlockTTL): Promise; unblockUser(id: User['id']): Promise; hideUser(user: User): void; unhideUser(userid: User['id']): void; onUnblockSomeone(): void; } interface State { /** * cached copy so we can * reapply block on unblocked user */ blockedUsers: BlockedUser[]; unblockedUsers: User['id'][]; hiddenUsers: { [id: string]: User }; unhiddenUsers: User['id'][]; } const messages = defineMessages({ blockUser: { id: 'settings.block-user', defaultMessage: 'Do you want to block {userName}?', }, unblockUser: { id: 'settings.unblock-user', defaultMessage: 'Do you want to unblock {userName}?', }, hiddenUsers: { id: 'settings.hidden-users-title', defaultMessage: 'Hidden users', }, blockedUsers: { id: 'settings.blocked-users-title', defaultMessage: 'Blocked users', }, }); export default class Settings extends Component { constructor(props: Props) { super(props); this.state = { blockedUsers: props.blockedUsers.slice(), unblockedUsers: [], hiddenUsers: { ...props.hiddenUsers }, unhiddenUsers: [], }; } block = (user: BlockedUser) => { if (!confirm(this.props.intl.formatMessage(messages.blockUser, { userName: user.name }))) return; this.setState({ unblockedUsers: this.state.unblockedUsers.filter(x => x !== user.id), }); this.props.blockUser(user.id, user.name, 'permanently'); }; unblock = (user: BlockedUser) => { if (!confirm(this.props.intl.formatMessage(messages.unblockUser, { userName: user.name }))) return; this.setState({ unblockedUsers: this.state.unblockedUsers.concat([user.id]) }); this.props.unblockUser(user.id); this.props.onUnblockSomeone(); }; hide = (user: User) => { this.setState({ unhiddenUsers: this.state.unhiddenUsers.filter(x => x !== user.id), }); this.props.hideUser(user); }; unhide = (user: User) => { this.setState({ unhiddenUsers: this.state.unhiddenUsers.concat([user.id]) }); this.props.unhideUser(user.id); this.props.onUnblockSomeone(); }; __isUserHidden = (user: User): boolean => { if (this.state.unhiddenUsers.indexOf(user.id) === -1) return true; return false; }; render({ user, theme }: Props, { blockedUsers, unblockedUsers, unhiddenUsers }: State) { const hiddenUsersList = Object.values(this.state.hiddenUsers); const intl = this.props.intl; return (

{!hiddenUsersList.length && (

)} {!!hiddenUsersList.length && (
    {hiddenUsersList.map(user => { const isUserUnhidden = unhiddenUsers.includes(user.id); return (
  • {user.name ? user.name : } {this.__isUserHidden(user) ? ( this.unhide(user))}> ) : ( this.hide(user))}> )}
    id: {user.id}
  • ); })}
)}
{user && user.admin && (

{!blockedUsers.length && (

)} {!!blockedUsers.length && (
    {blockedUsers.map(user => { const isUserUnblocked = unblockedUsers.includes(user.id); return (
  • {user.name ? user.name : } {' '} {isUserUnblocked && ( this.block(user))} className="settings__action"> )} {!isUserUnblocked && ( this.unblock(user))} className="settings__action"> )}
    id: {user.id}
  • ); })}
)}
)}
); } } const currentYear = new Date().getFullYear(); function FormatTime({ time }: { time: Date }) { const intl = useIntl(); // let's assume that if block ttl is more than 50 years then user blocked permanently if (time.getFullYear() - currentYear >= 50) return ; return ( ); }