import type { FC } from '../../../lib/teact/teact'; import { memo, useMemo } from '../../../lib/teact/teact'; import { getActions, getGlobal, withGlobal } from '../../../global'; import type { ApiChat, ApiChatMember } from '../../../api/types'; import { ManagementScreens } from '../../../types'; import { getHasAdminRight, getUserFullName, isChatChannel } from '../../../global/helpers'; import { selectChat, selectChatFullInfo } from '../../../global/selectors'; import { partition } from '../../../util/iteratees'; import useHistoryBack from '../../../hooks/useHistoryBack'; import useLastCallback from '../../../hooks/useLastCallback'; import useOldLang from '../../../hooks/useOldLang'; import Icon from '../../common/icons/Icon'; import PrivateChatInfo from '../../common/PrivateChatInfo'; import Checkbox from '../../ui/Checkbox'; import FloatingActionButton from '../../ui/FloatingActionButton'; import ListItem from '../../ui/ListItem'; type OwnProps = { chatId: string; isActive: boolean; onScreenSelect: (screen: ManagementScreens) => void; onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void; onClose: NoneToVoidFunction; }; type StateProps = { chat?: ApiChat; currentUserId?: string; isChannel?: boolean; adminMembersById?: Record; }; const ManageChatAdministrators: FC = ({ isActive, chat, isChannel, currentUserId, adminMembersById, onScreenSelect, onChatMemberSelect, onClose, }) => { const { toggleSignatures } = getActions(); const lang = useOldLang(); useHistoryBack({ isActive, onBack: onClose, }); const areSignaturesEnabled = Boolean(chat?.areSignaturesShown); const areProfilesEnabled = Boolean(chat?.areProfilesShown); const canAddNewAdmins = Boolean(chat?.isCreator || (chat && getHasAdminRight(chat, 'addAdmins'))); const canToggleSignatures = isChannel && getHasAdminRight(chat!, 'postMessages'); const adminMembers = useMemo(() => { if (!adminMembersById) { return []; } const [owner, admins] = partition(Object.values(adminMembersById), (member) => member.isOwner); return [...owner, ...admins]; }, [adminMembersById]); const handleAdminMemberClick = useLastCallback((member: ApiChatMember) => { onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId); onScreenSelect(ManagementScreens.ChatAdminRights); }); const handleToggleSignatures = useLastCallback(() => { toggleSignatures({ chatId: chat!.id, areProfilesEnabled, areSignaturesEnabled: !areSignaturesEnabled, }); }); const handleToggleProfiles = useLastCallback(() => { toggleSignatures({ chatId: chat!.id, areProfilesEnabled: !areProfilesEnabled, areSignaturesEnabled, }); }); const handleAddAdminClick = useLastCallback(() => { onScreenSelect(ManagementScreens.GroupAddAdmins); }); const getMemberStatus = useLastCallback((member: ApiChatMember) => { if (member.isOwner) { return lang('ChannelCreator'); } // No need for expensive global updates on users, so we avoid them const usersById = getGlobal().users.byId; const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined; if (promotedByUser) { return lang('EditAdminPromotedBy', getUserFullName(promotedByUser)); } return lang('ChannelAdmin'); }); return (
{lang('EventLog')} {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}

{lang(isChannel ? 'Channel.Management.AddModeratorHelp' : 'Group.Management.AddModeratorHelp')}

{adminMembers.map((member) => ( handleAdminMemberClick(member)} > ))}
{canToggleSignatures && (
{areSignaturesEnabled && ( <>

{lang('ChannelSignProfilesInfo')}

)}
)}
); }; export default memo(withGlobal( (global, { chatId }): Complete => { const chat = selectChat(global, chatId); return { chat, currentUserId: global.currentUserId, isChannel: chat && isChatChannel(chat), adminMembersById: selectChatFullInfo(global, chatId)?.adminMembersById, }; }, )(ManageChatAdministrators));