import { ChangeEvent } from 'react'; import React, { FC, memo, useCallback, useEffect, useState, } from '../../../lib/teact/teact'; import { withGlobal } from '../../../lib/teact/teactn'; import { GlobalActions } from '../../../global/types'; import { ManagementScreens, ManagementProgress } from '../../../types'; import { ApiChat, ApiMediaFormat } from '../../../api/types'; import { pick } from '../../../util/iteratees'; import { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers'; import useMedia from '../../../hooks/useMedia'; import useLang from '../../../hooks/useLang'; import { selectChat } from '../../../modules/selectors'; import AvatarEditable from '../../ui/AvatarEditable'; import InputText from '../../ui/InputText'; import ListItem from '../../ui/ListItem'; import Checkbox from '../../ui/Checkbox'; import Spinner from '../../ui/Spinner'; import FloatingActionButton from '../../ui/FloatingActionButton'; import ConfirmDialog from '../../ui/ConfirmDialog'; import useFlag from '../../../hooks/useFlag'; import useHistoryBack from '../../../hooks/useHistoryBack'; import './Management.scss'; type OwnProps = { chatId: number; onScreenSelect: (screen: ManagementScreens) => void; onClose: NoneToVoidFunction; isActive: boolean; }; type StateProps = { chat: ApiChat; progress?: ManagementProgress; isSignaturesShown: boolean; canChangeInfo?: boolean; }; type DispatchProps = Pick; const CHANNEL_TITLE_EMPTY = 'Channel title can\'t be empty'; const ManageChannel: FC = ({ chatId, chat, progress, isSignaturesShown, canChangeInfo, onScreenSelect, updateChat, toggleSignatures, closeManagement, leaveChannel, deleteChannel, openChat, onClose, isActive, }) => { const currentTitle = chat ? (chat.title || '') : ''; const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : ''; const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId; const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag(); const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false); const [title, setTitle] = useState(currentTitle); const [about, setAbout] = useState(currentAbout); const [photo, setPhoto] = useState(); const [error, setError] = useState(); const imageHash = chat && getChatAvatarHash(chat); const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl); const lang = useLang(); useHistoryBack(isActive, onClose); useEffect(() => { if (progress === ManagementProgress.Complete) { setIsProfileFieldsTouched(false); setError(undefined); } }, [progress]); const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0; const handleClickEditType = useCallback(() => { onScreenSelect(ManagementScreens.ChatPrivacyType); }, [onScreenSelect]); const handleClickDiscussion = useCallback(() => { onScreenSelect(ManagementScreens.Discussion); }, [onScreenSelect]); const handleClickAdministrators = useCallback(() => { onScreenSelect(ManagementScreens.ChatAdministrators); }, [onScreenSelect]); const handleSetPhoto = useCallback((file: File) => { setPhoto(file); setIsProfileFieldsTouched(true); }, []); const handleTitleChange = useCallback((e: ChangeEvent) => { setTitle(e.target.value); setIsProfileFieldsTouched(true); }, []); const handleAboutChange = useCallback((e: ChangeEvent) => { setAbout(e.target.value); setIsProfileFieldsTouched(true); }, []); const handleUpdateChannel = useCallback(() => { const trimmedTitle = title.trim(); const trimmedAbout = about.trim(); if (!trimmedTitle.length) { setError(CHANNEL_TITLE_EMPTY); return; } updateChat({ chatId, title: trimmedTitle, about: trimmedAbout, photo, }); }, [about, chatId, photo, title, updateChat]); const handleToggleSignatures = useCallback(() => { toggleSignatures({ chatId, isEnabled: !isSignaturesShown }); }, [chatId, isSignaturesShown, toggleSignatures]); const handleClickSubscribers = useCallback(() => { onScreenSelect(ManagementScreens.ChannelSubscribers); }, [onScreenSelect]); const handleDeleteChannel = useCallback(() => { if (chat.isCreator) { deleteChannel({ chatId: chat.id }); } else { leaveChannel({ chatId: chat.id }); } closeDeleteDialog(); closeManagement(); openChat({ id: undefined }); }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]); if (chat.isRestricted) { return undefined; } const isLoading = progress === ManagementProgress.InProgress; return (
{chat.isCreator && ( {lang('ChannelType')} {chat.username ? lang('TypePublic') : lang('TypePrivate')} )} {lang('Discussion')} {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')} {lang('ChannelAdministrators')} {adminsCount}
{lang('ChannelSubscribers')} {lang('Subscribers', chat.membersCount!, 'i')}
{chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}
{isLoading ? ( ) : ( )}
); }; export default memo(withGlobal( (global, { chatId }): StateProps => { const chat = selectChat(global, chatId)!; const { progress } = global.management; const isSignaturesShown = Boolean(chat && chat.isSignaturesShown); return { chat, progress, isSignaturesShown, canChangeInfo: getHasAdminRight(chat, 'changeInfo'), }; }, (setGlobal, actions): DispatchProps => pick(actions, [ 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat', ]), )(ManageChannel));