mirror of
https://github.com/danog/telegram-tt.git
synced 2024-11-30 04:39:00 +01:00
1 line
105 KiB
Plaintext
1 line
105 KiB
Plaintext
{"version":3,"file":"8422.cfa7884f5b7ee933b6c3.js","mappings":"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","sources":["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 {\n addActionHandler, getActions, getGlobal, setGlobal,\n} from '../../index';\n\nimport type {\n ApiChat, ApiUser, ApiChatFolder, ApiError,\n} from '../../../api/types';\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { NewChatMembersProgress, ChatCreationProgress, ManagementProgress } from '../../../types';\nimport type { GlobalActions, GlobalState } from '../../types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TG_LINK,\n SERVICE_NOTIFICATIONS_USER_ID,\n TMP_CHAT_ID,\n ALL_FOLDER_ID,\n 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,\n isChatArchived,\n isChatBasicGroup,\n isChatChannel,\n isChatSuperGroup,\n isUserBot,\n} from '../../helpers';\nimport { formatShareText, parseChooseParameter, 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';\nimport { selectCurrentLimit } from '../../selectors/limits';\n\nconst TOP_CHAT_MESSAGES_PRELOAD_INTERVAL = 100;\nconst INFINITE_LOOP_MARKER = 100;\n\nconst SERVICE_NOTIFICATIONS_USER_MOCK: ApiUser = {\n id: SERVICE_NOTIFICATIONS_USER_ID,\n accessHash: '0',\n type: 'userTypeRegular',\n isMin: true,\n username: '',\n phoneNumber: '',\n};\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?.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('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 const getOrderDate = (chat: ApiChat) => {\n return chat.lastMessage?.date || chat.joinDate;\n };\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) => (\n Boolean(chat && getOrderDate(chat))\n && chat.id !== SERVICE_NOTIFICATIONS_USER_ID\n && !selectIsChatPinned(global, chat.id)\n ))\n /* eslint-enable @typescript-eslint/no-loop-func */\n .sort((chat1, chat2) => getOrderDate(chat1)! - getOrderDate(chat2)!)[0]\n : undefined;\n\n await loadChats(listType, oldestChat?.id, oldestChat ? getOrderDate(oldestChat) : undefined, 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 return;\n }\n\n void joinChannel(channelId, accessHash);\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 const limit = selectCurrentLimit(global, 'dialogFolderPinned');\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\n const ids = global.chats.orderedPinnedIds[listType === 'archived' ? 'archived' : 'active'];\n if ((ids?.length || 0) >= limit && !isPinned) {\n actions.openLimitReachedModal({\n limit: 'dialogFolderPinned',\n });\n return;\n }\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 const limit = selectCurrentLimit(global, 'dialogFiltersChats');\n\n const isLimitReached = (idsToAdd as number[])\n .some((id) => selectChatFolder(global, id)!.includedChatIds.length >= limit);\n if (isLimitReached) {\n actions.openLimitReachedModal({ limit: 'dialogFiltersChats' });\n return;\n }\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, byId } = global.chatFolders;\n\n const limit = selectCurrentLimit(global, 'dialogFilters');\n if (Object.keys(byId).length >= limit) {\n actions.openLimitReachedModal({\n limit: 'dialogFilters',\n });\n return;\n }\n\n const maxId = Math.max(...(orderedIds || []), ARCHIVED_FOLDER_ID);\n\n void createChatFolder(folder, maxId);\n});\n\naddActionHandler('sortChatFolders', async (global, actions, payload) => {\n const { folderIds } = payload!;\n\n const result = await callApi('sortChatFolders', folderIds);\n if (result) {\n global = getGlobal();\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds: folderIds,\n },\n });\n }\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, startAttach, attach } = 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 if (attach) {\n openAttachMenuFromLink(actions, chat.id, attach, startAttach);\n }\n});\n\naddActionHandler('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n const {\n openChatByPhoneNumber,\n openChatByInvite,\n openStickerSet,\n openChatWithDraft,\n joinVoiceChatByLink,\n showNotification,\n focusMessage,\n openInvoice,\n processAttachBotParameters,\n openChatByUsername: openChatByUsernameAction,\n } = actions;\n\n if (url.match(RE_TG_LINK)) {\n processDeepLink(url);\n return;\n }\n\n const uri = new URL(url.startsWith('http') ? url : `https://${url}`);\n if (uri.hostname === 't.me' && uri.pathname === '/') {\n window.open(uri.toString(), '_blank', 'noopener');\n return;\n }\n\n const hostParts = uri.hostname.split('.');\n if (hostParts.length > 3) return;\n const pathname = hostParts.length === 3 ? `${hostParts[0]}/${uri.pathname}` : uri.pathname;\n const [part1, part2, part3] = 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 const startAttach = params.hasOwnProperty('startattach') && !params.startattach ? true : params.startattach;\n const choose = parseChooseParameter(params.choose);\n\n if (part1.match(/^\\+([0-9]+)(\\?|$)/)) {\n openChatByPhoneNumber({\n phoneNumber: part1.substr(1, part1.length - 1),\n startAttach,\n attach: params.attach,\n });\n return;\n }\n\n if (part1.startsWith(' ') || part1.startsWith('+')) {\n hash = part1.substr(1, part1.length - 1);\n }\n\n if (hash) {\n openChatByInvite({ hash });\n return;\n }\n\n if (part1 === 'addstickers' || part1 === 'addemoji') {\n openStickerSet({\n stickerSetInfo: {\n shortName: part2,\n },\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 (part1 === 'share') {\n const text = formatShareText(params.url, params.text);\n openChatWithDraft({ text });\n } else if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n 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 showNotification({ message: 'Chat does not exist' });\n return;\n }\n\n focusMessage({\n chatId,\n messageId,\n });\n } else if (part1.startsWith('$')) {\n openInvoice({\n slug: part1.substring(1),\n });\n } else if (part1 === 'invoice') {\n openInvoice({\n slug: part2,\n });\n } else if (startAttach && choose) {\n processAttachBotParameters({\n username: part1,\n filter: choose,\n ...(typeof startAttach === 'string' && { startParam: startAttach }),\n });\n } else {\n openChatByUsernameAction({\n username: part1,\n messageId: messageId || Number(chatOrChannelPostId),\n commentId,\n startParam: params.start,\n startAttach,\n attach: params.attach,\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, startAttach, attach,\n } = payload!;\n\n const chat = selectCurrentChat(global);\n\n if (!commentId) {\n if (chat && chat.username === username && !startAttach && !startParam) {\n actions.focusMessage({ chatId: chat.id, messageId });\n return;\n }\n await openChatByUsername(actions, username, messageId, startParam, startAttach, attach);\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 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;\n }\n\n if (isChatBasicGroup(chat)) {\n chat = await migrateChat(chat);\n\n if (!chat) {\n return;\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;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = Boolean(bannedRights.viewMessages);\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(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;\n }\n\n if (isChatBasicGroup(chat)) {\n chat = await migrateChat(chat);\n if (!chat) {\n return;\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;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n const isDismissed = !Object.keys(adminRights).length;\n\n global = getGlobal();\n\n setGlobal(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;\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 setGlobal(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;\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 setGlobal({\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 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 const maxFolders = selectCurrentLimit(global, 'dialogFilters');\n\n const isBlocked = payload + 1 > maxFolders;\n\n if (isBlocked) {\n actions.openLimitReachedModal({\n limit: 'dialogFilters',\n });\n return undefined;\n }\n\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddActionHandler('resetOpenChatWithDraft', (global) => {\n return {\n ...global,\n requestedDraft: undefined,\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;\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;\n }\n\n const { members, users, userStatusesById } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addUserStatuses(global, userStatusesById);\n global = addChatMembers(global, chat, members);\n setGlobal(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;\n\n const settings = await callApi('fetchChatSettings', chat);\n if (!settings) return;\n\n setGlobal(updateChat(getGlobal(), chat.id, { settings }));\n});\n\naddActionHandler('toggleJoinToSend', async (global, actions, payload) => {\n const { chatId, isEnabled } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) return;\n if (!isChatSuperGroup(chat) && !isChatChannel(chat)) return;\n\n await callApi('toggleJoinToSend', chat, isEnabled);\n});\n\naddActionHandler('toggleJoinRequest', async (global, actions, payload) => {\n const { chatId, isEnabled } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) return;\n if (!isChatSuperGroup(chat) && !isChatChannel(chat)) return;\n\n await callApi('toggleJoinRequest', chat, isEnabled);\n});\n\naddActionHandler('processAttachBotParameters', async (global, actions, payload) => {\n const { username, filter, startParam } = payload;\n const bot = await getAttachBotOrNotify(global, username);\n if (!bot) return;\n\n global = getGlobal();\n const { attachMenu: { bots } } = global;\n if (!bots[bot.id]) {\n setGlobal({\n ...global,\n requestedAttachBotInstall: {\n botId: bot.id,\n onConfirm: {\n action: 'requestAttachBotInChat',\n payload: {\n botId: bot.id,\n filter,\n startParam,\n },\n },\n },\n });\n return;\n }\n\n getActions().requestAttachBotInChat({\n botId: bot.id,\n filter,\n startParam,\n });\n});\n\nasync function loadChats(\n listType: 'active' | 'archived', offsetId?: string, offsetDate?: number, shouldReplace = false,\n) {\n let global = getGlobal();\n const lastLocalServiceMessage = selectLastServiceNotification(global)?.message;\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,\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 // Always include service notifications chat\n if (!chatIds.includes(SERVICE_NOTIFICATIONS_USER_ID)) {\n const result2 = await callApi('fetchChat', {\n type: 'user',\n user: SERVICE_NOTIFICATIONS_USER_MOCK,\n });\n\n global = getGlobal();\n\n const notificationsChat = result2 && selectChat(global, result2.chatId);\n if (notificationsChat) {\n chatIds.unshift(notificationsChat.id);\n result.chats.unshift(notificationsChat);\n if (lastLocalServiceMessage) {\n notificationsChat.lastMessage = lastLocalServiceMessage;\n }\n }\n }\n\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, userStatusesById, fullInfo, groupCall, membersCount,\n } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (userStatusesById) {\n global = addUserStatuses(global, userStatusesById);\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 const stickerSet = fullInfo.stickerSet;\n if (stickerSet) {\n getActions().loadStickers({\n stickerSetInfo: {\n id: stickerSet.id,\n accessHash: stickerSet.accessHash,\n },\n });\n }\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 let createdChannel: ApiChat | undefined;\n\n try {\n createdChannel = await callApi('createChannel', { title, about, users });\n } catch (error) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatCreation: {\n progress: ChatCreationProgress.Error,\n },\n });\n\n if ((error as ApiError).message === 'CHANNELS_TOO_MUCH') {\n getActions().openLimitReachedModal({ limit: 'channels' });\n } else {\n getActions().showDialog({ data: { ...(error as ApiError), hasErrorKey: true } });\n }\n }\n\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 joinChannel(channelId: string, accessHash: string) {\n try {\n await callApi('joinChannel', { channelId, accessHash });\n } catch (error) {\n if ((error as ApiError).message === 'CHANNELS_TOO_MUCH') {\n getActions().openLimitReachedModal({ limit: 'channels' });\n } else {\n getActions().showDialog({ data: { ...(error as ApiError), hasErrorKey: true } });\n }\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\nexport async function migrateChat(chat: ApiChat): Promise<ApiChat | undefined> {\n try {\n const supergroup = await callApi('migrateChat', chat);\n\n return supergroup;\n } catch (error) {\n if ((error as ApiError).message === 'CHANNELS_TOO_MUCH') {\n getActions().openLimitReachedModal({ limit: 'channels' });\n } else {\n getActions().showDialog({ data: { ...(error as ApiError), hasErrorKey: true } });\n }\n\n return undefined;\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 getAttachBotOrNotify(global: GlobalState, username: string) {\n const chat = await fetchChatByUsername(username);\n if (!chat) return undefined;\n\n const user = selectUser(global, chat.id);\n if (!user) return undefined;\n\n const isBot = isUserBot(user);\n if (!isBot || !user.isAttachBot) {\n getActions().showNotification({ message: langProvider.getTranslation('WebApp.AddToAttachmentUnavailableError') });\n\n return undefined;\n }\n return user;\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n startParam?: string,\n startAttach?: string | boolean,\n attach?: string,\n) {\n const global = getGlobal();\n const currentChat = selectCurrentChat(global);\n\n // Attach in the current chat\n if (startAttach && !attach) {\n const user = await getAttachBotOrNotify(global, username);\n\n if (!currentChat || !user) return;\n\n actions.callAttachBot({\n botId: user.id,\n chatId: currentChat.id,\n ...(typeof startAttach === 'string' && { startParam: startAttach }),\n });\n\n return;\n }\n\n const isCurrentChat = currentChat?.username === username;\n\n if (!isCurrentChat) {\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n }\n\n const chat = await fetchChatByUsername(username);\n if (!chat) {\n if (!isCurrentChat) {\n actions.openPreviousChat();\n actions.showNotification({ message: 'User does not exist' });\n }\n\n return;\n }\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else if (!isCurrentChat) {\n actions.openChat({ id: chat.id });\n }\n\n if (startParam) {\n actions.startBot({ botId: chat.id, param: startParam });\n }\n\n if (attach) {\n openAttachMenuFromLink(actions, chat.id, attach, startAttach);\n }\n}\n\nasync function openAttachMenuFromLink(\n actions: GlobalActions,\n chatId: string, attach: string, startAttach?: string | boolean,\n) {\n const botChat = await fetchChatByUsername(attach);\n if (!botChat) return;\n const botUser = selectUser(getGlobal(), botChat.id);\n if (!botUser || !botUser.isAttachBot) {\n actions.showNotification({ message: langProvider.getTranslation('WebApp.AddToAttachmentUnavailableError') });\n return;\n }\n\n actions.callAttachBot({\n botId: botUser.id,\n chatId,\n ...(typeof startAttach === 'string' && { startParam: startAttach }),\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, selectUser } from '../../selectors';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport type { 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';\nimport type { CallSound } from '../../types';\n\n// Workaround for Safari not playing audio without user interaction\nlet audioElement: HTMLAudioElement | undefined;\nlet audioContext: AudioContext | undefined;\n\nlet sounds: Record<CallSound, HTMLAudioElement>;\nlet initializationPromise: Promise<void> | undefined = Promise.resolve();\n\nexport const initializeSoundsForSafari = () => {\n if (!initializationPromise) return Promise.resolve();\n\n const joinAudio = new Audio('./voicechat_join.mp3');\n const connectingAudio = new Audio('./voicechat_connecting.mp3');\n connectingAudio.loop = true;\n const leaveAudio = new Audio('./voicechat_leave.mp3');\n const allowTalkAudio = new Audio('./voicechat_onallowtalk.mp3');\n const busyAudio = new Audio('./call_busy.mp3');\n const connectAudio = new Audio('./call_connect.mp3');\n const endAudio = new Audio('./call_end.mp3');\n const incomingAudio = new Audio('./call_incoming.mp3');\n incomingAudio.loop = true;\n const ringingAudio = new Audio('./call_ringing.mp3');\n ringingAudio.loop = true;\n\n sounds = {\n join: joinAudio,\n allowTalk: allowTalkAudio,\n leave: leaveAudio,\n connecting: connectingAudio,\n incoming: incomingAudio,\n end: endAudio,\n connect: connectAudio,\n busy: busyAudio,\n ringing: ringingAudio,\n };\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 isCallPanelVisible: !global.isCallPanelVisible,\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;\n\n if (global.phoneCall) {\n actions.toggleGroupCallPanel();\n return;\n }\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;\n }\n\n if (activeGroupCallId) {\n actions.leaveGroupCall({\n rejoin: payload,\n });\n return;\n }\n\n if (groupCall && activeGroupCallId === groupCall.id) {\n actions.toggleGroupCallPanel();\n return;\n }\n\n if (!groupCall && (!id || !accessHash)) {\n groupCall = await fetchGroupCall({\n id,\n accessHash,\n });\n }\n\n if (!groupCall) return;\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 },\n isCallPanelVisible: false,\n };\n setGlobal(global);\n});\n\naddActionHandler('playGroupCallSound', (global, actions, payload) => {\n const { sound } = payload!;\n\n if (!sounds[sound]) {\n return;\n }\n\n const doPlay = () => {\n if (sound !== 'connecting') {\n sounds.connecting.pause();\n }\n if (sound !== 'incoming') {\n sounds.incoming.pause();\n }\n if (sound !== 'ringing') {\n sounds.ringing.pause();\n }\n safePlay(sounds[sound]);\n };\n\n if (initializationPromise) {\n initializationPromise.then(doPlay);\n } else {\n doPlay();\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\naddActionHandler('requestCall', async (global, actions, payload) => {\n const { userId, isVideo } = payload;\n\n if (global.phoneCall) {\n actions.toggleGroupCallPanel();\n return;\n }\n\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n await initializeSoundsForSafari();\n\n setGlobal({\n ...getGlobal(),\n phoneCall: {\n id: '',\n state: 'requesting',\n participantId: userId,\n isVideo,\n adminId: global.currentUserId,\n },\n isCallPanelVisible: false,\n });\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","import type { GroupCallParticipant } from '../../lib/secret-sauce';\nimport type { GlobalState } from '../types';\nimport type { 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 type { GlobalState } from '../types';\nimport { selectChat } from './chats';\nimport { 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 selectPhoneCallUser(global: GlobalState) {\n const { phoneCall, currentUserId } = global;\n if (!phoneCall || !phoneCall.participantId || !phoneCall.adminId) {\n return undefined;\n }\n\n const id = phoneCall.adminId === currentUserId ? phoneCall.participantId : phoneCall.adminId;\n return selectUser(global, id);\n}\n","import { getActions } from '../global';\n\nimport type { ApiChatType } from '../api/types';\n\nimport { API_CHAT_TYPES } from '../config';\nimport { IS_SAFARI } from './environment';\n\ntype DeepLinkMethod = 'resolve' | 'login' | 'passport' | 'settings' | 'join' | 'addstickers' | 'addemoji' |\n'setlanguage' | 'addtheme' | 'confirmphone' | 'socks' | 'proxy' | 'privatepost' | 'bg' | 'share' | 'msg' | 'msg_url' |\n'invoice';\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 openStickerSet,\n focusMessage,\n joinVoiceChatByLink,\n openInvoice,\n processAttachBotParameters,\n openChatWithDraft,\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 = Object.fromEntries(searchParams);\n\n switch (method) {\n case 'resolve': {\n const {\n domain, phone, post, comment, voicechat, livestream, start, startattach, attach,\n } = params;\n\n const startAttach = params.hasOwnProperty('startattach') && !startattach ? true : startattach;\n const choose = parseChooseParameter(params.choose);\n\n if (domain !== 'telegrampassport') {\n if (startAttach && choose) {\n processAttachBotParameters({\n username: domain,\n filter: choose,\n ...(typeof startAttach === 'string' && { startParam: startAttach }),\n });\n } else if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n joinVoiceChatByLink({\n username: domain,\n inviteHash: voicechat || livestream,\n });\n } else if (phone) {\n openChatByPhoneNumber({ phone, startAttach, attach });\n } else {\n openChatByUsername({\n username: domain,\n messageId: Number(post),\n commentId: Number(comment),\n startParam: start,\n startAttach,\n attach,\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 'addemoji':\n case 'addstickers': {\n const { set } = params;\n\n openStickerSet({\n stickerSetInfo: {\n shortName: set,\n },\n });\n break;\n }\n case 'share':\n case 'msg':\n case 'msg_url': {\n const { url: urlParam, text } = params;\n openChatWithDraft({ text: formatShareText(urlParam, text) });\n break;\n }\n case 'login': {\n // const { code, token } = params;\n break;\n }\n\n case 'invoice': {\n const { slug } = params;\n openInvoice({ slug });\n break;\n }\n default:\n // Unsupported deeplink\n\n break;\n }\n};\n\nexport function parseChooseParameter(choose?: string) {\n if (!choose) return undefined;\n const types = choose.toLowerCase().split(' ');\n return types.filter((type): type is ApiChatType => API_CHAT_TYPES.includes(type as ApiChatType));\n}\n\nexport function formatShareText(url?: string, text?: string) {\n return [url, text].filter(Boolean).join('\\n');\n}\n"],"names":["SERVICE_NOTIFICATIONS_USER_MOCK","id","SERVICE_NOTIFICATIONS_USER_ID","accessHash","type","isMin","username","phoneNumber","runThrottledForLoadTopChats","throttle","cb","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetId","offsetDate","shouldReplace","global","getGlobal","lastLocalServiceMessage","selectLastServiceNotification","message","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","serverTimeOffset","chatIds","length","shift","includes","result2","user","notificationsChat","selectChat","chatId","unshift","chats","lastMessage","currentChat","selectCurrentChat","visibleChats","visibleUsers","selectVisibleUsers","currentUserId","users","byId","push","replaceUsers","buildCollectionByKey","concat","replaceUserStatuses","userStatusesById","replaceChats","replaceChatListIds","addUsers","addUserStatuses","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","forEach","replaceThreadParam","MAIN_THREAD_ID","replyingToById","isFullyLoaded","setGlobal","loadFullChat","chat","fullInfo","groupCall","membersCount","existingGroupCall","selectGroupCall","updateGroupCall","omit","undefined","participantsCount","updateChat","stickerSet","getActions","loadStickers","stickerSetInfo","migrateChat","error","openLimitReachedModal","showDialog","data","hasErrorKey","fetchChatByUsername","localChat","selectChatByUsername","getAttachBotOrNotify","selectUser","isUserBot","isAttachBot","showNotification","langProvider","openAttachMenuFromLink","actions","attach","startAttach","botChat","botUser","callAttachBot","botId","startParam","addActionHandler","preloadedChatIds","Set","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","currentChatId","selectCurrentMessageList","folderAllOrderedIds","getOrderedIds","ALL_FOLDER_ID","nextChatId","find","has","add","loadViewportMessages","threadId","payload","hasUnreadMark","toggleChatUnread","threadInfo","requestThreadInfoUpdate","isChatSummaryOnly","requestChatUpdate","selectThreadTopMessageId","chatFullInfo","linkedChatId","openChat","messageId","focusMessage","selectSupportChat","shouldReplaceHistory","TMP_CHAT_ID","onReplace","getOrderDate","date","joinDate","DEBUG","console","connectionState","authState","listIds","oldestChat","map","filter","Boolean","selectIsChatPinned","sort","chat1","chat2","force","lastLocalMessage","isMuted","title","about","photo","memberIds","createdChannel","chatCreation","progress","ChatCreationProgress","channelId","createChannel","joinChannel","userId","leaveChat","createdChat","e","createGroupChat","folderId","selectCurrentLimit","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","ids","orderedPinnedIds","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","idsToRemove","idsToAdd","some","includedId","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","folderIds","deleteChatFolder","unreadCount","hash","localUser","selectUserByPhoneNumber","fetchChatByPhoneNumber","openPreviousChat","replace","url","openChatByPhoneNumber","openChatByInvite","openStickerSet","openChatWithDraft","joinVoiceChatByLink","openInvoice","processAttachBotParameters","openChatByUsername","openChatByUsernameAction","match","RE_TG_LINK","processDeepLink","uri","URL","startsWith","hostname","pathname","window","open","toString","hostParts","split","part1","part2","part3","l","decodeURI","params","fromEntries","searchParams","hasOwnProperty","startattach","choose","parseChooseParameter","substr","shortName","chatOrChannelPostId","Number","commentId","comment","text","formatShareText","inviteHash","voicechat","livestream","slug","substring","start","channelPostId","isCurrentChat","startBot","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","requestedDraft","offset","addChatMembers","setNewChatMembersDialogState","NewChatMembersProgress","isProtected","enabledReactions","settings","isChatSuperGroup","isChatChannel","bot","attachMenu","bots","requestAttachBotInChat","requestedAttachBotInstall","onConfirm","action","audioElement","audioContext","sounds","initializationPromise","resolve","initializeSoundsForSafari","joinAudio","Audio","connectingAudio","loop","leaveAudio","allowTalkAudio","busyAudio","connectAudio","endAudio","incomingAudio","ringingAudio","join","allowTalk","leave","connecting","incoming","end","connect","busy","ringing","values","muted","volume","play","then","currentTime","fetchGroupCall","call","isLoaded","fetchGroupCallParticipants","nextOffset","getGroupCallAudioElement","getGroupCallAudioContext","removeGroupCallAudioElement","isCallPanelVisible","subscribed","peer","joinGroupCall","selectActiveGroupCall","canInvite","inviteLink","canSelfUnmute","copyTextToClipboard","full","ARE_CALLS_SUPPORTED","phoneCall","toggleGroupCallPanel","ctx","AudioContext","webkitAudioContext","srcObject","oscillator","createOscillator","dst","createMediaStreamDestination","MediaStream","assign","stream","getAudioTracks","enabled","silence","safePlay","createAudioElement","groupCalls","activeGroupCallId","selectChatGroupCall","leaveGroupCall","rejoin","sound","doPlay","isVideo","state","participantId","adminId","groupCallId","groupCallUpdate","addToParticipantCount","resetParticipantCount","participants","isLeft","acc","el","removeGroupCall","updateActiveGroupCall","updateGroupCallParticipant","participantUpdate","noUpdateCount","selectGroupCallParticipant","selectIsAdminInActiveGroupCall","isCreator","manageCall","selectPhoneCallUser","protocol","method","IS_SAFARI","domain","phone","post","invite","set","urlParam","toLowerCase","API_CHAT_TYPES"],"sourceRoot":""} |