mirror of
https://github.com/danog/telegram-tt.git
synced 2024-12-12 09:09:45 +01:00
1 line
1006 KiB
Plaintext
1 line
1006 KiB
Plaintext
{"version":3,"file":"347.99a699945961bd46d0f2.js","mappings":"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","sources":["webpack://telegram-t/./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerActions.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerFooter.tsx","webpack://telegram-t/./src/hooks/useFullscreen.ts","webpack://telegram-t/./src/components/mediaViewer/helpers/formatFileSize.ts","webpack://telegram-t/./src/components/mediaViewer/VideoPlayerControls.tsx","webpack://telegram-t/./src/components/mediaViewer/VideoPlayer.tsx","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.tsx","webpack://telegram-t/./src/components/mediaViewer/PanZoom.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.tsx","webpack://telegram-t/./src/components/main/ForwardPicker.tsx","webpack://telegram-t/./src/components/main/Dialogs.tsx","webpack://telegram-t/./src/components/main/Notifications.tsx","webpack://telegram-t/./src/components/main/SafeLinkModal.tsx","webpack://telegram-t/./src/components/common/CalendarModal.tsx","webpack://telegram-t/./src/components/main/HistoryCalendar.tsx","webpack://telegram-t/./src/components/common/DeleteMessageModal.tsx","webpack://telegram-t/./src/components/common/PinMessageModal.tsx","webpack://telegram-t/./src/components/common/UnpinAllMessagesModal.tsx","webpack://telegram-t/./src/components/middle/DeleteSelectedMessageModal.tsx","webpack://telegram-t/./src/components/common/ReportMessageModal.tsx","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.tsx","webpack://telegram-t/./src/hooks/useSelectWithEnter.ts","webpack://telegram-t/./src/components/left/search/LeftSearchResultChat.tsx","webpack://telegram-t/./src/components/left/search/RecentContacts.tsx","webpack://telegram-t/./src/components/left/search/ChatMessage.tsx","webpack://telegram-t/./src/components/left/search/DateSuggest.tsx","webpack://telegram-t/./src/components/left/search/ChatResults.tsx","webpack://telegram-t/./src/components/left/search/ChatMessageResults.tsx","webpack://telegram-t/./src/components/left/search/helpers/createMapStateToProps.ts","webpack://telegram-t/./src/components/left/search/MediaResults.tsx","webpack://telegram-t/./src/components/left/search/helpers/getSenderName.ts","webpack://telegram-t/./src/components/left/search/LinkResults.tsx","webpack://telegram-t/./src/components/left/search/FileResults.tsx","webpack://telegram-t/./src/components/left/search/AudioResults.tsx","webpack://telegram-t/./src/components/left/search/LeftSearch.tsx","webpack://telegram-t/./src/hooks/reducers/useTwoFaReducer.ts","webpack://telegram-t/./src/components/left/settings/SettingsHeader.tsx","webpack://telegram-t/./src/components/left/settings/SettingsMain.tsx","webpack://telegram-t/./src/components/common/UsernameInput.tsx","webpack://telegram-t/./src/components/left/settings/SettingsEditProfile.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack://telegram-t/./src/components/ui/ShowMoreButton.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFolders.tsx","webpack://telegram-t/./src/components/ui/RangeSlider.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSetCover.tsx","webpack://telegram-t/./src/components/left/settings/SettingsStickerSet.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneral.tsx","webpack://telegram-t/./src/util/systemFilesDialog.ts","webpack://telegram-t/./src/util/colors.ts","webpack://telegram-t/./src/components/left/settings/WallpaperTile.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackground.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack://telegram-t/./src/components/left/settings/SettingsNotifications.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacy.tsx","webpack://telegram-t/./src/components/left/settings/SettingsLanguage.tsx","webpack://telegram-t/./src/components/left/settings/helper/privacy.ts","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack://telegram-t/./src/components/left/settings/Settings.tsx","webpack://telegram-t/./src/components/left/main/ContactList.tsx","webpack://telegram-t/./src/components/left/newChat/NewChatStep1.tsx","webpack://telegram-t/./src/components/left/newChat/NewChatStep2.tsx","webpack://telegram-t/./src/components/left/newChat/NewChat.tsx","webpack://telegram-t/./src/components/left/ArchivedChats.tsx","webpack://telegram-t/./src/util/scrollLock.ts","webpack://telegram-t/./src/components/middle/message/helpers/copyOptions.ts","webpack://telegram-t/./src/components/middle/message/MessageContextMenu.tsx","webpack://telegram-t/./src/components/middle/message/ContextMenuContainer.tsx","webpack://telegram-t/./src/components/common/StickerSetModal.tsx","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.tsx","webpack://telegram-t/./src/components/middle/MobileSearch.tsx","webpack://telegram-t/./src/util/findInViewport.ts","webpack://telegram-t/./src/util/isFullyVisible.ts","webpack://telegram-t/./src/util/setTooltipItemVisible.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useKeyboardNavigation.ts","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.tsx","webpack://telegram-t/./src/components/middle/composer/PollModal.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiButton.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiCategory.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiPicker.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSet.tsx","webpack://telegram-t/./src/components/middle/composer/StickerPicker.tsx","webpack://telegram-t/./src/components/common/GifButton.tsx","webpack://telegram-t/./src/components/middle/composer/GifPicker.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenuFooter.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.tsx","webpack://telegram-t/./src/components/middle/composer/AttachMenu.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommand.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.tsx","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/BaseResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/MediaResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/ArticleResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/GifResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/StickerResult.tsx","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.tsx","webpack://telegram-t/./src/components/right/RightSearch.tsx","webpack://telegram-t/./src/components/right/StickerSetResult.tsx","webpack://telegram-t/./src/components/right/StickerSearch.tsx","webpack://telegram-t/./src/components/right/GifSearch.tsx","webpack://telegram-t/./src/components/right/PollAnswerResults.tsx","webpack://telegram-t/./src/components/right/PollResults.tsx","webpack://telegram-t/./src/components/right/management/ManageUser.tsx","webpack://telegram-t/./src/components/right/management/ManageGroup.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupPermissions.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack://telegram-t/./src/components/right/management/ManageChannel.tsx","webpack://telegram-t/./src/components/right/management/ManageChatPrivacyType.tsx","webpack://telegram-t/./src/components/right/management/ManageDiscussion.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupUserPermissions.tsx","webpack://telegram-t/./src/components/right/management/ManageChatAdministrators.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupRecentActions.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupAdminRights.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupMembers.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack://telegram-t/./src/components/right/management/Management.tsx","webpack://telegram-t/./src/components/common/helpers/detectCardType.ts","webpack://telegram-t/./src/hooks/reducers/usePaymentReducer.ts","webpack://telegram-t/./src/hooks/useFocusAfterAnimation.tsx","webpack://telegram-t/./src/components/ui/Select.tsx","webpack://telegram-t/./src/components/payment/ShippingInfo.tsx","webpack://telegram-t/./src/components/payment/Shipping.tsx","webpack://telegram-t/./src/components/payment/Checkout.tsx","webpack://telegram-t/./src/components/payment/ExpiryInput.tsx","webpack://telegram-t/./src/components/middle/helpers/inputFormatters.ts","webpack://telegram-t/./src/components/payment/CardInput.tsx","webpack://telegram-t/./src/components/payment/PaymentInfo.tsx","webpack://telegram-t/./src/components/payment/PaymentModal.tsx","webpack://telegram-t/./src/components/payment/ReceiptModal.tsx","webpack://telegram-t/./src/components/common/PasswordForm.tsx","webpack://telegram-t/./src/components/common/PasswordMonkey.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/CropModal.tsx","webpack://telegram-t/./src/components/ui/AvatarEditable.tsx"],"sourcesContent":["import { ApiMessage, ApiDimensions } from '../../../api/types';\n\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport {\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean,\n origin: MediaViewerOrigin,\n bestImageData: string,\n dimensions: ApiDimensions,\n isVideo: boolean,\n message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, dimensions.width, dimensions.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector<HTMLImageElement>(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin);\n if (!existingGhost) {\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n }\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, origin?: MediaViewerOrigin) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n if (origin === MediaViewerOrigin.ProfileAvatar || origin === MediaViewerOrigin.SettingsAvatar) {\n ghost.classList.add('ProfileInfo');\n if (origin === MediaViewerOrigin.SettingsAvatar) {\n ghost.classList.add('self');\n }\n const profileInfo = document.querySelector(\n origin === MediaViewerOrigin.ProfileAvatar\n ? '#RightColumn .ProfileInfo .info'\n : '#Settings .ProfileInfo .info',\n );\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector<HTMLDivElement>('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest<HTMLDivElement>('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest<HTMLDivElement>('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record<string, string>) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.SettingsAvatar:\n containerSelector = '#Settings .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector<HTMLElement>(containerSelector)!;\n const mediaEls = container && container.querySelectorAll<HTMLImageElement | HTMLVideoElement>(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.SettingsAvatar:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'closeMediaViewer' | 'focusMessage'>;\n\nconst SenderInfo: FC<OwnProps & StateProps & DispatchProps> = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n <div className=\"SenderInfo\" onClick={handleFocusMessage}>\n {isFromChat ? (\n <Avatar key={sender.id} size=\"medium\" chat={sender as ApiChat} />\n ) : (\n <Avatar key={sender.id} size=\"medium\" user={sender as ApiUser} />\n )}\n <div className=\"meta\">\n <div className=\"title\" dir=\"auto\">\n {senderTitle && renderText(senderTitle)}\n </div>\n <div className=\"date\" dir=\"auto\">\n {isAvatar ? lang('lng_mediaview_profile_photo') : formatMediaDateTime(lang, message!.date * 1000)}\n </div>\n </div>\n </div>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, { FC, useMemo } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useMediaDownload from '../../hooks/useMediaDownload';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC<OwnProps> = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n } = useMediaDownload(\n message && isVideo ? getMessageMediaHash(message, 'download') : undefined,\n fileName,\n );\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n className={isOpen ? 'active' : undefined}\n onClick={onTrigger}\n ariaLabel=\"More actions\"\n >\n <i className=\"icon-more\" />\n </Button>\n );\n }, []);\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n return (\n <div className=\"MediaViewerActions-mobile\">\n <DropdownMenu\n trigger={MenuButton}\n positionX=\"right\"\n >\n {!isAvatar && (\n <MenuItem\n icon=\"forward\"\n onClick={onForward}\n >\n {lang('Forward')}\n </MenuItem>\n )}\n {isVideo ? (\n <MenuItem\n icon={isDownloadStarted ? 'close' : 'download'}\n onClick={handleDownloadClick}\n >\n {isDownloadStarted ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n </MenuItem>\n ) : (\n <MenuItem\n icon=\"download\"\n href={mediaData}\n download={fileName}\n >\n {lang('AccActionDownload')}\n </MenuItem>\n )}\n </DropdownMenu>\n {isDownloadStarted && <ProgressSpinner progress={downloadProgress} size=\"s\" noCross />}\n </div>\n );\n }\n\n return (\n <div className=\"MediaViewerActions\">\n {!isAvatar && (\n <>\n <Button\n round\n size=\"smaller\"\n color=\"translucent-white\"\n ariaLabel={lang('Forward')}\n onClick={onForward}\n >\n <i className=\"icon-forward\" />\n </Button>\n </>\n )}\n {isVideo ? (\n <Button\n round\n size=\"smaller\"\n color=\"translucent-white\"\n ariaLabel={lang('AccActionDownload')}\n onClick={handleDownloadClick}\n >\n {isDownloadStarted ? (\n <ProgressSpinner progress={downloadProgress} size=\"s\" onClick={handleDownloadClick} />\n ) : (\n <i className=\"icon-download\" />\n )}\n </Button>\n ) : (\n <Button\n href={mediaData}\n download={fileName}\n round\n size=\"smaller\"\n color=\"translucent-white\"\n ariaLabel={lang('AccActionDownload')}\n >\n <i className=\"icon-download\" />\n </Button>\n )}\n <Button\n round\n size=\"smaller\"\n color=\"translucent-white\"\n ariaLabel={isZoomed ? 'Zoom Out' : 'Zoom In'}\n onClick={onZoomToggle}\n >\n <i className={isZoomed ? 'icon-zoom-out' : 'icon-zoom-in'} />\n </Button>\n <Button\n round\n size=\"smaller\"\n color=\"translucent-white\"\n ariaLabel={lang('Close')}\n onClick={onCloseMediaViewer}\n >\n <i className=\"icon-close\" />\n </Button>\n </div>\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\n\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHidden?: boolean;\n isForVideo: boolean;\n};\n\nconst MediaViewerFooter: FC<OwnProps> = ({\n text = '', isHidden, isForVideo, onClick,\n}) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent<HTMLDivElement, MouseEvent>) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n const classNames = buildClassName(\n 'MediaViewerFooter',\n isForVideo && 'is-for-video',\n isHidden && 'is-hidden',\n );\n\n return (\n <div className={classNames} onClick={stopEvent}>\n {text && (\n <div className=\"media-viewer-footer-content\" onClick={!IS_SINGLE_COLUMN_LAYOUT ? onClick : undefined}>\n <p className={`media-text custom-scroll ${isMultiline ? 'multiline' : ''}`} dir=\"auto\">{text}</p>\n </div>\n )}\n </div>\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onPlayPause: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => void;\n\nconst stopEvent = (e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC<IProps> = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_SINGLE_COLUMN_LAYOUT) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n <div className={`VideoPlayerControls ${isForceMobileVersion ? 'mobile' : ''}`} onClick={stopEvent}>\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n <Button\n ariaLabel={lang('AccActionPlay')}\n size=\"tiny\"\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n color=\"translucent-white\"\n className=\"play\"\n onClick={onPlayPause}\n >\n <i className={isPlayed ? 'icon-pause' : 'icon-play'} />\n </Button>\n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n <Button\n ariaLabel=\"Fullscreen\"\n size=\"tiny\"\n color=\"translucent-white\"\n className=\"fullscreen\"\n onClick={onChangeFullscreen}\n >\n <i className={`${isFullscreen ? 'icon-smallscreen' : 'icon-fullscreen'}`} />\n </Button>\n )}\n </div>\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n <div className=\"player-time\">\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n </div>\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n <div className=\"player-file-size\">\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n </div>\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n <div className=\"player-seekline\">\n <div className=\"player-seekline-track\">\n <div\n className=\"player-seekline-buffered\"\n // @ts-ignore teact feature\n style={`width: ${percentageBuffered || 0}%`}\n />\n <div\n className=\"player-seekline-played\"\n // @ts-ignore teact feature\n style={`width: ${percentagePlayed || 0}%`}\n />\n <input\n min=\"0\"\n max=\"100\"\n step={0.01}\n type=\"range\"\n onInput={onSeek}\n className=\"player-seekline-input\"\n value={percentagePlayed || 0}\n />\n </div>\n </div>\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiDimensions } from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Button from '../ui/Button';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: ApiDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC<OwnProps> = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(IS_IOS && !isPlayed && !shouldRenderSpinner, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent> | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent<HTMLVideoElement>) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n <div\n className=\"VideoPlayer\"\n onClick={!isGif && IS_SINGLE_COLUMN_LAYOUT ? toggleControls : undefined}\n onMouseOver={!isGif ? handleMouseOver : undefined}\n onMouseOut={!isGif ? handleMouseOut : undefined}\n >\n <div\n // @ts-ignore\n style={wrapperStyle}\n >\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n <video\n ref={videoRef}\n autoPlay={IS_TOUCH_ENV}\n playsInline\n loop={isGif}\n // This is to force auto playing on mobiles\n muted={isGif}\n id=\"media-viewer-video\"\n // @ts-ignore\n style={videoStyle}\n onEnded={handleEnded}\n onClick={!IS_SINGLE_COLUMN_LAYOUT ? togglePlayState : undefined}\n onDoubleClick={handleFullscreenChange}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...bufferingHandlers}\n onTimeUpdate={handleTimeUpdate}\n >\n {url && <source src={url} />}\n </video>\n </div>\n {shouldRenderPlayButton && (\n <Button round className={`play-button ${playButtonClassNames}`} onClick={togglePlayState}>\n <i className=\"icon-play\" />\n </Button>\n )}\n {shouldRenderSpinner && (\n <div className={['spinner-container', spinnerClassNames].join(' ')}>\n {!isBuffered && <div className=\"buffering\">Buffering...</div>}\n <ProgressSpinner\n size=\"xl\"\n progress={isBuffered ? 1 : downloadProgress}\n square\n onClick={onClose}\n />\n </div>\n )}\n {!isGif && !shouldRenderSpinner && (\n <VideoPlayerControls\n isPlayed={isPlayed}\n bufferedProgress={bufferedProgress}\n currentTime={currentTime}\n isFullscreenSupported={Boolean(setFullscreen)}\n isFullscreen={isFullscreen}\n fileSize={fileSize}\n duration={videoRef.current ? videoRef.current.duration : 0}\n isForceVisible={!isPlayed || isControlsVisible}\n isForceMobileVersion={posterSize && posterSize.width < MOBILE_VERSION_CONTROL_WIDTH}\n onSeek={handleSeek}\n onChangeFullscreen={handleFullscreenChange}\n onPlayPause={togglePlayState}\n />\n )}\n </div>\n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC<OwnProps> = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious<boolean>(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef<boolean>(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent<HTMLInputElement>) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n <div className={className}>\n <Button\n disabled={zoomLevel === MIN_ZOOM_LEVEL}\n size=\"tiny\"\n color=\"translucent-white\"\n ariaLabel={lang('ZoomOut')}\n className=\"zoom-out\"\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n onClick={handleZoomOut}\n >\n <i className=\"icon-zoom-out\" />\n </Button>\n <Button\n disabled={zoomLevel === MAX_ZOOM_LEVEL}\n size=\"tiny\"\n color=\"translucent-white\"\n ariaLabel=\"Zoom In\"\n className=\"zoom-in\"\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n onClick={handleZoomIn}\n >\n <i className=\"icon-zoom-in\" />\n </Button>\n <div className=\"seekline\">\n <div className=\"seekline-track\">\n <div\n className=\"seekline-played\"\n // @ts-ignore teact feature\n style={`width: ${(zoomLevel - 1) * ONE_STEP_PERCENT}%`}\n />\n <input\n ref={inputRef}\n min={MIN_ZOOM_LEVEL}\n max={MAX_ZOOM_LEVEL}\n step=\"0.5\"\n value={zoomLevel}\n type=\"range\"\n className=\"seekline-input\"\n onChange={handleSeeklineChange}\n onMouseDown={handleStartSeek}\n onMouseUp={handleStopSeek}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC<OwnProps> = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState<boolean>(false);\n const [dragData, setDragData] = useState<IDragData>({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState<number[]>(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef<HTMLDivElement>(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent<EventTarget>) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent<EventTarget>) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n <div\n ref={panWrapperRef}\n className={`pan-wrapper ${className || ''}`}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseMove={handleMouseMove}\n >\n <div\n ref={panContainerRef}\n className=\"pan-container\"\n >\n {children}\n </div>\n </div>\n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser, ApiDimensions,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageDocument,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions, getMessageFileSize,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n chatMessages?: Record<number, ApiMessage>;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'openMediaViewer' | 'closeMediaViewer' | 'openForwardMenu' | 'focusMessage'>;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC<StateProps & DispatchProps> = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n const isOpen = Boolean(avatarOwner || messageId);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n /* Content */\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const webPageVideo = message ? getMessageWebPageVideo(message) : undefined;\n const isDocumentPhoto = message ? isMessageDocumentPhoto(message) : false;\n const isDocumentVideo = message ? isMessageDocumentVideo(message) : false;\n const isVideo = Boolean(video || webPageVideo || isDocumentVideo);\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\n const { isGif } = video || webPageVideo || {};\n const isAvatar = Boolean(avatarOwner);\n\n /* Navigation */\n const isSingleSlide = Boolean(webPagePhoto || webPageVideo);\n const messageIds = useMemo(() => {\n return isSingleSlide && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isSingleSlide, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n\n /* Animation */\n const animationKey = useRef<number>();\n const prevSenderId = usePrevious<number | undefined>(senderId);\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [isFooterHidden, setIsFooterHidden] = useState<boolean>(false);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState<boolean>(false);\n const [zoomLevel, setZoomLevel] = useState<number>(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n /* Media data */\n function getMediaHash(isFull?: boolean) {\n if (isAvatar && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner!;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner!, isFull ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, isFull ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const blobUrlPreview = useMedia(\n previewMediaHash,\n undefined,\n isAvatar && previewMediaHash && previewMediaHash.startsWith('profilePhoto')\n ? ApiMediaFormat.DataUri\n : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const videoSize = message ? getMessageFileSize(message) : undefined;\n const fileName = message\n ? getMessageFileName(message)\n : isAvatar\n ? `avatar${avatarOwner!.id}-${profilePhotoIndex}.jpg`\n : undefined;\n\n let dimensions!: ApiDimensions;\n if (message) {\n if (isDocumentPhoto || isDocumentVideo) {\n dimensions = getMessageDocument(message)!.mediaSize!;\n } else if (photo || webPagePhoto) {\n dimensions = getPhotoFullDimensions((photo || webPagePhoto)!)!;\n } else if (video || webPageVideo) {\n dimensions = getVideoDimensions((video || webPageVideo)!)!;\n }\n } else {\n dimensions = AVATAR_FULL_DIMENSIONS;\n }\n\n useEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious<ApiMessage | undefined>(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious<ApiChat | ApiUser | undefined>(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, dimensions, isVideo, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin, message, prevMessage, prevAvatarOwner,\n bestImageData, prevBestImageData, dimensions, isVideo,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n // Prevent refresh when rotating device to watch a video\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isOpen]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector<HTMLDivElement>('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed && !IS_TOUCH_ENV) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else if (!(e.target && (e.target as HTMLElement).closest('.MediaViewerFooter'))) {\n close();\n }\n\n return true;\n } : undefined,\n });\n }, [close, isFooterHidden, isGif, isPhoto, isZoomed, selectNextMedia, selectPreviousMedia]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif)) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [isFooterHidden, isGif, isPhoto]);\n\n const lang = useLang();\n\n useHistoryBack(isOpen, closeMediaViewer, openMediaViewer, {\n chatId,\n threadId,\n messageId,\n origin,\n avatarOwnerId: avatarOwner && avatarOwner.id,\n });\n\n function renderSlide(isActive: boolean) {\n if (isAvatar) {\n return (\n <div key={chatId} className=\"media-viewer-content\">\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n </div>\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n <div\n key={messageId}\n className={`media-viewer-content ${hasFooter ? 'has-footer' : ''}`}\n onClick={handleToggleFooterVisibility}\n >\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n {isVideo && (\n <VideoPlayer\n key={messageId}\n url={localBlobUrl || fullMediaData}\n isGif={isGif}\n posterData={bestImageData}\n posterSize={message && calculateMediaViewerDimensions(dimensions!, hasFooter, true)}\n downloadProgress={downloadProgress}\n fileSize={videoSize!}\n isMediaViewerOpen={isOpen}\n noPlay={!isActive}\n onClose={close}\n />\n )}\n {textParts && (\n <MediaViewerFooter\n text={textParts}\n onClick={handleFooterClick}\n isHidden={isFooterHidden && (!isVideo || isGif)}\n isForVideo={isVideo && !isGif}\n />\n )}\n </div>\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return isAvatar ? (\n <SenderInfo\n key={avatarOwner!.id}\n chatId={avatarOwner!.id}\n isAvatar\n />\n ) : (\n <SenderInfo\n key={messageId}\n chatId={chatId}\n messageId={messageId}\n />\n );\n }\n\n return (\n <ShowTransition\n id=\"MediaViewer\"\n className={isZoomed ? 'zoomed' : ''}\n isOpen={isOpen}\n >\n {() => (\n <>\n <div className=\"media-viewer-head\" dir={lang.isRtl ? 'rtl' : undefined}>\n {IS_SINGLE_COLUMN_LAYOUT && (\n <Button\n className=\"media-viewer-close\"\n round\n size=\"smaller\"\n color=\"translucent-white\"\n ariaLabel={lang('Close')}\n onClick={close}\n >\n <i className=\"icon-close\" />\n </Button>\n )}\n <Transition activeKey={animationKey.current!} name={headerAnimation}>\n {renderSenderInfo}\n </Transition>\n <MediaViewerActions\n mediaData={fullMediaData || blobUrlPreview}\n isVideo={isVideo}\n isZoomed={isZoomed}\n message={message}\n fileName={fileName}\n onCloseMediaViewer={close}\n onForward={handleForward}\n onZoomToggle={handleZoomToggle}\n isAvatar={isAvatar}\n />\n </div>\n <PanZoom\n noWrap={!canPanZoomWrap}\n canPan={isZoomed}\n panDeltaX={panDelta.x}\n panDeltaY={panDelta.y}\n zoomLevel={zoomLevel}\n onPan={handlePan}\n >\n <Transition\n className=\"slide-container\"\n activeKey={selectedMediaMessageIndex}\n name={slideAnimation}\n >\n {renderSlide}\n </Transition>\n </PanZoom>\n {!isFirst && (\n <button\n type=\"button\"\n className={`navigation prev ${isVideo && !isGif && 'inline'}`}\n aria-label={lang('AccDescrPrevious')}\n dir={lang.isRtl ? 'rtl' : undefined}\n onClick={selectPreviousMedia}\n />\n )}\n {!isLast && (\n <button\n type=\"button\"\n className={`navigation next ${isVideo && !isGif && 'inline'}`}\n aria-label={lang('Next')}\n dir={lang.isRtl ? 'rtl' : undefined}\n onClick={selectNextMedia}\n />\n )}\n <ZoomControls\n isShown={isZoomed}\n onChangeZoom={handleZoomValue}\n />\n </>\n )}\n </ShowTransition>\n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n <img\n src={blobUrl}\n alt=\"\"\n // @ts-ignore teact feature\n style={imageSize ? `width: ${imageSize.width}px` : ''}\n draggable={Boolean(canDrag)}\n />\n )\n : (\n <div\n className=\"spinner-wrapper\"\n // @ts-ignore teact feature\n style={imageSize ? `width: ${imageSize.width}px` : ''}\n >\n <Spinner color=\"white\" />\n </div>\n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record<number, ApiMessage> | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick, unique } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record<number, ApiChat>;\n pinnedIds?: number[];\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'setForwardChatId' | 'exitForwardMode' | 'loadMoreChats'>;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC<OwnProps & StateProps & DispatchProps> = ({\n chatsById,\n pinnedIds,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...activeListIds || [],\n ...archivedListIds || [],\n ];\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang, pinnedIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds && viewportIds.length > 0) {\n setForwardChatId({ id: viewportIds[index === -1 ? 0 : index] });\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n <div className=\"modal-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n <Button\n round\n color=\"translucent\"\n size=\"smaller\"\n ariaLabel={lang('Close')}\n onClick={exitForwardMode}\n >\n <i className=\"icon-close\" />\n </Button>\n <InputText\n ref={inputRef}\n value={filter}\n onChange={handleFilterChange}\n onKeyDown={handleKeyDown}\n placeholder={lang('ForwardTo')}\n />\n </div>\n );\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={exitForwardMode}\n className=\"ForwardPicker\"\n header={modalHeader}\n >\n {viewportIds && viewportIds.length ? (\n <InfiniteScroll\n className=\"picker-list custom-scroll\"\n items={viewportIds}\n onLoadMore={getMore}\n noScrollRestore={Boolean(filter)}\n ref={containerRef}\n onKeyDown={handleKeyDown}\n >\n {viewportIds.map((id) => (\n <ListItem\n key={id}\n className=\"chat-item-clickable force-rounded-corners\"\n onClick={() => setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n <PrivateChatInfo status={id === currentUserId ? lang('SavedMessagesInfo') : undefined} userId={id} />\n ) : (\n <GroupChatInfo chatId={id} />\n )}\n </ListItem>\n ))}\n </InfiniteScroll>\n ) : viewportIds && !viewportIds.length ? (\n <p className=\"no-results\">Sorry, nothing found.</p>\n ) : (\n <Loading />\n )}\n </Modal>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n pinnedIds: orderedPinnedIds.active,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'dismissDialog' | 'acceptInviteConfirmation'>;\n\nconst Dialogs: FC<StateProps & DispatchProps> = ({ dialogs, dismissDialog, acceptInviteConfirmation }) => {\n const lang = useLang();\n\n if (!dialogs.length) {\n return undefined;\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, participantsCount, isChannel,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n dismissDialog();\n };\n\n const participantsText = isChannel\n ? lang('Subscribers', participantsCount, 'i')\n : lang('Members', participantsCount, 'i');\n\n const joinText = isChannel ? lang('ChannelJoin') : lang('JoinGroup');\n\n return (\n <Modal\n isOpen\n onClose={dismissDialog}\n className=\"error\"\n title={title}\n >\n {participantsCount !== undefined && <p>{participantsText}</p>}\n <Button isText className=\"confirm-dialog-button\" onClick={handleJoinClick}>{joinText}</Button>\n <Button isText className=\"confirm-dialog-button\" onClick={dismissDialog}>{lang('Cancel')}</Button>\n </Modal>\n );\n };\n\n const renderError = (error: ApiError) => {\n return (\n <Modal\n isOpen\n onClose={dismissDialog}\n className=\"error\"\n title={getErrorHeader(error)}\n >\n {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])}\n <div>\n <Button isText onClick={dismissDialog}>{lang('OK')}</Button>\n </div>\n </Modal>\n );\n };\n\n const renderDialog = (dialog: ApiError | ApiInviteInfo) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n <div id=\"Dialogs\">\n {dialogs.map(renderDialog)}\n </div>\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n if (!error.hasErrorKey) {\n return 'Telegram';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['dialogs']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissDialog', 'acceptInviteConfirmation']),\n)(Dialogs));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\n\nimport Notification from '../ui/Notification';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'dismissNotification'>;\n\nconst Notifications: FC<StateProps & DispatchProps> = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n <div id=\"Notifications\">\n {notifications.map(({ message, localId }) => (\n <Notification\n message={renderText(message, ['emoji', 'br', 'links', 'simple_markdown'])}\n onDismiss={() => dismissNotification({ localId })}\n />\n ))}\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'toggleSafeLinkModal'>;\n\nconst SafeLinkModal: FC<OwnProps & DispatchProps> = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(url);\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n <ConfirmDialog\n isOpen={Boolean(url)}\n onClose={handleDismiss}\n title={lang('OpenUrlTitle')}\n textParts={renderText(lang('OpenUrlAlert2', renderingUrl), ['links'])}\n confirmLabel={lang('OpenUrlTitle')}\n confirmHandler={handleOpen}\n />\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport { formatTime, formatDateToString } from '../../util/dateFormat';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useFlag from '../../hooks/useFlag';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = [\n 'lng_weekday1',\n 'lng_weekday2',\n 'lng_weekday3',\n 'lng_weekday4',\n 'lng_weekday5',\n 'lng_weekday6',\n 'lng_weekday7',\n];\n\nconst CalendarModal: FC<OwnProps> = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const lang = useLang();\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n const prevIsOpen = usePrevious(isOpen);\n const [isTimeInputFocused, markTimeInputAsFocused, unmarkTimeInputAsFocused] = useFlag(false);\n\n const [selectedDate, setSelectedDate] = useState<Date>(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState<string>(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState<string>(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (!prevIsOpen && isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate, prevIsOpen]);\n\n useEffect(() => {\n if (isFutureMode && !isTimeInputFocused && selectedDate.getTime() < defaultSelectedDate.getTime()) {\n setSelectedDate(defaultSelectedDate);\n setSelectedHours(formatInputTime(defaultSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(defaultSelectedDate.getMinutes()));\n }\n }, [defaultSelectedDate, isTimeInputFocused, isFutureMode, selectedDate]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n <div className=\"timepicker\">\n <input\n type=\"text\"\n className=\"form-control\"\n inputMode=\"decimal\"\n value={selectedHours}\n onChange={handleChangeHours}\n onFocus={markTimeInputAsFocused}\n onBlur={unmarkTimeInputAsFocused}\n />\n :\n <input\n type=\"text\"\n className=\"form-control\"\n inputMode=\"decimal\"\n value={selectedMinutes}\n onChange={handleChangeMinutes}\n onFocus={markTimeInputAsFocused}\n onBlur={unmarkTimeInputAsFocused}\n />\n </div>\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n className=\"CalendarModal\"\n >\n <div className=\"container\">\n <div className=\"month-selector\">\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={onClose}\n >\n <i className=\"icon-close\" />\n </Button>\n\n <h4>\n {lang(`lng_month${selectedDate.getMonth() + 1}`)}\n {' '}\n {selectedDate.getFullYear()}\n </h4>\n\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n disabled={shouldDisablePrevMonth}\n onClick={!shouldDisablePrevMonth ? handlePrevMonth : undefined}\n >\n <i className=\"icon-previous\" />\n </Button>\n\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n disabled={shouldDisableNextMonth}\n onClick={!shouldDisableNextMonth ? handleNextMonth : undefined}\n >\n <i className=\"icon-next\" />\n </Button>\n </div>\n </div>\n\n <div className=\"calendar-wrapper\">\n <div className=\"calendar-grid\">\n {WEEKDAY_LETTERS.map((day) => (\n <div className=\"day-button faded weekday\">\n <span>{lang(day)}</span>\n </div>\n ))}\n {calendarGrid.map((gridDate) => (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n <span>{gridDate}</span>\n )}\n </div>\n ))}\n </div>\n </div>\n\n {withTimePicker && renderTimePicker()}\n\n <div className=\"footer\">\n <Button onClick={handleSubmit}>\n {withTimePicker ? formatSubmitLabel(lang, selectedDate) : submitButtonLabel}\n </Button>\n {secondButtonLabel && (\n <Button onClick={onSecondButtonClick} isText>\n {secondButtonLabel}\n </Button>\n )}\n </div>\n </Modal>\n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay() || 7;\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatDateToString(date, lang.code);\n const today = formatDateToString(new Date(), lang.code);\n\n if (day === today) {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(date)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'searchMessagesByDate' | 'closeHistoryCalendar'>;\n\nconst HistoryCalendar: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n <CalendarModal\n isOpen={isOpen}\n selectedAt={selectedAt}\n isPastMode\n submitButtonLabel={lang('JumpToDate')}\n onClose={closeHistoryCalendar}\n onSubmit={handleJumpToDate}\n />\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n return {\n selectedAt: global.historyCalendarSelectedAt,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'deleteMessages' | 'deleteScheduledMessages'>;\n\nconst DeleteMessageModal: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n onEnter={isOpen && !canDeleteForAll ? handleDeleteMessageForSelf : undefined}\n className=\"delete\"\n title={lang('DeleteSingleMessagesTitle')}\n >\n <p>{lang('AreYouSureDeleteSingleMessage')}</p>\n {willDeleteForCurrentUserOnly && (\n <p>{lang('lng_delete_for_me_chat_hint', 1, 'i')}</p>\n )}\n {willDeleteForAll && (\n <p>{lang('lng_delete_for_everyone_hint', 1, 'i')}</p>\n )}\n {canDeleteForAll && (\n <Button color=\"danger\" className=\"confirm-dialog-button\" isText onClick={handleDeleteMessageForAll}>\n {contactName && renderText(lang('Conversation.DeleteMessagesFor', contactName))}\n {!contactName && lang('Conversation.DeleteMessagesForEveryone')}\n </Button>\n )}\n <Button color=\"danger\" className=\"confirm-dialog-button\" isText onClick={handleDeleteMessageForSelf}>\n {lang(canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete')}\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, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'pinMessage'>;\n\nconst PinMessageModal: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderMessage() {\n if (isChannel) {\n return lang('PinMessageAlertChannel');\n }\n\n if (isGroup || isSuperGroup) {\n return lang('PinMessageAlert');\n }\n\n return lang('PinMessageAlertChat');\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n className=\"pin\"\n title={lang('PinMessageAlertTitle')}\n >\n <p>{renderMessage()}</p>\n <Button className=\"confirm-dialog-button\" isText onClick={handlePinMessage}>\n {lang('DialogPin')}\n </Button>\n {canPinForAll && (\n <Button className=\"confirm-dialog-button\" isText onClick={handlePinMessageForAll}>\n {contactName\n ? renderText(lang('Conversation.PinMessagesFor', contactName))\n : lang('Conversation.PinMessageAlert.PinAndNotifyMembers')}\n </Button>\n )}\n <Button className=\"confirm-dialog-button\" isText onClick={onClose}>{lang('Cancel')}</Button>\n </Modal>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC<OwnProps> = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n className=\"unpin-all\"\n title={lang('Chat.PanelUnpinAllMessages')}\n >\n <p>{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}</p>\n <Button className=\"confirm-dialog-button\" isText onClick={onUnpin}>\n {lang('DialogUnpin')}\n </Button>\n <Button className=\"confirm-dialog-button\" isText onClick={onClose}>{lang('Cancel')}</Button>\n </Modal>\n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, {\n FC, useCallback, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'deleteMessages' | 'exitMessageSelectMode' | 'deleteScheduledMessages'>;\n\nconst DeleteSelectedMessageModal: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const prevIsOpen = usePrevious(isOpen);\n\n const handleDeleteMessageForAll = useCallback(() => {\n onClose();\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n }, [deleteMessages, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n onClose();\n }, [isSchedule, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages]);\n\n const lang = useLang();\n\n // Returning `undefined` from FC instead of `<Modal>` doesn't trigger useHistoryBack\n useEffect(() => {\n if (!isOpen && prevIsOpen) {\n exitMessageSelectMode();\n }\n }, [exitMessageSelectMode, isOpen, prevIsOpen]);\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n onEnter={canDeleteForAll ? undefined : handleDeleteMessageForSelf}\n className=\"delete\"\n title={lang('Conversation.DeleteManyMessages')}\n >\n <p>{lang('AreYouSureDeleteFewMessages')}</p>\n {willDeleteForCurrentUserOnly && (\n <p>This will delete them just for you, not for other participants in the chat.</p>\n )}\n {willDeleteForAll && (\n <p>This will delete them for everyone in this chat.</p>\n )}\n {canDeleteForAll && (\n <Button color=\"danger\" className=\"confirm-dialog-button\" isText onClick={handleDeleteMessageForAll}>\n {contactName\n ? renderText(lang('ChatList.DeleteForEveryone', contactName))\n : lang('Conversation.DeleteMessagesForEveryone')}\n </Button>\n )}\n <Button color=\"danger\" className=\"confirm-dialog-button\" isText onClick={handleDeleteMessageForSelf}>\n {lang(canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete')}\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, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport RadioGroup from '../ui/RadioGroup';\nimport InputText from '../ui/InputText';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageIds?: number[];\n onClose: () => void;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'reportMessages' | 'exitMessageSelectMode'>;\n\nconst ReportMessageModal: FC<OwnProps & DispatchProps> = ({\n isOpen,\n messageIds,\n reportMessages,\n exitMessageSelectMode,\n onClose,\n}) => {\n const [selectedReason, setSelectedReason] = useState<ApiReportReason>('spam');\n const [description, setDescription] = useState('');\n\n const handleReport = () => {\n reportMessages({ messageIds, reason: selectedReason, description });\n exitMessageSelectMode();\n onClose();\n };\n\n const handleSelectReason = useCallback((value: string) => {\n setSelectedReason(value as ApiReportReason);\n }, []);\n\n const handleDescriptionChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setDescription(e.target.value);\n }, []);\n\n const lang = useLang();\n\n const REPORT_OPTIONS: { value: ApiReportReason; label: string }[] = [\n { value: 'spam', label: lang('lng_report_reason_spam') },\n { value: 'violence', label: lang('lng_report_reason_violence') },\n { value: 'pornography', label: lang('lng_report_reason_pornography') },\n { value: 'childAbuse', label: lang('lng_report_reason_child_abuse') },\n { value: 'copyright', label: lang('ReportPeer.ReasonCopyright') },\n { value: 'other', label: lang('lng_report_reason_other') },\n ];\n\n if (!messageIds) {\n return undefined;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n onEnter={isOpen ? handleReport : undefined}\n className=\"report\"\n title={lang('lng_report_message_title')}\n >\n <RadioGroup\n name=\"report-message\"\n options={REPORT_OPTIONS}\n onChange={handleSelectReason}\n selected={selectedReason}\n />\n <InputText\n label={lang('lng_report_reason_description')}\n value={description}\n onChange={handleDescriptionChange}\n />\n <Button color=\"danger\" className=\"confirm-dialog-button\" isText onClick={handleReport}>\n {lang('lng_report_button')}\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 undefined, (setGlobal, actions): DispatchProps => pick(actions, [\n 'reportMessages', 'exitMessageSelectMode',\n ]),\n)(ReportMessageModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanReportSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessageModal from './DeleteSelectedMessageModal';\nimport ReportMessageModal from '../common/ReportMessageModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n canReportMessages?: boolean;\n selectedMessageIds?: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'exitMessageSelectMode' | 'openForwardMenuForSelectedMessages'>;\n\nconst MessageSelectToolbar: FC<OwnProps & StateProps & DispatchProps> = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n selectedMessageIds,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isReportModalOpen, openReportModal, closeReportModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen && !isReportModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n <div className={className}>\n <div className=\"MessageSelectToolbar-inner\">\n <Button\n color=\"translucent\"\n round\n onClick={exitMessageSelectMode}\n ariaLabel=\"Exit select mode\"\n >\n <i className=\"icon-close\" />\n </Button>\n <span className=\"MessageSelectToolbar-count\" title={formattedMessagesCount}>\n {formattedMessagesCount}\n </span>\n\n {!!selectedMessagesCount && (\n <div className=\"MessageSelectToolbar-actions\">\n {messageListType !== 'scheduled' && (\n <MenuItem\n icon=\"forward\"\n ariaLabel=\"Forward Messages\"\n onClick={openForwardMenuForSelectedMessages}\n >\n <span className=\"item-text\">\n {lang('Forward')}\n </span>\n </MenuItem>\n )}\n {canReportMessages && (\n <MenuItem\n icon=\"flag\"\n onClick={openReportModal}\n disabled={!canReportMessages}\n ariaLabel={lang('Conversation.ReportMessages')}\n >\n <span className=\"item-text\">\n {lang('Report')}\n </span>\n </MenuItem>\n )}\n <MenuItem\n destructive\n icon=\"delete\"\n onClick={openDeleteModal}\n disabled={!canDeleteMessages}\n ariaLabel={lang('EditAdminGroupDeleteMessages')}\n >\n <span className=\"item-text\">\n {lang('Delete')}\n </span>\n </MenuItem>\n </div>\n )}\n </div>\n <DeleteSelectedMessageModal\n isOpen={isDeleteModalOpen}\n isSchedule={isSchedule}\n onClose={closeDeleteModal}\n />\n <ReportMessageModal\n isOpen={isReportModalOpen}\n onClose={closeReportModal}\n messageIds={selectedMessageIds}\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n const canReport = selectCanReportSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n selectedMessageIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId, selectIsChatMuted } from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectIsChatPinned, selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withUsername?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC<OwnProps & StateProps> = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n handleDelete: openDeleteModal,\n });\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n <ListItem\n className=\"chat-item-clickable search-result\"\n onClick={handleClick}\n contextActions={contextActions}\n buttonRef={buttonRef}\n >\n {isChatPrivate(chatId) ? (\n <PrivateChatInfo userId={chatId} withUsername={withUsername} avatarSize=\"large\" />\n ) : (\n <GroupChatInfo chatId={chatId} withUsername={withUsername} avatarSize=\"large\" />\n )}\n <DeleteChatModal\n isOpen={isDeleteModalOpen}\n onClose={closeDeleteModal}\n chat={chat}\n />\n </ListItem>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n const isMuted = chat\n ? selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n : undefined;\n\n return {\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record<number, ApiUser>;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadTopUsers' | 'loadContactList' | 'openChat' | 'addRecentlyFoundChatId' | 'clearRecentlyFoundChats'\n)>;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC<OwnProps & StateProps & DispatchProps> = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef<HTMLDivElement>(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef.current, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n <div className=\"RecentContacts custom-scroll\">\n {topUserIds && (\n <div className=\"top-peers-section\" dir={lang.isRtl ? 'rtl' : undefined}>\n <div ref={topUsersRef} className=\"top-peers no-selection\">\n {topUserIds.map((userId) => (\n <div className=\"top-peer-item\" onClick={() => handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\n <Avatar user={usersById[userId]} />\n <div className=\"top-peer-name\">{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}</div>\n </div>\n ))}\n </div>\n </div>\n )}\n {recentlyFoundChatIds && (\n <div className=\"search-section pt-1\">\n <h3 className=\"section-heading mt-0 recent-chats-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('Recent')}\n\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n ariaLabel=\"Clear recent chats\"\n onClick={clearRecentlyFoundChats}\n isRtl={lang.isRtl}\n >\n <i className=\"icon-close\" />\n </Button>\n </h3>\n {recentlyFoundChatIds.map((id) => (\n <LeftSearchResultChat\n chatId={id}\n onClick={handleClick}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'focusMessage'>;\n\nconst ChatMessage: FC<OwnProps & StateProps & DispatchProps> = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n <ListItem\n className=\"ChatMessage chat-item-clickable\"\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n onClick={handleClick}\n buttonRef={buttonRef}\n >\n <Avatar\n chat={chat}\n user={privateChatUser}\n withOnlineStatus\n isSavedMessages={privateChatUser && privateChatUser.isSelf}\n lastSyncTime={lastSyncTime}\n />\n <div className=\"info\">\n <div className=\"info-row\">\n <div className=\"title\">\n <h3 dir=\"auto\">{renderText(getChatTitle(lang, chat, privateChatUser))}</h3>\n {chat.isVerified && <VerifiedIcon />}\n </div>\n <div className=\"message-date\">\n <Link className=\"date\">\n {formatPastTimeShort(lang, message.date * 1000)}\n </Link>\n </div>\n\n </div>\n <div className=\"subtitle\">\n <div className=\"message\" dir=\"auto\">\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n </div>\n </div>\n </div>\n </ListItem>\n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n <span className=\"media-preview\">\n <img src={blobUrl} alt=\"\" className={isRoundVideo ? 'round' : undefined} />\n {getMessageVideo(message) && <i className=\"icon-play\" />}\n {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n </span>\n );\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n lastSyncTime: global.lastSyncTime,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC<OwnProps> = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n <section className=\"DateSuggest custom-scroll custom-scroll-x\">\n {suggestions.map(({ date, text }) => {\n return (\n <div\n onClick={() => onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n <i className=\"icon-calendar\" />\n <span>{text}</span>\n </div>\n );\n })}\n </section>\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChatIds?: number[];\n localUserIds?: number[];\n globalChatIds?: number[];\n globalUserIds?: number[];\n foundIds?: string[];\n globalMessagesByChatId?: Record<number, { byId: Record<number, ApiMessage> }>;\n chatsById: Record<number, ApiChat>;\n usersById: Record<number, ApiUser>;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'openChat' | 'addRecentlyFoundChatId' | 'searchMessagesGlobal' | 'setGlobalSearchChatId'\n)>;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC<OwnProps & StateProps & DispatchProps> = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\n\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState<boolean>(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState<boolean>(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundContactIds = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [\n searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById,\n ]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]),\n chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter<ApiMessage>(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n <ChatMessage\n chatId={message.chatId}\n message={message}\n searchQuery={searchQuery}\n />\n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return <RecentContacts onReset={onReset} />;\n }\n\n return (\n <InfiniteScroll\n className=\"LeftSearch custom-scroll\"\n items={foundMessages}\n onLoadMore={handleLoadMore}\n // To prevent scroll jumps caused by delayed local results rendering\n noScrollRestoreOnTop\n noFastList\n >\n {dateSearchQuery && (\n <div className=\"chat-selection no-selection no-scrollbar\">\n <DateSuggest\n searchDate={dateSearchQuery}\n onSelect={onSearchDateSelect}\n />\n </div>\n )}\n {nothingFound && (\n <NothingFound\n text={lang('ChatList.Search.NoResults')}\n description={lang('ChatList.Search.NoResultsDescription')}\n />\n )}\n {!!localResults.length && (\n <div className=\"chat-selection no-selection no-scrollbar\" dir={lang.isRtl ? 'rtl' : undefined}>\n {localResults.map((id) => (\n <PickerSelectedItem\n chatOrUserId={id}\n onClick={handlePickerItemClick}\n clickArg={id}\n />\n ))}\n </div>\n )}\n {!!localResults.length && (\n <div className=\"search-section\">\n <h3 className=\"section-heading\" dir={lang.isRtl ? 'auto' : undefined}>\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n <Link onClick={handleClickShowMoreLocal}>\n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n </Link>\n )}\n {lang('DialogList.SearchSectionDialogs')}\n </h3>\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n <LeftSearchResultChat\n chatId={id}\n onClick={handleChatClick}\n />\n );\n })}\n </div>\n )}\n {!!globalResults.length && (\n <div className=\"search-section\">\n <h3 className=\"section-heading\" dir={lang.isRtl ? 'auto' : undefined}>\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n <Link onClick={handleClickShowMoreGlobal}>\n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n </Link>\n )}\n {lang('DialogList.SearchSectionGlobal')}\n </h3>\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n <LeftSearchResultChat\n chatId={id}\n withUsername\n onClick={handleChatClick}\n />\n );\n })}\n </div>\n )}\n {!!foundMessages.length && (\n <div className=\"search-section\">\n <h3 className=\"section-heading\" dir={lang.isRtl ? 'auto' : undefined}>{lang('SearchMessages')}</h3>\n {foundMessages.map(renderFoundMessage)}\n </div>\n )}\n </InfiniteScroll>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const {\n currentUserId, messages, lastSyncTime,\n } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record<number, { byId: Record<number, ApiMessage> }>;\n chatsById: Record<number, ApiChat>;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('searchMessagesGlobal')>;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC<OwnProps & StateProps & DispatchProps> = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter<ApiMessage>(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n <ChatMessage\n chatId={message.chatId}\n message={message}\n searchQuery={searchQuery}\n />\n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n <div className=\"LeftSearch\">\n <InfiniteScroll\n className=\"search-content custom-scroll chat-list\"\n items={foundMessages}\n onLoadMore={handleLoadMore}\n noFastList\n >\n {dateSearchQuery && (\n <div className=\"chat-selection no-selection no-scrollbar\">\n <DateSuggest\n searchDate={dateSearchQuery}\n onSelect={onSearchDateSelect}\n />\n </div>\n )}\n {nothingFound && (\n <NothingFound\n text={lang('ChatList.Search.NoResults')}\n description={lang('ChatList.Search.NoResultsDescription')}\n />\n )}\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\nimport { ISettings } from '../../../../types';\n\nimport { selectTheme } from '../../../../modules/selectors';\n\nexport type StateProps = {\n theme: ISettings['theme'];\n isLoading?: boolean;\n chatsById: Record<number, ApiChat>;\n usersById: Record<number, ApiUser>;\n globalMessagesByChatId?: Record<number, { byId: Record<number, ApiMessage> }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n theme: selectTheme(global),\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('searchMessagesGlobal' | 'openMediaViewer')>;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC<OwnProps & StateProps & DispatchProps> = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const lang = useLang();\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n <div className=\"media-list\" dir={lang.isRtl ? 'rtl' : undefined}>\n {foundMessages.map((message) => (\n <Media\n key={message.id}\n idPrefix=\"search-media\"\n message={message}\n onClick={handleSelectMedia}\n />\n ))}\n </div>\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n <ChatMessage\n key={message.id}\n chatId={message.chatId}\n message={message}\n />\n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n <div className=\"LeftSearch\">\n <InfiniteScroll\n className={classNames}\n items={foundMessages}\n itemSelector={!searchQuery ? '.Media' : '.ListItem'}\n onLoadMore={handleLoadMore}\n noFastList\n >\n {!canRenderContents && <Loading />}\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n <NothingFound\n text={lang('ChatList.Search.NoResults')}\n description={lang('ChatList.Search.NoResultsDescription')}\n />\n )}\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record<number, ApiChat>, usersById: Record<number, ApiUser>,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('searchMessagesGlobal' | 'focusMessage')>;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC<OwnProps & StateProps & DispatchProps> = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n <div\n className=\"ListItem small-icon\"\n dir={lang.isRtl ? 'rtl' : undefined}\n key={message.id}\n >\n {shouldDrawDateDivider && (\n <p className=\"section-heading\" dir={lang.isRtl ? 'rtl' : undefined}>\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n </p>\n )}\n <WebLink\n key={message.id}\n message={message}\n senderTitle={getSenderName(lang, message, chatsById, usersById)}\n onMessageClick={handleMessageFocus}\n />\n </div>\n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n <div className=\"LeftSearch\">\n <InfiniteScroll\n className=\"search-content documents-list custom-scroll\"\n items={foundMessages}\n onLoadMore={handleLoadMore}\n noFastList\n >\n {!canRenderContents && <Loading />}\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n <NothingFound\n text={lang('ChatList.Search.NoResults')}\n description={lang('ChatList.Search.NoResultsDescription')}\n />\n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('searchMessagesGlobal' | 'focusMessage')>;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC<OwnProps & StateProps & DispatchProps> = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n <div\n className=\"ListItem small-icon\"\n key={message.id}\n >\n {shouldDrawDateDivider && (\n <p className=\"section-heading\">{formatMonthAndYear(lang, new Date(message.date * 1000))}</p>\n )}\n <Document\n message={message}\n withDate\n datetime={message.date}\n smaller\n sender={getSenderName(lang, message, chatsById, usersById)}\n className=\"scroll-item\"\n onDateClick={handleMessageFocus}\n />\n </div>\n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n <div className=\"LeftSearch\">\n <InfiniteScroll\n className=\"search-content documents-list custom-scroll\"\n items={foundMessages}\n onLoadMore={handleLoadMore}\n noFastList\n >\n {!canRenderContents && <Loading />}\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n <NothingFound\n text={lang('ChatList.Search.NoResults')}\n description={lang('ChatList.Search.NoResultsDescription')}\n />\n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('searchMessagesGlobal' | 'focusMessage' | 'openAudioPlayer')>;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC<OwnProps & StateProps & DispatchProps> = ({\n theme,\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n <div\n className=\"ListItem small-icon\"\n key={message.id}\n >\n {shouldDrawDateDivider && (\n <p className=\"section-heading\" dir={lang.isRtl ? 'rtl' : undefined}>\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n </p>\n )}\n <Audio\n key={message.id}\n theme={theme}\n message={message}\n target=\"searchResult\"\n senderTitle={getSenderName(lang, message, chatsById, usersById)}\n date={message.date}\n lastSyncTime={lastSyncTime}\n className=\"scroll-item\"\n onPlay={handlePlayAudio}\n onDateClick={handleMessageFocus}\n />\n </div>\n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n <div className=\"LeftSearch\">\n <InfiniteScroll\n className=\"search-content documents-list custom-scroll\"\n items={foundMessages}\n onLoadMore={handleLoadMore}\n noFastList\n >\n {!canRenderContents && <Loading />}\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n <NothingFound\n text={lang('ChatList.Search.NoResults')}\n description={lang('ChatList.Search.NoResultsDescription')}\n />\n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('setGlobalSearchContent' | 'setGlobalSearchDate')>;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC<OwnProps & StateProps & DispatchProps> = ({\n searchQuery,\n searchDate,\n isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(currentContent);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n useHistoryBack(isActive, onReset, undefined, undefined, true);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\n\n return (\n <div className=\"LeftSearch\" ref={containerRef} onKeyDown={handleKeyDown}>\n <TabList activeTab={activeTab} tabs={chatId ? CHAT_TABS : TABS} onSwitchTab={handleSwitchTab} />\n <Transition\n name={lang.isRtl ? 'slide-reversed' : 'slide'}\n renderCount={TRANSITION_RENDER_COUNT}\n activeKey={currentContent}\n >\n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n <UserChatResults\n searchQuery={searchQuery}\n dateSearchQuery={dateSearchQuery}\n onReset={onReset}\n onSearchDateSelect={handleSearchDateSelect}\n />\n );\n }\n return (\n <ChatResults\n searchQuery={searchQuery}\n searchDate={searchDate}\n dateSearchQuery={dateSearchQuery}\n onReset={onReset}\n onSearchDateSelect={handleSearchDateSelect}\n />\n );\n case GlobalSearchContent.Media:\n return <MediaResults searchQuery={searchQuery} />;\n case GlobalSearchContent.Links:\n return <LinkResults searchQuery={searchQuery} />;\n case GlobalSearchContent.Files:\n return <FileResults searchQuery={searchQuery} />;\n case GlobalSearchContent.Music:\n return (\n <AudioResults\n key=\"audio\"\n searchQuery={searchQuery}\n />\n );\n case GlobalSearchContent.Voice:\n return (\n <AudioResults\n key=\"voice\"\n isVoice\n searchQuery={searchQuery}\n />\n );\n default:\n return undefined;\n }\n }}\n </Transition>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch<TwoFaActions>;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer<TwoFaState, TwoFaActions> = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'signOut' | 'deleteChatFolder'>;\n\nconst SettingsHeader: FC<OwnProps & DispatchProps> = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n onScreenSelect,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n <Button\n round\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n size=\"smaller\"\n color=\"translucent\"\n className={isOpen ? 'active' : ''}\n onClick={onTrigger}\n ariaLabel=\"More actions\"\n >\n <i className=\"icon-more\" />\n </Button>\n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return <h3>{lang('lng_settings_information')}</h3>;\n case SettingsScreens.General:\n return <h3>{lang('General')}</h3>;\n case SettingsScreens.Notifications:\n return <h3>{lang('Notifications')}</h3>;\n case SettingsScreens.Privacy:\n return <h3>{lang('PrivacySettings')}</h3>;\n case SettingsScreens.Language:\n return <h3>{lang('Language')}</h3>;\n\n case SettingsScreens.GeneralChatBackground:\n return <h3>{lang('ChatBackground')}</h3>;\n case SettingsScreens.GeneralChatBackgroundColor:\n return <h3>{lang('SetColor')}</h3>;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return <h3>{lang('PrivacyPhone')}</h3>;\n case SettingsScreens.PrivacyLastSeen:\n return <h3>{lang('PrivacyLastSeen')}</h3>;\n case SettingsScreens.PrivacyProfilePhoto:\n return <h3>{lang('Privacy.ProfilePhoto')}</h3>;\n case SettingsScreens.PrivacyForwarding:\n return <h3>{lang('PrivacyForwards')}</h3>;\n case SettingsScreens.PrivacyGroupChats:\n return <h3>{lang('AutodownloadGroupChats')}</h3>;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return <h3>{lang('AlwaysShareWith')}</h3>;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return <h3>{lang('NeverShareWith')}</h3>;\n\n case SettingsScreens.PrivacyActiveSessions:\n return <h3>{lang('SessionsTitle')}</h3>;\n case SettingsScreens.PrivacyBlockedUsers:\n return <h3>{lang('BlockedUsers')}</h3>;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return <h3>{lang('TwoStepVerification')}</h3>;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return <h3>{lang('PleaseEnterCurrentPassword')}</h3>;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return <h3>{lang('PleaseReEnterPassword')}</h3>;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return <h3>{lang('PasswordHint')}</h3>;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return <h3>{lang('RecoveryEmailTitle')}</h3>;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return <h3>Recovery Email Code</h3>;\n case SettingsScreens.TwoFaCongratulations:\n return <h3>{lang('TwoStepVerificationPasswordSet')}</h3>;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return <h3>{lang('PleaseEnterCurrentPassword')}</h3>;\n\n case SettingsScreens.Folders:\n return <h3>{lang('Filters')}</h3>;\n case SettingsScreens.FoldersCreateFolder:\n return <h3>{lang('FilterNew')}</h3>;\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n <div className=\"settings-main-header\">\n <h3>{lang('FilterEdit')}</h3>\n\n {editedFolderId && (\n <DropdownMenu\n className=\"settings-more-menu\"\n trigger={SettingsMenuButton}\n positionX=\"right\"\n >\n <MenuItem icon=\"delete\" destructive onClick={openDeleteFolderConfirmation}>\n {lang('Delete')}\n </MenuItem>\n </DropdownMenu>\n )}\n </div>\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n <div className=\"settings-main-header\">\n {(currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersIncludedChatsFromChatList) ? (\n <h3>{lang('FilterInclude')}</h3>\n ) : (\n <h3>{lang('FilterExclude')}</h3>\n )}\n\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n className=\"color-primary\"\n onClick={onSaveFilter}\n ariaLabel={lang('AutoDeleteConfirm')}\n >\n <i className=\"icon-check\" />\n </Button>\n </div>\n );\n\n default:\n return (\n <div className=\"settings-main-header\">\n <h3>{lang('SETTINGS')}</h3>\n\n <Button\n round\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n size=\"smaller\"\n color=\"translucent\"\n onClick={() => onScreenSelect(SettingsScreens.EditProfile)}\n ariaLabel={lang('lng_settings_information')}\n >\n <i className=\"icon-edit\" />\n </Button>\n <DropdownMenu\n className=\"settings-more-menu\"\n trigger={SettingsMenuButton}\n positionX=\"right\"\n >\n <MenuItem icon=\"logout\" onClick={openSignOutConfirmation}>{lang('LogOutTitle')}</MenuItem>\n </DropdownMenu>\n </div>\n );\n }\n }\n\n return (\n <div className=\"left-header\">\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={onReset}\n ariaLabel={lang('AccDescrGoBack')}\n >\n <i className=\"icon-arrow-left\" />\n </Button>\n {renderHeaderContent()}\n <ConfirmDialog\n isOpen={isSignOutDialogOpen}\n onClose={closeSignOutConfirmation}\n text={lang('lng_sure_logout')}\n confirmLabel={lang('AccountSettings.Logout')}\n confirmHandler={handleSignOutMessage}\n confirmIsDestructive\n />\n <ConfirmDialog\n isOpen={isDeleteFolderDialogOpen}\n onClose={closeDeleteFolderConfirmation}\n text={lang('FilterDeleteAlert')}\n confirmLabel={lang('Delete')}\n confirmHandler={handleDeleteFolderMessage}\n confirmIsDestructive\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ProfileInfo from '../../common/ProfileInfo';\nimport ChatExtra from '../../common/ChatExtra';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadProfilePhotos'>;\n\nconst SettingsMain: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n loadProfilePhotos,\n currentUser,\n lastSyncTime,\n}) => {\n const lang = useLang();\n const profileId = currentUser ? currentUser.id : undefined;\n\n useEffect(() => {\n if (profileId && lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [lastSyncTime, profileId, loadProfilePhotos]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main);\n\n return (\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-main-menu\">\n {currentUser && (\n <ProfileInfo\n userId={currentUser.id}\n forceShowSelf\n />\n )}\n {currentUser && (\n <ChatExtra\n chatOrUserId={currentUser.id}\n forceShowSelf\n />\n )}\n <ListItem\n icon=\"settings\"\n onClick={() => onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n </ListItem>\n <ListItem\n icon=\"unmute\"\n onClick={() => onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n </ListItem>\n <ListItem\n icon=\"lock\"\n onClick={() => onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n </ListItem>\n <ListItem\n icon=\"folder\"\n onClick={() => onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n </ListItem>\n <ListItem\n icon=\"language\"\n onClick={() => onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n </ListItem>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { currentUserId, lastSyncTime } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadProfilePhotos']),\n)(SettingsMain));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC<OwnProps> = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n <InputText\n value={`${asLink ? LINK_PREFIX : ''}${username}`}\n onChange={handleUsernameChange}\n label={label}\n error={usernameError}\n success={usernameSuccess}\n readOnly={isLoading}\n />\n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress, SettingsScreens } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadCurrentUser' | 'updateProfile' | 'checkUsername'\n)>;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const lang = useLang();\n\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n const [photo, setPhoto] = useState<File | undefined>();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState<string | false>(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.EditProfile);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n return (\n <div className=\"settings-fab-wrapper\">\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-edit-profile\">\n <AvatarEditable\n currentAvatarBlobUrl={currentAvatarBlobUrl}\n onChange={handlePhotoChange}\n title=\"Edit your profile photo\"\n disabled={isLoading}\n />\n <InputText\n value={firstName}\n onChange={handleFirstNameChange}\n label={lang('FirstName')}\n disabled={isLoading}\n error={error === ERROR_FIRST_NAME_MISSING ? error : undefined}\n />\n <InputText\n value={lastName}\n onChange={handleLastNameChange}\n label={lang('LastName')}\n disabled={isLoading}\n />\n <InputText\n value={bio}\n onChange={handleBioChange}\n label={lang('UserBio')}\n disabled={isLoading}\n error={error === ERROR_BIO_TOO_LONG ? error : undefined}\n />\n\n <p className=\"settings-item-description\" dir={lang.isRtl ? 'rtl' : undefined}>\n {renderText(lang('lng_settings_about_bio'), ['br', 'simple_markdown'])}\n </p>\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('Username')}</h4>\n\n <UsernameInput\n currentUsername={username || ''}\n isLoading={isLoading}\n isUsernameAvailable={isUsernameAvailable}\n checkUsername={checkUsername}\n onChange={handleUsernameChange}\n />\n\n <p className=\"settings-item-description\" dir={lang.isRtl ? 'rtl' : undefined}>\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n </p>\n {username && (\n <p className=\"settings-item-description\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('lng_username_link')}<br />\n <span className=\"username-link\">https://t.me/{username}</span>\n </p>\n )}\n </div>\n </div>\n\n <FloatingActionButton\n isShown={isSaveButtonShown}\n onClick={handleProfileSave}\n disabled={isLoading}\n ariaLabel=\"Save changes\"\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record<number, ApiChat>;\n usersById: Record<number, ApiUser>;\n orderedFolderIds?: number[];\n foldersById: Record<number, ApiChatFolder>;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record<number, NotifyException>;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadRecommendedChatFolders' | 'addChatFolder' | 'showDialog'>;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC<OwnProps & StateProps & DispatchProps> = ({\n onCreateFolder,\n onEditFolder,\n isActive,\n onScreenSelect,\n onReset,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\n}) => {\n const [animationData, setAnimationData] = useState<Record<string, any>>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showDialog, onCreateFolder]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Folders);\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showDialog]);\n\n return (\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-content-header\">\n <div className=\"settings-content-icon\">\n {animationData && (\n <AnimatedSticker\n id=\"settingsFoldersMain\"\n size={STICKER_SIZE_FOLDER_SETTINGS}\n animationData={animationData}\n play={isAnimationLoaded}\n noLoop\n onLoad={handleAnimationLoad}\n />\n )}\n </div>\n\n <p className=\"settings-item-description mb-3\" dir=\"auto\">\n {lang('CreateNewFilterInfo')}\n </p>\n\n <Button\n // TODO: Refactor button component to handle icon placemenet with props\n className=\"with-icon mb-2\"\n color=\"primary\"\n size=\"smaller\"\n pill\n fluid\n onClick={handleCreateFolder}\n isRtl={lang.isRtl}\n >\n <i className=\"icon-add\" />\n {lang('CreateNewFilter')}\n </Button>\n </div>\n\n <div className=\"settings-item pt-3\">\n <h4 className=\"settings-item-header mb-3\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('Filters')}</h4>\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n <ListItem\n className=\"mb-2 no-icon\"\n narrow\n multiline\n onClick={() => onEditFolder(foldersById[folder.id])}\n >\n <span className=\"title\">{folder.title}</span>\n <span className=\"subtitle\">{folder.subtitle}</span>\n </ListItem>\n )) : userFolders && !userFolders.length ? (\n <p className=\"settings-item-description my-4\" dir=\"auto\">\n You have no folders yet.\n </p>\n ) : <Loading />}\n </div>\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n <div className=\"settings-item pt-3\">\n <h4 className=\"settings-item-header mb-3\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('FilterRecommended')}\n </h4>\n\n {recommendedChatFolders.map((folder) => (\n <ListItem\n className=\"mb-2\"\n narrow\n onClick={() => handleCreateFolderFromRecommended(folder)}\n >\n <div className=\"settings-folders-recommended-item\">\n <div className=\"multiline-item\">\n <span className=\"title\">{folder.title}</span>\n <span className=\"subtitle\">{folder.description}</span>\n </div>\n\n <Button\n className=\"px-3\"\n color=\"primary\"\n size=\"tiny\"\n pill\n fluid\n isRtl={lang.isRtl}\n >\n {lang('Add')}\n </Button>\n </div>\n </ListItem>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showDialog']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC<OwnProps> = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n const lang = useLang();\n\n return (\n <Button\n className=\"ShowMoreButton\"\n color=\"translucent\"\n size=\"smaller\"\n isText\n isLoading={isLoading}\n isRtl={lang.isRtl}\n onClick={onClick}\n >\n <i className=\"icon-down\" />\n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n </Button>\n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet, pick } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n EXCLUDED_CHAT_TYPES,\n FolderEditDispatch,\n FoldersState,\n INCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n onBack: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'editChatFolder' | 'addChatFolder' | 'loadMoreChats'>;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'ChatList.Filter.Error.Empty';\n\nconst SettingsFoldersEdit: FC<OwnProps & StateProps & DispatchProps> = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n isActive,\n onScreenSelect,\n onReset,\n onBack,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState<Record<string, any>>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onBack, onScreenSelect, state.mode === 'edit'\n ? SettingsScreens.FoldersEditFolder\n : SettingsScreens.FoldersCreateFolder);\n\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n <ListItem\n key={chatType.key}\n className=\"settings-folders-list-item mb-1\"\n icon={chatType.icon}\n narrow\n inactive\n >\n {lang(chatType.title)}\n </ListItem>\n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n <ListItem\n className=\"settings-folders-list-item mb-1\"\n narrow\n inactive\n >\n {isChatPrivate(id) ? (\n <PrivateChatInfo avatarSize=\"small\" userId={id} />\n ) : (\n <GroupChatInfo avatarSize=\"small\" chatId={id} />\n )}\n </ListItem>\n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n <ShowMoreButton\n count={leftChatsCount}\n itemName=\"chat\"\n onClick={clickHandler}\n />\n )}\n </>\n );\n }\n\n return (\n <div className=\"settings-fab-wrapper\">\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-content-header\">\n <div className=\"settings-content-icon\">\n {animationData && (\n <AnimatedSticker\n id=\"settingsFoldersEdit\"\n size={STICKER_SIZE_FOLDER_SETTINGS}\n animationData={animationData}\n play={isAnimationLoaded && String(state.folderId)}\n noLoop\n onLoad={handleAnimationLoad}\n />\n )}\n </div>\n\n {state.mode === 'create' && (\n <p className=\"settings-item-description mb-3\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('FilterIncludeInfo')}\n </p>\n )}\n\n <InputText\n className=\"mb-0\"\n label={lang('FilterNameHint')}\n value={state.folder.title}\n onChange={handleChange}\n error={state.error && state.error === ERROR_NO_TITLE ? ERROR_NO_TITLE : undefined}\n />\n </div>\n\n <div className=\"settings-item no-border pt-3\">\n {state.error && state.error === ERROR_NO_CHATS && (\n <p className=\"settings-item-description color-danger mb-2\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang(state.error)}\n </p>\n )}\n\n <h4 className=\"settings-item-header mb-3\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('FilterInclude')}</h4>\n\n <ListItem\n className=\"settings-folders-list-item color-primary mb-0\"\n icon=\"add\"\n onClick={onAddIncludedChats}\n >\n {lang('FilterAddChats')}\n </ListItem>\n\n {renderChats('included')}\n </div>\n\n <div className=\"settings-item no-border pt-3\">\n <h4 className=\"settings-item-header mb-3\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('FilterExclude')}</h4>\n\n <ListItem\n className=\"settings-folders-list-item color-primary mb-0\"\n icon=\"add\"\n onClick={onAddExcludedChats}\n >\n {lang('FilterAddChats')}\n </ListItem>\n\n {renderChats('excluded')}\n </div>\n </div>\n\n <FloatingActionButton\n isShown={!!state.isTouched}\n disabled={state.isLoading}\n onClick={handleSubmit}\n ariaLabel={state.mode === 'edit' ? 'Save changes' : 'Create folder'}\n >\n {state.isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC<OwnProps> = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n <PickerSelectedItem\n icon={selectedType.icon}\n title={lang(selectedType.title)}\n isMinimized={shouldMinimize}\n canClose\n onClick={handleChatTypeClick}\n clickArg={selectedType.key}\n />\n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n <ListItem\n key={type.key}\n className=\"chat-item-clickable picker-list-item chat-type-item\"\n onClick={() => handleChatTypeClick(type.key)}\n ripple\n >\n <i className={`icon-${type.icon}`} />\n <h3 className=\"chat-type\" dir=\"auto\">{lang(type.title)}</h3>\n <Checkbox\n label=\"\"\n checked={selectedChatTypes.includes(type.key)}\n round\n />\n </ListItem>\n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n <ListItem\n key={id}\n className=\"chat-item-clickable picker-list-item chat-item\"\n onClick={() => handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n <PrivateChatInfo userId={id} />\n ) : (\n <GroupChatInfo chatId={id} withChatType />\n )}\n <Checkbox\n label=\"\"\n checked={isSelected}\n round\n />\n </ListItem>\n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n <div className=\"Picker SettingsFoldersChatsPicker\">\n <div className=\"picker-header custom-scroll\">\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n <PickerSelectedItem\n chatOrUserId={id}\n isMinimized={shouldMinimize && i < selectedIds.length - ALWAYS_FULL_ITEMS_COUNT}\n canClose\n onClick={handleItemClick}\n clickArg={id}\n />\n ))}\n {!hasMaxChats ? (\n <InputText\n ref={inputRef}\n value={filterValue}\n onChange={handleFilterChange}\n placeholder={lang('Search')}\n />\n ) : (\n <p className=\"max-items-reached\" dir=\"auto\">\n {`Sorry, you can't add more than ${MAX_CHATS} chats.`}\n </p>\n )}\n </div>\n <InfiniteScroll\n className=\"picker-list custom-scroll\"\n itemSelector=\".chat-item\"\n items={viewportIds}\n onLoadMore={getMore}\n >\n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n <h4 key=\"header1\" className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('FilterChatTypes')}\n </h4>\n {chatTypes.map(renderChatType)}\n <div key=\"divider\" className=\"picker-list-divider\" />\n <h4 key=\"header2\" className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('FilterChats')}\n </h4>\n </>\n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n <p className=\"no-results\" key=\"no-results\">Sorry, nothing found.</p>\n ) : (\n <Loading key=\"loading\" />\n )}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record<number, ApiChat>;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadMoreChats'>;\n\nconst SettingsFoldersChatFilters: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const lang = useLang();\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record<string, boolean> = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n useHistoryBack(isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats);\n\n if (!displayedIds) {\n return <Loading />;\n }\n\n return (\n <SettingsFoldersChatsPicker\n mode={mode}\n chatIds={displayedIds}\n selectedIds={selectedChatIds}\n selectedChatTypes={selectedChatTypes}\n filterValue={chatFilter}\n onSelectedIdsChange={handleSelectedIdsChange}\n onSelectedChatTypesChange={handleSelectedChatTypesChange}\n onFilterChange={handleFilterChange}\n onLoadMore={loadMoreChats}\n />\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FolderEditDispatch, FoldersState } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC<OwnProps> = ({\n currentScreen,\n shownScreen,\n state,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersIncludedChatsFromChatList\n : SettingsScreens.FoldersIncludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersExcludedChatsFromChatList\n : SettingsScreens.FoldersExcludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n <SettingsFoldersMain\n onCreateFolder={handleCreateFolder}\n onEditFolder={handleEditFolder}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersExcludedChats,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n <SettingsFoldersEdit\n state={state}\n dispatch={dispatch}\n onAddIncludedChats={handleAddIncludedChats}\n onAddExcludedChats={handleAddExcludedChats}\n onReset={handleReset}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersExcludedChats,\n ].includes(shownScreen)}\n onBack={onReset}\n />\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n return (\n <SettingsFoldersChatFilters\n mode=\"included\"\n state={state}\n dispatch={dispatch}\n onReset={handleReset}\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n />\n );\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n <SettingsFoldersChatFilters\n mode=\"excluded\"\n state={state}\n dispatch={dispatch}\n onReset={handleReset}\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n />\n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC<OwnProps> = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n <div className={className}>\n {label && (\n <div className=\"slider-top-row\" dir={lang.isRtl ? 'rtl' : undefined}>\n <span className=\"label\" dir=\"auto\">{label}</span>\n {range && (\n <span className=\"value\" dir=\"auto\">{value}</span>\n )}\n </div>\n )}\n <div className=\"slider-main\">\n <div\n className=\"slider-fill-track\"\n // @ts-ignore\n style={`width: ${trackWidth}%`}\n />\n <input\n min={min}\n max={max}\n value={value}\n step={step}\n type=\"range\"\n onChange={handleChange}\n />\n {options && (\n <div className=\"slider-options\">\n {options.map((option, index) => (\n <div\n className={buildClassName('slider-option no-selection', index === value && 'active')}\n onClick={() => onChange(index)}\n >\n {option}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC<OwnProps> = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n <div ref={ref} className=\"sticker-set-cover\">\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n <AnimatedSticker\n id={mediaHash}\n size={size}\n animationData={lottieData}\n className={transitionClassNames}\n />\n )}\n </div>\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC<OwnProps> = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n <div ref={ref} className=\"sticker-set-cover\">\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n <img src={mediaData} className={transitionClassNames} alt=\"\" />\n )}\n </div>\n );\n};\n\nexport default memo(StickerSetCover);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC<OwnProps> = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n <ListItem\n narrow\n className=\"SettingsStickerSet\"\n inactive={!firstSticker}\n onClick={() => firstSticker && onClick(firstSticker)}\n >\n <Button\n ariaLabel={stickerSet.title}\n color=\"translucent\"\n isRtl={lang.isRtl}\n >\n {stickerSet.isAnimated ? (\n <StickerSetCoverAnimated\n size={STICKER_SIZE_GENERAL_SETTINGS}\n stickerSet={stickerSet}\n observeIntersection={observeIntersection}\n />\n ) : (\n <StickerSetCover\n stickerSet={stickerSet}\n observeIntersection={observeIntersection}\n />\n )}\n </Button>\n <div className=\"multiline-menu-item\">\n <div className=\"title\">{stickerSet.title}</div>\n <div className=\"subtitle\">{lang('StickerPack.StickerCount', stickerSet.count, 'i')}</div>\n </div>\n </ListItem>\n );\n } else {\n return (\n <ListItem\n narrow\n className=\"SettingsStickerSet\"\n onClick={() => onClick(firstSticker)}\n >\n <StickerButton\n sticker={firstSticker}\n size={STICKER_SIZE_GENERAL_SETTINGS}\n title={stickerSet.title}\n observeIntersection={observeIntersection}\n />\n <div className=\"multiline-menu-item\">\n <div className=\"title\">{stickerSet.title}</div>\n <div className=\"subtitle\">{lang('StickerPack.StickerCount', stickerSet.count, 'i')}</div>\n </div>\n </ListItem>\n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_IOS, IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick<ISettings, (\n 'messageTextSize' |\n 'animationLevel' |\n 'messageSendKeyCombo' |\n 'shouldAutoDownloadMediaFromContacts' |\n 'shouldAutoDownloadMediaInPrivateChats' |\n 'shouldAutoDownloadMediaInGroups' |\n 'shouldAutoDownloadMediaInChannels' |\n 'shouldAutoPlayGifs' |\n 'shouldAutoPlayVideos' |\n 'shouldSuggestStickers' |\n 'shouldLoopStickers'\n)> & {\n stickerSetIds?: string[];\n stickerSetsById?: Record<string, ApiStickerSet>;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'setSettingOption' | 'loadStickerSets' | 'loadAddedStickers'\n)>;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef<HTMLDivElement>(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState<ApiSticker>();\n\n const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(newSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(newSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n document.documentElement.setAttribute('data-message-text-size', newSize.toString());\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter<ApiStickerSet>(Boolean as any);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n return (\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-item pt-3\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('SETTINGS')}</h4>\n\n <RangeSlider\n label={lang('TextSize')}\n // TODO Remove memo-killer\n range={{ min: 12, max: 20 }}\n value={messageTextSize}\n onChange={handleMessageTextSizeChange}\n />\n\n <ListItem\n icon=\"photo\"\n onClick={() => onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n </ListItem>\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n Animation Level\n </h4>\n <p className=\"settings-item-description\" dir={lang.isRtl ? 'rtl' : undefined}>\n Choose the desired animations amount.\n </p>\n\n <RangeSlider\n options={ANIMATION_LEVEL_OPTIONS}\n value={animationLevel}\n onChange={handleAnimationLevelChange}\n />\n </div>\n\n {KEYBOARD_SEND_OPTIONS && (\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('VoiceOver.Keyboard')}</h4>\n\n <RadioGroup\n name=\"keyboard-send-settings\"\n options={KEYBOARD_SEND_OPTIONS}\n onChange={(value) => setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n </div>\n )}\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('AutoDownloadMedia')}</h4>\n\n <Checkbox\n label={lang('Contacts')}\n checked={shouldAutoDownloadMediaFromContacts}\n onCheck={(isChecked) => setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n <Checkbox\n label={lang('AutodownloadPrivateChats')}\n checked={shouldAutoDownloadMediaInPrivateChats}\n onCheck={(isChecked) => setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n <Checkbox\n label={lang('AutodownloadGroupChats')}\n checked={shouldAutoDownloadMediaInGroups}\n onCheck={(isChecked) => setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n <Checkbox\n label={lang('FilterChannels')}\n checked={shouldAutoDownloadMediaInChannels}\n onCheck={(isChecked) => setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('AutoplayMedia')}</h4>\n\n <Checkbox\n label={lang('GifsTab2')}\n checked={shouldAutoPlayGifs}\n onCheck={(isChecked) => setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n <Checkbox\n label={lang('DataAndStorage.Autoplay.Videos')}\n checked={shouldAutoPlayVideos}\n onCheck={(isChecked) => setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('AccDescrStickers')}</h4>\n\n <Checkbox\n label={lang('SuggestStickers')}\n checked={shouldSuggestStickers}\n onCheck={(isChecked) => setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n <Checkbox\n label={lang('LoopAnimatedStickers')}\n checked={shouldLoopStickers}\n onCheck={(isChecked) => setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n <div className=\"mt-4\" ref={stickerSettingsRef}>\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n <SettingsStickerSet\n key={stickerSet.id}\n stickerSet={stickerSet}\n observeIntersection={observeIntersectionForCovers}\n onClick={handleStickerSetClick}\n />\n ))}\n </div>\n {sticker && (\n <StickerSetModal\n isOpen={isModalOpen}\n fromSticker={sticker}\n onClose={closeModal}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey, [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n 'isSensitiveEnabled',\n 'canChangeSensitive',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC<OwnProps> = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n true,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef<string>();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n <div className={className} onClick={handleClick}>\n <div className=\"media-inner\">\n {shouldRenderThumb && (\n <canvas\n ref={thumbRef}\n className=\"thumbnail\"\n />\n )}\n {shouldRenderFullMedia && (\n <img\n src={previewBlobUrl || localBlobUrl}\n className={`full-media ${transitionClassNames}`}\n alt=\"\"\n />\n )}\n {shouldRenderSpinner && (\n <div className={buildClassName('spinner-container', spinnerClassNames)}>\n <ProgressSpinner progress={downloadProgress} onClick={handleClick} />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport { selectTheme } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadWallpapers' | 'uploadWallpaper' | 'setThemeSettings'\n)>;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef<string>();\n themeRef.current = theme;\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackground);\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n <div className=\"SettingsGeneralBackground settings-content custom-scroll\">\n <div className=\"settings-item pt-3\">\n <ListItem\n icon=\"camera-add\"\n className=\"mb-0\"\n disabled={isUploading}\n onClick={handleUploadWallpaper}\n >\n {lang('UploadImage')}\n </ListItem>\n\n <ListItem\n icon=\"colorize\"\n className=\"mb-0\"\n onClick={handleSetColor}\n >\n {lang('SetColor')}\n </ListItem>\n\n <ListItem icon=\"favorite\" onClick={handleResetToDefault}>\n {lang('ThemeResetToDefaults')}\n </ListItem>\n\n <Checkbox\n label={lang('BackgroundBlurred')}\n checked={Boolean(isBlurred)}\n onChange={handleWallPaperBlurChange}\n />\n </div>\n\n {loadedWallpapers ? (\n <div className=\"settings-wallpapers\">\n {loadedWallpapers.map((wallpaper) => (\n <WallpaperTile\n wallpaper={wallpaper}\n theme={theme}\n isSelected={background === wallpaper.slug}\n onClick={handleWallPaperSelect}\n />\n ))}\n </div>\n ) : (\n <Loading />\n )}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport { selectTheme } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'setThemeSettings'>;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef<string>();\n themeRef.current = theme;\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef<HTMLDivElement>(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(backgroundColor));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef<CanvasRects>();\n const colorCtxRef = useRef<CanvasRenderingContext2D>();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n selectorToPreventScroll: '.SettingsGeneralBackgroundColor',\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n selectorToPreventScroll: '.SettingsGeneralBackgroundColor',\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent<HTMLInputElement>) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackgroundColor);\n\n return (\n <div ref={containerRef} className={className}>\n <div className=\"settings-item pt-3\">\n <div ref={colorPickerRef} className=\"color-picker\">\n <canvas />\n <div\n className=\"handle\"\n // @ts-ignore\n style={`transform: translate(${colorPosition[0]}px, ${colorPosition[1]}px); background-color: #${hex};`}\n />\n </div>\n <div ref={huePickerRef} className=\"hue-picker\">\n <canvas />\n <div\n className=\"handle\"\n // @ts-ignore\n style={`transform: translateX(${huePosition}px); background-color: #${hueHex};`}\n />\n </div>\n <div className=\"tools\">\n <InputText value={hexInput} label=\"HEX\" onChange={handleHexChange} />\n <InputText value={rgbInput} label=\"RGB\" onChange={handleRgbChange} />\n </div>\n </div>\n <div className=\"predefined-colors\">\n {PREDEFINED_COLORS.map((color) => (\n <div\n className={color === `#${hex}` ? 'active' : undefined}\n data-color={color}\n // @ts-ignore\n style={`background-color: ${color};`}\n onClick={handlePredefinedColorClick}\n />\n ))}\n </div>\n </div>\n );\n};\n\nfunction getInitialHsb(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject<CanvasRenderingContext2D | undefined>,\n rectsRef: RefObject<CanvasRects | undefined>,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Checkbox from '../../ui/Checkbox';\nimport RangeSlider from '../../ui/RangeSlider';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadNotificationSettings' | 'updateContactSignUpNotification' |\n 'updateNotificationSettings' | 'updateWebNotificationSettings'\n)>;\n\nconst SettingsNotifications: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n hasPushNotifications,\n hasWebNotifications,\n notificationSoundVolume,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n updateWebNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent<HTMLInputElement>,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Notifications);\n\n return (\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n Web notifications\n </h4>\n <Checkbox\n label=\"Web notifications\"\n // eslint-disable-next-line max-len\n subLabel={lang(hasWebNotifications ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasWebNotifications}\n onChange={(e) => {\n updateWebNotificationSettings({ hasWebNotifications: e.target.checked });\n }}\n />\n <Checkbox\n label=\"Offline notifications\"\n disabled={!hasWebNotifications}\n // eslint-disable-next-line max-len\n subLabel={lang(hasPushNotifications ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasPushNotifications}\n onChange={(e) => {\n updateWebNotificationSettings({ hasPushNotifications: e.target.checked });\n }}\n />\n <div className=\"settings-item-slider\">\n <RangeSlider\n label=\"Sound\"\n disabled={!hasWebNotifications}\n range={{\n min: 0,\n max: 10,\n }}\n value={notificationSoundVolume}\n onChange={(volume) => {\n updateWebNotificationSettings({ notificationSoundVolume: volume });\n }}\n />\n </div>\n </div>\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('AutodownloadPrivateChats')}\n </h4>\n\n <Checkbox\n label={lang('NotificationsForPrivateChats')}\n // eslint-disable-next-line max-len\n subLabel={lang(hasPrivateChatsNotifications ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasPrivateChatsNotifications}\n onChange={(e) => { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n <Checkbox\n label={lang('MessagePreview')}\n disabled={!hasPrivateChatsNotifications}\n // eslint-disable-next-line max-len\n subLabel={lang(hasPrivateChatsMessagePreview ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasPrivateChatsMessagePreview}\n onChange={(e) => { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('FilterGroups')}</h4>\n\n <Checkbox\n label={lang('NotificationsForGroups')}\n subLabel={lang(hasGroupNotifications ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasGroupNotifications}\n onChange={(e) => { handleSettingsChange(e, 'group', 'silent'); }}\n />\n <Checkbox\n label={lang('MessagePreview')}\n disabled={!hasGroupNotifications}\n subLabel={lang(hasGroupMessagePreview ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasGroupMessagePreview}\n onChange={(e) => { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('FilterChannels')}</h4>\n\n <Checkbox\n label={lang('NotificationsForChannels')}\n // eslint-disable-next-line max-len\n subLabel={lang(hasBroadcastNotifications ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasBroadcastNotifications}\n onChange={(e) => { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n <Checkbox\n label={lang('MessagePreview')}\n disabled={!hasBroadcastNotifications}\n // eslint-disable-next-line max-len\n subLabel={lang(hasBroadcastMessagePreview ? 'UserInfo.NotificationsEnabled' : 'UserInfo.NotificationsDisabled')}\n checked={hasBroadcastMessagePreview}\n onChange={(e) => { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('PhoneOther')}</h4>\n\n <Checkbox\n label={lang('ContactJoined')}\n checked={hasContactJoinedNotifications}\n onChange={handleContactNotificationChange}\n />\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n hasWebNotifications: global.settings.byKey.hasWebNotifications,\n hasPushNotifications: global.settings.byKey.hasPushNotifications,\n notificationSoundVolume: global.settings.byKey.notificationSoundVolume,\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n 'updateWebNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadBlockedContacts' | 'loadAuthorizations' | 'loadPrivacySettings' | 'loadContentSettings' | 'updateContentSettings'\n)>;\n\nconst SettingsPrivacy: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPassword,\n blockedCount,\n sessionsCount,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n loadContentSettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings, loadContentSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Privacy);\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-item pt-3\">\n <ListItem\n icon=\"delete-user\"\n narrow\n onClick={() => onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('BlockedUsers')}</span>\n {blockedCount > 0 && (\n <span className=\"subtitle\" dir=\"auto\">\n {lang('Users', blockedCount)}\n </span>\n )}\n </div>\n </ListItem>\n <ListItem\n icon=\"lock\"\n narrow\n onClick={() => onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('TwoStepVerification')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n </span>\n </div>\n </ListItem>\n <ListItem\n icon=\"active-sessions\"\n narrow\n onClick={() => onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('SessionsTitle')}</span>\n {sessionsCount > 0 && (\n <span className=\"subtitle\" dir=\"auto\">\n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n </span>\n )}\n </div>\n </ListItem>\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header mb-4\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('PrivacyTitle')}</h4>\n\n <ListItem\n narrow\n className=\"no-icon\"\n onClick={() => onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('PrivacyPhoneTitle')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n </span>\n </div>\n </ListItem>\n <ListItem\n narrow\n className=\"no-icon\"\n onClick={() => onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('LastSeenTitle')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {getVisibilityValue(visibilityPrivacyLastSeen)}\n </span>\n </div>\n </ListItem>\n <ListItem\n narrow\n className=\"no-icon\"\n onClick={() => onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('PrivacyProfilePhotoTitle')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n </span>\n </div>\n </ListItem>\n <ListItem\n narrow\n className=\"no-icon\"\n onClick={() => onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('PrivacyForwardsTitle')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {getVisibilityValue(visibilityPrivacyForwarding)}\n </span>\n </div>\n </ListItem>\n <ListItem\n narrow\n className=\"no-icon\"\n onClick={() => onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n <div className=\"multiline-menu-item\">\n <span className=\"title\">{lang('WhoCanAddMe')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {getVisibilityValue(visibilityPrivacyGroupChats)}\n </span>\n </div>\n </ListItem>\n </div>\n\n {canChangeSensitive && (\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('lng_settings_sensitive_title')}\n </h4>\n <Checkbox\n label={lang('lng_settings_sensitive_disable_filtering')}\n subLabel={lang('lng_settings_sensitive_about')}\n checked={Boolean(isSensitiveEnabled)}\n disabled={!canChangeSensitive}\n onCheck={updateContentSettings}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword, isSensitiveEnabled, canChangeSensitive },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', 'loadContentSettings', 'updateContentSettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings, LangCode, SettingsScreens } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick<ISettings, 'languages' | 'language'>;\n\ntype DispatchProps = Pick<GlobalActions, 'loadLanguages' | 'setSettingOption'>;\n\nconst SettingsLanguage: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState<string>(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n void setLanguage(langCode as LangCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Language);\n\n return (\n <div className=\"settings-content settings-item settings-language custom-scroll\">\n {options ? (\n <RadioGroup\n name=\"keyboard-send-settings\"\n options={options}\n selected={selectedLanguage}\n loadingOption={isLoading ? selectedLanguage : undefined}\n onChange={handleChange}\n />\n ) : (\n <Loading />\n )}\n </div>\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\n });\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Partial<ApiPrivacySettings> & {\n chatsById?: Record<number, ApiChat>;\n usersById?: Record<number, ApiUser>;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'setPrivacyVisibility'>;\n\nconst SettingsPrivacyVisibility: FC<OwnProps & StateProps & DispatchProps> = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n <div className=\"settings-content custom-scroll\">\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header\" dir={lang.isRtl ? 'rtl' : undefined}>{headerText}</h4>\n\n <RadioGroup\n name={`visibility-${privacyKey}`}\n options={visibilityOptions}\n onChange={handleVisibilityChange}\n selected={visibility}\n />\n\n {descriptionText && (\n <p className=\"settings-item-description-larger\" dir={lang.isRtl ? 'rtl' : undefined}>{descriptionText}</p>\n )}\n </div>\n\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header mb-4\" dir={lang.isRtl ? 'rtl' : undefined}>{lang('PrivacyExceptions')}</h4>\n\n {exceptionLists.shouldShowAllowed && (\n <ListItem\n narrow\n icon=\"add-user\"\n onClick={() => { onScreenSelect(allowedContactsScreen); }}\n >\n <div className=\"multiline-menu-item full-size\">\n {allowedCount > 0 && <span className=\"date\" dir=\"auto\">+{allowedCount}</span>}\n <span className=\"title\">{lang('AlwaysShareWith')}</span>\n <span className=\"subtitle\">{lang('EditAdminAddUsers')}</span>\n </div>\n </ListItem>\n )}\n {exceptionLists.shouldShowDenied && (\n <ListItem\n narrow\n icon=\"delete-user\"\n onClick={() => { onScreenSelect(deniedContactsScreen); }}\n >\n <div className=\"multiline-menu-item full-size\">\n {blockCount > 0 && <span className=\"date\" dir=\"auto\">−{blockCount}</span>}\n <span className=\"title\">{lang('NeverShareWith')}</span>\n <span className=\"subtitle\">{lang('EditAdminAddUsers')}</span>\n </div>\n </ListItem>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadAuthorizations' | 'terminateAuthorization' | 'terminateAllAuthorizations'\n)>;\n\nconst SettingsPrivacyActiveSessions: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyActiveSessions);\n\n function renderCurrentSession(session: ApiSession) {\n return (\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header mb-4\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('AuthSessions.CurrentSession')}\n </h4>\n\n <ListItem narrow inactive className=\"no-icon\">\n <div className=\"multiline-menu-item\" dir=\"auto\">\n <span className=\"title\" dir=\"auto\">{session.appName}</span>\n <span className=\"subtitle black tight\">{getDeviceEnvironment(session)}</span>\n <span className=\"subtitle\">{session.ip} - {getLocation(session)}</span>\n </div>\n </ListItem>\n\n <ListItem\n className=\"destructive mb-0 no-icon\"\n icon=\"stop\"\n ripple\n narrow\n onClick={openConfirmTerminateAllDialog}\n >\n {lang('TerminateAllSessions')}\n </ListItem>\n </div>\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n <div className=\"settings-item\">\n <h4 className=\"settings-item-header mb-4\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('OtherSessions')}\n </h4>\n\n {sessions.map(renderSession)}\n </div>\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n <ListItem\n key={session.hash}\n ripple\n narrow\n contextActions={[{\n title: 'Terminate',\n icon: 'stop',\n handler: () => {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n className=\"no-icon\"\n >\n <div className=\"multiline-menu-item full-size\" dir=\"auto\">\n <span className=\"date\">{formatPastTimeShort(lang, session.dateActive * 1000)}</span>\n <span className=\"title\">{session.appName}</span>\n <span className=\"subtitle black tight\">{getDeviceEnvironment(session)}</span>\n <span className=\"subtitle\">{session.ip} - {getLocation(session)}</span>\n </div>\n </ListItem>\n );\n }\n\n return (\n <div className=\"settings-content custom-scroll\">\n {currentSession && renderCurrentSession(currentSession)}\n {otherSessions && renderOtherSessions(otherSessions)}\n {otherSessions && (\n <ConfirmDialog\n isOpen={isConfirmTerminateAllDialogOpen}\n onClose={closeConfirmTerminateAllDialog}\n text=\"Are you sure you want to terminate all other sessions?\"\n confirmLabel=\"Terminate All Other Sessions\"\n confirmHandler={handleTerminateAllSessions}\n confirmIsDestructive\n />\n )}\n </div>\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsByIds: Record<number, ApiChat>;\n usersByIds: Record<number, ApiUser>;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'unblockContact'>;\n\nconst SettingsPrivacyBlockedUsers: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyBlockedUsers);\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item small-icon',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n <ListItem\n key={contactId}\n className={className}\n ripple\n narrow\n contextActions={[{\n title: 'Unblock',\n icon: 'unlock',\n handler: () => {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n <Avatar size=\"medium\" user={user} chat={chat} />\n <div className=\"contact-info\" dir=\"auto\">\n <h3 dir=\"auto\">{renderText((isPrivate ? getUserFullName(user) : getChatTitle(lang, chat!)) || '')}</h3>\n {user && user.phoneNumber && (\n <div className=\"contact-phone\" dir=\"auto\">{formatPhoneNumberWithCode(user.phoneNumber)}</div>\n )}\n {user && !user.phoneNumber && user.username && (\n <div className=\"contact-username\" dir=\"auto\">@{user.username}</div>\n )}\n </div>\n </ListItem>\n );\n }\n\n return (\n <div className=\"settings-fab-wrapper\">\n <div className=\"settings-content infinite-scroll\">\n <div className=\"settings-item\">\n <p className=\"settings-item-description-larger mt-0 mb-2\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang('BlockedUsersInfo')}\n </p>\n </div>\n\n <div className=\"chat-list custom-scroll\">\n {blockedIds && blockedIds.length ? (\n <div className=\"scroll-container\">\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n </div>\n ) : blockedIds && !blockedIds.length ? (\n <div className=\"no-results\" dir=\"auto\">\n List is empty\n </div>\n ) : (\n <Loading key=\"loading\" />\n )}\n </div>\n </div>\n\n <FloatingActionButton\n isShown\n onClick={() => {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n <i className=\"icon-add\" />\n </FloatingActionButton>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC<OwnProps & StateProps> = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaEnabled);\n\n return (\n <div className=\"settings-content two-fa custom-scroll\">\n <div className=\"settings-content-header\">\n <AnimatedEmoji sticker={animatedEmoji} size=\"large\" />\n\n <p className=\"settings-item-description mb-3\" dir=\"auto\">\n {renderText(lang('EnabledPasswordText'), ['br'])}\n </p>\n </div>\n\n <div className=\"settings-item pt-0 no-border\">\n <ListItem\n icon=\"edit\"\n onClick={() => onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n </ListItem>\n <ListItem\n icon=\"password-off\"\n onClick={() => onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n </ListItem>\n <ListItem\n icon=\"email\"\n onClick={() => onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n </ListItem>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n screen: SettingsScreens;\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC<OwnProps> = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState<string>('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n <div className=\"settings-content two-fa custom-scroll\">\n <div className=\"settings-content-header\">\n <PasswordMonkey isBig isPasswordVisible={shouldShowPassword} />\n </div>\n\n <div className=\"settings-item pt-0 no-border\">\n <PasswordForm\n error={validationError || error}\n hint={hint}\n placeholder={placeholder}\n submitLabel={submitLabel || lang('Next')}\n clearError={handleClearError}\n isLoading={isLoading}\n isPasswordVisible={shouldShowPassword}\n onChangePasswordVisibility={setShouldShowPassword}\n onSubmit={handleSubmit}\n />\n </div>\n </div>\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC<OwnProps & StateProps> = ({\n isActive, onScreenSelect, onReset, animatedEmoji, onStart,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaDisabled);\n\n return (\n <div className=\"settings-content two-fa custom-scroll\">\n <div className=\"settings-content-header\">\n <AnimatedEmoji sticker={animatedEmoji} size=\"large\" />\n\n <p className=\"settings-item-description mb-3\" dir=\"auto\">\n {lang('SetAdditionalPasswordInfo')}\n </p>\n </div>\n\n <div className=\"settings-item pt-0 no-border\">\n <Button onClick={onStart}>{lang('EditAdminTransferSetPassword')}</Button>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC<OwnProps & StateProps> = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [value, setValue] = useState<string>('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n <div className=\"settings-content two-fa custom-scroll\">\n <div className=\"settings-content-header\">\n <AnimatedEmoji sticker={animatedEmoji} size=\"large\" />\n </div>\n\n <div className=\"settings-item pt-0 no-border\">\n <form action=\"\" onSubmit={handleSubmit}>\n <InputText\n ref={inputRef}\n value={value}\n inputMode={type}\n label={placeholder}\n error={error}\n onChange={handleInputChange}\n />\n\n {value ? (\n <Button type=\"submit\" isLoading={isLoading} ripple>{lang('Continue')}</Button>\n ) : (\n <Button\n isText\n isLoading={isLoading}\n ripple\n onClick={shouldConfirm ? markIsConfirmShown : handleSkip}\n >\n {lang('YourEmailSkip')}\n </Button>\n )}\n </form>\n {shouldConfirm && (\n <Modal\n className=\"narrow\"\n isOpen={isConfirmShown}\n title={lang('YourEmailSkipWarning')}\n onClose={unmarkIsConfirmShown}\n >\n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n <div className=\"dialog-buttons\">\n <Button\n color=\"danger\"\n ripple\n isText\n className=\"confirm-dialog-button\"\n onClick={handleSkipConfirm}\n >\n {lang('YourEmailSkip')}\n </Button>\n <Button\n color=\"primary\"\n ripple\n isText\n className=\"confirm-dialog-button\"\n onClick={unmarkIsConfirmShown}\n >\n {lang('Cancel')}\n </Button>\n </div>\n </Modal>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC<OwnProps & StateProps> = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaCongratulations);\n\n return (\n <div className=\"settings-content two-fa custom-scroll\">\n <div className=\"settings-content-header\">\n <AnimatedEmoji sticker={animatedEmoji} size=\"large\" />\n\n <p className=\"settings-item-description mb-3\" dir=\"auto\">\n {lang('TwoStepVerificationPasswordSetInfo')}\n </p>\n </div>\n\n <div className=\"settings-item pt-0 no-border\">\n <Button onClick={handleClick}>{lang('TwoStepVerificationPasswordReturnSettings')}</Button>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC<OwnProps & StateProps> = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [value, setValue] = useState<string>('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n <div className=\"settings-content two-fa custom-scroll\">\n <div className=\"settings-content-header\">\n <AnimatedEmoji sticker={animatedEmoji} size=\"large\" />\n </div>\n\n <div className=\"settings-item pt-0 no-border\">\n <InputText\n value={value}\n ref={inputRef}\n inputMode=\"decimal\"\n label={lang('YourEmailCode')}\n error={error}\n onChange={handleInputChange}\n />\n {isLoading && <Loading />}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick<GlobalActions, (\n 'updatePassword' | 'updateRecoveryEmail' | 'clearPassword' | 'provideTwoFaEmailCode' |\n 'checkPassword' | 'clearTwoFaError'\n)>;\n\nconst SettingsTwoFa: FC<OwnProps & StateProps & DispatchProps> = ({\n currentScreen,\n shownScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n <SettingsTwoFaStart\n onStart={handleStartWizard}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n <SettingsTwoFaPassword\n screen={currentScreen}\n placeholder={lang('PleaseEnterPassword')}\n submitLabel={lang('Continue')}\n onSubmit={handleNewPassword}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n <SettingsTwoFaPassword\n screen={currentScreen}\n expectedPassword={state.password}\n placeholder={lang('PleaseReEnterPassword')}\n submitLabel={lang('Continue')}\n onSubmit={handleNewPasswordConfirm}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n <SettingsTwoFaSkippableForm\n icon=\"hint\"\n placeholder={lang('PasswordHintPlaceholder')}\n onSubmit={handleNewPasswordHint}\n screen={currentScreen}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n <SettingsTwoFaSkippableForm\n icon=\"email\"\n type=\"email\"\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n placeholder={lang('RecoveryEmailTitle')}\n shouldConfirm\n onSubmit={handleNewPasswordEmail}\n screen={currentScreen}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n <SettingsTwoFaEmailCode\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n onSubmit={handleEmailCode}\n screen={currentScreen}\n onScreenSelect={onScreenSelect}\n isActive={isActive || shownScreen === SettingsScreens.TwoFaCongratulations}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n <SettingsTwoFaCongratulations\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n <SettingsTwoFaEnabled\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n <SettingsTwoFaPassword\n screen={currentScreen}\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n hint={hint}\n onSubmit={handleChangePasswordCurrent}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n <SettingsTwoFaPassword\n screen={currentScreen}\n placeholder={lang('PleaseEnterNewFirstPassword')}\n onSubmit={handleChangePasswordNew}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n <SettingsTwoFaPassword\n screen={currentScreen}\n expectedPassword={state.password}\n placeholder={lang('PleaseReEnterPassword')}\n onSubmit={handleChangePasswordConfirm}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n <SettingsTwoFaSkippableForm\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n icon=\"hint\"\n placeholder={lang('PasswordHintPlaceholder')}\n onSubmit={handleChangePasswordHint}\n onScreenSelect={onScreenSelect}\n isActive={isActive || shownScreen === SettingsScreens.TwoFaCongratulations}\n onReset={onReset}\n screen={currentScreen}\n />\n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n <SettingsTwoFaPassword\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n hint={hint}\n onSubmit={handleTurnOff}\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n onReset={onReset}\n screen={currentScreen}\n />\n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n <SettingsTwoFaPassword\n screen={currentScreen}\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n hint={hint}\n onSubmit={handleRecoveryEmailCurrentPassword}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n <SettingsTwoFaSkippableForm\n screen={currentScreen}\n icon=\"email\"\n type=\"email\"\n placeholder={lang('RecoveryEmailTitle')}\n onSubmit={handleRecoveryEmail}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n SettingsScreens.TwoFaRecoveryEmailCode,\n SettingsScreens.TwoFaCongratulations,\n ].includes(shownScreen)}\n onReset={onReset}\n />\n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n <SettingsTwoFaEmailCode\n screen={currentScreen}\n isLoading={isLoading}\n error={error}\n clearError={clearTwoFaError}\n onSubmit={handleEmailCode}\n onScreenSelect={onScreenSelect}\n isActive={isActive || shownScreen === SettingsScreens.TwoFaCongratulations}\n onReset={onReset}\n />\n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record<number, ApiChat>;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'setPrivacySettings'>;\n\nconst SettingsPrivacyVisibilityExceptionList: FC<OwnProps & StateProps & DispatchProps> = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const lang = useLang();\n\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState<string>('');\n const [isSubmitShown, setIsSubmitShown] = useState<boolean>(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState<number[]>(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n <div className=\"NewChat-inner step-1\">\n <Picker\n itemIds={displayedIds || []}\n selectedIds={newSelectedContactIds}\n filterValue={searchQuery}\n filterPlaceholder={isAllowList ? lang('AlwaysShareWithPlaceholder') : lang('NeverShareWithPlaceholder')}\n searchInputId=\"new-group-picker-search\"\n onSelectedIdsChange={handleSelectedContactIdsChange}\n onFilterChange={setSearchQuery}\n />\n\n <FloatingActionButton\n isShown={isSubmitShown}\n onClick={handleSubmit}\n ariaLabel={isAllowList ? lang('AlwaysShareWithTitle') : lang('NeverShareWithTitle')}\n >\n <i className=\"icon-arrow-right\" />\n </FloatingActionButton>\n </div>\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\nimport { FolderEditDispatch, FoldersState } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nconst TWO_FA_SCREENS = [\n SettingsScreens.TwoFaDisabled,\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n SettingsScreens.TwoFaEnabled,\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n];\n\nconst FOLDERS_SCREENS = [\n SettingsScreens.Folders,\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersEditFolderFromChatList,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersIncludedChatsFromChatList,\n SettingsScreens.FoldersExcludedChats,\n SettingsScreens.FoldersExcludedChatsFromChatList,\n];\n\nconst PRIVACY_SCREENS = [\n SettingsScreens.PrivacyBlockedUsers,\n SettingsScreens.PrivacyActiveSessions,\n];\n\nconst PRIVACY_PHONE_NUMBER_SCREENS = [\n SettingsScreens.PrivacyPhoneNumberAllowedContacts,\n SettingsScreens.PrivacyPhoneNumberDeniedContacts,\n];\n\nconst PRIVACY_LAST_SEEN_PHONE_SCREENS = [\n SettingsScreens.PrivacyLastSeenAllowedContacts,\n SettingsScreens.PrivacyLastSeenDeniedContacts,\n];\n\nconst PRIVACY_PROFILE_PHOTO_SCREENS = [\n SettingsScreens.PrivacyProfilePhotoAllowedContacts,\n SettingsScreens.PrivacyProfilePhotoDeniedContacts,\n];\n\nconst PRIVACY_FORWARDING_SCREENS = [\n SettingsScreens.PrivacyForwardingAllowedContacts,\n SettingsScreens.PrivacyForwardingDeniedContacts,\n];\n\nconst PRIVACY_GROUP_CHATS_SCREENS = [\n SettingsScreens.PrivacyGroupChatsAllowedContacts,\n SettingsScreens.PrivacyGroupChatsDeniedContacts,\n];\n\nexport type OwnProps = {\n isActive: boolean;\n currentScreen: SettingsScreens;\n foldersState: FoldersState;\n foldersDispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC<OwnProps> = ({\n isActive,\n currentScreen,\n foldersState,\n foldersDispatch,\n onScreenSelect,\n onReset,\n shouldSkipTransition,\n}) => {\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent(isScreenActive: boolean, screen: SettingsScreens) {\n const privacyAllowScreens: Record<number, boolean> = {\n [SettingsScreens.PrivacyPhoneNumber]: PRIVACY_PHONE_NUMBER_SCREENS.includes(screen),\n [SettingsScreens.PrivacyLastSeen]: PRIVACY_LAST_SEEN_PHONE_SCREENS.includes(screen),\n [SettingsScreens.PrivacyProfilePhoto]: PRIVACY_PROFILE_PHOTO_SCREENS.includes(screen),\n [SettingsScreens.PrivacyForwarding]: PRIVACY_FORWARDING_SCREENS.includes(screen),\n [SettingsScreens.PrivacyGroupChats]: PRIVACY_GROUP_CHATS_SCREENS.includes(screen),\n };\n\n const isTwoFaScreen = TWO_FA_SCREENS.includes(screen);\n const isFoldersScreen = FOLDERS_SCREENS.includes(screen);\n const isPrivacyScreen = PRIVACY_SCREENS.includes(screen)\n || isTwoFaScreen\n || Object.keys(privacyAllowScreens).includes(screen.toString())\n || Object.values(privacyAllowScreens).find((key) => key === true);\n\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n <SettingsMain onScreenSelect={onScreenSelect} isActive={isActive} onReset={handleReset} />\n );\n case SettingsScreens.EditProfile:\n return (\n <SettingsEditProfile\n onScreenSelect={onScreenSelect}\n isActive={isActive && isScreenActive}\n onReset={handleReset}\n />\n );\n case SettingsScreens.General:\n return (\n <SettingsGeneral\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive\n || screen === SettingsScreens.GeneralChatBackgroundColor\n || screen === SettingsScreens.GeneralChatBackground\n || isPrivacyScreen || isFoldersScreen}\n onReset={handleReset}\n />\n );\n case SettingsScreens.Notifications:\n return (\n <SettingsNotifications onScreenSelect={onScreenSelect} isActive={isScreenActive} onReset={handleReset} />\n );\n case SettingsScreens.Privacy:\n return (\n <SettingsPrivacy\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive || isPrivacyScreen || isTwoFaScreen}\n onReset={handleReset}\n />\n );\n case SettingsScreens.Language:\n return (\n <SettingsLanguage onScreenSelect={onScreenSelect} isActive={isScreenActive} onReset={handleReset} />\n );\n case SettingsScreens.GeneralChatBackground:\n return (\n <SettingsGeneralBackground\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive || screen === SettingsScreens.GeneralChatBackgroundColor}\n onReset={handleReset}\n />\n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n <SettingsGeneralBackgroundColor\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive}\n onReset={handleReset}\n />\n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n <SettingsPrivacyActiveSessions\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive}\n onReset={handleReset}\n />\n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n <SettingsPrivacyBlockedUsers\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive}\n onReset={handleReset}\n />\n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n <SettingsPrivacyVisibility\n screen={currentScreen}\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive || privacyAllowScreens[currentScreen]}\n onReset={handleReset}\n />\n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n <SettingsPrivacyVisibilityExceptionList\n isAllowList\n screen={currentScreen}\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive || privacyAllowScreens[currentScreen]}\n onReset={handleReset}\n />\n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n <SettingsPrivacyVisibilityExceptionList\n screen={currentScreen}\n onScreenSelect={onScreenSelect}\n isActive={isScreenActive}\n onReset={handleReset}\n />\n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n <SettingsFolders\n currentScreen={currentScreen}\n shownScreen={screen}\n state={foldersState}\n dispatch={foldersDispatch}\n isActive={isScreenActive}\n onScreenSelect={onScreenSelect}\n onReset={handleReset}\n />\n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n <SettingsTwoFa\n currentScreen={currentScreen}\n state={twoFaState}\n dispatch={twoFaDispatch}\n shownScreen={screen}\n isActive={isScreenActive}\n onScreenSelect={onScreenSelect}\n onReset={handleReset}\n />\n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection(isScreenActive: boolean, isFrom: boolean, currentKey: SettingsScreens) {\n return (\n <>\n <SettingsHeader\n currentScreen={currentScreen}\n onReset={handleReset}\n onSaveFilter={handleSaveFilter}\n onScreenSelect={onScreenSelect}\n editedFolderId={foldersState.folderId}\n />\n {renderCurrentSectionContent(isScreenActive, currentKey)}\n </>\n );\n }\n\n return (\n <Transition\n id=\"Settings\"\n name={shouldSkipTransition ? 'none' : LAYERS_ANIMATION_NAME}\n activeKey={currentScreen}\n renderCount={TRANSITION_RENDER_COUNT}\n >\n {renderCurrentSection}\n </Transition>\n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n usersById: Record<number, ApiUser>;\n contactIds?: number[];\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadContactList' | 'openChat'>;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC<OwnProps & StateProps & DispatchProps> = ({\n isActive, onReset,\n filter, usersById, contactIds, loadContactList, openChat, serverTimeOffset,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n useHistoryBack(isActive, onReset);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return sortUserIds(resultIds, usersById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, serverTimeOffset]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n <InfiniteScroll items={viewportIds} onLoadMore={getMore} className=\"chat-list custom-scroll\">\n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n <ListItem\n key={id}\n className=\"chat-item-clickable\"\n onClick={() => handleClick(id)}\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n >\n <PrivateChatInfo userId={id} forceShowSelf avatarSize=\"large\" />\n </ListItem>\n ))\n ) : viewportIds && !viewportIds.length ? (\n <p className=\"no-results\" key=\"no-results\" dir=\"auto\">\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n </p>\n ) : (\n <Loading key=\"loading\" />\n )}\n </InfiniteScroll>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, isUserBot, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record<number, ApiUser>;\n chatsById: Record<number, ApiChat>;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadContactList' | 'setGlobalSearchQuery'>;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC<OwnProps & StateProps & DispatchProps> = ({\n isChannel,\n isActive,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n return !user || !isUserBot(user) || user.canBeInvitedToGroup;\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds,\n currentUserId, usersById,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\n\n return (\n <div className=\"NewChat step-1\">\n <div className=\"left-header\">\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={onReset}\n ariaLabel=\"Return to Chat List\"\n >\n <i className=\"icon-arrow-left\" />\n </Button>\n <h3>{lang('GroupAddMembers')}</h3>\n </div>\n <div className=\"NewChat-inner step-1\">\n <Picker\n itemIds={displayedIds}\n selectedIds={selectedMemberIds}\n filterValue={searchQuery}\n filterPlaceholder={lang('SendMessageTo')}\n searchInputId=\"new-group-picker-search\"\n isLoading={isSearching}\n onSelectedIdsChange={onSelectedMemberIdsChange}\n onFilterChange={handleFilterChange}\n />\n\n <FloatingActionButton\n isShown={Boolean(selectedMemberIds.length || isChannel)}\n onClick={handleNextStep}\n ariaLabel={isChannel ? 'Continue To Channel Info' : 'Continue To Group Info'}\n >\n <i className=\"icon-arrow-right\" />\n </FloatingActionButton>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUserIds,\n localUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'createGroupChat' | 'createChannel'>;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC<OwnProps & StateProps & DispatchProps> = ({\n isChannel,\n isActive,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState<File | undefined>();\n const [error, setError] = useState<string | undefined>();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n <div className=\"NewChat\">\n <div className=\"left-header\">\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={() => onReset()}\n ariaLabel=\"Return to member selection\"\n >\n <i className=\"icon-arrow-left\" />\n </Button>\n <h3>{lang(isChannel ? 'NewChannel' : 'NewGroup')}</h3>\n </div>\n <div className=\"NewChat-inner step-2\">\n <AvatarEditable\n onChange={setPhoto}\n title={lang('AddPhoto')}\n />\n <InputText\n value={title}\n onChange={handleTitleChange}\n label={lang(isChannel ? 'EnterChannelName' : 'GroupName')}\n error={error === chatTitleEmptyError || error === channelTitleEmptyError ? error : undefined}\n />\n {isChannel && (\n <>\n <InputText\n value={about}\n onChange={handleDescriptionChange}\n label={lang('DescriptionOptionalPlaceholder')}\n />\n <p className=\"note\">{lang('DescriptionInfo')}</p>\n </>\n )}\n\n {renderedError && (\n <p className=\"error\">{renderedError}</p>\n )}\n\n {memberIds.length > 0 && (\n <>\n <h3 className=\"chat-members-heading\">{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}</h3>\n\n <div className=\"chat-members-list custom-scroll\">\n {memberIds.map((id) => (\n <ListItem inactive className=\"chat-item-clickable\">\n <PrivateChatInfo userId={id} />\n </ListItem>\n ))}\n </div>\n </>\n )}\n </div>\n\n <FloatingActionButton\n isShown={title.length !== 0}\n onClick={isChannel ? handleCreateChannel : handleCreateGroup}\n disabled={isLoading}\n ariaLabel={isChannel ? lang('ChannelIntro.CreateChannel') : 'Create Group'}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-arrow-right\" />\n )}\n </FloatingActionButton>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC<OwnProps> = ({\n isActive,\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState<number[]>([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n <Transition\n id=\"NewChat\"\n name={LAYERS_ANIMATION_NAME}\n renderCount={RENDER_COUNT}\n activeKey={content}\n >\n {(isStepActive) => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n <NewChatStep1\n isChannel={isChannel}\n isActive={isActive}\n selectedMemberIds={newChatMemberIds}\n onSelectedMemberIdsChange={setNewChatMemberIds}\n onNextStep={handleNextStep}\n onReset={onReset}\n />\n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n <NewChatStep2\n isChannel={isChannel}\n isActive={isStepActive && isActive}\n memberIds={newChatMemberIds}\n onReset={onReset}\n />\n );\n default:\n return undefined;\n }\n }}\n </Transition>\n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\nimport { LeftColumnContent } from '../../types';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n onContentChange: (content: LeftColumnContent) => void;\n};\n\nconst ArchivedChats: FC<OwnProps> = ({ isActive, onReset, onContentChange }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onContentChange, LeftColumnContent.Archived);\n\n return (\n <div className=\"ArchivedChats\">\n <div className=\"left-header\">\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={onReset}\n ariaLabel=\"Return to chat list\"\n >\n <i className=\"icon-arrow-left\" />\n </Button>\n <h3>{lang('ArchivedChats')}</h3>\n </div>\n <ChatList folderType=\"archived\" isActive={isActive} />\n </div>\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record<string, boolean> = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nfunction isTextBox(target: EventTarget | null) {\n if (!target || !(target instanceof HTMLElement)) return false;\n const element = target;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'textarea') return true;\n if (tagName !== 'input') return false;\n const type = element.getAttribute('type');\n if (!type) return false;\n const inputTypes = [\n 'text', 'password', 'number', 'email', 'tel', 'url',\n 'search', 'date', 'datetime', 'datetime-local', 'time', 'month', 'week',\n ];\n return inputTypes.indexOf(type.toLowerCase()) > -1;\n}\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key] && !isTextBox(e.target)) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport {\n getMessageMediaHash,\n getMessagePhoto,\n getMessageText,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n hasMessageLocalBlobUrl,\n} from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message)\n || (!getMessageWebPageVideo(message) ? getMessageWebPagePhoto(message) : undefined);\n const mediaHash = getMessageMediaHash(message, 'inline');\n const canImageBeCopied = photo && (mediaHash || hasMessageLocalBlobUrl(message)) && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n Promise.resolve(mediaHash ? mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl) : photo!.blobUrl)\n .then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n return 'lng_context_copy_text';\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onReport: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC<OwnProps> = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onReport,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n <Menu\n isOpen={isOpen}\n positionX={positionX}\n positionY={positionY}\n style={style}\n className=\"MessageContextMenu fluid\"\n onClose={onClose}\n onCloseAnimationEnd={onCloseAnimationEnd}\n >\n {canSendNow && <MenuItem icon=\"send-outline\" onClick={onSend}>{lang('MessageScheduleSend')}</MenuItem>}\n {canReschedule && (\n <MenuItem icon=\"schedule\" onClick={onReschedule}>{lang('MessageScheduleEditTime')}</MenuItem>\n )}\n {canReply && <MenuItem icon=\"reply\" onClick={onReply}>{lang('Reply')}</MenuItem>}\n {canEdit && <MenuItem icon=\"edit\" onClick={onEdit}>{lang('Edit')}</MenuItem>}\n {canFaveSticker && (\n <MenuItem icon=\"favorite\" onClick={onFaveSticker}>{lang('AddToFavorites')}</MenuItem>\n )}\n {canUnfaveSticker && (\n <MenuItem icon=\"favorite\" onClick={onUnfaveSticker}>{lang('Stickers.RemoveFromFavorites')}</MenuItem>\n )}\n {canCopy && copyOptions.map((options) => (\n <MenuItem key={options.label} icon=\"copy\" onClick={options.handler}>{lang(options.label)}</MenuItem>\n ))}\n {canPin && <MenuItem icon=\"pin\" onClick={onPin}>{lang('DialogPin')}</MenuItem>}\n {canUnpin && <MenuItem icon=\"unpin\" onClick={onUnpin}>{lang('DialogUnpin')}</MenuItem>}\n {canForward && <MenuItem icon=\"forward\" onClick={onForward}>{lang('Forward')}</MenuItem>}\n {canSelect && <MenuItem icon=\"select\" onClick={onSelect}>{lang('Common.Select')}</MenuItem>}\n {canReport && <MenuItem icon=\"flag\" onClick={onReport}>{lang('lng_context_report_msg')}</MenuItem>}\n {canDelete && <MenuItem destructive icon=\"delete\" onClick={onDelete}>{lang('Delete')}</MenuItem>}\n </Menu>\n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport ReportMessageModal from '../../common/ReportMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatUsername?: string;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'setReplyingToId' | 'setEditingId' | 'pinMessage' | 'openForwardMenu' |\n 'faveSticker' | 'unfaveSticker' | 'toggleMessageSelection' | 'sendScheduledMessages' | 'rescheduleMessage'\n)>;\n\nconst ContextMenuContainer: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen,\n messageListType,\n chatUsername,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isReportModalOpen, setIsReportModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const handleReport = useCallback(() => {\n setIsMenuOpen(false);\n setIsReportModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closeReportModal = useCallback(() => {\n setIsReportModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n copyTextToClipboard(`https://t.me/${chatUsername || `c/${Math.abs(message.chatId)}`}/${message.id}`);\n closeMenu();\n }, [chatUsername, closeMenu, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const reportMessageIds = useMemo(() => (album ? album.messages : [message]).map(({ id }) => id), [album, message]);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n <div className={['ContextMenuContainer', transitionClassNames].join(' ')}>\n <MessageContextMenu\n message={message}\n isOpen={isMenuOpen}\n anchor={anchor}\n canSendNow={canSendNow}\n canReschedule={canReschedule}\n canReply={canReply}\n canDelete={canDelete}\n canReport={canReport}\n canPin={canPin}\n canUnpin={canUnpin}\n canEdit={canEdit}\n canForward={canForward}\n canFaveSticker={canFaveSticker}\n canUnfaveSticker={canUnfaveSticker}\n canCopy={canCopy}\n canCopyLink={canCopyLink}\n canSelect={canSelect}\n onReply={handleReply}\n onEdit={handleEdit}\n onPin={handlePin}\n onUnpin={handleUnpin}\n onForward={handleForward}\n onDelete={handleDelete}\n onReport={handleReport}\n onFaveSticker={handleFaveSticker}\n onUnfaveSticker={handleUnfaveSticker}\n onSelect={handleSelectMessage}\n onSend={handleScheduledMessageSend}\n onReschedule={handleOpenCalendar}\n onClose={closeMenu}\n onCopyLink={handleCopyLink}\n />\n <DeleteMessageModal\n isOpen={isDeleteModalOpen}\n isSchedule={messageListType === 'scheduled'}\n onClose={closeDeleteModal}\n album={album}\n message={message}\n />\n <ReportMessageModal\n isOpen={isReportModalOpen}\n onClose={closeReportModal}\n messageIds={reportMessageIds}\n />\n <PinMessageModal\n isOpen={isPinModalOpen}\n messageId={message.id}\n chatId={message.chatId}\n onClose={closePinModal}\n />\n <CalendarModal\n isOpen={isCalendarOpen}\n withTimePicker\n selectedAt={message.date * 1000}\n maxAt={getDayStartAt(scheduledMaxDate)}\n isFutureMode\n onClose={handleCloseCalendar}\n onSubmit={handleRescheduleMessage}\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canReport,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet, selectStickerSetByShortName } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker?: ApiSticker;\n stickerSetShortName?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadStickers' | 'toggleStickerSet' | 'sendMessage'>;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen,\n fromSticker,\n stickerSetShortName,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n if (fromSticker) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({\n stickerSetId,\n stickerSetAccessHash,\n });\n } else if (stickerSetShortName) {\n loadStickers({\n stickerSetShortName,\n });\n }\n }\n }, [isOpen, fromSticker, loadStickers, stickerSetShortName]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n if (stickerSet) {\n toggleStickerSet({ stickerSetId: stickerSet.id });\n onClose();\n }\n }, [onClose, stickerSet, toggleStickerSet]);\n\n return (\n <Modal\n className=\"StickerSetModal\"\n isOpen={isOpen}\n onClose={onClose}\n hasCloseButton\n title={stickerSet ? renderText(stickerSet.title, ['emoji', 'links']) : lang('AccDescrStickerSet')}\n >\n {stickerSet && stickerSet.stickers ? (\n <>\n <div ref={containerRef} className=\"stickers custom-scroll\">\n {stickerSet.stickers.map((sticker) => (\n <StickerButton\n sticker={sticker}\n size={STICKER_SIZE_MODAL}\n observeIntersection={observeIntersection}\n onClick={handleSelect}\n clickArg={sticker}\n />\n ))}\n </div>\n <div className=\"button-wrapper\">\n <Button\n size=\"smaller\"\n fluid\n color={stickerSet.installedDate ? 'danger' : 'primary'}\n onClick={handleButtonClick}\n >\n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n </Button>\n </div>\n </>\n ) : (\n <Loading />\n )}\n </Modal>\n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker, stickerSetShortName }: OwnProps) => {\n return {\n stickerSet: fromSticker\n ? selectStickerSet(global, fromSticker.stickerSetId)\n : stickerSetShortName\n ? selectStickerSetByShortName(global, stickerSetShortName)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat, selectNotifySettings, selectNotifyExceptions } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat, selectIsChatMuted } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick<GlobalActions, (\n 'updateChatMutedState' | 'enterMessageSelectMode' | 'sendBotCommand' | 'restartBot'\n)>;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC<OwnProps & StateProps & DispatchProps> = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n <Portal>\n <div className=\"HeaderMenuContainer\">\n <Menu\n isOpen={isMenuOpen}\n positionX=\"right\"\n style={`left: ${x}px;top: ${y}px;`}\n onClose={closeMenu}\n >\n {IS_SINGLE_COLUMN_LAYOUT && canStartBot && (\n <MenuItem\n icon=\"bots\"\n onClick={handleStartBot}\n >\n {lang('BotStart')}\n </MenuItem>\n )}\n {IS_SINGLE_COLUMN_LAYOUT && canRestartBot && (\n <MenuItem\n icon=\"bots\"\n onClick={handleRestartBot}\n >\n {lang('BotRestart')}\n </MenuItem>\n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSubscribe && (\n <MenuItem\n icon={isChannel ? 'channel' : 'group'}\n onClick={handleSubscribe}\n >\n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n </MenuItem>\n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n <MenuItem\n icon=\"search\"\n onClick={handleSearch}\n >\n {lang('Search')}\n </MenuItem>\n )}\n {canMute && (\n <MenuItem\n icon={isMuted ? 'unmute' : 'mute'}\n onClick={handleToggleMuteClick}\n >\n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n </MenuItem>\n )}\n {canSelect && (\n <MenuItem\n icon=\"select\"\n onClick={handleSelectMessages}\n >\n {lang('ReportSelectMessages')}\n </MenuItem>\n )}\n {canLeave && (\n <MenuItem\n destructive\n icon=\"delete\"\n onClick={handleDelete}\n >\n {lang(isPrivate\n ? 'Delete'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\n </MenuItem>\n )}\n </Menu>\n {chat && (\n <DeleteChatModal\n isOpen={isDeleteModalOpen}\n onClose={closeDeleteModal}\n chat={chat}\n />\n )}\n </div>\n </Portal>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n 'sendBotCommand',\n 'restartBot',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n isHistoryCalendarOpen?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'setLocalTextSearchQuery' | 'searchTextMessagesLocal' | 'closeLocalTextSearch' | 'openHistoryCalendar' |\n 'focusMessage'\n)>;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC<StateProps & DispatchProps> = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll<HTMLInputElement>('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll<HTMLDivElement>('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector<HTMLInputElement>('#MobileSearch input')!;\n searchInput.blur();\n }, [isHistoryCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n return (\n <div id=\"MobileSearch\" className={isActive ? 'active' : ''}>\n <div className=\"header\">\n <Button\n size=\"smaller\"\n round\n color=\"translucent\"\n onClick={closeLocalTextSearch}\n >\n <i className=\"icon-arrow-left\" />\n </Button>\n <SearchInput\n ref={inputRef}\n value={query}\n onChange={handleMessageSearchQueryChange}\n />\n </div>\n <div className=\"footer\">\n <div className=\"counter\">\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={() => openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n <i className=\"icon-calendar\" />\n </Button>\n )}\n </div>\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={handleUp}\n disabled={!foundIds || !foundIds.length || focusedIndex === foundIds.length - 1}\n >\n <i className=\"icon-up\" />\n </Button>\n <Button\n round\n size=\"smaller\"\n color=\"translucent\"\n onClick={handleDown}\n disabled={!foundIds || !foundIds.length || focusedIndex === 0}\n >\n <i className=\"icon-down\" />\n </Button>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf<HTMLElement>,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll<HTMLElement>(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import findInViewport from './findInViewport';\nimport isFullyVisible from './isFullyVisible';\nimport fastSmoothScroll from './fastSmoothScroll';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nexport default function setTooltipItemVisible(selector: string, index: number, containerRef: Record<string, any>) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n selector,\n VIEWPORT_MARGIN,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\nimport captureKeyboardListeners from '../../../../util/captureKeyboardListeners';\nimport cycleRestrict from '../../../../util/cycleRestrict';\n\nexport function useKeyboardNavigation({\n isActive,\n isHorizontal,\n shouldRemoveSelectionOnReset,\n noArrowNavigation,\n items,\n shouldSelectOnTab,\n onSelect,\n onClose,\n}: {\n isActive: boolean;\n isHorizontal?: boolean;\n shouldRemoveSelectionOnReset?: boolean;\n noArrowNavigation?: boolean;\n items?: any[];\n shouldSelectOnTab?: boolean;\n onSelect: AnyToVoidFunction;\n onClose: NoneToVoidFunction;\n}) {\n const [selectedItemIndex, setSelectedItemIndex] = useState(-1);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!items) {\n return -1;\n }\n\n return cycleRestrict(items.length, newIndex);\n }, [items]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedItemIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedItemIndex, getSelectedIndex]);\n\n const handleItemSelect = useCallback((e: KeyboardEvent) => {\n if (items && items.length && selectedItemIndex > -1) {\n const item = items[selectedItemIndex];\n if (item) {\n e.preventDefault();\n onSelect(item);\n }\n }\n }, [items, onSelect, selectedItemIndex]);\n\n useEffect(() => {\n setSelectedItemIndex(shouldRemoveSelectionOnReset ? -1 : 0);\n }, [items, shouldRemoveSelectionOnReset]);\n\n useEffect(() => (isActive ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: noArrowNavigation || isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: noArrowNavigation || isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(1, e),\n onLeft: noArrowNavigation || !isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: noArrowNavigation || !isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(1, e),\n onTab: shouldSelectOnTab ? handleItemSelect : undefined,\n onEnter: handleItemSelect,\n }) : undefined), [\n noArrowNavigation, handleArrowKey, handleItemSelect, isActive, isHorizontal, onClose, shouldSelectOnTab,\n ]);\n\n return selectedItemIndex;\n}\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredUsers?: ApiUser[];\n usersById?: Record<number, ApiUser>;\n};\n\nconst MentionTooltip: FC<OwnProps> = ({\n isOpen,\n onClose,\n onInsertUserName,\n usersById,\n filteredUsers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((member: ApiUser) => {\n handleUserSelect(member.id, true);\n }, [handleUserSelect]);\n\n const selectedMentionIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: filteredUsers,\n onSelect: handleSelectMention,\n shouldSelectOnTab: true,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n useEffect(() => {\n if (filteredUsers && !filteredUsers.length) {\n onClose();\n }\n }, [filteredUsers, onClose]);\n\n const prevChatMembers = usePrevious(\n filteredUsers && filteredUsers.length\n ? filteredUsers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredUsers && !filteredUsers.length\n ? prevChatMembers\n : filteredUsers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n <div className={className} ref={containerRef}>\n {renderedChatMembers && renderedChatMembers.map(({ id }, index) => (\n <ListItem\n key={id}\n className=\"chat-item-clickable scroll-item\"\n onClick={() => handleUserSelect(id)}\n focus={selectedMentionIndex === index}\n >\n <PrivateChatInfo\n userId={id}\n avatarSize=\"small\"\n withUsername\n />\n </ListItem>\n ))}\n </div>\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n isReady?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record<number, ApiUser>;\n recentEmojis: string[];\n baseEmojiKeywords?: Record<string, string[]>;\n emojiKeywords?: Record<string, string[]>;\n addRecentEmoji: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC<OwnProps> = ({\n attachments,\n caption,\n isReady,\n currentUserId,\n groupChatMembers,\n usersById,\n recentEmojis,\n baseEmojiKeywords,\n emojiKeywords,\n addRecentEmoji,\n onCaptionUpdate,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef<number>(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = Boolean(renderingAttachments && renderingAttachments.every((a) => a.quick));\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, closeMentionTooltip, insertMention, mentionFilteredUsers,\n } = useMentionTooltip(\n isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n undefined,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const handleDragLeave = (e: React.DragEvent<HTMLElement>) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files && files.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.has(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, isQuick);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent<HTMLDivElement, MouseEvent>) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n <div className=\"modal-header-condensed\" dir={lang.isRtl ? 'rtl' : undefined}>\n <Button round color=\"translucent\" size=\"smaller\" ariaLabel=\"Cancel attachments\" onClick={onClear}>\n <i className=\"icon-close\" />\n </Button>\n <div className=\"modal-title\">{title}</div>\n <Button\n color=\"primary\"\n size=\"smaller\"\n className=\"modal-action-button\"\n onClick={sendAttachments}\n >\n {lang('Send')}\n </Button>\n </div>\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClear}\n header={renderHeader()}\n className={`AttachmentModal ${isHovered ? 'hovered' : ''}`}\n >\n <div\n className=\"drop-target\"\n onDragEnter={markHovered}\n onDrop={handleFilesDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n data-attach-description={lang('Preview.Dragging.AddItems', 10)}\n >\n {isQuick ? (\n <div className=\"media-wrapper custom-scroll\">\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? <img src={attachment.blobUrl} alt=\"\" />\n : <video src={attachment.blobUrl} autoPlay muted loop />\n ))}\n </div>\n ) : (\n <div className=\"document-wrapper custom-scroll\">\n {renderingAttachments.map((attachment) => (\n <File\n name={attachment.filename}\n extension={getFileExtension(attachment.filename, attachment.mimeType)}\n previewData={attachment.previewBlobUrl}\n size={attachment.size}\n smaller\n />\n ))}\n </div>\n )}\n\n <div className=\"attachment-caption-wrapper\">\n <MentionTooltip\n isOpen={isMentionTooltipOpen}\n onClose={closeMentionTooltip}\n onInsertUserName={insertMention}\n filteredUsers={mentionFilteredUsers}\n usersById={usersById}\n />\n <EmojiTooltip\n isOpen={isEmojiTooltipOpen}\n emojis={filteredEmojis}\n onClose={closeEmojiTooltip}\n onEmojiSelect={insertEmoji}\n addRecentEmoji={addRecentEmoji}\n />\n <MessageInput\n id=\"caption-input-text\"\n isAttachmentModalInput\n html={caption}\n editableInputId={EDITABLE_INPUT_MODAL_ID}\n placeholder={lang('Caption')}\n onUpdate={onCaptionUpdate}\n onSend={onSend}\n shouldSetFocus={Boolean(attachments.length)}\n />\n </div>\n </div>\n </Modal>\n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC<OwnProps> = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef<HTMLInputElement>(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef<HTMLDivElement>(null);\n\n const [question, setQuestion] = useState<string>('');\n const [options, setOptions] = useState<string[]>(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState<string>();\n const [correctOption, setCorrectOption] = useState<string>();\n const [hasErrors, setHasErrors] = useState<boolean>(false);\n\n const lang = useLang();\n\n const focusInput = useCallback((ref: RefObject<HTMLInputElement>) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\n\n function renderHeader() {\n return (\n <div className=\"modal-header-condensed\">\n <Button round color=\"translucent\" size=\"smaller\" ariaLabel=\"Cancel poll creation\" onClick={onClear}>\n <i className=\"icon-close\" />\n </Button>\n <div className=\"modal-title\">{lang('NewPoll')}</div>\n <Button\n color=\"primary\"\n size=\"smaller\"\n className=\"modal-action-button\"\n onClick={handleCreate}\n >\n {lang('Create')}\n </Button>\n </div>\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n <div className=\"option-wrapper\">\n <InputText\n label={index !== options.length - 1 || options.length === MAX_OPTIONS_COUNT\n ? lang('OptionHint')\n : lang('CreatePoll.AddOption')}\n error={getOptionsError(index)}\n value={option}\n onChange={(e) => updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n <Button\n className=\"option-remove-button\"\n round\n color=\"translucent\"\n size=\"smaller\"\n ariaLabel={lang('Delete')}\n onClick={() => removeOption(index)}\n >\n <i className=\"icon-close\" />\n </Button>\n )}\n </div>\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n <p className=\"error\">{lang('lng_polls_choose_correct')}</p>\n );\n }\n\n return (\n <Modal isOpen={isOpen} onClose={onClear} header={renderHeader()} className=\"PollModal\">\n <InputText\n ref={questionInputRef}\n label={lang('AskAQuestion')}\n value={question}\n error={getQuestionError()}\n onChange={(e) => setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n <div className=\"options-divider\" />\n\n <div className=\"options-list custom-scroll\" ref={optionsListRef}>\n <h3 className=\"options-header\">{lang('PollOptions')}</h3>\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n <RadioGroup\n name=\"correctOption\"\n options={renderRadioOptions()}\n onChange={handleCorrectOptionChange}\n />\n ) : (\n renderOptions()\n )}\n\n </div>\n\n <div className=\"options-divider\" />\n\n <div className=\"quiz-mode\">\n <Checkbox\n label={lang('PollAnonymous')}\n checked={isAnonymous}\n onChange={handleIsAnonymousChange}\n />\n <Checkbox\n label={lang('PollMultiple')}\n checked={isMultipleAnswers}\n disabled={isQuizMode}\n onChange={handleMultipleAnswersChange}\n />\n <Checkbox\n label={lang('PollQuiz')}\n checked={isQuizMode}\n disabled={isMultipleAnswers}\n onChange={handleQuizModeChange}\n />\n {isQuizMode && (\n <>\n <h3 className=\"options-header\">{lang('lng_polls_solution_title')}</h3>\n <div\n ref={solutionRef}\n className=\"form-control\"\n contentEditable\n dir=\"auto\"\n onChange={(e) => setSolution(e.currentTarget.innerHTML)}\n />\n <div className=\"note\">{lang('CreatePoll.ExplanationInfo')}</div>\n </>\n )}\n </div>\n </Modal>\n );\n};\n\nexport default memo(PollModal);\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC<OwnProps> = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n <div\n className={`EmojiButton ${focus ? 'focus' : ''}`}\n onMouseDown={handleClick}\n title={`:${emoji.names[0]}:`}\n >\n {IS_EMOJI_SUPPORTED ? emoji.native : <img src={`./img-apple-64/${emoji.image}.png`} alt=\"\" loading=\"lazy\" />}\n </div>\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC<OwnProps> = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n <div\n ref={ref}\n key={category.id}\n id={`emoji-category-${index}`}\n className=\"symbol-set\"\n >\n <p className=\"symbol-set-name\" dir=\"auto\">\n {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}\n </p>\n <div\n className={buildClassName('symbol-set-container', transitionClassNames)}\n // @ts-ignore\n style={`height: ${height}px;`}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Recent emojis may contain emoticons that are no longer in the list\n if (!emoji) {\n return undefined;\n }\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n <EmojiButton\n key={displayedEmoji.id}\n emoji={displayedEmoji}\n onClick={onEmojiSelect}\n />\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\ntype StateProps = Pick<GlobalState, 'recentEmojis'>;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record<string, string> = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise<EmojiModule>;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC<OwnProps & StateProps> = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef<HTMLDivElement>(null);\n\n const [categories, setCategories] = useState<EmojiCategoryData[]>();\n const [emojis, setEmojis] = useState<AllEmojis>();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef.current, !IS_SINGLE_COLUMN_LAYOUT);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji, name);\n }, [onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n <Button\n className={`symbol-set-button ${index === activeCategoryIndex ? 'activated' : ''}`}\n round\n faded\n color=\"translucent\"\n onClick={() => selectCategory(index)}\n ariaLabel={category.name}\n >\n <i className={icon} />\n </Button>\n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n <div className={containerClassName}>\n <Loading />\n </div>\n );\n }\n\n return (\n <div className={containerClassName}>\n <div ref={headerRef} className=\"EmojiPicker-header\" dir={lang.isRtl ? 'rtl' : ''}>\n {allCategories.map(renderCategoryButton)}\n </div>\n <div\n ref={containerRef}\n className={buildClassName('EmojiPicker-main no-selection', IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll')}\n >\n {allCategories.map((category, i) => (\n <EmojiCategory\n category={category}\n index={i}\n allEmojis={emojis}\n observeIntersection={observeIntersection}\n shouldRender={activeCategoryIndex >= i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n </div>\n </div>\n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise<EmojiModule>;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => pick(global, ['recentEmojis']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_SINGLE_COLUMN_LAYOUT ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC<OwnProps> = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n <div\n ref={ref}\n key={stickerSet.id}\n id={`sticker-set-${index}`}\n className=\"symbol-set\"\n >\n <p className=\"symbol-set-name\">{stickerSet.title}</p>\n <div\n className={buildClassName('symbol-set-container', transitionClassNames)}\n // @ts-ignore\n style={`height: ${height}px;`}\n >\n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n <StickerButton\n key={sticker.id}\n sticker={sticker}\n size={STICKER_SIZE_PICKER}\n observeIntersection={observeIntersection}\n noAnimate={!loadAndPlay}\n onClick={onStickerSelect}\n clickArg={sticker}\n onUnfaveClick={stickerSet.id === 'favorite' ? onStickerUnfave : undefined}\n />\n ))}\n </div>\n </div>\n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record<string, ApiStickerSet>;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'loadStickerSets' | 'loadRecentStickers' | 'loadFavoriteStickers' |\n 'addRecentSticker' | 'loadAddedStickers' | 'unfaveSticker'\n)>;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC<OwnProps & StateProps & DispatchProps> = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef<HTMLDivElement>(null);\n const [activeSetIndex, setActiveSetIndex] = useState<number>(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n <Button\n key={stickerSet.id}\n className={buttonClassName}\n ariaLabel={stickerSet.title}\n round\n faded={stickerSet.id === 'recent' || stickerSet.id === 'favorite'}\n color=\"translucent\"\n onClick={() => selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n <i className=\"icon-recent\" />\n ) : stickerSet.id === 'favorite' ? (\n <i className=\"icon-favorite\" />\n ) : stickerSet.isAnimated ? (\n <StickerSetCoverAnimated\n stickerSet={stickerSet as ApiStickerSet}\n observeIntersection={observeIntersectionForCovers}\n />\n ) : (\n <StickerSetCover\n stickerSet={stickerSet as ApiStickerSet}\n observeIntersection={observeIntersectionForCovers}\n />\n )}\n </Button>\n );\n } else {\n return (\n <StickerButton\n key={stickerSet.id}\n sticker={firstSticker}\n size={STICKER_SIZE_PICKER_HEADER}\n title={stickerSet.title}\n className={buttonClassName}\n observeIntersection={observeIntersectionForCovers}\n onClick={selectStickerSet}\n clickArg={index}\n />\n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n <div className={fullClassName}>\n {!canSendStickers ? (\n <div className=\"picker-disabled\">Sending stickers is not allowed in this chat.</div>\n ) : noPopulatedSets ? (\n <div className=\"picker-disabled\">You have no saved Stickers.</div>\n ) : (\n <Loading />\n )}\n </div>\n );\n }\n\n return (\n <div className={fullClassName}>\n <div\n ref={headerRef}\n className=\"StickerPicker-header no-selection no-scrollbar\"\n >\n {allSets.map(renderCover)}\n </div>\n <div\n ref={containerRef}\n className={buildClassName('StickerPicker-main no-selection', IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll')}\n >\n {allSets.map((stickerSet, i) => (\n <StickerSet\n key={stickerSet.id}\n stickerSet={stickerSet}\n loadAndPlay={Boolean(shouldPlay && loadAndPlay)}\n index={i}\n observeIntersection={observeIntersection}\n shouldRender={activeSetIndex >= i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n className?: string;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC<OwnProps> = ({\n gif, observeIntersection, isDisabled, className, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef<HTMLVideoElement>(null);\n\n const hasThumbnail = gif.thumbnail && !!gif.thumbnail.dataUri;\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbRef = useCanvasBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(hasThumbnail || previewBlobUrl || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const fullClassName = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n className,\n );\n\n return (\n <div\n ref={ref}\n className={fullClassName}\n onClick={handleClick}\n >\n {hasThumbnail && (\n <canvas\n ref={thumbRef}\n className=\"thumbnail\"\n />\n )}\n {!hasThumbnail && previewBlobUrl && (\n <img\n src={previewBlobUrl}\n alt=\"\"\n className=\"thumbnail\"\n />\n )}\n {(shouldRenderVideo || previewBlobUrl) && (\n <video\n ref={videoRef}\n autoPlay\n loop\n muted\n playsInline\n preload=\"none\"\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...bufferingHandlers}\n >\n <source src={videoData} />\n </video>\n )}\n {shouldRenderSpinner && (\n <Spinner color={previewBlobUrl || hasThumbnail ? 'white' : 'black'} />\n )}\n </div>\n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadSavedGifs'>;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC<OwnProps & StateProps & DispatchProps> = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n <div\n ref={containerRef}\n className={buildClassName('GifPicker', className, IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll')}\n >\n {!canSendGifs ? (\n <div className=\"picker-disabled\">Sending GIFs is not allowed in this chat.</div>\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n <GifButton\n key={gif.id}\n gif={gif}\n observeIntersection={observeIntersection}\n isDisabled={!loadAndPlay}\n onClick={onGifSelect}\n />\n ))\n ) : canRenderContents && savedGifs ? (\n <div className=\"picker-disabled\">No saved GIFs.</div>\n ) : (\n <Loading />\n )}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC<OwnProps> = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n const lang = useLang();\n\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n <Button\n className={`symbol-tab-button ${activeTab === tab ? 'activated' : ''}`}\n onClick={() => onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n <i className={SYMBOL_MENU_TAB_ICONS[tab]} />\n </Button>\n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n <div className=\"SymbolMenu-footer\" onClick={stopPropagation} dir={lang.isRtl ? 'rtl' : undefined}>\n {activeTab !== SymbolMenuTabs.Emoji && (\n <Button\n className=\"symbol-search-button\"\n ariaLabel={activeTab === SymbolMenuTabs.Stickers ? 'Search Stickers' : 'Search GIFs'}\n round\n faded\n color=\"translucent\"\n onClick={handleSearchOpen}\n >\n <i className=\"icon-search\" />\n </Button>\n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n <Button\n className=\"symbol-delete-button\"\n onClick={onRemoveSymbol}\n ariaLabel=\"Remove Symbol\"\n round\n faded\n color=\"translucent\"\n >\n <i className=\"icon-delete-left\" />\n </Button>\n )}\n </div>\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker, shouldPreserveInput?: boolean) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\ntype StateProps = {\n isLeftColumnShown: boolean;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC<OwnProps & StateProps> = ({\n isOpen, allowedAttachmentOptions, isLeftColumnShown,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState<number>(0);\n const [recentEmojis, setRecentEmojis] = useState<string[]>([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker, true);\n }, [onStickerSelect]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n <EmojiPicker\n className=\"picker-tab\"\n onEmojiSelect={handleEmojiSelect}\n />\n );\n case SymbolMenuTabs.Stickers:\n return (\n <StickerPicker\n className=\"picker-tab\"\n loadAndPlay={canSendStickers ? isOpen && (isActive || isFrom) : false}\n canSendStickers={canSendStickers}\n onStickerSelect={handleStickerSelect}\n />\n );\n case SymbolMenuTabs.GIFs:\n return (\n <GifPicker\n className=\"picker-tab\"\n loadAndPlay={canSendGifs ? isOpen && (isActive || isFrom) : false}\n canSendGifs={canSendGifs}\n onGifSelect={onGifSelect}\n />\n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n <div className=\"SymbolMenu-main\" onClick={stopPropagation}>\n {isActivated && (\n <Transition name=\"slide\" activeKey={activeTab} renderCount={SYMBOL_MENU_TAB_TITLES.length}>\n {renderContent}\n </Transition>\n )}\n </div>\n {IS_SINGLE_COLUMN_LAYOUT && (\n <Button\n round\n faded\n color=\"translucent\"\n ariaLabel={lang('Close')}\n className=\"symbol-close-button\"\n size=\"tiny\"\n onClick={onClose}\n >\n <i className=\"icon-close\" />\n </Button>\n )}\n <SymbolMenuFooter\n activeTab={activeTab}\n onSwitchTab={setActiveTab}\n onRemoveSymbol={onRemoveSymbol}\n onSearchOpen={handleSearch}\n />\n </>\n );\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n !isLeftColumnShown && 'middle-column-open',\n );\n\n return (\n <Portal>\n <div className={className}>\n {content}\n </div>\n </Portal>\n );\n }\n\n return (\n <Menu\n isOpen={isOpen}\n positionX=\"left\"\n positionY=\"bottom\"\n onClose={onClose}\n className=\"SymbolMenu\"\n onCloseAnimationEnd={onClose}\n onMouseEnter={!IS_TOUCH_ENV ? handleMouseEnter : undefined}\n onMouseLeave={!IS_TOUCH_ENV ? handleMouseLeave : undefined}\n noCloseOnBackdrop={!IS_TOUCH_ENV}\n >\n {content}\n </Menu>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n return {\n isLeftColumnShown: global.isLeftColumnShown,\n };\n },\n)(SymbolMenu));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC<OwnProps> = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n Array.from(CONTENT_TYPES_FOR_QUICK_UPLOAD).join(','),\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n <Menu\n isOpen={isOpen}\n autoClose\n positionX=\"right\"\n positionY=\"bottom\"\n onClose={onClose}\n className=\"AttachMenu fluid\"\n onCloseAnimationEnd={onClose}\n onMouseEnter={!IS_TOUCH_ENV ? handleMouseEnter : undefined}\n onMouseLeave={!IS_TOUCH_ENV ? handleMouseLeave : undefined}\n noCloseOnBackdrop={!IS_TOUCH_ENV}\n >\n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n <MenuItem className=\"media-disabled\" disabled>Posting media content is not allowed in this group.</MenuItem>\n )}\n {canAttachMedia && (\n <>\n <MenuItem icon=\"photo\" onClick={handleQuickSelect}>\n {lang('AttachmentMenu.PhotoOrVideo')}\n </MenuItem>\n <MenuItem icon=\"document\" onClick={handleDocumentSelect}>{lang('AttachDocument')}</MenuItem>\n </>\n )}\n {canAttachPolls && (\n <MenuItem icon=\"poll\" onClick={onPollCreate}>{lang('Poll')}</MenuItem>\n )}\n </Menu>\n );\n};\n\nexport default memo(AttachMenu);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\n\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\nimport './BotCommand.scss';\n\ntype OwnProps = {\n botCommand: ApiBotCommand;\n bot?: ApiUser;\n withAvatar?: boolean;\n focus?: boolean;\n onClick: (botCommand: ApiBotCommand) => void;\n};\n\nconst BotCommand: FC<OwnProps> = ({\n withAvatar,\n focus,\n botCommand,\n bot,\n onClick,\n}) => {\n return (\n <ListItem\n key={botCommand.command}\n className={buildClassName('BotCommand chat-item-clickable scroll-item', withAvatar && 'with-avatar')}\n multiline\n onClick={() => onClick(botCommand)}\n focus={focus}\n >\n {withAvatar && (\n <Avatar size=\"small\" user={bot} />\n )}\n <div className=\"content-inner\">\n <span className=\"title\">/{botCommand.command}</span>\n <span className=\"subtitle\">{renderText(botCommand.description)}</span>\n </div>\n </ListItem>\n );\n};\n\nexport default memo(BotCommand);\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport BotCommand from './BotCommand';\n\nimport './BotCommandTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withUsername?: boolean;\n botCommands?: ApiBotCommand[];\n onClick: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record<number, ApiUser>;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'sendBotCommand'>;\n\nconst BotCommandTooltip: FC<OwnProps & StateProps & DispatchProps> = ({\n usersById,\n isOpen,\n withUsername,\n botCommands,\n onClick,\n onClose,\n sendBotCommand,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const handleSendCommand = useCallback(({ botId, command }: ApiBotCommand) => {\n const bot = usersById[botId];\n sendBotCommand({\n command: `/${command}${withUsername && bot ? `@${bot.username}` : ''}`,\n botId,\n });\n onClick();\n }, [onClick, sendBotCommand, usersById, withUsername]);\n\n const selectedCommandIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: botCommands,\n onSelect: handleSendCommand,\n onClose,\n });\n\n useEffect(() => {\n if (botCommands && !botCommands.length) {\n onClose();\n }\n }, [botCommands, onClose]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedCommandIndex, containerRef);\n }, [selectedCommandIndex]);\n\n const prevCommands = usePrevious(botCommands && botCommands.length ? botCommands : undefined, shouldRender);\n const renderedCommands = botCommands && !botCommands.length ? prevCommands : botCommands;\n\n if (!shouldRender || (renderedCommands && !renderedCommands.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'BotCommandTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n <div className={className} ref={containerRef}>\n {renderedCommands && renderedCommands.map((chatBotCommand, index) => (\n <BotCommand\n key={`${chatBotCommand.botId}_${chatBotCommand.command}`}\n botCommand={chatBotCommand}\n bot={usersById[chatBotCommand.botId]}\n withAvatar\n onClick={handleSendCommand}\n focus={selectedCommandIndex === index}\n />\n ))}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => ({\n usersById: global.users.byId,\n }),\n (setGlobal, actions): DispatchProps => pick(actions, ['sendBotCommand']),\n)(BotCommandTooltip));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotCommand } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport BotCommand from './BotCommand';\n\nimport './BotCommandMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n botCommands: ApiBotCommand[];\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'sendBotCommand'>;\n\nconst BotCommandMenu: FC<OwnProps & DispatchProps> = ({\n isOpen, botCommands, onClose, sendBotCommand,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n\n const handleClick = useCallback((botCommand: ApiBotCommand) => {\n sendBotCommand({\n command: `/${botCommand.command}`,\n botId: botCommand.botId,\n });\n onClose();\n }, [onClose, sendBotCommand]);\n\n return (\n <Menu\n isOpen={isOpen}\n positionX=\"left\"\n positionY=\"bottom\"\n onClose={onClose}\n className=\"BotCommandMenu\"\n onCloseAnimationEnd={onClose}\n onMouseEnter={!IS_TOUCH_ENV ? handleMouseEnter : undefined}\n onMouseLeave={!IS_TOUCH_ENV ? handleMouseLeave : undefined}\n noCloseOnBackdrop={!IS_TOUCH_ENV}\n >\n {botCommands.map((botCommand) => (\n <BotCommand\n key={botCommand.command}\n botCommand={botCommand}\n onClick={handleClick}\n />\n ))}\n </Menu>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['sendBotCommand']),\n)(BotCommandMenu));\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'clearStickersForEmoji'>;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC<OwnProps & StateProps & DispatchProps> = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers && displayedStickers.length) && 'hidden',\n );\n\n return (\n <div\n ref={containerRef}\n className={className}\n onMouseEnter={!IS_TOUCH_ENV ? handleMouseEnter : undefined}\n onMouseLeave={!IS_TOUCH_ENV ? handleMouseLeave : undefined}\n >\n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n <StickerButton\n key={sticker.id}\n sticker={sticker}\n size={STICKER_SIZE_PICKER}\n observeIntersection={observeIntersection}\n onClick={onStickerSelect}\n clickArg={sticker}\n />\n ))\n ) : shouldRender ? (\n <Loading />\n ) : undefined}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(StickerTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC<OwnProps> = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n <Menu\n isOpen={isOpen}\n autoClose\n positionX=\"right\"\n positionY=\"bottom\"\n className=\"CustomSendMenu\"\n onClose={onClose}\n onCloseAnimationEnd={onCloseAnimationEnd}\n onMouseEnter={!IS_TOUCH_ENV ? handleMouseEnter : undefined}\n onMouseLeave={!IS_TOUCH_ENV ? handleMouseLeave : undefined}\n noCloseOnBackdrop={!IS_TOUCH_ENV}\n >\n {onSilentSend && <MenuItem icon=\"mute\" onClick={onSilentSend}>{lang('SendWithoutSound')}</MenuItem>}\n {onScheduleSend && <MenuItem icon=\"schedule\" onClick={onScheduleSend}>{lang('ScheduleMessage')}</MenuItem>}\n </Menu>\n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\nconst CLOSE_DURATION = 350;\n\nfunction setItemVisible(index: number, containerRef: Record<string, any>) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst EmojiTooltip: FC<OwnProps> = ({\n isOpen,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const handleSelectEmoji = useCallback((emoji: Emoji) => {\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const handleClick = useCallback((native: string, id: string) => {\n onEmojiSelect(native);\n addRecentEmoji({ emoji: id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const selectedIndex = useKeyboardNavigation({\n isActive: isOpen,\n isHorizontal: true,\n items: emojis,\n onSelect: handleSelectEmoji,\n onClose,\n });\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n <div\n ref={containerRef}\n className={className}\n onMouseEnter={!IS_TOUCH_ENV ? handleMouseEnter : undefined}\n onMouseLeave={!IS_TOUCH_ENV ? handleMouseLeave : undefined}\n >\n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n <EmojiButton\n key={emoji.id}\n emoji={emoji}\n focus={selectedIndex === index}\n onClick={handleClick}\n />\n ))\n ) : shouldRender ? (\n <Loading />\n ) : undefined}\n </div>\n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiWebDocument } from '../../../../api/types';\n\nimport { getFirstLetters } from '../../../../util/textFormat';\nimport renderText from '../../../common/helpers/renderText';\nimport useMedia from '../../../../hooks/useMedia';\n\nimport ListItem from '../../../ui/ListItem';\n\nimport './BaseResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n thumbnail?: ApiWebDocument;\n thumbUrl?: string;\n title?: string;\n description?: string;\n transitionClassNames?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst BaseResult: FC<OwnProps> = ({\n title,\n description,\n thumbnail,\n thumbUrl,\n focus,\n transitionClassNames = '',\n onClick,\n}) => {\n let content: string | undefined = '';\n\n const thumbnailDataUrl = useMedia(thumbnail ? `webDocument:${thumbnail.url}` : undefined);\n thumbUrl = thumbUrl || thumbnailDataUrl;\n\n if (thumbUrl) {\n content = (\n <img src={thumbUrl} className={transitionClassNames} alt=\"\" decoding=\"async\" draggable=\"false\" />\n );\n } else if (title) {\n content = getFirstLetters(title, 1);\n }\n\n return (\n <ListItem\n focus={focus}\n className=\"BaseResult chat-item-clickable\"\n onClick={onClick}\n >\n <span className=\"thumb\">\n {typeof content === 'string' ? renderText(content) : content}\n </span>\n <div className=\"content-inner\">\n {title && (<div className=\"title\">{title}</div>)}\n {description && (<div className=\"description\">{description}</div>)}\n </div>\n </ListItem>\n );\n};\n\nexport default memo(BaseResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiPhoto, ApiThumbnail, ApiWebDocument,\n} from '../../../../api/types';\n\nimport useMedia from '../../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../../hooks/useTransitionForMedia';\n\nimport BaseResult from './BaseResult';\n\nimport './MediaResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n isForGallery?: boolean;\n inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst MediaResult: FC<OwnProps> = ({\n focus, isForGallery, inlineResult, onClick,\n}) => {\n let photo: ApiPhoto | undefined;\n let thumbnail: ApiThumbnail | undefined;\n let webThumbnail: ApiWebDocument | undefined;\n\n if ('photo' in inlineResult) {\n photo = inlineResult.photo;\n }\n // For results with type=video (for example @stikstokbot)\n if ('thumbnail' in inlineResult) {\n thumbnail = inlineResult.thumbnail;\n }\n if ('webThumbnail' in inlineResult && isForGallery) {\n webThumbnail = inlineResult.webThumbnail;\n }\n\n const thumbnailDataUrl = useMedia(webThumbnail ? `webDocument:${webThumbnail.url}` : undefined);\n const mediaBlobUrl = useMedia(photo && `photo${photo.id}?size=m`);\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (isForGallery) {\n return (\n <div className=\"MediaResult chat-item-clickable\" onClick={handleClick}>\n {shouldRenderThumb && (\n <img src={(photo && photo.thumbnail && photo.thumbnail.dataUri) || thumbnailDataUrl} alt=\"\" />\n )}\n {shouldRenderFullMedia && (\n <img src={mediaBlobUrl} className={`${transitionClassNames} full-media`} alt=\"\" />\n )}\n </div>\n );\n }\n\n const { title, description } = inlineResult;\n\n return (\n <BaseResult\n focus={focus}\n thumbUrl={shouldRenderFullMedia ? mediaBlobUrl : (thumbnail && thumbnail.dataUri) || thumbnailDataUrl}\n transitionClassNames={shouldRenderFullMedia ? transitionClassNames : undefined}\n title={title}\n description={description}\n onClick={handleClick}\n />\n );\n};\n\nexport default memo(MediaResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineResult } from '../../../../api/types';\n\nimport BaseResult from './BaseResult';\n\nexport type OwnProps = {\n focus?: boolean;\n inlineResult: ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst ArticleResult: FC<OwnProps> = ({ focus, inlineResult, onClick }) => {\n const {\n title, url, description, webThumbnail,\n } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n return (\n <BaseResult\n focus={focus}\n thumbnail={webThumbnail}\n title={title || url}\n description={description}\n onClick={handleClick}\n />\n );\n};\n\nexport default memo(ArticleResult);\n","import React, {\n FC, memo, useCallback,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport GifButton from '../../../common/GifButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst GifResult: FC<OwnProps> = ({\n inlineResult, observeIntersection, onClick,\n}) => {\n const { gif } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (!gif) {\n return undefined;\n }\n\n return (\n <GifButton\n gif={gif}\n observeIntersection={observeIntersection}\n className=\"chat-item-clickable\"\n onClick={handleClick}\n />\n );\n};\n\nexport default memo(GifResult);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { STICKER_SIZE_INLINE_BOT_RESULT } from '../../../../config';\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport StickerButton from '../../../common/StickerButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst StickerResult: FC<OwnProps> = ({ inlineResult, observeIntersection, onClick }) => {\n const { sticker } = inlineResult;\n\n if (!sticker) {\n return undefined;\n }\n\n return (\n <StickerButton\n sticker={sticker}\n size={STICKER_SIZE_INLINE_BOT_RESULT}\n observeIntersection={observeIntersection}\n title={sticker.emoji}\n className=\"chat-item-clickable\"\n onClick={onClick}\n clickArg={inlineResult}\n />\n );\n};\n\nexport default memo(StickerResult);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm } from '../../../api/types';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport MediaResult from './inlineResults/MediaResult';\nimport ArticleResult from './inlineResults/ArticleResult';\nimport GifResult from './inlineResults/GifResult';\nimport StickerResult from './inlineResults/StickerResult';\nimport ListItem from '../../ui/ListItem';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\nimport './InlineBotTooltip.scss';\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nexport type OwnProps = {\n isOpen: boolean;\n botId?: number;\n isGallery?: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n inlineBotResults?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n switchPm?: ApiBotInlineSwitchPm;\n onSelectResult: (inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult) => void;\n loadMore: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick<GlobalActions, ('startBot' | 'openChat' | 'sendInlineBotResult')>;\n\nconst InlineBotTooltip: FC<OwnProps & DispatchProps> = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n openChat,\n startBot,\n onSelectResult,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n isDisabled: !isOpen,\n });\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (direction === LoadMoreDirection.Backwards) {\n runThrottled(loadMore);\n }\n }, [loadMore]);\n\n const selectedIndex = useKeyboardNavigation({\n isActive: isOpen,\n shouldRemoveSelectionOnReset: isGallery,\n noArrowNavigation: isGallery,\n items: inlineBotResults,\n onSelect: onSelectResult,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const handleSendPm = useCallback(() => {\n openChat({ id: botId });\n startBot({ botId, param: switchPm!.startParam });\n }, [botId, openChat, startBot, switchPm]);\n\n const prevInlineBotResults = usePrevious(\n inlineBotResults && inlineBotResults.length\n ? inlineBotResults\n : undefined,\n shouldRender,\n );\n const renderedInlineBotResults = inlineBotResults && !inlineBotResults.length\n ? prevInlineBotResults\n : inlineBotResults;\n\n if (!shouldRender || !renderedInlineBotResults || (!renderedInlineBotResults.length && !switchPm)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'InlineBotTooltip composer-tooltip',\n IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll',\n isGallery && 'gallery',\n transitionClassNames,\n );\n\n function renderSwitchPm() {\n return (\n <ListItem ripple className=\"switch-pm scroll-item\" onClick={handleSendPm}>\n <span className=\"title\">{switchPm!.text}</span>\n </ListItem>\n );\n }\n\n function renderContent() {\n return renderedInlineBotResults!.map((inlineBotResult, index) => {\n switch (inlineBotResult.type) {\n case 'gif':\n return (\n <GifResult\n key={inlineBotResult.id}\n inlineResult={inlineBotResult}\n observeIntersection={observeIntersection}\n onClick={onSelectResult}\n />\n );\n\n case 'photo':\n return (\n <MediaResult\n key={inlineBotResult.id}\n isForGallery={isGallery}\n inlineResult={inlineBotResult}\n onClick={onSelectResult}\n />\n );\n\n case 'sticker':\n return (\n <StickerResult\n key={inlineBotResult.id}\n inlineResult={inlineBotResult}\n observeIntersection={observeIntersection}\n onClick={onSelectResult}\n />\n );\n\n case 'video':\n case 'game':\n return (\n <MediaResult\n key={inlineBotResult.id}\n focus={selectedIndex === index}\n inlineResult={inlineBotResult}\n onClick={onSelectResult}\n />\n );\n case 'article':\n case 'audio':\n return (\n <ArticleResult\n key={inlineBotResult.id}\n focus={selectedIndex === index}\n inlineResult={inlineBotResult}\n onClick={onSelectResult}\n />\n );\n\n default:\n return undefined;\n }\n });\n }\n\n return (\n <InfiniteScroll\n ref={containerRef}\n className={className}\n items={renderedInlineBotResults}\n itemSelector=\".chat-item-clickable\"\n noFastList\n onLoadMore={handleLoadMore}\n sensitiveArea={160}\n >\n {switchPm && renderSwitchPm()}\n {renderContent()}\n </InfiniteScroll>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'startBot', 'openChat', 'sendInlineBotResult',\n ]),\n)(InlineBotTooltip));\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record<number, ApiMessage>;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'searchTextMessagesLocal' | 'focusMessage'>;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC<OwnProps & StateProps & DispatchProps> = ({\n chatId,\n threadId,\n onClose,\n isActive,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\n\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, message);\n\n return (\n <ListItem\n className=\"chat-item-clickable search-result-message m-0\"\n onClick={onClick}\n >\n <Avatar chat={senderChat} user={senderUser} />\n <div className=\"info\">\n <div className=\"title\">\n <h3 dir=\"auto\">{title && renderText(title)}</h3>\n <LastMessageMeta message={message} />\n </div>\n <div className=\"subtitle\" dir=\"auto\">\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n </div>\n </div>\n </ListItem>\n );\n };\n\n useHistoryBack(isActive, onClose);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n const foundResult = foundResults && foundResults[index === -1 ? 0 : index];\n if (foundResult) {\n foundResult.onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n <InfiniteScroll\n className=\"RightSearch custom-scroll\"\n items={foundResults}\n preloadBackwards={0}\n onLoadMore={searchTextMessagesLocal}\n noFastList\n onKeyDown={handleKeyDown}\n ref={containerRef}\n >\n <p className=\"helper-text\" dir=\"auto\">\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} messages found`\n )}\n </p>\n {foundResults.map(renderSearchResult)}\n </InfiniteScroll>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadStickers' | 'toggleStickerSet'>;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC<OwnProps & StateProps & DispatchProps> = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n <div key={set.id} className=\"sticker-set\" dir={lang.isRtl ? 'rtl' : undefined}>\n <div className=\"sticker-set-header\">\n <div className=\"title-wrapper\">\n <h3 className=\"title\" dir=\"auto\">{set.title}</h3>\n <p className=\"count\" dir=\"auto\">{lang('Stickers', set.count, 'i')}</p>\n </div>\n <Button\n className={isAdded ? 'is-added' : undefined}\n color=\"primary\"\n size=\"tiny\"\n pill\n fluid\n onClick={handleAddClick}\n >\n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\n </Button>\n </div>\n <div className=\"sticker-set-main\">\n {!canRenderStickers && <Spinner />}\n {canRenderStickers && displayedStickers.map((sticker) => (\n <StickerButton\n sticker={sticker}\n size={STICKER_SIZE_SEARCH}\n observeIntersection={observeIntersection}\n noAnimate={!shouldPlay || isModalOpen || isSomeModalOpen}\n onClick={openModal}\n />\n ))}\n </div>\n {canRenderStickers && (\n <StickerSetModal\n isOpen={isModalOpen}\n fromSticker={displayedStickers[0]}\n onClose={closeModal}\n />\n )}\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadFeaturedStickers'>;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC<OwnProps & StateProps & DispatchProps> = ({\n onClose,\n isActive,\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n\n const lang = useLang();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n <StickerSetResult\n key={id}\n stickerSetId={id}\n observeIntersection={observeIntersection}\n isSomeModalOpen={isModalOpen}\n onModalToggle={setIsModalOpen}\n />\n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return <p className=\"helper-text\" dir=\"auto\">Nothing found.</p>;\n }\n\n return resultIds.map((id) => (\n <StickerSetResult\n key={id}\n stickerSetId={id}\n observeIntersection={observeIntersection}\n isSomeModalOpen={isModalOpen}\n onModalToggle={setIsModalOpen}\n />\n ));\n }\n\n return <Loading />;\n }\n\n return (\n <div ref={containerRef} className=\"StickerSearch custom-scroll\" dir={lang.isRtl ? 'rtl' : undefined}>\n {renderContent()}\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'searchMoreGifs' | 'sendMessage' | 'setGifSearchQuery'>;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC<OwnProps & StateProps & DispatchProps> = ({\n onClose,\n isActive,\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n <Loading />\n );\n }\n\n if (!results.length) {\n return (\n <p className=\"helper-text\" dir=\"auto\">{lang('NoGIFsFound')}</p>\n );\n }\n\n return results.map((gif) => (\n <GifButton\n key={gif.id}\n gif={gif}\n observeIntersection={observeIntersection}\n onClick={handleGifClick}\n />\n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n <div className=\"GifSearch\" dir={lang.isRtl ? 'rtl' : undefined}>\n <InfiniteScroll\n ref={containerRef}\n className={buildClassName('gif-container custom-scroll', hasResults && 'grid')}\n items={results}\n itemSelector=\".GifButton\"\n preloadBackwards={PRELOAD_BACKWARDS}\n noFastList\n onLoadMore={searchMoreGifs}\n >\n {renderContent()}\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadPollOptionResults' | 'openChat' | 'closePollResults'>;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC<OwnProps & StateProps & DispatchProps> = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious<number>(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n const lang = useLang();\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n <ShowMoreButton\n count={leftVotersCount}\n itemName=\"voter\"\n isLoading={isLoading}\n onClick={handleViewMoreClick}\n />\n );\n }\n\n return (\n <div className=\"PollAnswerResults\">\n <div className=\"poll-voters\">\n {voters\n ? voters.map((id) => (\n <ListItem\n key={id}\n className=\"chat-item-clickable\"\n onClick={() => handleMemberClick(id)}\n >\n <PrivateChatInfo\n avatarSize=\"tiny\"\n userId={id}\n forceShowSelf\n noStatusOrTyping\n />\n </ListItem>\n ))\n : <Loading />}\n {voters && renderViewMoreButton()}\n </div>\n <div className=\"answer-head\" dir={lang.isRtl ? 'rtl' : undefined}>\n <span className=\"answer-title\" dir=\"auto\">{text}</span>\n <span className=\"answer-percent\" dir={lang.isRtl ? 'auto' : undefined}>\n {getPercentage(answerVote.votersCount, totalVoters)}%\n </span>\n </div>\n </div>\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC<OwnProps & StateProps> = ({\n onClose,\n isActive,\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n useHistoryBack(isActive, onClose);\n\n if (!message || !chat) {\n return <Loading />;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n <div className=\"PollResults\" dir={lang.isRtl ? 'rtl' : undefined}>\n <h3 className=\"poll-question\" dir=\"auto\">{summary.question}</h3>\n <div className=\"poll-results-list custom-scroll\">\n {lastSyncTime && summary.answers.map((answer) => (\n <PollAnswerResults\n key={`${message.id}-${answer.option}`}\n chat={chat}\n message={message}\n answer={answer}\n answerVote={resultsByOption[answer.option]}\n totalVoters={results.totalVoters!}\n />\n ))}\n {!lastSyncTime && <Loading />}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../../modules/selectors';\nimport { selectIsChatMuted } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n isMuted?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'updateContact' | 'deleteUser' | 'deleteHistory' | 'closeManagement' | 'openChat'\n)>;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC<OwnProps & StateProps & DispatchProps> = ({\n userId,\n user,\n chat,\n progress,\n isMuted,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!isMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!isMuted);\n }, [isMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <PrivateChatInfo\n userId={user.id}\n avatarSize=\"jumbo\"\n status=\"original name\"\n withFullInfo\n />\n <InputText\n id=\"user-first-name\"\n label={lang('UserInfo.FirstNamePlaceholder')}\n onChange={handleFirstNameChange}\n value={firstName}\n error={error === ERROR_FIRST_NAME_MISSING ? error : undefined}\n />\n <InputText\n id=\"user-last-name\"\n label={lang('UserInfo.LastNamePlaceholder')}\n onChange={handleLastNameChange}\n value={lastName}\n />\n <div className=\"ListItem no-selection narrow\">\n <Checkbox\n checked={isNotificationsEnabled}\n label={lang('Notifications')}\n subLabel={lang(isNotificationsEnabled\n ? 'UserInfo.NotificationsEnabled'\n : 'UserInfo.NotificationsDisabled')}\n onChange={handleNotificationChange}\n />\n </div>\n </div>\n <div className=\"section\">\n <ListItem icon=\"delete\" ripple destructive onClick={openDeleteDialog}>\n {lang('DeleteContact')}\n </ListItem>\n </div>\n </div>\n <FloatingActionButton\n isShown={isProfileFieldsTouched}\n onClick={handleProfileSave}\n disabled={isLoading}\n ariaLabel={lang('Save')}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n <ConfirmDialog\n isOpen={isDeleteDialogOpen}\n onClose={closeDeleteDialog}\n text={lang('AreYouSureDeleteContact')}\n confirmLabel={lang('DeleteContact')}\n confirmHandler={handleDeleteContact}\n confirmIsDestructive\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n return {\n user, chat, progress, isMuted,\n };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'togglePreHistoryHidden' | 'updateChat' | 'closeManagement' |\n 'leaveChannel' | 'deleteChannel' | 'deleteChat' | 'openChat'\n)>;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC<OwnProps & StateProps & DispatchProps> = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState<File | undefined>();\n const [error, setError] = useState<string | undefined>();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteChat({ chatId: chat.id });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id,\n closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <AvatarEditable\n currentAvatarBlobUrl={currentAvatarBlobUrl}\n onChange={handleSetPhoto}\n disabled={!canChangeInfo}\n />\n <InputText\n id=\"group-title\"\n label={lang('GroupName')}\n onChange={handleTitleChange}\n value={title}\n error={error === GROUP_TITLE_EMPTY ? error : undefined}\n disabled={!canChangeInfo}\n />\n <InputText\n id=\"group-about\"\n className=\"mb-2\"\n label={lang('DescriptionPlaceholder')}\n onChange={handleAboutChange}\n value={about}\n disabled={!canChangeInfo}\n />\n {chat.isCreator && (\n <ListItem icon=\"lock\" multiline onClick={handleClickEditType}>\n <span className=\"title\">{lang('GroupType')}</span>\n <span className=\"subtitle\">{chat.username ? lang('TypePublic') : lang('TypePrivate')}</span>\n </ListItem>\n )}\n {hasLinkedChannel && (\n <ListItem\n icon=\"message\"\n multiline\n onClick={handleClickDiscussion}\n >\n <span className=\"title\">{lang('LinkedChannel')}</span>\n <span className=\"subtitle\">{lang('DiscussionUnlink')}</span>\n </ListItem>\n )}\n <ListItem\n icon=\"permissions\"\n multiline\n onClick={handleClickPermissions}\n disabled={!canBanUsers}\n >\n <span className=\"title\">{lang('ChannelPermissions')}</span>\n <span className=\"subtitle\" dir=\"auto\">\n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n </span>\n </ListItem>\n <ListItem\n icon=\"admin\"\n multiline\n onClick={handleClickAdministrators}\n >\n <span className=\"title\">{lang('ChannelAdministrators')}</span>\n <span className=\"subtitle\">{formatInteger(adminsCount)}</span>\n </ListItem>\n </div>\n <div className=\"section\">\n <ListItem icon=\"group\" multiline onClick={handleClickMembers}>\n <span className=\"title\">{lang('GroupMembers')}</span>\n <span className=\"subtitle\">{formatInteger(chat.membersCount!)}</span>\n </ListItem>\n\n {chat.fullInfo && (\n <div className=\"ListItem narrow no-selection\">\n <Checkbox\n checked={!chat.fullInfo.isPreHistoryHidden}\n label={lang('ChatHistory')}\n onChange={handleTogglePreHistory}\n disabled={!canBanUsers}\n />\n </div>\n )}\n </div>\n <div className=\"section\">\n <ListItem icon=\"delete\" ripple destructive onClick={openDeleteDialog}>\n {lang('DeleteMega')}\n </ListItem>\n </div>\n </div>\n <FloatingActionButton\n isShown={isProfileFieldsTouched}\n onClick={handleUpdateGroup}\n disabled={isLoading}\n ariaLabel={lang('Save')}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n <ConfirmDialog\n isOpen={isDeleteDialogOpen}\n onClose={closeDeleteDialog}\n textParts={renderText(\n isBasicGroup || !chat.isCreator\n ? lang('AreYouSureDeleteAndExit')\n : lang('AreYouSureDeleteThisChatWithGroup', chat.title),\n ['br', 'simple_markdown'],\n )}\n confirmLabel={isBasicGroup || !chat.isCreator ? lang('DeleteMega') : lang('DeleteGroupForAll')}\n confirmHandler={handleDeleteGroup}\n confirmIsDestructive\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n const isBasicGroup = isChatBasicGroup(chat);\n\n return {\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'leaveChannel', 'deleteChannel', 'deleteChat', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'updateChatDefaultBannedRights'>;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC<OwnProps & StateProps & DispatchProps> = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState<ApiChatBannedRights>({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as Exclude<keyof ApiChatBannedRights, 'untilDate'>]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <h3 className=\"section-heading\" dir=\"auto\">{lang('ChannelPermissionsHeader')}</h3>\n\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendMessages\"\n checked={!permissions.sendMessages}\n label={lang('UserRestrictionsSend')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendMedia\"\n checked={!permissions.sendMedia}\n label={lang('UserRestrictionsSendMedia')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendStickers\"\n checked={!permissions.sendStickers && !permissions.sendGifs}\n label={lang('UserRestrictionsSendStickers')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendPolls\"\n checked={!permissions.sendPolls}\n label={lang('UserRestrictionsSendPolls')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"embedLinks\"\n checked={!permissions.embedLinks}\n label={lang('UserRestrictionsEmbedLinks')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"inviteUsers\"\n checked={!permissions.inviteUsers}\n label={lang('UserRestrictionsInviteUsers')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"pinMessages\"\n checked={!permissions.pinMessages}\n label={lang('UserRestrictionsPinMessages')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!permissions.changeInfo}\n label={lang('UserRestrictionsChangeInfo')}\n blocking\n onChange={handlePermissionChange}\n />\n </div>\n </div>\n\n <div className=\"section\">\n <ListItem\n icon=\"delete-user\"\n multiline\n narrow\n onClick={handleRemovedUsersClick}\n >\n <span className=\"title\">{lang('ChannelBlockedUsers')}</span>\n <span className=\"subtitle\">{removedUsersCount}</span>\n </ListItem>\n </div>\n\n <div className=\"section\">\n <h3 className=\"section-heading\" dir=\"auto\">{lang('PrivacyExceptions')}</h3>\n\n <ListItem\n icon=\"add-user\"\n onClick={handleAddExceptionClick}\n >\n {lang('ChannelAddException')}\n </ListItem>\n\n {exceptionMembers.map((member) => (\n <ListItem\n key={member.userId}\n className=\"chat-item-clickable exceptions-member\"\n onClick={() => handleExceptionMemberClick(member)}\n >\n <PrivateChatInfo\n userId={member.userId}\n status={getMemberExceptions(member)}\n />\n </ListItem>\n ))}\n </div>\n </div>\n\n <FloatingActionButton\n isShown={havePermissionChanged}\n onClick={handleSavePermissions}\n ariaLabel={lang('Save')}\n disabled={isLoading}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record<number, ApiUser>;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'updateChatMemberBannedRights'>;\n\nconst ManageGroupRemovedUsers: FC<OwnProps & StateProps & DispatchProps> = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\" dir={lang.isRtl ? 'rtl' : undefined}>\n <p className=\"text-muted\">{lang('NoBlockedGroup2')}</p>\n\n {removedMembers.map((member) => (\n <ListItem\n key={member.userId}\n className=\"chat-item-clickable\"\n ripple\n contextActions={getContextActions(member)}\n >\n <PrivateChatInfo\n userId={member.userId}\n status={getRemovedBy(member)}\n />\n </ListItem>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'toggleSignatures' | 'updateChat' | 'closeManagement' | 'leaveChannel' | 'deleteChannel' | 'openChat'\n)>;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC<OwnProps & StateProps & DispatchProps> = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n onClose,\n isActive,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState<File | undefined>();\n const [error, setError] = useState<string | undefined>();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <AvatarEditable\n currentAvatarBlobUrl={currentAvatarBlobUrl}\n onChange={handleSetPhoto}\n disabled={!canChangeInfo}\n />\n <InputText\n id=\"channel-title\"\n label={lang('EnterChannelName')}\n onChange={handleTitleChange}\n value={title}\n error={error === CHANNEL_TITLE_EMPTY ? error : undefined}\n disabled={!canChangeInfo}\n />\n <InputText\n id=\"channel-about\"\n className=\"mb-2\"\n label={lang('DescriptionPlaceholder')}\n onChange={handleAboutChange}\n value={about}\n disabled={!canChangeInfo}\n />\n {chat.isCreator && (\n <ListItem icon=\"lock\" multiline onClick={handleClickEditType}>\n <span className=\"title\">{lang('ChannelType')}</span>\n <span className=\"subtitle\">{chat.username ? lang('TypePublic') : lang('TypePrivate')}</span>\n </ListItem>\n )}\n <ListItem\n icon=\"message\"\n multiline\n onClick={handleClickDiscussion}\n disabled={!canChangeInfo}\n >\n <span className=\"title\">{lang('Discussion')}</span>\n <span className=\"subtitle\">{hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}</span>\n </ListItem>\n <ListItem\n icon=\"admin\"\n multiline\n onClick={handleClickAdministrators}\n >\n <span className=\"title\">{lang('ChannelAdministrators')}</span>\n <span className=\"subtitle\">{adminsCount}</span>\n </ListItem>\n <div className=\"ListItem no-selection narrow\">\n <Checkbox\n checked={isSignaturesShown}\n label={lang('ChannelSignMessages')}\n onChange={handleToggleSignatures}\n />\n </div>\n </div>\n <div className=\"section\">\n <ListItem\n icon=\"group\"\n multiline\n onClick={handleClickSubscribers}\n >\n <span className=\"title\" dir=\"auto\">{lang('ChannelSubscribers')}</span>\n <span className=\"subtitle\" dir=\"auto\">{lang('Subscribers', chat.membersCount!, 'i')}</span>\n </ListItem>\n </div>\n <div className=\"section\">\n <ListItem icon=\"delete\" ripple destructive onClick={openDeleteDialog}>\n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n </ListItem>\n </div>\n </div>\n <FloatingActionButton\n isShown={isProfileFieldsTouched}\n onClick={handleUpdateChannel}\n disabled={isLoading}\n ariaLabel={lang('Save')}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n <ConfirmDialog\n isOpen={isDeleteDialogOpen}\n onClose={closeDeleteDialog}\n text={chat.isCreator ? lang('ChannelDeleteAlert') : lang('ChannelLeaveAlert')}\n confirmLabel={chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n confirmHandler={handleDeleteChannel}\n confirmIsDestructive\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, (\n 'checkPublicLink' | 'updatePublicLink' | 'updatePrivateLink'\n)>;\n\nconst ManageChatPrivacyType: FC<OwnProps & StateProps & DispatchProps> = ({\n chat,\n onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState<PrivacyType>(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = Boolean(\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic),\n );\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\" dir={lang.isRtl ? 'rtl' : undefined}>\n <h3 className=\"section-heading\">{lang(`${langPrefix2}Type`)}</h3>\n <RadioGroup\n selected={privacyType}\n name=\"channel-type\"\n options={options}\n onChange={handleOptionChange}\n />\n </div>\n {privacyType === 'private' ? (\n <div className=\"section\" dir={lang.isRtl ? 'rtl' : undefined}>\n {privateLink ? (\n <>\n <SafeLink url={privateLink} className=\"group-link\" text={privateLink} />\n <p className=\"section-info\" dir={lang.isRtl ? 'rtl' : undefined}>\n {lang(`${langPrefix1}PrivateLinkHelp`)}\n </p>\n\n <ListItem icon=\"delete\" ripple destructive onClick={openRevokeConfirmDialog}>\n {lang('RevokeLink')}\n </ListItem>\n <ConfirmDialog\n isOpen={isRevokeConfirmDialogOpen}\n onClose={closeRevokeConfirmDialog}\n text={lang('RevokeAlert')}\n confirmLabel={lang('RevokeButton')}\n confirmHandler={handleRevokePrivateLink}\n confirmIsDestructive\n />\n </>\n ) : (\n <Loading />\n )}\n </div>\n ) : (\n <div className=\"section no-border\">\n <UsernameInput\n asLink\n currentUsername={chat.username}\n isLoading={isLoading}\n isUsernameAvailable={isUsernameAvailable}\n checkUsername={checkPublicLink}\n onChange={setUsername}\n />\n <p className=\"section-info\" dir=\"auto\">\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n </p>\n </div>\n )}\n </div>\n <FloatingActionButton\n isShown={canUpdate}\n disabled={isLoading}\n ariaLabel={lang('Save')}\n onClick={handleSave}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record<number, ApiChat>;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'loadGroupsForDiscussion' | 'linkDiscussionGroup' | 'unlinkDiscussionGroup'>;\n\nconst ManageDiscussion: FC<OwnProps & StateProps & DispatchProps> = ({\n chat,\n onClose,\n isActive,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState<number>();\n const [animationData, setAnimationData] = useState<Record<string, any>>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n <div className=\"modal-header\">\n <Avatar\n size=\"tiny\"\n chat={linkedChat}\n />\n <div className=\"modal-title\">\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n </div>\n </div>\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n <div className=\"modal-header\">\n <Avatar\n size=\"tiny\"\n chat={linkedGroup}\n />\n <div className=\"modal-title\">\n {lang('Channel.DiscussionGroup.LinkGroup')}\n </div>\n </div>\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n <div>\n <ListItem\n className=\"chat-item-clickable\"\n inactive\n >\n <GroupChatInfo chatId={linkedChat!.id} />\n </ListItem>\n <ListItem\n icon=\"delete\"\n ripple\n destructive\n onClick={openConfirmUnlinkGroupDialog}\n >\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n </ListItem>\n <ConfirmDialog\n isOpen={isConfirmUnlinkGroupDialogOpen}\n onClose={closeConfirmUnlinkGroupDialog}\n header={renderUnlinkGroupHeader()}\n textParts={renderText(\n lang(isChannel ? 'DiscussionUnlinkChannelAlert' : 'DiscussionUnlinkGroupAlert', linkedChat!.title),\n ['br', 'simple_markdown'],\n )}\n confirmLabel={lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n confirmHandler={handleUnlinkGroupSessions}\n confirmIsDestructive\n />\n </div>\n );\n }\n\n function renderDiscussionGroups() {\n return (\n <div>\n <p className=\"section-help\" dir=\"auto\">{lang('DiscussionChannelHelp')}</p>\n\n <div teactFastList>\n <ListItem\n key=\"create-group\"\n icon=\"group\"\n ripple\n teactOrderKey={0}\n className=\"not-implemented\"\n >\n {lang('DiscussionCreateGroup')}\n </ListItem>\n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n <ListItem\n key={id}\n teactOrderKey={i + 1}\n className=\"chat-item-clickable scroll-item\"\n onClick={() => { onDiscussionClick(id); }}\n >\n <GroupChatInfo chatId={id} />\n </ListItem>\n ))\n ) : (\n <NothingFound key=\"nothing-found\" teactOrderKey={0} text=\"No discussion groups found\" />\n )}\n </div>\n <p className=\"mt-4 mb-0 section-help\" dir=\"auto\">{lang('DiscussionChannelHelp2')}</p>\n <ConfirmDialog\n isOpen={isConfirmLinkGroupDialogOpen}\n onClose={closeConfirmLinkGroupDialog}\n header={renderLinkGroupHeader()}\n textParts={renderLinkGroupConfirmText()}\n confirmLabel={lang('DiscussionLinkGroup')}\n confirmHandler={handleLinkGroupSessions}\n isButtonsInOneRow\n />\n </div>\n );\n }\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <div className=\"section-icon\">\n {animationData && (\n <AnimatedSticker\n id=\"discussionGroupsDucks\"\n size={STICKER_SIZE_DISCUSSION_GROUPS}\n animationData={animationData}\n play={isAnimationLoaded}\n noLoop\n onLoad={handleAnimationLoad}\n />\n )}\n </div>\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'updateChatMemberBannedRights'>;\n\nconst ManageGroupUserPermissions: FC<OwnProps & StateProps & DispatchProps> = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState<ApiChatBannedRights>({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as Exclude<keyof ApiChatBannedRights, 'untilDate'>]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: Exclude<keyof ApiChatBannedRights, 'untilDate'>) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <ListItem inactive className=\"chat-item-clickable\">\n <PrivateChatInfo userId={selectedChatMember.userId} />\n </ListItem>\n\n <h3 className=\"section-heading mt-4\" dir=\"auto\">{lang('UserRestrictionsCanDo')}</h3>\n\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendMessages\"\n checked={!permissions.sendMessages}\n label={lang('UserRestrictionsSend')}\n blocking\n disabled={getControlIsDisabled('sendMessages')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendMedia\"\n checked={!permissions.sendMedia}\n label={lang('UserRestrictionsSendMedia')}\n blocking\n disabled={getControlIsDisabled('sendMedia')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendStickers\"\n checked={!permissions.sendStickers && !permissions.sendGifs}\n label={lang('UserRestrictionsSendStickers')}\n blocking\n disabled={getControlIsDisabled('sendStickers')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"sendPolls\"\n checked={!permissions.sendPolls}\n label={lang('UserRestrictionsSendPolls')}\n blocking\n disabled={getControlIsDisabled('sendPolls')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"embedLinks\"\n checked={!permissions.embedLinks}\n label={lang('UserRestrictionsEmbedLinks')}\n blocking\n disabled={getControlIsDisabled('embedLinks')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"inviteUsers\"\n checked={!permissions.inviteUsers}\n label={lang('UserRestrictionsInviteUsers')}\n blocking\n disabled={getControlIsDisabled('inviteUsers')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"pinMessages\"\n checked={!permissions.pinMessages}\n label={lang('UserRestrictionsPinMessages')}\n blocking\n disabled={getControlIsDisabled('pinMessages')}\n onChange={handlePermissionChange}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!permissions.changeInfo}\n label={lang('UserRestrictionsChangeInfo')}\n blocking\n disabled={getControlIsDisabled('changeInfo')}\n onChange={handlePermissionChange}\n />\n </div>\n </div>\n\n {!isFormFullyDisabled && (\n <div className=\"section\">\n <ListItem icon=\"delete-user\" ripple destructive onClick={openBanConfirmationDialog}>\n {lang('UserRestrictionsBlock')}\n </ListItem>\n </div>\n )}\n </div>\n\n <FloatingActionButton\n isShown={havePermissionChanged}\n onClick={handleSavePermissions}\n ariaLabel={lang('Save')}\n disabled={isLoading}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n\n <ConfirmDialog\n isOpen={isBanConfirmationDialogOpen}\n onClose={closeBanConfirmationDialog}\n text=\"Are you sure you want to ban and remove this user from the group?\"\n confirmLabel=\"Remove\"\n confirmHandler={handleBanFromGroup}\n confirmIsDestructive\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record<number, ApiUser>;\n};\n\nconst ManageChatAdministrators: FC<OwnProps & StateProps> = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <ListItem\n icon=\"recent\"\n multiline\n onClick={handleRecentActionsClick}\n >\n <span className=\"title\">{lang('EventLog')}</span>\n <span className=\"subtitle\">{lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}</span>\n </ListItem>\n </div>\n\n <div className=\"section\" dir={lang.isRtl ? 'rtl' : undefined}>\n <p className=\"text-muted\" dir=\"auto\">\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n </p>\n\n {adminMembers.map((member) => (\n <ListItem\n key={member.userId}\n className=\"chat-item-clickable\"\n onClick={() => handleAdminMemberClick(member)}\n >\n <PrivateChatInfo\n userId={member.userId}\n status={getMemberStatus(member)}\n forceShowSelf\n />\n </ListItem>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC<OwnProps & StateProps> = ({ chat, onClose, isActive }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section not-implemented\" dir={lang.isRtl ? 'rtl' : undefined}>\n <h3 className=\"section-heading\" dir=\"auto\">Actions</h3>\n\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogAllEvents')}\n onChange={undefined}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogFilterNewAdmins')}\n onChange={undefined}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogFilterNewMembers')}\n onChange={undefined}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogFilterChannelInfo')}\n onChange={undefined}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogFilterDeletedMessages')}\n onChange={undefined}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogFilterEditedMessages')}\n onChange={undefined}\n />\n </div>\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogFilterLeavingMembers')}\n onChange={undefined}\n />\n </div>\n </div>\n\n <div className=\"section not-implemented\" dir={lang.isRtl ? 'rtl' : undefined}>\n <h3 className=\"section-heading\" dir=\"auto\">{lang('Channel.Management.Title')}</h3>\n\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!false}\n label={lang('EventLogAllAdmins')}\n onChange={undefined}\n />\n </div>\n\n {adminMembers.map((member) => (\n <ListItem\n key={member.userId}\n className=\"chat-item-clickable picker-list-item\"\n onClick={undefined}\n ripple\n >\n <Checkbox label=\"\" checked={!false} />\n <PrivateChatInfo\n userId={member.userId}\n status={getMemberStatus(member)}\n forceShowSelf\n />\n </ListItem>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record<number, ApiUser>;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'updateChatAdmin'>;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC<OwnProps & StateProps & DispatchProps> = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState<ApiChatAdminRights>({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\">\n <ListItem inactive className=\"chat-item-clickable\">\n <PrivateChatInfo\n userId={selectedChatMember.userId}\n status={memberStatus}\n forceShowSelf\n />\n </ListItem>\n\n <h3 className=\"section-heading mt-4\" dir=\"auto\">{lang('EditAdminWhatCanDo')}</h3>\n\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"changeInfo\"\n checked={!!permissions.changeInfo}\n label={lang(isChannel ? 'EditAdminChangeChannelInfo' : 'EditAdminChangeGroupInfo')}\n blocking\n disabled={getControlIsDisabled('changeInfo')}\n onChange={handlePermissionChange}\n />\n </div>\n {isChannel && (\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"postMessages\"\n checked={!!permissions.postMessages}\n label={lang('EditAdminPostMessages')}\n blocking\n disabled={getControlIsDisabled('postMessages')}\n onChange={handlePermissionChange}\n />\n </div>\n )}\n {isChannel && (\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"editMessages\"\n checked={!!permissions.editMessages}\n label={lang('EditAdminEditMessages')}\n blocking\n disabled={getControlIsDisabled('editMessages')}\n onChange={handlePermissionChange}\n />\n </div>\n )}\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"deleteMessages\"\n checked={!!permissions.deleteMessages}\n label={lang(isChannel ? 'EditAdminDeleteMessages' : 'EditAdminGroupDeleteMessages')}\n blocking\n disabled={getControlIsDisabled('deleteMessages')}\n onChange={handlePermissionChange}\n />\n </div>\n {!isChannel && (\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"banUsers\"\n checked={!!permissions.banUsers}\n label={lang('EditAdminBanUsers')}\n blocking\n disabled={getControlIsDisabled('banUsers')}\n onChange={handlePermissionChange}\n />\n </div>\n )}\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"inviteUsers\"\n checked={!!permissions.inviteUsers}\n label={lang('EditAdminAddUsers')}\n blocking\n disabled={getControlIsDisabled('inviteUsers')}\n onChange={handlePermissionChange}\n />\n </div>\n {!isChannel && (\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"pinMessages\"\n checked={!!permissions.pinMessages}\n label={lang('EditAdminPinMessages')}\n blocking\n disabled={getControlIsDisabled('pinMessages')}\n onChange={handlePermissionChange}\n />\n </div>\n )}\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"addAdmins\"\n checked={!!permissions.addAdmins}\n label={lang('EditAdminAddAdmins')}\n blocking\n disabled={getControlIsDisabled('addAdmins')}\n onChange={handlePermissionChange}\n />\n </div>\n {!isChannel && (\n <div className=\"ListItem no-selection\">\n <Checkbox\n name=\"anonymous\"\n checked={!!permissions.anonymous}\n label={lang('EditAdminSendAnonymously')}\n blocking\n disabled={getControlIsDisabled('anonymous')}\n onChange={handlePermissionChange}\n />\n </div>\n )}\n\n {isFormFullyDisabled && (\n <p className=\"section-info mb-4\" dir=\"auto\">\n {lang('Channel.EditAdmin.CannotEdit')}\n </p>\n )}\n\n {!isChannel && (\n <InputText\n id=\"admin-title\"\n label={lang('EditAdminRank')}\n onChange={handleCustomTitleChange}\n value={customTitle}\n disabled={isFormFullyDisabled}\n maxLength={CUSTOM_TITLE_MAX_LENGTH}\n />\n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n <ListItem icon=\"delete\" ripple destructive onClick={openDismissConfirmationDialog}>\n {lang('EditAdminRemoveAdmin')}\n </ListItem>\n )}\n </div>\n </div>\n\n <FloatingActionButton\n isShown={isTouched}\n onClick={handleSavePermissions}\n ariaLabel={lang('Save')}\n disabled={isLoading}\n >\n {isLoading ? (\n <Spinner color=\"white\" />\n ) : (\n <i className=\"icon-check\" />\n )}\n </FloatingActionButton>\n\n <ConfirmDialog\n isOpen={isDismissConfirmationDialogOpen}\n onClose={closeDismissConfirmationDialog}\n text=\"Are you sure you want to dismiss this admin?\"\n confirmLabel=\"Dismiss\"\n confirmHandler={handleDismissAdmin}\n confirmIsDestructive\n />\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record<number, ApiUser>;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'openUserInfo'>;\n\nconst ManageGroupMembers: FC<OwnProps & StateProps & DispatchProps> = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [members, serverTimeOffset, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n useHistoryBack(isActive, onClose);\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\" teactFastList>\n {memberIds ? (\n memberIds.map((id, i) => (\n <ListItem\n key={id}\n teactOrderKey={i}\n className=\"chat-item-clickable scroll-item\"\n onClick={() => handleMemberClick(id)}\n >\n <PrivateChatInfo userId={id} forceShowSelf />\n </ListItem>\n ))\n ) : (\n <NothingFound\n teactOrderKey={0}\n key=\"nothing-found\"\n text={isChannel ? 'No subscribers found' : 'No members found'}\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record<number, ApiUser>;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC<OwnProps & StateProps> = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(\n members.filter((member) => !member.isOwner).map(({ userId }) => userId),\n usersById, undefined, serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n <div className=\"Management\">\n <div className=\"custom-scroll\">\n <div className=\"section\" teactFastList>\n {memberIds ? (\n memberIds.map((id, i) => (\n <ListItem\n key={id}\n teactOrderKey={i}\n className=\"chat-item-clickable scroll-item\"\n onClick={() => handleExceptionMemberClick(id)}\n >\n <PrivateChatInfo userId={id} forceShowSelf />\n </ListItem>\n ))\n ) : (\n <NothingFound\n teactOrderKey={0}\n key=\"nothing-found\"\n text={isChannel ? 'No subscribers found' : 'No members found'}\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC<OwnProps & StateProps> = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return (\n <ManageUser\n key={chatId}\n userId={chatId}\n onClose={onClose}\n isActive={isActive}\n />\n );\n case 'group':\n return (\n <ManageGroup\n key={chatId}\n chatId={chatId}\n onScreenSelect={onScreenSelect}\n onClose={onClose}\n isActive={isActive || [\n ManagementScreens.ChatPrivacyType,\n ManagementScreens.Discussion,\n ManagementScreens.GroupPermissions,\n ManagementScreens.ChatAdministrators,\n ManagementScreens.GroupRemovedUsers,\n ManagementScreens.GroupUserPermissionsCreate,\n ManagementScreens.GroupUserPermissions,\n ManagementScreens.ChatAdminRights,\n ManagementScreens.GroupRecentActions,\n ].includes(currentScreen)}\n />\n );\n case 'channel':\n return (\n <ManageChannel\n key={chatId}\n chatId={chatId}\n onScreenSelect={onScreenSelect}\n onClose={onClose}\n isActive={isActive || [\n ManagementScreens.ChannelSubscribers,\n ManagementScreens.ChatAdministrators,\n ManagementScreens.Discussion,\n ManagementScreens.ChatPrivacyType,\n ManagementScreens.ChatAdminRights,\n ManagementScreens.GroupRecentActions,\n ].includes(currentScreen)}\n />\n );\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n <ManageChatPrivacyType\n chatId={chatId}\n isActive={isActive}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.Discussion:\n return (\n <ManageDiscussion\n chatId={chatId}\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.GroupPermissions:\n return (\n <ManageGroupPermissions\n chatId={chatId}\n onScreenSelect={onScreenSelect}\n onChatMemberSelect={onChatMemberSelect}\n isActive={isActive || [\n ManagementScreens.GroupRemovedUsers,\n ManagementScreens.GroupUserPermissionsCreate,\n ManagementScreens.GroupUserPermissions,\n ].includes(currentScreen)}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n <ManageGroupRemovedUsers\n chatId={chatId}\n isActive={isActive}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n <ManageGroupUserPermissionsCreate\n chatId={chatId}\n onChatMemberSelect={onChatMemberSelect}\n onScreenSelect={onScreenSelect}\n isActive={isActive || [\n ManagementScreens.GroupUserPermissions,\n ].includes(currentScreen)}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n <ManageGroupUserPermissions\n chatId={chatId}\n selectedChatMemberId={selectedChatMemberId}\n isPromotedByCurrentUser={isPromotedByCurrentUser}\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n <ManageChatAdministrators\n chatId={chatId}\n onScreenSelect={onScreenSelect}\n onChatMemberSelect={onChatMemberSelect}\n isActive={isActive || [\n ManagementScreens.ChatAdminRights,\n ManagementScreens.GroupRecentActions,\n ].includes(currentScreen)}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n <ManageGroupRecentActions\n chatId={chatId}\n isActive={isActive}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n <ManageGroupAdminRights\n chatId={chatId}\n selectedChatMemberId={selectedChatMemberId}\n isPromotedByCurrentUser={isPromotedByCurrentUser}\n onScreenSelect={onScreenSelect}\n isActive={isActive}\n onClose={onClose}\n />\n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n <ManageGroupMembers\n chatId={chatId}\n isActive={isActive}\n onClose={onClose}\n />\n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record<number, string> = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record<string, string>;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch<FormActions>;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer<FormState, FormActions> = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject<HTMLInputElement>, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject<HTMLSelectElement>;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent<HTMLSelectElement>) => void;\n children: any;\n};\n\nconst Select: FC<OwnProps> = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n <div className={fullClassName}>\n <select\n className=\"form-control\"\n id={id}\n value={value || ''}\n onChange={onChange}\n placeholder={placeholder || label}\n ref={ref}\n >\n {children}\n </select>\n {labelText && id && (\n <label htmlFor={id}>{labelText}</label>\n )}\n </div>\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC<OwnProps> = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef<HTMLInputElement>(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n <div className=\"ShippingInfo\">\n <form>\n {needAddress ? (\n <div>\n <h5>{lang('PaymentShippingAddress')}</h5>\n <InputText\n ref={inputRef}\n label=\"Address1 (Street)\"\n onChange={handleAddress1Change}\n value={state.streetLine1}\n inputMode=\"text\"\n error={formErrors.streetLine1}\n />\n <InputText\n label=\"Address2 (Street)\"\n onChange={handleAddress2Change}\n value={state.streetLine2}\n inputMode=\"text\"\n error={formErrors.streetLine2}\n />\n <InputText\n label=\"City\"\n onChange={handleCityChange}\n value={state.city}\n inputMode=\"text\"\n error={formErrors.city}\n />\n <InputText\n label=\"State\"\n onChange={handleStateChange}\n value={state.state}\n inputMode=\"text\"\n error={formErrors.state}\n />\n <Select\n label=\"Country\"\n placeholder=\"Country\"\n onChange={handleCountryChange}\n value={state.countryIso2}\n hasArrow={Boolean(true)}\n id=\"shipping-country\"\n error={formErrors.countryIso2}\n ref={selectCountryRef}\n >\n {countryList.map(({ name, id }) => (\n <option\n value={id}\n className=\"county-item\"\n >\n {name}\n </option>\n ))}\n </Select>\n\n <InputText\n label=\"Post Code\"\n onChange={handlePostCodeChange}\n value={state.postCode}\n inputMode=\"text\"\n error={formErrors.postCode}\n />\n </div>\n ) : undefined}\n { needName || needEmail || needPhone ? (\n <h5>{lang('PaymentShippingReceiver')}</h5>\n ) : undefined }\n { needName && (\n <InputText\n label=\"Full name\"\n onChange={handleFullNameChange}\n value={state.fullName}\n inputMode=\"text\"\n error={formErrors.fullName}\n />\n ) }\n { needEmail && (\n <InputText\n label=\"Email\"\n onChange={handleEmailChange}\n value={state.email}\n inputMode=\"email\"\n error={formErrors.email}\n />\n ) }\n { needPhone && (\n <InputText\n label=\"Phone number\"\n onChange={handlePhoneChange}\n value={state.phone}\n inputMode=\"tel\"\n error={formErrors.phone}\n ref={phoneRef}\n />\n ) }\n <Checkbox\n label={lang('PaymentShippingSave')}\n subLabel={lang('PaymentShippingSaveInfo')}\n checked={Boolean(state.saveInfo)}\n onChange={handleSaveInfoChange}\n />\n </form>\n </div>\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types';\n\nimport { formatCurrency } from '../../util/formatCurrency';\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency?: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC<OwnProps> = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n const lang = useLang();\n\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: formatCurrency(amount, currency, lang.code),\n value,\n }))), [shippingOptions, currency, lang.code]);\n\n return (\n <div className=\"Shipping\">\n <form>\n <p>Select shipping method</p>\n <RadioGroup\n name=\"shipping-options\"\n options={options}\n onChange={handleShippingSelect}\n selected={state.shipping}\n />\n </form>\n </div>\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { LangCode, Price } from '../../types';\n\nimport { formatCurrency } from '../../util/formatCurrency';\nimport useLang from '../../hooks/useLang';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC<OwnProps> = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n const lang = useLang();\n\n const { photoUrl, title, text } = invoiceContent || {};\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n\n return (\n <div className=\"Checkout\">\n <div className=\"description has-image\">\n {photoUrl && <img src={photoUrl} alt=\"\" />}\n <div className=\"text\">\n <h5>{title}</h5>\n <p>{text}</p>\n </div>\n </div>\n <div className=\"price-info\">\n { prices && prices.map((item) => (\n renderPaymentItem(lang.code, item.label, item.amount, currency)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(lang.code, item.label, item.amount, currency)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem(lang.code, lang('Checkout.TotalAmount'), totalPrice, currency, true)\n ) }\n </div>\n <div className=\"invoice-info\">\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n </div>\n </div>\n );\n};\n\nfunction renderPaymentItem(\n langCode: LangCode | undefined, title: string, value: number, currency?: string, main = false,\n) {\n return (\n <div className={`price-info-item ${main ? 'price-info-item-main' : ''}`}>\n <div className=\"title\">\n { title }\n </div>\n <div className=\"value\">\n {formatCurrency(value, currency, langCode)}\n </div>\n </div>\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n <div className=\"checkout-info-item\">\n <i className={icon}> </i>\n <div className=\"info\">\n <div className=\"title\">\n { title }\n </div>\n <p className=\"data\">\n { data }\n </p>\n </div>\n </div>\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC<OwnProps> = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef<HTMLInputElement>(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n <InputText\n label=\"Expiry date\"\n ref={expiryInputRef}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n value={value}\n error={error}\n inputMode=\"numeric\"\n maxLength={MAX_FIELD_LENGTH}\n />\n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC<OwnProps> = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef<HTMLInputElement>(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState<number>(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n <div className=\"CardInput\">\n <span className=\"left-addon\">{cardIcon}</span>\n <InputText\n ref={cardNumberRef}\n label=\"Card number\"\n onChange={handleChange}\n value={value}\n inputMode=\"numeric\"\n className={cardType ? 'has-left-addon' : ''}\n error={error}\n maxLength={CARD_NUMBER_MAX_LENGTH}\n />\n </div>\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return <img src={mastercardIconPath} alt=\"\" />;\n case CardType.Visa:\n return <img src={visaIconPath} alt=\"\" />;\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC<OwnProps> = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n <div className=\"PaymentInfo\">\n <form>\n <h5>{lang('PaymentCardTitle')}</h5>\n <CardInput\n onChange={handleCardNumberChange}\n value={state.cardNumber}\n error={formErrors.cardNumber}\n />\n { needCardholderName && (\n <InputText\n label=\"Name on card\"\n onChange={handleCardholderChange}\n value={state.cardholder}\n inputMode=\"text\"\n error={formErrors.cardholder}\n />\n )}\n <section className=\"inline-inputs\">\n <ExpiryInput\n value={state.expiry}\n onChange={handleExpiryChange}\n error={formErrors.expiry}\n />\n <InputText\n label=\"CVV code\"\n onChange={handleCvvChange}\n value={state.cvv}\n inputMode=\"numeric\"\n maxLength={3}\n error={formErrors.cvv}\n />\n </section>\n { needCountry || needZip ? (\n <h5>{lang('PaymentBillingAddress')}</h5>\n ) : undefined }\n { needCountry && (\n <Select\n label=\"Country\"\n placeholder=\"Country\"\n onChange={handleCountryChange}\n value={state.billingCountry}\n hasArrow={Boolean(true)}\n id=\"billing-country\"\n error={formErrors.billingCountry}\n ref={selectCountryRef}\n >\n {\n countryList.map(({ name }) => (\n <option\n value={name}\n className=\"county-item\"\n >\n {name}\n </option>\n ))\n }\n </Select>\n ) }\n { needZip && (\n <InputText\n label=\"Post Code\"\n onChange={handleBillingPostCodeChange}\n value={state.billingZip}\n inputMode=\"text\"\n error={formErrors.billingZip}\n />\n )}\n { canSaveCredentials && (\n <Checkbox\n label={lang('PaymentCardSavePaymentInformation')}\n checked={state.saveCredentials}\n onChange={handleChangeSaveCredentials}\n />\n ) }\n </form>\n </div>\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\n\nimport { pick } from '../../util/iteratees';\nimport { formatCurrency } from '../../util/formatCurrency';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n};\n\ntype GlobalStateProps = Pick<GlobalState['payment'], 'step' | 'shippingOptions' |\n'savedInfo' | 'canSaveCredentials' | 'nativeProvider' | 'passwordMissing' | 'invoiceContent' |\n'error'>;\n\ntype DispatchProps = Pick<GlobalActions, 'validateRequestedInfo' | 'sendPaymentForm' | 'setPaymentStep'\n| 'sendCredentialsInfo' | 'clearPaymentError' >;\n\nconst Invoice: FC<OwnProps & StateProps & GlobalStateProps & DispatchProps> = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error) {\n setIsLoading(false);\n }\n }, [step, error]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.message,\n },\n });\n }\n }, [error, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n <Modal\n className=\"error\"\n isOpen={Boolean(error)}\n onClose={handleErrorModalClose}\n >\n <h4>{error.description || 'Error'}</h4>\n <p>{error.description || 'Error'}</p>\n <Button\n isText\n onClick={clearPaymentError}\n >\n {lang('OK')}\n </Button>\n </Modal>\n );\n }\n\n function renderModalContent(currentStep: PaymentStep) {\n switch (currentStep) {\n case PaymentStep.ShippingInfo:\n return (\n <ShippingInfo\n state={paymentState}\n dispatch={paymentDispatch}\n needAddress={Boolean(shippingAddressRequested)}\n needEmail={Boolean(emailRequested || emailToProvider)}\n needPhone={Boolean(phoneRequested || phoneToProvider)}\n needName={Boolean(nameRequested)}\n />\n );\n case PaymentStep.Shipping:\n return (\n <Shipping\n state={paymentState}\n dispatch={paymentDispatch}\n shippingOptions={shippingOptions || []}\n currency={currency}\n />\n );\n case PaymentStep.PaymentInfo:\n return (\n <PaymentInfo\n state={paymentState}\n dispatch={paymentDispatch}\n canSaveCredentials={Boolean(!passwordMissing && canSaveCredentials)}\n needCardholderName={needCardholderName}\n needCountry={needCountry}\n needZip={needZip}\n />\n );\n case PaymentStep.Checkout:\n return (\n <Checkout\n prices={prices}\n shippingPrices={paymentState.shipping && shippingOptions\n ? getShippingPrices(shippingOptions, paymentState.shipping)\n : undefined}\n totalPrice={totalPrice}\n invoiceContent={invoiceContent}\n checkoutInfo={checkoutInfo}\n currency={currency}\n />\n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return lang('Checkout.PayPrice', formatCurrency(totalPrice, currency, lang.code));\n default:\n return lang('Next');\n }\n }, [step, lang, currency, totalPrice]);\n\n if (isProviderError) {\n return (\n <Modal\n className=\"error\"\n isOpen={isOpen}\n onClose={onClose}\n >\n <p>\n Sorry, Telegram WebZ doesn't support payments with this provider yet. <br />\n Please use one of our mobile apps to do this.\n </p>\n <Button\n isText\n onClick={onClose}\n >\n {lang('OK')}\n </Button>\n </Modal>\n );\n }\n\n return (\n <Modal\n className=\"PaymentModal\"\n isOpen={isOpen}\n onClose={onClose}\n >\n <div className=\"header\" dir={lang.isRtl ? 'rtl' : undefined}>\n <Button\n className=\"close-button\"\n color=\"translucent\"\n round\n size=\"smaller\"\n onClick={onClose}\n ariaLabel=\"Close\"\n >\n <i className=\"icon-close\" />\n </Button>\n <h3>{modalHeader}</h3>\n </div>\n {step !== undefined ? (\n <Transition name=\"slide\" activeKey={step}>\n {() => (\n <div className=\"content custom-scroll\">\n {renderModalContent(step)}\n </div>\n )}\n </Transition>\n ) : (\n <div className=\"empty-content\">\n <Spinner color=\"gray\" />\n </div>\n )}\n <div className=\"footer\">\n <Button\n type=\"submit\"\n onClick={handleButtonClick}\n disabled={isLoading}\n isLoading={isLoading}\n >\n {buttonText}\n </Button>\n </div>\n {error && !error.field && renderError()}\n </Modal>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types';\n\nimport useLang from '../../hooks/useLang';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC<OwnProps & StateProps> = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n\n return (\n <Modal\n className=\"PaymentModal PaymentModal-receipt\"\n isOpen={isOpen}\n onClose={onClose}\n >\n <div>\n <div className=\"header\" dir={lang.isRtl ? 'rtl' : undefined}>\n <Button\n className=\"close-button\"\n color=\"translucent\"\n round\n size=\"smaller\"\n onClick={onClose}\n ariaLabel=\"Close\"\n >\n <i className=\"icon-close\" />\n </Button>\n <h3> {lang('PaymentReceipt')} </h3>\n </div>\n <div className=\"receipt-content custom-scroll\">\n <Checkout\n prices={prices}\n shippingPrices={shippingPrices}\n totalPrice={totalAmount}\n invoiceContent={{\n photoUrl,\n text,\n title,\n }}\n checkoutInfo={checkoutInfo}\n currency={currency}\n />\n </div>\n </div>\n </Modal>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst PasswordForm: FC<OwnProps> = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent<HTMLInputElement>) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n <form action=\"\" onSubmit={handleSubmit} autoComplete=\"off\">\n <div\n className={buildClassName('input-group password-input', password && 'touched', error && 'error')}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n <input\n ref={inputRef}\n className=\"form-control\"\n type={isPasswordVisible ? 'text' : 'password'}\n id=\"sign-in-password\"\n value={password || ''}\n autoComplete=\"current-password\"\n onChange={onPasswordChange}\n dir=\"auto\"\n />\n <label>{error || hint || placeholder}</label>\n <div\n className=\"toggle-password\"\n onClick={togglePasswordVisibility}\n role=\"button\"\n tabIndex={0}\n title=\"Toggle password visibility\"\n >\n <i className={isPasswordVisible ? 'icon-eye' : 'icon-eye-closed'} />\n </div>\n </div>\n {canSubmit && (\n <Button type=\"submit\" ripple isLoading={isLoading}>\n {submitLabel}\n </Button>\n )}\n </form>\n );\n};\n\nexport default memo(PasswordForm);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC<OwnProps> = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState<Record<string, any>>();\n const [peekMonkeyData, setPeekMonkeyData] = useState<Record<string, any>>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n <div id=\"monkey\" className={isBig ? 'big' : ''}>\n {!isFirstMonkeyLoaded && (\n <div className=\"monkey-preview\" />\n )}\n {closeMonkeyData && (\n <AnimatedSticker\n id=\"closeMonkey\"\n size={isBig ? STICKER_SIZE_TWO_FA : STICKER_SIZE}\n className={isPeekShown ? 'hidden' : 'shown'}\n animationData={closeMonkeyData}\n playSegment={SEGMENT_COVER_EYES}\n noLoop\n onLoad={handleFirstMonkeyLoad}\n />\n )}\n {peekMonkeyData && (\n <AnimatedSticker\n id=\"peekMonkey\"\n size={isBig ? STICKER_SIZE_TWO_FA : STICKER_SIZE}\n className={isPeekShown ? 'shown' : 'hidden'}\n animationData={peekMonkeyData}\n playSegment={isPasswordVisible ? SEGMENT_UNCOVER_EYE : SEGMENT_COVER_EYE}\n noLoop\n />\n )}\n </div>\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC<OwnProps> = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n <Modal\n isOpen={Boolean(file)}\n onClose={onClose}\n title=\"Drag to reposition\"\n className=\"CropModal\"\n hasCloseButton\n >\n {isCroppieReady ? (\n <div id=\"avatar-crop\" />\n ) : (\n <Loading />\n )}\n <Button\n className=\"confirm-button\"\n round\n color=\"primary\"\n onClick={handleCropClick}\n ariaLabel={lang('CropImage')}\n >\n <i className=\"icon-check\" />\n </Button>\n </Modal>\n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC<OwnProps> = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState<File | undefined>();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState<string | undefined>(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent<HTMLInputElement>) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n <div className=\"AvatarEditable\">\n <label\n className={labelClassName}\n role=\"button\"\n tabIndex={0}\n title={title}\n >\n <input\n type=\"file\"\n onChange={handleSelectFile}\n accept=\"image/png, image/jpeg\"\n />\n <i className=\"icon-camera-add\" />\n {croppedBlobUrl && <img src={croppedBlobUrl} alt=\"Avatar\" />}\n </label>\n <CropModal file={selectedFile} onClose={handleModalClose} onChange={handleAvatarCrop} />\n </div>\n );\n};\n\nexport default memo(AvatarEditable);\n"],"names":["createGhost","source","origin","ghost","document","createElement","classList","add","img","Image","src","HTMLVideoElement","poster","appendChild","MediaViewerOrigin","profileInfo","querySelector","cloneNode","isMessageImageFullyVisible","container","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","includes","parentElement","scrollTop","offsetHeight","applyStyles","element","styles","Object","assign","style","getNodes","message","containerSelector","mediaSelector","mediaEls","querySelectorAll","mediaEl","length","applyShape","firstChild","objectFit","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","size","chat","user","dir","renderText","formatMediaDateTime","date","mediaData","isVideo","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isDownloadStarted","downloadProgress","handleDownloadClick","useMediaDownload","getMessageMediaHash","undefined","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_SINGLE_COLUMN_LAYOUT","DropdownMenu","trigger","positionX","MenuItem","icon","Math","href","download","ProgressSpinner","progress","noCross","text","isHidden","isForVideo","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","height","clientHeight","REM","handleResize","throttle","window","addEventListener","removeEventListener","classNames","buildClassName","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","units","bytes","number","floor","log","toFixed","stopEvent","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","setTimeout","clearTimeout","body","remove","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","max","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","Boolean","useLayoutEffect","listener","listenerEnter","listenerExit","video","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","shouldRenderPlayButton","playButtonClassNames","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","preventDefault","wrapperStyle","width","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onDoubleClick","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","ZOOM_SAFE_AREA","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","getBoundingClientRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","transform","toString","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","ANIMATION_DURATION","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isFromSharedMedia","isFromSearch","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","isGhostAnimation","isFooterHidden","setIsFooterHidden","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","getMediaHash","isFull","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","previewMediaHash","blobUrlPreview","startsWith","fullMediaData","useMediaWithDownloadProgress","getMessageMediaFormat","localBlobUrl","bestImageData","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","getMessageFileName","dimensions","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","toggle","forceUpdate","useForceUpdate","mql","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","textParts","renderMessageText","hasFooter","fromImage","windowWidth","windowSize","availableWidth","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","topOffsetRem","matches","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","uncovered","realWidth","realHeight","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","requestAnimationFrame","clearShape","contains","removeChild","animateOpening","toImage","getElementById","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","existingGhost","getElementsByClassName","transition","transformOrigin","opacity","animateClosing","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","handlePan","handleToggleFooterVisibility","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","useHistoryBack","ShowTransition","isRtl","Transition","activeKey","name","chats","byId","chatsById","listIds","orderedPinnedIds","currentUserId","pinnedIds","active","activeListIds","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","priorityIds","unique","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","containerRef","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","hasErrorKey","dialogs","dismissDialog","acceptInviteConfirmation","dialog","invite","hash","title","participantsCount","isChannel","participantsText","joinText","isText","renderInvite","getReadableErrorText","notifications","dismissNotification","localId","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","prevIsOpen","isTimeInputFocused","markTimeInputAsFocused","unmarkTimeInputAsFocused","useFlag","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","getTime","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","d","dateCopy","role","tabIndex","handleDateSelect","inputMode","onFocus","onBlur","formatDateToString","code","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","reportMessages","selectedReason","setSelectedReason","description","setDescription","handleReport","reason","handleSelectReason","handleDescriptionChange","REPORT_OPTIONS","label","RadioGroup","options","selected","messageListType","canDelete","canReport","selectCanReportSelectedMessages","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canReportMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isReportModalOpen","openReportModal","closeReportModal","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","contextActions","useChatContextActions","handleDelete","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","theme","selectTheme","isLoading","searchChatId","CURRENT_TYPE","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","formatMonthAndYear","WebLink","onMessageClick","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","onPlay","TABS","GlobalSearchContent","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","INITIAL_STATE","currentPassword","password","hint","email","twoFaReducer","state","action","payload","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","onScreenSelect","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","renderHeaderContent","confirmIsDestructive","currentUser","loadProfilePhotos","profileId","ProfileInfo","forceShowSelf","ChatExtra","LINK_PREFIX","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","ERROR_FIRST_NAME_MISSING","ERROR_BIO_TOO_LONG","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","isUsernameError","isSaveButtonShown","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","FloatingActionButton","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","notifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showDialog","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","data","userFolders","folder","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","onBack","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","selectedChatIds","includedChatIds","selectedChatTypes","includedChatTypes","selectChatFilters","excludedChatIds","excludedChatTypes","folderId","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","mode","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","INCLUDED_CHAT_TYPES","typeKey","EXCLUDED_CHAT_TYPES","inactive","renderChatType","event","isTouched","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","find","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","archivedPinnedIds","chatFilter","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","includeFilters","excludeFilters","handleSelectedChatTypesChange","newFilters","forEach","shownScreen","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","stickers","firstSticker","isAnimated","STICKER_SIZE_GENERAL_SETTINGS","StickerButton","sticker","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","setAttribute","handleStickerSetClick","stickerSets","installedDate","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","slug","localMediaHash","previewBlobUrl","thumbRef","useCanvasBlur","thumbnail","dataUri","shouldRenderThumb","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","save","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","selectorToPreventScroll","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","hasWebNotifications","hasPushNotifications","notificationSoundVolume","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","volume","hasPassword","isSensitiveEnabled","canChangeSensitive","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","phoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","loadContentSettings","updateContentSettings","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","appName","ip","sessions","handler","dateActive","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","formatPhoneNumberWithCode","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","Picker","itemIds","filterPlaceholder","searchInputId","TWO_FA_SCREENS","FOLDERS_SCREENS","PRIVACY_SCREENS","PRIVACY_PHONE_NUMBER_SCREENS","PRIVACY_LAST_SEEN_PHONE_SCREENS","PRIVACY_PROFILE_PHOTO_SCREENS","PRIVACY_FORWARDING_SCREENS","PRIVACY_GROUP_CHATS_SCREENS","foldersState","foldersDispatch","shouldSkipTransition","twoFaState","twoFaDispatch","useReducer","handleSaveFilter","renderCurrentSection","isScreenActive","isFrom","currentKey","privacyAllowScreens","isTwoFaScreen","isFoldersScreen","isPrivacyScreen","values","SettingsGeneralBackgroundColor","renderCurrentSectionContent","LAYERS_ANIMATION_NAME","contactIds","serverTimeOffset","resultIds","sortUserIds","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","isUserBot","canBeInvitedToGroup","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","chatTitleEmptyError","channelTitleEmptyError","chatTooManyUsersError","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","isStepActive","ChatList","folderType","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","Left","ArrowLeft","Right","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","abs","reportMessageIds","scheduledMaxDate","getDayStartAt","stickerSetShortName","selectStickerSet","stickerSetId","selectStickerSetByShortName","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","canDeleteChat","getCanDeleteChat","canStartBot","canRestartBot","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","handleStartBot","command","handleRestartBot","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","setTooltipItemVisible","selector","first","isFullyVisible","position","fastSmoothScroll","useKeyboardNavigation","shouldRemoveSelectionOnReset","noArrowNavigation","shouldSelectOnTab","selectedItemIndex","setSelectedItemIndex","getSelectedIndex","newIndex","cycleRestrict","handleArrowKey","handleItemSelect","item","onUp","onDown","onLeft","onRight","onTab","onInsertUserName","filteredUsers","handleUserSelect","forceFocus","handleSelectMention","member","selectedMentionIndex","prevChatMembers","renderedChatMembers","attachments","caption","isReady","groupChatMembers","recentEmojis","baseEmojiKeywords","emojiKeywords","addRecentEmoji","onCaptionUpdate","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","isAttachmentModalInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","emoji","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","noAnimate","onUnfaveClick","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","shouldPlay","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","fullClassName","buttonClassName","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","useMouseInside","fastRaf","recentEmojisRef","renderContent","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","withAvatar","botCommand","bot","botCommands","handleSendCommand","botId","selectedCommandIndex","prevCommands","renderedCommands","chatBotCommand","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","handleSelectEmoji","selectedIndex","setItemVisible","thumbUrl","thumbnailDataUrl","decoding","isForGallery","inlineResult","webThumbnail","STICKER_SIZE_INLINE_BOT_RESULT","isGallery","inlineBotResults","switchPm","loadMore","startBot","onSelectResult","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","GROUP_TITLE_EMPTY","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","handleClickDiscussion","handleClickPermissions","handleClickAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","handleAddExceptionClick","handleExceptionMemberClick","promotedByUserId","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","CHANNEL_TITLE_EMPTY","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","handleLinkGroupSessions","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","linkedGroup","renderLinkGroupHeader","hasPrivateLink","renderLinkGroupConfirmText","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","getMemberStatus","promotedByUser","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","reducer","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","currency","handleShippingSelect","amount","formatCurrency","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","field","handleErrorModalClose","PaymentStep","shippingOption","getShippingPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","buttonText","currentStep","renderModalContent","renderError","optionId","receipt","info","totalAmount","credentialsTitle","fullAddress","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","path","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL"],"sourceRoot":""} |