import type { FC } from '../../../lib/teact/teact'; import React, { memo, useCallback, useEffect, useMemo, useState, } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types'; import { ManagementScreens } from '../../../types'; import { selectChat, selectChatFullInfo } from '../../../global/selectors'; import stopEvent from '../../../util/stopEvent'; import buildClassName from '../../../util/buildClassName'; import useManagePermissions from '../hooks/useManagePermissions'; import useLang from '../../../hooks/useLang'; import useFlag from '../../../hooks/useFlag'; import useHistoryBack from '../../../hooks/useHistoryBack'; import PrivateChatInfo from '../../common/PrivateChatInfo'; import ListItem from '../../ui/ListItem'; import Checkbox from '../../ui/Checkbox'; import FloatingActionButton from '../../ui/FloatingActionButton'; import Spinner from '../../ui/Spinner'; import ConfirmDialog from '../../ui/ConfirmDialog'; type OwnProps = { chatId: string; selectedChatMemberId?: string; isPromotedByCurrentUser?: boolean; onScreenSelect: (screen: ManagementScreens) => void; onClose: NoneToVoidFunction; isActive: boolean; }; type StateProps = { chat?: ApiChat; hasFullInfo?: boolean; members?: ApiChatMember[]; isFormFullyDisabled?: boolean; }; const ITEM_HEIGHT = 24 + 32; const SHIFT_HEIGHT_MINUS = 1; const BEFORE_ITEMS_COUNT = 2; const BEFORE_USER_INFO_HEIGHT = 96; const ITEMS_COUNT = 9; const ManageGroupUserPermissions: FC = ({ chat, selectedChatMemberId, hasFullInfo, members, onScreenSelect, isFormFullyDisabled, onClose, isActive, }) => { const { updateChatMemberBannedRights } = getActions(); const selectedChatMember = useMemo(() => { if (!members) { return undefined; } return members.find(({ userId }) => userId === selectedChatMemberId); }, [members, selectedChatMemberId]); const { permissions, havePermissionChanged, isLoading, handlePermissionChange, setIsLoading, } = useManagePermissions(selectedChatMember?.bannedRights || chat?.defaultBannedRights); const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag(); const lang = useLang(); const { isForum } = chat || {}; useHistoryBack({ isActive, onBack: onClose, }); useEffect(() => { if (hasFullInfo && selectedChatMemberId && !selectedChatMember) { onScreenSelect(ManagementScreens.GroupPermissions); } }, [chat, hasFullInfo, onScreenSelect, selectedChatMember, selectedChatMemberId]); const handleSavePermissions = useCallback(() => { if (!chat || !selectedChatMemberId) { return; } setIsLoading(true); updateChatMemberBannedRights({ chatId: chat.id, userId: selectedChatMemberId, bannedRights: permissions, }); }, [chat, selectedChatMemberId, setIsLoading, updateChatMemberBannedRights, permissions]); const handleBanFromGroup = useCallback(() => { if (!chat || !selectedChatMemberId) { return; } updateChatMemberBannedRights({ chatId: chat.id, userId: selectedChatMemberId, bannedRights: { viewMessages: true, }, }); }, [chat, selectedChatMemberId, updateChatMemberBannedRights]); const getControlIsDisabled = useCallback((key: Exclude) => { if (isFormFullyDisabled) { return true; } if (!chat || !chat.defaultBannedRights) { return false; } return chat.defaultBannedRights[key]; }, [chat, isFormFullyDisabled]); const [isMediaDropdownOpen, setIsMediaDropdownOpen] = useState(false); const handleOpenMediaDropdown = useCallback((e: React.MouseEvent) => { stopEvent(e); setIsMediaDropdownOpen(!isMediaDropdownOpen); }, [isMediaDropdownOpen]); if (!selectedChatMember) { return undefined; } return (

{lang('UserRestrictionsCanDo')}

{isForum && (
)}
{!isFormFullyDisabled && (
{lang('UserRestrictionsBlock')}
)}
{isLoading ? ( ) : ( )}
); }; export default memo(withGlobal( (global, { chatId, isPromotedByCurrentUser }): StateProps => { const chat = selectChat(global, chatId)!; const fullInfo = selectChatFullInfo(global, chatId); const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser); return { chat, isFormFullyDisabled, hasFullInfo: Boolean(fullInfo), members: fullInfo?.members, }; }, )(ManageGroupUserPermissions));