mirror of
https://github.com/danog/telegram-tt.git
synced 2024-11-27 04:45:08 +01:00
1 line
91 KiB
Plaintext
1 line
91 KiB
Plaintext
{"version":3,"file":"970.81d005f8fdd6b7e03eb7.js","mappings":"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","sources":["webpack://telegram-t/./src/components/right/DeleteMemberModal.tsx","webpack://telegram-t/./src/global/actions/api/chats.ts","webpack://telegram-t/./src/global/actions/ui/calls.ts","webpack://telegram-t/./src/global/reducers/calls.ts","webpack://telegram-t/./src/global/selectors/calls.ts","webpack://telegram-t/./src/util/deeplink.ts"],"sourcesContent":["import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectCurrentChat, selectUser } from '../../global/selectors';\nimport { getUserFirstOrLastName } from '../../global/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n userId?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n contactName?: string;\n};\n\nconst DeleteMemberModal: FC<OwnProps & StateProps> = ({\n isOpen,\n chat,\n userId,\n contactName,\n onClose,\n}) => {\n const { deleteChatMember } = getActions();\n\n const lang = useLang();\n\n const handleDeleteChatMember = useCallback(() => {\n deleteChatMember({ chatId: chat!.id, userId });\n onClose();\n }, [chat, deleteChatMember, onClose, userId]);\n\n if (!chat || !userId) {\n return undefined;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n onEnter={handleDeleteChatMember}\n className=\"delete\"\n title={lang('GroupRemoved.Remove')}\n >\n <p>{renderText(lang('PeerInfo.Confirm.RemovePeer', contactName))}</p>\n <Button color=\"danger\" className=\"confirm-dialog-button\" isText onClick={handleDeleteChatMember}>\n {lang('lng_box_remove')}\n </Button>\n <Button className=\"confirm-dialog-button\" isText onClick={onClose}>{lang('Cancel')}</Button>\n </Modal>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { userId }): StateProps => {\n const chat = selectCurrentChat(global);\n const user = userId && selectUser(global, userId);\n const contactName = user ? getUserFirstOrLastName(user) : undefined;\n\n return {\n chat,\n contactName,\n };\n },\n)(DeleteMemberModal));\n","import {\n addActionHandler, getActions, getGlobal, setGlobal,\n} from '../../index';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NewChatMembersProgress, ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n TIPS_USERNAME,\n LOCALIZED_TIPS,\n RE_TG_LINK,\n SERVICE_NOTIFICATIONS_USER_ID,\n TMP_CHAT_ID, ALL_FOLDER_ID, DEBUG,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats, addUsers, addUserStatuses, replaceThreadParam,\n updateChatListIds, updateChats, updateChat, updateChatListSecondaryInfo,\n updateManagementProgress, leaveChat, replaceUsers, replaceUserStatuses,\n replaceChats, replaceChatListIds, addChatMembers,\n} from '../../reducers';\nimport {\n selectChat, selectUser, selectChatListType, selectIsChatPinned,\n selectChatFolder, selectSupportChat, selectChatByUsername, selectThreadTopMessageId,\n selectCurrentMessageList, selectThreadInfo, selectCurrentChat, selectLastServiceNotification,\n selectVisibleUsers, selectUserByPhoneNumber,\n} from '../../selectors';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, isChatBasicGroup,\n} from '../../helpers';\nimport { processDeepLink } from '../../../util/deeplink';\nimport { updateGroupCall } from '../../reducers/calls';\nimport { selectGroupCall } from '../../selectors/calls';\nimport { getOrderedIds } from '../../../util/folderManager';\nimport * as langProvider from '../../../util/langProvider';\n\nconst TOP_CHAT_MESSAGES_PRELOAD_INTERVAL = 100;\nconst INFINITE_LOOP_MARKER = 100;\n\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddActionHandler('preloadTopChatMessages', async (global, actions) => {\n const preloadedChatIds = new Set<string>();\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHAT_MESSAGES_PRELOAD_INTERVAL);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const folderAllOrderedIds = getOrderedIds(ALL_FOLDER_ID);\n const nextChatId = folderAllOrderedIds?.find((id) => id !== currentChatId && !preloadedChatIds.has(id));\n if (!nextChatId) {\n return;\n }\n\n preloadedChatIds.add(nextChatId);\n\n actions.loadViewportMessages({ chatId: nextChatId, threadId: MAIN_THREAD_ID });\n }\n});\n\naddActionHandler('openChat', (global, actions, payload) => {\n const { id, threadId = MAIN_THREAD_ID } = payload;\n if (!id) {\n return;\n }\n\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat?.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n // Please telegram send us some updates about linked chat 🙏\n if (chat && chat.lastMessage && chat.lastMessage.threadInfo) {\n actions.requestThreadInfoUpdate({\n chatId: chat.lastMessage.threadInfo.chatId,\n threadId: chat.lastMessage.threadInfo.threadId,\n });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddActionHandler('openLinkedChat', async (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n const chatFullInfo = await callApi('fetchFullChat', chat);\n\n if (chatFullInfo?.fullInfo?.linkedChatId) {\n actions.openChat({ id: chatFullInfo.fullInfo.linkedChatId });\n }\n});\n\naddActionHandler('focusMessageInComments', async (global, actions, payload) => {\n const { chatId, threadId, messageId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const result = await callApi('requestThreadInfoUpdate', { chat, threadId });\n if (!result) {\n return;\n }\n\n actions.focusMessage({ chatId, threadId, messageId });\n});\n\naddActionHandler('openSupportChat', async (global, actions) => {\n const chat = selectSupportChat(global);\n if (chat) {\n actions.openChat({ id: chat.id, shouldReplaceHistory: true });\n return;\n }\n\n actions.openChat({ id: TMP_CHAT_ID, shouldReplaceHistory: true });\n\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId, shouldReplaceHistory: true });\n }\n});\n\naddActionHandler('openTipsChat', (global, actions, payload) => {\n const { langCode } = payload;\n\n const usernamePostfix = langCode === 'pt-br'\n ? 'BR'\n : LOCALIZED_TIPS.includes(langCode) ? (langCode as string).toUpperCase() : '';\n\n actions.openChatByUsername({ username: `${TIPS_USERNAME}${usernamePostfix}` });\n});\n\naddActionHandler('loadAllChats', async (global, actions, payload) => {\n const listType = payload.listType as 'active' | 'archived';\n const { onReplace } = payload;\n let { shouldReplace } = payload;\n let i = 0;\n\n while (shouldReplace || !getGlobal().chats.isFullyLoaded[listType]) {\n if (i++ >= INFINITE_LOOP_MARKER) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('`actions/loadAllChats`: Infinite loop detected');\n }\n\n return;\n }\n\n global = getGlobal();\n\n if (global.connectionState !== 'connectionStateReady' || global.authState !== 'authorizationStateReady') {\n return;\n }\n\n const listIds = !shouldReplace && global.chats.listIds[listType];\n const oldestChat = listIds\n ? listIds\n /* eslint-disable @typescript-eslint/no-loop-func */\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat?.lastMessage) && !selectIsChatPinned(global, chat.id))\n /* eslint-enable @typescript-eslint/no-loop-func */\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n await loadChats(listType, oldestChat?.id, oldestChat?.lastMessage!.date, shouldReplace);\n\n if (shouldReplace) {\n onReplace?.();\n shouldReplace = false;\n }\n }\n});\n\naddActionHandler('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddActionHandler('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddActionHandler('requestChatUpdate', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', {\n chat,\n serverTimeOffset,\n ...(chatId === SERVICE_NOTIFICATIONS_USER_ID && {\n lastLocalMessage: selectLastServiceNotification(global)?.message,\n }),\n });\n});\n\naddActionHandler('updateChatMutedState', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n setGlobal(updateChat(global, chatId, { isMuted }));\n void callApi('updateChatMutedState', { chat, isMuted, serverTimeOffset });\n});\n\naddActionHandler('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as string[])\n .map((id) => selectUser(global, id))\n .filter<ApiUser>(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddActionHandler('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddActionHandler('deleteChatUser', (global, actions, payload) => {\n const { chatId, userId }: { chatId: string; userId: string } = payload!;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n if (!chat || !user) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n void callApi('deleteChatUser', { chat, user });\n});\n\naddActionHandler('deleteChat', (global, actions, payload) => {\n const { chatId }: { chatId: string } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n void callApi('deleteChat', { chatId: chat.id });\n});\n\naddActionHandler('leaveChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n const { id: channelId, accessHash } = chat;\n if (channelId && accessHash) {\n void callApi('leaveChannel', { channelId, accessHash });\n }\n});\n\naddActionHandler('deleteChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n const { id: channelId, accessHash } = chat;\n if (channelId && accessHash) {\n void callApi('deleteChannel', { channelId, accessHash });\n }\n});\n\naddActionHandler('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as string[])\n .map((id) => selectUser(global, id))\n .filter<ApiUser>(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddActionHandler('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddActionHandler('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddActionHandler('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddActionHandler('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddActionHandler('editChatFolders', (global, actions, payload) => {\n const { chatId, idsToRemove, idsToAdd } = payload!;\n\n (idsToRemove as number[]).forEach(async (id) => {\n const folder = selectChatFolder(global, id);\n if (folder) {\n await callApi('editChatFolder', {\n id,\n folderUpdate: {\n ...folder,\n pinnedChatIds: folder.pinnedChatIds?.filter((pinnedId) => pinnedId !== chatId),\n includedChatIds: folder.includedChatIds.filter((includedId) => includedId !== chatId),\n },\n });\n }\n });\n\n (idsToAdd as number[]).forEach(async (id) => {\n const folder = selectChatFolder(global, id);\n if (folder) {\n await callApi('editChatFolder', {\n id,\n folderUpdate: {\n ...folder,\n includedChatIds: folder.includedChatIds.concat(chatId),\n },\n });\n }\n });\n});\n\naddActionHandler('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddActionHandler('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds?.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddActionHandler('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddActionHandler('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const { serverTimeOffset } = global;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { serverTimeOffset, chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddActionHandler('openChatByInvite', async (global, actions, payload) => {\n const { hash } = payload!;\n\n const result = await callApi('openChatByInvite', hash);\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.chatId });\n});\n\naddActionHandler('openChatByPhoneNumber', async (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByPhoneNumber(phoneNumber);\n if (!chat) {\n actions.openPreviousChat();\n actions.showNotification({\n message: langProvider.getTranslation('lng_username_by_phone_not_found').replace('{phone}', phoneNumber),\n });\n return;\n }\n\n actions.openChat({ id: chat.id });\n});\n\naddActionHandler('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n if (url.match(RE_TG_LINK)) {\n processDeepLink(url.match(RE_TG_LINK)[0]);\n return;\n }\n\n const uri = new URL(url.startsWith('http') ? url : `https://${url}`);\n const [part1, part2, part3] = uri.pathname.split('/').filter(Boolean).map((l) => decodeURI(l));\n const params = Object.fromEntries(uri.searchParams);\n\n let hash: string | undefined;\n if (part1 === 'joinchat') {\n hash = part2;\n }\n\n if (part1.match(/^\\+([0-9]+)(\\?|$)/)) {\n actions.openChatByPhoneNumber({ phoneNumber: part1.substr(1, part1.length - 1) });\n return;\n }\n\n if (part1.startsWith(' ') || part1.startsWith('+')) {\n hash = part1.substr(1, part1.length - 1);\n }\n\n if (hash) {\n actions.openChatByInvite({ hash });\n return;\n }\n\n if (part1 === 'addstickers') {\n actions.openStickerSetShortName({\n stickerSetShortName: part2,\n });\n return;\n }\n\n const chatOrChannelPostId = part2 || undefined;\n const messageId = part3 ? Number(part3) : undefined;\n const commentId = params.comment ? Number(params.comment) : undefined;\n\n if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n actions.joinVoiceChatByLink({\n username: part1,\n inviteHash: params.voicechat || params.livestream,\n });\n } else if (part1 === 'c' && chatOrChannelPostId && messageId) {\n const chatId = `-${chatOrChannelPostId}`;\n const chat = selectChat(global, chatId);\n if (!chat) {\n actions.showNotification({ message: 'Chat does not exist' });\n return;\n }\n\n actions.focusMessage({\n chatId,\n messageId,\n });\n } else {\n actions.openChatByUsername({\n username: part1,\n messageId: messageId || Number(chatOrChannelPostId),\n commentId,\n startParam: params.start,\n });\n }\n});\n\naddActionHandler('acceptInviteConfirmation', async (global, actions, payload) => {\n const { hash } = payload!;\n const result = await callApi('importChatInvite', { hash });\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.id });\n});\n\naddActionHandler('openChatByUsername', async (global, actions, payload) => {\n const {\n username, messageId, commentId, startParam,\n } = payload!;\n\n const chat = selectCurrentChat(global);\n\n if (!commentId) {\n if (chat && chat.username === username) {\n actions.focusMessage({ chatId: chat.id, messageId });\n return;\n }\n await openChatByUsername(actions, username, messageId, startParam);\n return;\n }\n\n const { chatId, type } = selectCurrentMessageList(global) || {};\n const usernameChat = selectChatByUsername(global, username);\n if (chatId && usernameChat && type === 'thread') {\n const threadInfo = selectThreadInfo(global, chatId, messageId);\n\n if (threadInfo && threadInfo.chatId === chatId) {\n actions.focusMessage({\n chatId: threadInfo.chatId,\n threadId: threadInfo.threadId,\n messageId: commentId,\n });\n return;\n }\n }\n\n if (!messageId) return;\n\n void openCommentsByUsername(actions, username, messageId, commentId);\n});\n\naddActionHandler('togglePreHistoryHidden', async (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n\n let chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n});\n\naddActionHandler('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddActionHandler('updateChatMemberBannedRights', async (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return undefined;\n }\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return undefined;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n global = getGlobal();\n\n const chatAfterUpdate = selectChat(global, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return undefined;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = Boolean(bannedRights.viewMessages);\n const isUnblocked = !Object.keys(bannedRights).length;\n\n return updateChat(global, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n });\n});\n\naddActionHandler('updateChatAdmin', async (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n if (!chat || !user) {\n return undefined;\n }\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n if (!chat) {\n return undefined;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const chatAfterUpdate = await callApi('fetchFullChat', chat);\n if (!chatAfterUpdate?.fullInfo) {\n return undefined;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n const isDismissed = !Object.keys(adminRights).length;\n\n global = getGlobal();\n\n return updateChat(global, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n });\n});\n\naddActionHandler('updateChat', async (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n return updateManagementProgress(getGlobal(), ManagementProgress.Complete);\n});\n\naddActionHandler('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddActionHandler('loadGroupsForDiscussion', async (global) => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return undefined;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record<string, ApiChat>);\n\n global = getGlobal();\n global = addChats(global, addedById);\n return {\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById),\n },\n };\n});\n\naddActionHandler('linkDiscussionGroup', async (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo!.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n});\n\naddActionHandler('unlinkDiscussionGroup', async (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo?.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n});\n\naddActionHandler('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddActionHandler('loadMoreMembers', async (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return undefined;\n }\n\n const offset = (chat.fullInfo?.members?.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return undefined;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return undefined;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChatMembers(global, chat, members);\n return global;\n});\n\naddActionHandler('addChatMembers', async (global, actions, payload) => {\n const { chatId, memberIds } = payload;\n const chat = selectChat(global, chatId);\n const users = (memberIds as string[]).map((userId) => selectUser(global, userId)).filter<ApiUser>(Boolean as any);\n\n if (!chat || !users.length) {\n return;\n }\n\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Loading);\n await callApi('addChatMembers', chat, users);\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n loadFullChat(chat);\n});\n\naddActionHandler('deleteChatMember', async (global, actions, payload) => {\n const { chatId, userId } = payload;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n await callApi('deleteChatMember', chat, user);\n loadFullChat(chat);\n});\n\naddActionHandler('toggleIsProtected', (global, actions, payload) => {\n const { chatId, isProtected } = payload;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleIsProtected', { chat, isProtected });\n});\n\naddActionHandler('setChatEnabledReactions', async (global, actions, payload) => {\n const { chatId, enabledReactions } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) return;\n\n await callApi('setChatEnabledReactions', {\n chat,\n enabledReactions,\n });\n\n void loadFullChat(chat);\n});\n\naddActionHandler('loadChatSettings', async (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const settings = await callApi('fetchChatSettings', chat);\n if (!settings) return undefined;\n\n return updateChat(getGlobal(), chat.id, { settings });\n});\n\nasync function loadChats(\n listType: 'active' | 'archived', offsetId?: string, offsetDate?: number, shouldReplace = false,\n) {\n let global = getGlobal();\n\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: shouldReplace,\n serverTimeOffset: global.serverTimeOffset,\n lastLocalServiceMessage: selectLastServiceNotification(global)?.message,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n global = getGlobal();\n\n if (shouldReplace && listType === 'active') {\n const currentChat = selectCurrentChat(global);\n const visibleChats = currentChat ? [currentChat] : [];\n\n const visibleUsers = selectVisibleUsers(global) || [];\n if (global.currentUserId && global.users.byId[global.currentUserId]) {\n visibleUsers.push(global.users.byId[global.currentUserId]);\n }\n\n global = replaceUsers(global, buildCollectionByKey(visibleUsers.concat(result.users), 'id'));\n global = replaceUserStatuses(global, result.userStatusesById);\n global = replaceChats(global, buildCollectionByKey(visibleChats.concat(result.chats), 'id'));\n global = replaceChatListIds(global, listType, chatIds);\n } else if (shouldReplace && listType === 'archived') {\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addUserStatuses(global, result.userStatusesById);\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, listType, chatIds);\n } else {\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addUserStatuses(global, result.userStatusesById);\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n }\n\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nexport async function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return undefined;\n }\n\n const {\n users, fullInfo, groupCall, membersCount,\n } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (groupCall) {\n const existingGroupCall = selectGroupCall(global, groupCall.id!);\n global = updateGroupCall(\n global,\n groupCall.id!,\n omit(groupCall, ['connectionState']),\n undefined,\n existingGroupCall ? undefined : groupCall.participantsCount,\n );\n }\n\n global = updateChat(global, chat.id, {\n fullInfo,\n ...(membersCount && { membersCount }),\n });\n\n setGlobal(global);\n\n return result;\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getActions().openChat({ id: channelId, shouldReplaceHistory: true });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n try {\n const createdChat = await callApi('createGroupChat', {\n title,\n users,\n });\n\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getActions()\n .openChat({\n id: chatId,\n shouldReplaceHistory: true,\n });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', {\n chatId,\n photo,\n });\n }\n } catch (e: any) {\n if (e.message === 'USERS_TOO_FEW') {\n const global = getGlobal();\n setGlobal({\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: ChatCreationProgress.Error,\n error: 'CreateGroupError',\n },\n });\n }\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nexport async function fetchChatByUsername(\n username: string,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n return localChat;\n }\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n return undefined;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n return chat;\n}\n\nexport async function fetchChatByPhoneNumber(phoneNumber: string) {\n const global = getGlobal();\n const localUser = selectUserByPhoneNumber(global, phoneNumber);\n if (localUser && !localUser.isMin) {\n return selectChat(global, localUser.id);\n }\n\n const chat = await callApi('getChatByPhoneNumber', phoneNumber);\n if (!chat) {\n return undefined;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n return chat;\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n startParam?: string,\n) {\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) {\n actions.openPreviousChat();\n actions.showNotification({ message: 'User does not exist' });\n return;\n }\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n if (startParam) {\n actions.startBot({ botId: chat.id, param: startParam });\n }\n}\n\nasync function openCommentsByUsername(\n actions: GlobalActions,\n username: string,\n messageId: number,\n commentId: number,\n) {\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) return;\n\n const global = getGlobal();\n\n const threadInfo = selectThreadInfo(global, chat.id, messageId);\n let discussionChatId: string | undefined;\n\n if (!threadInfo) {\n const result = await callApi('requestThreadInfoUpdate', { chat, threadId: messageId });\n if (!result) return;\n\n discussionChatId = result.discussionChatId;\n } else {\n discussionChatId = threadInfo.chatId;\n }\n\n if (!discussionChatId) return;\n\n actions.focusMessage({\n chatId: discussionChatId,\n threadId: messageId,\n messageId: Number(commentId),\n });\n}\n","import { addActionHandler, getGlobal, setGlobal } from '../../index';\nimport { selectActiveGroupCall, selectChatGroupCall, selectGroupCall } from '../../selectors/calls';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat } from '../../selectors';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { ApiGroupCall } from '../../../api/types';\nimport { updateGroupCall } from '../../reducers/calls';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { addChats, addUsers } from '../../reducers';\nimport { fetchChatByUsername, loadFullChat } from '../api/chats';\nimport safePlay from '../../../util/safePlay';\nimport { ARE_CALLS_SUPPORTED } from '../../../util/environment';\nimport * as langProvider from '../../../util/langProvider';\n\n// Workaround for Safari not playing audio without user interaction\nlet audioElement: HTMLAudioElement | undefined;\nlet audioContext: AudioContext | undefined;\n\nconst joinAudio = new Audio('./voicechat_join.mp3');\nconst connectingAudio = new Audio('./voicechat_connecting.mp3');\nconnectingAudio.loop = true;\nconst leaveAudio = new Audio('./voicechat_leave.mp3');\nconst allowTalkAudio = new Audio('./voicechat_onallowtalk.mp3');\n\nconst sounds: Record<string, HTMLAudioElement> = {\n join: joinAudio,\n allowTalk: allowTalkAudio,\n leave: leaveAudio,\n connecting: connectingAudio,\n};\n\nlet initializationPromise: Promise<void> | undefined = Promise.resolve();\n\nconst initializeSoundsForSafari = () => {\n if (!initializationPromise) return Promise.resolve();\n\n initializationPromise = Promise.all(Object.values(sounds).map((l) => {\n l.muted = true;\n l.volume = 0.0001;\n return l.play().then(() => {\n l.pause();\n l.volume = 1;\n l.currentTime = 0;\n l.muted = false;\n });\n })).then(() => {\n initializationPromise = undefined;\n });\n\n return initializationPromise;\n};\n\nasync function fetchGroupCall(groupCall: Partial<ApiGroupCall>) {\n const result = await callApi('getGroupCall', {\n call: groupCall,\n });\n\n if (!result) return undefined;\n\n let global = getGlobal();\n\n const existingGroupCall = selectGroupCall(global, groupCall.id!);\n\n global = updateGroupCall(\n global,\n groupCall.id!,\n omit(result.groupCall, ['connectionState']),\n undefined,\n existingGroupCall?.isLoaded ? undefined : result.groupCall.participantsCount,\n );\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(global);\n\n return result.groupCall;\n}\n\nasync function fetchGroupCallParticipants(groupCall: Partial<ApiGroupCall>, nextOffset?: string) {\n const result = await callApi('fetchGroupCallParticipants', {\n call: groupCall as ApiGroupCall,\n offset: nextOffset,\n });\n\n if (!result) return;\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(global);\n}\n\naddActionHandler('toggleGroupCallPanel', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isGroupCallPanelHidden: !global.groupCalls.isGroupCallPanelHidden,\n },\n };\n});\n\naddActionHandler('subscribeToGroupCallUpdates', async (global, actions, payload) => {\n const { subscribed, id } = payload!;\n const groupCall = selectGroupCall(global, id);\n\n if (!groupCall) return;\n\n if (subscribed) {\n await fetchGroupCall(groupCall);\n await fetchGroupCallParticipants(groupCall);\n }\n\n await callApi('toggleGroupCallStartSubscription', {\n subscribed,\n call: groupCall,\n });\n});\n\naddActionHandler('createGroupCall', async (global, actions, payload) => {\n const { chatId } = payload;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const result = await callApi('createGroupCall', {\n peer: chat,\n });\n\n if (!result) return;\n\n global = getGlobal();\n setGlobal(updateGroupCall(global, result.id, {\n ...result,\n chatId,\n }));\n\n actions.joinGroupCall({ id: result.id, accessHash: result.accessHash });\n});\n\naddActionHandler('createGroupCallInviteLink', async (global, actions) => {\n const groupCall = selectActiveGroupCall(global);\n\n if (!groupCall || !groupCall.chatId) {\n return;\n }\n\n const chat = selectChat(global, groupCall.chatId);\n if (!chat) {\n return;\n }\n\n const canInvite = Boolean(chat.username);\n\n let { inviteLink } = chat.fullInfo!;\n if (canInvite) {\n inviteLink = await callApi('exportGroupCallInvite', {\n call: groupCall,\n canSelfUnmute: false,\n });\n }\n\n if (!inviteLink) {\n return;\n }\n\n copyTextToClipboard(inviteLink);\n actions.showNotification({\n message: 'Link copied to clipboard',\n });\n});\n\naddActionHandler('joinVoiceChatByLink', async (global, actions, payload) => {\n const { username, inviteHash } = payload!;\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) {\n actions.showNotification({ message: langProvider.getTranslation('NoUsernameFound') });\n return;\n }\n\n const full = await loadFullChat(chat);\n\n if (full?.groupCall) {\n actions.joinGroupCall({ id: full.groupCall.id, accessHash: full.groupCall.accessHash, inviteHash });\n }\n});\n\naddActionHandler('joinGroupCall', async (global, actions, payload) => {\n if (!ARE_CALLS_SUPPORTED) return undefined;\n\n const {\n chatId, id, accessHash, inviteHash,\n } = payload;\n\n createAudioElement();\n\n await initializeSoundsForSafari();\n const { groupCalls: { activeGroupCallId } } = global;\n let groupCall = id ? selectGroupCall(global, id) : selectChatGroupCall(global, chatId);\n\n if (groupCall?.id === activeGroupCallId) {\n actions.toggleGroupCallPanel();\n return undefined;\n }\n\n if (activeGroupCallId) {\n actions.leaveGroupCall({\n rejoin: payload,\n });\n return undefined;\n }\n\n if (groupCall && activeGroupCallId === groupCall.id) {\n actions.toggleGroupCallPanel();\n return undefined;\n }\n\n if (!groupCall && (!id || !accessHash)) {\n groupCall = await fetchGroupCall({\n id,\n accessHash,\n });\n }\n\n if (!groupCall) return undefined;\n\n global = getGlobal();\n global = updateGroupCall(\n global,\n groupCall.id,\n {\n ...groupCall,\n inviteHash,\n },\n undefined,\n groupCall.participantsCount + 1,\n );\n global = {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n activeGroupCallId: groupCall.id,\n isGroupCallPanelHidden: false,\n },\n };\n return global;\n});\n\naddActionHandler('playGroupCallSound', (global, actions, payload) => {\n const { sound } = payload!;\n\n if (!sounds[sound]) {\n return;\n }\n\n if (initializationPromise) {\n initializationPromise.then(() => {\n safePlay(sounds[sound]);\n });\n } else {\n if (sound !== 'connecting') {\n sounds.connecting.pause();\n }\n safePlay(sounds[sound]);\n }\n});\n\naddActionHandler('loadMoreGroupCallParticipants', (global) => {\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) {\n return;\n }\n\n void fetchGroupCallParticipants(groupCall, groupCall.nextOffset);\n});\n\nfunction createAudioContext() {\n return (new (window.AudioContext || (window as any).webkitAudioContext)());\n}\n\nconst silence = (ctx: AudioContext) => {\n const oscillator = ctx.createOscillator();\n const dst = oscillator.connect(ctx.createMediaStreamDestination());\n oscillator.start();\n return new MediaStream([Object.assign((dst as any).stream.getAudioTracks()[0], { enabled: false })]);\n};\n\nfunction createAudioElement() {\n const ctx = createAudioContext();\n audioElement = new Audio();\n audioContext = ctx;\n audioElement.srcObject = silence(ctx);\n safePlay(audioElement);\n}\n\nexport function getGroupCallAudioElement() {\n return audioElement;\n}\n\nexport function getGroupCallAudioContext() {\n return audioContext;\n}\n\nexport function removeGroupCallAudioElement() {\n audioElement?.pause();\n audioContext = undefined;\n audioElement = undefined;\n}\n\naddActionHandler('openCallFallbackConfirm', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isFallbackConfirmOpen: true,\n },\n };\n});\n\naddActionHandler('closeCallFallbackConfirm', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isFallbackConfirmOpen: false,\n },\n };\n});\n","import { GroupCallParticipant } from '../../lib/secret-sauce';\nimport { GlobalState } from '../types';\nimport { ApiGroupCall } from '../../api/types';\nimport { selectGroupCall } from '../selectors/calls';\nimport { omit } from '../../util/iteratees';\nimport { updateChat } from './chats';\nimport { selectChat } from '../selectors';\n\nexport function updateGroupCall(\n global: GlobalState,\n groupCallId: string,\n groupCallUpdate: Partial<ApiGroupCall>,\n addToParticipantCount?: number,\n resetParticipantCount?: number,\n): GlobalState {\n const unfiltered = Object.values({\n ...global.groupCalls.byId[groupCallId]?.participants,\n ...groupCallUpdate.participants,\n });\n const filtered = unfiltered.filter((l) => !l.isLeft);\n const participants = filtered.reduce((acc: Record<string, GroupCallParticipant>, el) => {\n acc[el.id] = el;\n return acc;\n }, {});\n\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n byId: {\n ...global.groupCalls.byId,\n [groupCallId]: {\n ...global.groupCalls.byId[groupCallId],\n ...omit(groupCallUpdate, ['participantsCount']),\n ...(addToParticipantCount && {\n participantsCount: global.groupCalls.byId[groupCallId].participantsCount + addToParticipantCount,\n }),\n ...(resetParticipantCount !== undefined && {\n participantsCount: resetParticipantCount,\n }),\n participants,\n },\n },\n },\n };\n}\n\nexport function removeGroupCall(\n global: GlobalState,\n groupCallId: string,\n): GlobalState {\n const groupCall = selectGroupCall(global, groupCallId);\n if (groupCall && groupCall.chatId) {\n const chat = selectChat(global, groupCall.chatId);\n if (chat) {\n global = updateChat(global, groupCall.chatId, {\n fullInfo: {\n ...chat.fullInfo,\n groupCallId: undefined,\n },\n });\n }\n }\n\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n byId: {\n ...omit(global.groupCalls.byId, [groupCallId.toString()]),\n },\n },\n };\n}\n\nexport function updateActiveGroupCall(\n global: GlobalState,\n groupCallUpdate: Partial<ApiGroupCall>,\n resetParticipantCount?: number,\n): GlobalState {\n if (!global.groupCalls.activeGroupCallId) {\n return global;\n }\n\n return updateGroupCall(global,\n global.groupCalls.activeGroupCallId,\n groupCallUpdate,\n undefined,\n resetParticipantCount);\n}\n\nexport function updateGroupCallParticipant(\n global: GlobalState,\n groupCallId: string,\n userId: string,\n participantUpdate: Partial<GroupCallParticipant>,\n noUpdateCount = false,\n) {\n const groupCall = selectGroupCall(global, groupCallId);\n if (!groupCall) {\n return global;\n }\n\n return updateGroupCall(global, groupCallId, {\n participants: {\n ...groupCall.participants,\n [userId]: {\n ...groupCall.participants[userId],\n ...participantUpdate,\n },\n },\n }, participantUpdate.isLeft\n ? (noUpdateCount ? 0 : -1)\n : (groupCall.participants[userId] || noUpdateCount ? 0 : 1));\n}\n","import { GlobalState } from '../types';\nimport { selectChat } from './chats';\nimport { getUserFullName, isChatBasicGroup } from '../helpers';\nimport { selectUser } from './users';\n\nexport function selectChatGroupCall(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.fullInfo || !chat.fullInfo.groupCallId) return undefined;\n\n return selectGroupCall(global, chat.fullInfo.groupCallId);\n}\n\nexport function selectGroupCall(global: GlobalState, groupCallId: string) {\n return global.groupCalls.byId[groupCallId];\n}\n\nexport function selectGroupCallParticipant(global: GlobalState, groupCallId: string, participantId: string) {\n return selectGroupCall(global, groupCallId)?.participants[participantId];\n}\n\nexport function selectIsAdminInActiveGroupCall(global: GlobalState): boolean {\n const chatId = selectActiveGroupCall(global)?.chatId;\n\n if (!chatId) return false;\n\n const chat = selectChat(global, chatId);\n if (!chat) return false;\n\n return (isChatBasicGroup(chat) && chat.isCreator) || Boolean(chat.adminRights?.manageCall);\n}\n\nexport function selectActiveGroupCall(global: GlobalState) {\n const { groupCalls: { activeGroupCallId } } = global;\n if (!activeGroupCallId) {\n return undefined;\n }\n\n return selectGroupCall(global, activeGroupCallId);\n}\n\nexport function selectCallFallbackChannelTitle(global: GlobalState) {\n const currentUser = selectUser(global, global.currentUserId!);\n\n return `Calls: ${getUserFullName(currentUser!)}`;\n}\n","import { getActions } from '../global';\nimport { IS_SAFARI } from './environment';\n\ntype DeepLinkMethod = 'resolve' | 'login' | 'passport' | 'settings' | 'join' | 'addstickers' | 'setlanguage' |\n'addtheme' | 'confirmphone' | 'socks' | 'proxy' | 'privatepost' | 'bg' | 'share' | 'msg' | 'msg_url';\n\nexport const processDeepLink = (url: string) => {\n const {\n protocol, searchParams, pathname, hostname,\n } = new URL(url);\n\n if (protocol !== 'tg:') return;\n\n const {\n openChatByInvite,\n openChatByUsername,\n openChatByPhoneNumber,\n openStickerSetShortName,\n focusMessage,\n joinVoiceChatByLink,\n } = getActions();\n\n // Safari thinks the path in tg://path links is hostname for some reason\n const method = (IS_SAFARI ? hostname : pathname).replace(/^\\/\\//, '') as DeepLinkMethod;\n const params: Record<string, string> = {};\n searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n switch (method) {\n case 'resolve': {\n const {\n domain, phone, post, comment, voicechat, livestream, start,\n } = params;\n\n if (domain !== 'telegrampassport') {\n if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n joinVoiceChatByLink({\n username: domain,\n inviteHash: voicechat || livestream,\n });\n } else if (phone) {\n openChatByPhoneNumber({ phone });\n } else {\n openChatByUsername({\n username: domain,\n messageId: Number(post),\n commentId: Number(comment),\n startParam: start,\n });\n }\n }\n break;\n }\n case 'privatepost': {\n const {\n post, channel,\n } = params;\n\n focusMessage({\n chatId: `-${channel}`,\n id: post,\n });\n break;\n }\n case 'bg': {\n // const {\n // slug, color, rotation, mode, intensity, bg_color: bgColor, gradient,\n // } = params;\n break;\n }\n case 'join': {\n const { invite } = params;\n\n openChatByInvite({ hash: invite });\n break;\n }\n case 'addstickers': {\n const { set } = params;\n\n openStickerSetShortName({\n stickerSetShortName: set,\n });\n break;\n }\n case 'share':\n case 'msg': {\n // const { url, text } = params;\n break;\n }\n case 'login': {\n // const { code, token } = params;\n break;\n }\n default:\n // Unsupported deeplink\n\n break;\n }\n};\n"],"names":["memo","withGlobal","global","userId","chat","selectCurrentChat","user","selectUser","contactName","getUserFirstOrLastName","undefined","isOpen","onClose","deleteChatMember","getActions","lang","useLang","handleDeleteChatMember","useCallback","chatId","id","onEnter","className","title","renderText","color","isText","onClick","runThrottledForLoadTopChats","throttle","cb","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetId","offsetDate","shouldReplace","getGlobal","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","serverTimeOffset","lastLocalServiceMessage","selectLastServiceNotification","message","chatIds","length","shift","currentChat","visibleChats","visibleUsers","selectVisibleUsers","currentUserId","users","byId","push","replaceUsers","buildCollectionByKey","concat","replaceUserStatuses","userStatusesById","replaceChats","chats","replaceChatListIds","addUsers","addUserStatuses","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","forEach","replaceThreadParam","MAIN_THREAD_ID","replyingToById","isFullyLoaded","setGlobal","loadFullChat","fullInfo","groupCall","membersCount","existingGroupCall","selectGroupCall","updateGroupCall","omit","participantsCount","updateChat","fetchChatByUsername","username","localChat","selectChatByUsername","isMin","addActionHandler","actions","preloadedChatIds","Set","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","currentChatId","selectCurrentMessageList","folderAllOrderedIds","getOrderedIds","ALL_FOLDER_ID","nextChatId","find","has","add","loadViewportMessages","threadId","payload","selectChat","hasUnreadMark","toggleChatUnread","lastMessage","threadInfo","requestThreadInfoUpdate","isChatSummaryOnly","requestChatUpdate","type","selectThreadTopMessageId","chatFullInfo","linkedChatId","openChat","messageId","focusMessage","selectSupportChat","shouldReplaceHistory","TMP_CHAT_ID","langCode","usernamePostfix","LOCALIZED_TIPS","toUpperCase","openChatByUsername","TIPS_USERNAME","onReplace","DEBUG","console","error","connectionState","authState","listIds","oldestChat","map","filter","Boolean","selectIsChatPinned","sort","chat1","chat2","date","force","SERVICE_NOTIFICATIONS_USER_ID","lastLocalMessage","isMuted","about","photo","memberIds","chatCreation","progress","ChatCreationProgress","createdChannel","channelId","accessHash","createChannel","leaveChat","createdChat","e","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","idsToRemove","idsToAdd","includedId","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","hash","phoneNumber","localUser","selectUserByPhoneNumber","fetchChatByPhoneNumber","openPreviousChat","showNotification","langProvider","replace","url","match","RE_TG_LINK","processDeepLink","uri","URL","startsWith","part1","part2","part3","pathname","split","l","decodeURI","params","fromEntries","searchParams","openChatByPhoneNumber","substr","openChatByInvite","openStickerSetShortName","stickerSetShortName","chatOrChannelPostId","Number","commentId","comment","hasOwnProperty","joinVoiceChatByLink","inviteHash","voicechat","livestream","startParam","start","channelPostId","startBot","botId","param","usernameChat","selectThreadInfo","discussionChatId","openCommentsByUsername","isEnabled","isChatBasicGroup","bannedRights","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","activeChatFolder","offset","addChatMembers","setNewChatMembersDialogState","NewChatMembersProgress","isProtected","enabledReactions","settings","audioElement","audioContext","joinAudio","Audio","connectingAudio","loop","leaveAudio","sounds","join","allowTalk","leave","connecting","initializationPromise","resolve","fetchGroupCall","call","isLoaded","fetchGroupCallParticipants","nextOffset","getGroupCallAudioElement","getGroupCallAudioContext","removeGroupCallAudioElement","groupCalls","isGroupCallPanelHidden","subscribed","peer","joinGroupCall","selectActiveGroupCall","canInvite","inviteLink","canSelfUnmute","copyTextToClipboard","full","ARE_CALLS_SUPPORTED","ctx","window","AudioContext","webkitAudioContext","srcObject","oscillator","createOscillator","dst","connect","createMediaStreamDestination","MediaStream","assign","stream","getAudioTracks","enabled","silence","safePlay","createAudioElement","values","muted","volume","play","then","currentTime","activeGroupCallId","selectChatGroupCall","leaveGroupCall","rejoin","toggleGroupCallPanel","sound","isFallbackConfirmOpen","groupCallId","groupCallUpdate","addToParticipantCount","resetParticipantCount","participants","isLeft","acc","el","removeGroupCall","toString","updateActiveGroupCall","updateGroupCallParticipant","participantUpdate","noUpdateCount","selectGroupCallParticipant","participantId","selectIsAdminInActiveGroupCall","isCreator","manageCall","selectCallFallbackChannelTitle","currentUser","getUserFullName","protocol","hostname","method","IS_SAFARI","value","key","domain","phone","post","invite","set"],"sourceRoot":""} |