import React, { FC, memo, useCallback, useEffect, useMemo, useState, } from '../../../lib/teact/teact'; import { withGlobal } from '../../../lib/teact/teactn'; import { ApiChat, ApiChatBannedRights } from '../../../api/types'; import { ManagementScreens } from '../../../types'; import { GlobalActions } from '../../../global/types'; import { pick } from '../../../util/iteratees'; import { selectChat } from '../../../modules/selectors'; 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: number; selectedChatMemberId?: number; isPromotedByCurrentUser?: boolean; onScreenSelect: (screen: ManagementScreens) => void; onClose: NoneToVoidFunction; isActive: boolean; }; type StateProps = { chat?: ApiChat; isFormFullyDisabled?: boolean; }; type DispatchProps = Pick; const ManageGroupUserPermissions: FC = ({ chat, selectedChatMemberId, onScreenSelect, updateChatMemberBannedRights, isFormFullyDisabled, onClose, isActive, }) => { const [permissions, setPermissions] = useState({}); const [havePermissionChanged, setHavePermissionChanged] = useState(false); const [isLoading, setIsLoading] = useState(false); const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag(); const lang = useLang(); useHistoryBack(isActive, onClose); const selectedChatMember = useMemo(() => { if (!chat || !chat.fullInfo || !chat.fullInfo.members) { return undefined; } return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId); }, [chat, selectedChatMemberId]); useEffect(() => { if (chat?.fullInfo && selectedChatMemberId && !selectedChatMember) { onScreenSelect(ManagementScreens.GroupPermissions); } }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]); useEffect(() => { setPermissions((selectedChatMember?.bannedRights) || (chat?.defaultBannedRights) || {}); setHavePermissionChanged(false); setIsLoading(false); }, [chat, selectedChatMember]); const handlePermissionChange = useCallback((e: React.ChangeEvent) => { const { name } = e.target; function getUpdatedPermissionValue(value: true | undefined) { return value ? undefined : true; } setPermissions((p) => ({ ...p, [name]: getUpdatedPermissionValue(p[name as Exclude]), ...(name === 'sendStickers' && { sendGifs: getUpdatedPermissionValue(p[name]), }), })); setHavePermissionChanged(true); }, []); const handleSavePermissions = useCallback(() => { if (!chat || !selectedChatMemberId) { return; } setIsLoading(true); updateChatMemberBannedRights({ chatId: chat.id, userId: selectedChatMemberId, bannedRights: permissions, }); }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]); 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]); if (!selectedChatMember) { return undefined; } return (

{lang('UserRestrictionsCanDo')}

{!isFormFullyDisabled && (
{lang('UserRestrictionsBlock')}
)}
{isLoading ? ( ) : ( )}
); }; export default memo(withGlobal( (global, { chatId, isPromotedByCurrentUser }): StateProps => { const chat = selectChat(global, chatId)!; const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser); return { chat, isFormFullyDisabled }; }, (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']), )(ManageGroupUserPermissions));