import type { FC } from '../../../lib/teact/teact'; import React, { memo, useCallback, useMemo } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiChat, ApiCountryCode, ApiUser } from '../../../api/types'; import { CHAT_HEIGHT_PX } from '../../../config'; import { formatPhoneNumberWithCode } from '../../../util/phoneNumber'; import { getMainUsername, isUserId } from '../../../global/helpers'; import buildClassName from '../../../util/buildClassName'; import useLang from '../../../hooks/useLang'; import useHistoryBack from '../../../hooks/useHistoryBack'; import useFlag from '../../../hooks/useFlag'; import ListItem from '../../ui/ListItem'; import FloatingActionButton from '../../ui/FloatingActionButton'; import Avatar from '../../common/Avatar'; import Loading from '../../ui/Loading'; import BlockUserModal from './BlockUserModal'; import FullNameTitle from '../../common/FullNameTitle'; type OwnProps = { isActive?: boolean; onReset: () => void; }; type StateProps = { chatsByIds: Record; usersByIds: Record; blockedIds: string[]; phoneCodeList: ApiCountryCode[]; }; const SettingsPrivacyBlockedUsers: FC = ({ isActive, onReset, chatsByIds, usersByIds, blockedIds, phoneCodeList, }) => { const { unblockContact } = getActions(); const lang = useLang(); const [isBlockUserModalOpen, openBlockUserModal, closeBlockUserModal] = useFlag(); const handleUnblockClick = useCallback((contactId: string) => { unblockContact({ contactId }); }, [unblockContact]); useHistoryBack({ isActive, onBack: onReset, }); const blockedUsernamesById = useMemo(() => { return blockedIds.reduce((acc, contactId) => { const isPrivate = isUserId(contactId); const user = isPrivate ? usersByIds[contactId] : undefined; const mainUsername = user && !user.phoneNumber && getMainUsername(user); if (mainUsername) { acc[contactId] = mainUsername; } return acc; }, {} as Record); }, [blockedIds, usersByIds]); function renderContact(contactId: string, i: number, viewportOffset: number) { const isPrivate = isUserId(contactId); const user = usersByIds[contactId]; const chat = chatsByIds[contactId]; const peer = user || chat; const className = buildClassName( 'Chat chat-item-clickable blocked-list-item small-icon', isPrivate ? 'private' : 'group', ); const userMainUsername = blockedUsernamesById[contactId]; return ( { handleUnblockClick(contactId); }, }]} style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`} >
{peer && } {user?.phoneNumber && (
{formatPhoneNumberWithCode(phoneCodeList, user.phoneNumber)}
)} {userMainUsername && (
@{userMainUsername}
)}
); } return (

{lang('BlockedUsersInfo')}

{blockedIds?.length ? (
{blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}
) : blockedIds && !blockedIds.length ? (
{lang('NoBlocked')}
) : ( )}
); }; export default memo(withGlobal( (global): StateProps => { const { chats: { byId: chatsByIds, }, users: { byId: usersByIds, }, blocked: { ids, }, countryList: { phoneCodes: phoneCodeList, }, } = global; return { chatsByIds, usersByIds, blockedIds: ids, phoneCodeList, }; }, )(SettingsPrivacyBlockedUsers));