import type { FC } from '../../lib/teact/teact'; import { useEffect, useMemo, useState, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import type { ApiExportedInvite } from '../../api/types'; import type { GiftProfileFilterOptions, ThreadId } from '../../types'; import { MAIN_THREAD_ID } from '../../api/types'; import { ManagementScreens, ProfileState, SettingsScreens } from '../../types'; import { ANIMATION_END_DELAY, SAVED_FOLDER_ID } from '../../config'; import { getCanAddContact, getCanManageTopic, isChatChannel, isUserBot, } from '../../global/helpers'; import { selectCanManage, selectCanUseGiftProfileAdminFilter, selectCanUseGiftProfileFilter, selectChat, selectChatFullInfo, selectCurrentGifSearch, selectCurrentStickerSearch, selectIsChatWithSelf, selectTabState, selectTopic, selectUser, } from '../../global/selectors'; import { IS_TAURI } from '../../util/browser/globalEnvironment'; import { IS_MAC_OS } from '../../util/browser/windowEnvironment'; import buildClassName from '../../util/buildClassName'; import { isUserId } from '../../util/entities/ids'; import { useVtn } from '../../hooks/animations/useVtn'; import useAppLayout from '../../hooks/useAppLayout'; import useCurrentOrPrev from '../../hooks/useCurrentOrPrev'; import useFlag from '../../hooks/useFlag'; import { useFolderManagerForChatsCount } from '../../hooks/useFolderManager'; import useLang from '../../hooks/useLang'; import useLastCallback from '../../hooks/useLastCallback'; import useOldLang from '../../hooks/useOldLang'; import Button from '../ui/Button'; import ConfirmDialog from '../ui/ConfirmDialog'; import DropdownMenu from '../ui/DropdownMenu'; import MenuItem from '../ui/MenuItem'; import MenuSeparator from '../ui/MenuSeparator'; import SearchInput from '../ui/SearchInput'; import Transition from '../ui/Transition'; import './RightHeader.scss'; type OwnProps = { chatId?: string; threadId?: ThreadId; isColumnOpen?: boolean; isProfile?: boolean; isManagement?: boolean; isStatistics?: boolean; isBoostStatistics?: boolean; isMessageStatistics?: boolean; isMonetizationStatistics?: boolean; isStoryStatistics?: boolean; isStickerSearch?: boolean; isGifSearch?: boolean; isPollResults?: boolean; isCreatingTopic?: boolean; isEditingTopic?: boolean; isAddingChatMembers?: boolean; profileState?: ProfileState; managementScreen?: ManagementScreens; onClose: (shouldScrollUp?: boolean) => void; onScreenSelect: (screen: ManagementScreens) => void; }; type StateProps = { canAddContact?: boolean; canManage?: boolean; canViewStatistics?: boolean; isChannel?: boolean; userId?: string; isSelf?: boolean; stickerSearchQuery?: string; gifSearchQuery?: string; isEditingInvite?: boolean; currentInviteInfo?: ApiExportedInvite; shouldSkipHistoryAnimations?: boolean; isBot?: boolean; canEditBot?: boolean; giftProfileFilter: GiftProfileFilterOptions; canUseGiftFilter?: boolean; canUseGiftAdminFilter?: boolean; isInsideTopic?: boolean; canEditTopic?: boolean; isSavedMessages?: boolean; isOwnProfile?: boolean; }; const COLUMN_ANIMATION_DURATION = 450 + ANIMATION_END_DELAY; enum HeaderContent { Profile, MemberList, GiftList, SharedMedia, StoryList, Search, Statistics, MessageStatistics, StoryStatistics, BoostStatistics, MonetizationStatistics, Management, ManageInitial, ManageChannelSubscribers, ManageChatAdministrators, ManageChatPrivacyType, ManageDiscussion, ManageGroupPermissions, ManageGroupRemovedUsers, ManageChannelRemovedUsers, ManageGroupUserPermissionsCreate, ManageGroupUserPermissions, ManageGroupRecentActions, ManageGroupAdminRights, ManageGroupNewAdminRights, ManageGroupMembers, ManageGroupAddAdmins, StickerSearch, GifSearch, PollResults, AddingMembers, ManageInvites, ManageEditInvite, ManageReactions, ManageInviteInfo, ManageJoinRequests, CreateTopic, EditTopic, SavedDialogs, NewDiscussionGroup, } const RightHeader: FC = ({ chatId, threadId, isColumnOpen, isProfile, isManagement, isStatistics, isMessageStatistics, isStoryStatistics, isMonetizationStatistics, isBoostStatistics, isStickerSearch, isGifSearch, isPollResults, isCreatingTopic, isEditingTopic, isAddingChatMembers, profileState, managementScreen, canAddContact, userId, isSelf, canManage, isChannel, stickerSearchQuery, gifSearchQuery, isEditingInvite, canViewStatistics, currentInviteInfo, shouldSkipHistoryAnimations, isBot, isInsideTopic, canEditTopic, isSavedMessages, canEditBot, giftProfileFilter, canUseGiftFilter, canUseGiftAdminFilter, isOwnProfile, onClose, onScreenSelect, }) => { const { setStickerSearchQuery, setGifSearchQuery, toggleManagement, openAddContactDialog, toggleStatistics, setEditingExportedInvite, deleteExportedChatInvite, openEditTopicPanel, updateGiftProfileFilter, openSettingsScreen, } = getActions(); const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag(); const { isMobile } = useAppLayout(); const { createVtnStyle } = useVtn(); const { sortType: giftsSortType, shouldIncludeUnlimited: shouldIncludeUnlimitedGifts, shouldIncludeLimited: shouldIncludeLimitedGifts, shouldIncludeUpgradable: shouldIncludeUpgradableGifts, shouldIncludeUnique: shouldIncludeUniqueGifts, shouldIncludeDisplayed: shouldIncludeDisplayedGifts, shouldIncludeHidden: shouldIncludeHiddenGifts, } = giftProfileFilter; const foldersChatCount = useFolderManagerForChatsCount(); const handleEditInviteClick = useLastCallback(() => { setEditingExportedInvite({ chatId: chatId!, invite: currentInviteInfo! }); onScreenSelect(ManagementScreens.EditInvite); }); const handleDeleteInviteClick = useLastCallback(() => { deleteExportedChatInvite({ chatId: chatId!, link: currentInviteInfo!.link }); onScreenSelect(ManagementScreens.Invites); closeDeleteDialog(); }); const handleStickerSearchQueryChange = useLastCallback((query: string) => { setStickerSearchQuery({ query }); }); const handleGifSearchQueryChange = useLastCallback((query: string) => { setGifSearchQuery({ query }); }); const handleAddContact = useLastCallback(() => { openAddContactDialog({ userId }); }); const toggleEditTopic = useLastCallback(() => { if (!chatId || !threadId) return; openEditTopicPanel({ chatId, topicId: Number(threadId) }); }); const handleToggleManagement = useLastCallback(() => { toggleManagement(); }); const handleToggleStatistics = useLastCallback(() => { toggleStatistics(); }); const handleEditProfile = useLastCallback(() => { openSettingsScreen({ screen: SettingsScreens.EditProfile }); }); const handleClose = useLastCallback(() => { onClose(!isSavedMessages); }); const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen); useEffect(() => { setTimeout(() => { setShouldSkipTransition(!isColumnOpen); }, COLUMN_ANIMATION_DURATION); }, [isColumnOpen]); const oldLang = useOldLang(); const lang = useLang(); const contentKey = isProfile ? ( profileState === ProfileState.Profile ? ( HeaderContent.Profile ) : profileState === ProfileState.SharedMedia ? ( HeaderContent.SharedMedia ) : profileState === ProfileState.MemberList ? ( HeaderContent.MemberList ) : profileState === ProfileState.GiftList ? ( HeaderContent.GiftList ) : profileState === ProfileState.StoryList ? ( HeaderContent.StoryList ) : profileState === ProfileState.SavedDialogs ? ( HeaderContent.SavedDialogs ) : -1 // Never reached ) : isPollResults ? ( HeaderContent.PollResults ) : isStickerSearch ? ( HeaderContent.StickerSearch ) : isGifSearch ? ( HeaderContent.GifSearch ) : isAddingChatMembers ? ( HeaderContent.AddingMembers ) : isManagement ? ( managementScreen === ManagementScreens.Initial ? ( HeaderContent.ManageInitial ) : managementScreen === ManagementScreens.ChatPrivacyType ? ( HeaderContent.ManageChatPrivacyType ) : managementScreen === ManagementScreens.Discussion ? ( HeaderContent.ManageDiscussion ) : managementScreen === ManagementScreens.ChannelSubscribers ? ( HeaderContent.ManageChannelSubscribers ) : managementScreen === ManagementScreens.GroupPermissions ? ( HeaderContent.ManageGroupPermissions ) : managementScreen === ManagementScreens.ChatAdministrators ? ( HeaderContent.ManageChatAdministrators ) : managementScreen === ManagementScreens.GroupRemovedUsers ? ( HeaderContent.ManageGroupRemovedUsers ) : managementScreen === ManagementScreens.ChannelRemovedUsers ? ( HeaderContent.ManageChannelRemovedUsers ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? ( HeaderContent.ManageGroupUserPermissionsCreate ) : managementScreen === ManagementScreens.GroupUserPermissions ? ( HeaderContent.ManageGroupUserPermissions ) : managementScreen === ManagementScreens.GroupRecentActions ? ( HeaderContent.ManageGroupRecentActions ) : managementScreen === ManagementScreens.ChatAdminRights ? ( HeaderContent.ManageGroupAdminRights ) : managementScreen === ManagementScreens.ChatNewAdminRights ? ( HeaderContent.ManageGroupNewAdminRights ) : managementScreen === ManagementScreens.GroupMembers ? ( HeaderContent.ManageGroupMembers ) : managementScreen === ManagementScreens.Invites ? ( HeaderContent.ManageInvites ) : managementScreen === ManagementScreens.EditInvite ? ( HeaderContent.ManageEditInvite ) : managementScreen === ManagementScreens.GroupAddAdmins ? ( HeaderContent.ManageGroupAddAdmins ) : managementScreen === ManagementScreens.Reactions ? ( HeaderContent.ManageReactions ) : managementScreen === ManagementScreens.InviteInfo ? ( HeaderContent.ManageInviteInfo ) : managementScreen === ManagementScreens.JoinRequests ? ( HeaderContent.ManageJoinRequests ) : managementScreen === ManagementScreens.NewDiscussionGroup ? ( HeaderContent.NewDiscussionGroup ) : undefined // Never reached ) : isStatistics ? ( HeaderContent.Statistics ) : isMessageStatistics ? ( HeaderContent.MessageStatistics ) : isStoryStatistics ? ( HeaderContent.StoryStatistics ) : isBoostStatistics ? ( HeaderContent.BoostStatistics ) : isCreatingTopic ? ( HeaderContent.CreateTopic ) : isEditingTopic ? ( HeaderContent.EditTopic ) : isMonetizationStatistics ? ( HeaderContent.MonetizationStatistics ) : undefined; // When column is closed const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1; function getHeaderTitle() { if (isOwnProfile) { return lang('MyProfileHeader'); } if (isSavedMessages) { return oldLang('SavedMessages'); } if (isInsideTopic) { return oldLang('AccDescrTopic'); } if (isChannel) { return oldLang('Channel.TitleInfo'); } if (userId) { return oldLang(isBot ? 'lng_info_bot_title' : 'lng_info_user_title'); } return oldLang('GroupInfo.Title'); } const PrimaryLinkMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => { return ({ onTrigger, isOpen }) => ( {renderHeaderContent()} ); }; export default withGlobal( (global, { chatId, isProfile, isManagement, threadId, }): Complete => { const tabState = selectTabState(global); const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {}; const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {}; const chat = chatId ? selectChat(global, chatId) : undefined; const user = isProfile && chatId && isUserId(chatId) ? selectUser(global, chatId) : undefined; const isChannel = chat && isChatChannel(chat); const isInsideTopic = chat?.isForum && Boolean(threadId && threadId !== MAIN_THREAD_ID); const topic = isInsideTopic ? selectTopic(global, chatId!, threadId!) : undefined; const canEditTopic = isInsideTopic && topic && getCanManageTopic(chat, topic); const isBot = user && isUserBot(user); const isOwnProfile = tabState.chatInfo?.isOwnProfile; const isSavedMessages = chatId && !isOwnProfile ? selectIsChatWithSelf(global, chatId) : undefined; const canEditBot = isBot && user?.canEditBot; const canAddContact = user && getCanAddContact(user); const canManage = Boolean(!isManagement && isProfile && chatId && selectCanManage(global, chatId)); const isEditingInvite = Boolean(chatId && tabState.management.byChatId[chatId]?.editingInvite); const canViewStatistics = !isInsideTopic && chatId ? selectChatFullInfo(global, chatId)?.canViewStatistics : undefined; const currentInviteInfo = chatId ? tabState.management.byChatId[chatId]?.inviteInfo?.invite : undefined; const giftProfileFilter = tabState.savedGifts.filter; const canUseGiftFilter = chatId ? selectCanUseGiftProfileFilter(global, chatId) : false; const canUseGiftAdminFilter = chatId ? selectCanUseGiftProfileAdminFilter(global, chatId) : false; return { canManage, canAddContact, canViewStatistics, isChannel, isBot, isInsideTopic, canEditTopic, userId: user?.id, isSelf: user?.isSelf, stickerSearchQuery, gifSearchQuery, isEditingInvite, currentInviteInfo, isSavedMessages, shouldSkipHistoryAnimations: tabState.shouldSkipHistoryAnimations, canEditBot, giftProfileFilter, canUseGiftFilter, canUseGiftAdminFilter, isOwnProfile, }; }, )(RightHeader);