{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/components/middle/composer/MentionMenu.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","ProfileAvatar","opacity","source","shouldAppendProfileInfo","createElement","img","Image","src","HTMLVideoElement","poster","profileInfo","cloneNode","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isVideoDownloadAllowed","setIsVideoDownloadAllowed","useState","videoMediaHash","getMessageMediaHash","undefined","videoBlobUrl","downloadProgress","useMediaWithDownloadProgress","useEffect","download","handleVideoDownloadClick","e","stopPropagation","isAllowed","lang","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","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","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","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","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","preventDefault","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","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","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","currentUserId","activeListIds","active","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","modalHeader","InputText","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","errors","dismissError","title","getReadableErrorText","isText","notifications","dismissNotification","Notification","onDismiss","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","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedIds","selectPinnedIds","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","withUsername","contextActions","useChatContextActions","handleDelete","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","handleClick","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","onSelect","suggestions","match","formatDateToString","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","getTranslation","unique","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","description","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","ConfirmDialog","confirmLabel","confirmHandler","confirmIsDestructive","currentUser","onScreenSelect","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","orderedPinnedIds","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","isAnimated","localMediaHash","stickerSelector","thumbnail","dataUri","previewBlobUrl","shouldPlay","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","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","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","RadioGroup","selected","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","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","useBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isBackgroundBlurred","customBackground","loadedWallpapers","loadWallpapers","uploadWallpaper","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","patternColor","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","data","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","containerRef","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationsSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentIsShowPreviews","isShowPreviews","handleContactNotificationChange","hasPassword","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","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","hash","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","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","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","searchMessagesByDate","focusedIndex","setFocusedIndex","visualViewport","mainEl","activeElement","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleJumpToDate","timestamp","valueOf","handleUp","newFocusIndex","handleDown","SearchInput","isFullyVisible","viewportY1","viewportY2","y1","y2","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","visibleIndexes","allElements","selectorOrElements","margin","isDense","shouldContainBottom","isFound","findInViewport","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","onCaptionUpdate","onClear","prevAttachments","renderingAttachments","isMentionMenuOpen","mentionFilter","closeMentionMenu","insertMention","mentionFilteredMembers","useMentionMenu","EDITABLE_INPUT_MODAL_ID","sendAttachments","areAllPhotos","every","mimeType","areAllVideos","isQuick","quick","renderHeader","attachment","File","filename","extension","getFileExtension","previewData","MessageInput","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","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","colons","IS_EMOJI_SUPPORTED","loading","category","allEmojis","onEmojiSelect","useOnIntersect","emojisPerRow","ceil","emojis","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","recentEmojis","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","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","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","allowedAttachmentOptions","addRecentEmoji","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","CONTENT_TYPES_FOR_QUICK_UPLOAD","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","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","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","lastMessage","maxId","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","file","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","isCreator","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","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","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","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","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","substr","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","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","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","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","onKeyDown","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","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","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","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","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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ACpB61C,eAAgBK,GAAkB73C,EAAO2B,SACzCi2C,WAAY,IACP93C,EAAM83C,WACTX,iBAAapiE,IAGnB,IAAK,iBACH,MAAO,IACFirB,EACHo3C,SAAUl3C,EAAO2B,QACjBi2C,WAAY,IACP93C,EAAM83C,WACTV,cAAUriE,IAGhB,IAAK,iBACH,MAAO,IACFirB,EACHlF,SAAUoF,EAAO2B,QACjBi2C,WAAY,IACP93C,EAAM83C,WACTh9C,cAAU/lB,IAGhB,IAAK,cACH,MAAO,IACFirB,EACHqC,MAAOnC,EAAO2B,QACdi2C,WAAY,IACP93C,EAAM83C,WACTz1C,WAAOttB,IAGb,IAAK,cACH,MAAO,IACFirB,EACHq3C,MAAOn3C,EAAO2B,QACdi2C,WAAY,IACP93C,EAAM83C,WACTT,WAAOtiE,IAGb,IAAK,iBACH,MAAO,IAAKirB,EAAOs3C,SAAUp3C,EAAO2B,SACtC,IAAK,mBACH,MAAO,IACF7B,EACH+2C,WAAY72C,EAAO2B,QACnBi2C,WAAY,IACP93C,EAAM83C,WACTf,gBAAYhiE,IAGlB,IAAK,mBACH,MAAO,IACFirB,EACHu3C,WAAYr3C,EAAO2B,QACnBi2C,WAAY,IACP93C,EAAM83C,WACTP,gBAAYxiE,IAGlB,IAAK,mBACH,MAAO,IACFirB,EACHw3C,OAAQt3C,EAAO2B,QACfi2C,WAAY,IACP93C,EAAM83C,WACTN,YAAQziE,IAGd,IAAK,gBACH,MAAO,IACFirB,EACHy3C,IAAKv3C,EAAO2B,QACZi2C,WAAY,IACP93C,EAAM83C,WACTL,SAAK1iE,IAGX,IAAK,uBACH,MAAO,IACFirB,EACH03C,eAAgBx3C,EAAO2B,QACvBi2C,WAAY,IACP93C,EAAM83C,WACTJ,oBAAgB3iE,IAGtB,IAAK,mBACH,MAAO,IACFirB,EACH23C,WAAYz3C,EAAO2B,QACnBi2C,WAAY,IACP93C,EAAM83C,WACTH,gBAAY5iE,IAGlB,IAAK,iBACH,MAAO,IAAKirB,EAAO43C,SAAU13C,EAAO2B,SACtC,IAAK,wBACH,MAAO,IAAK7B,EAAO63C,gBAAiB33C,EAAO2B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","file":"2.13a0dc5a3839d1711416.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.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 document.body.removeChild(ghost);\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(\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 ghost = createGhost(bestImageData || toImage, origin === MediaViewerOrigin.ProfileAvatar);\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 requestAnimationFrame(() => {\n document.body.classList.add('ghost-animating');\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n document.body.removeChild(ghost);\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, shouldAppendProfileInfo = false) {\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 (shouldAppendProfileInfo) {\n ghost.classList.add('ProfileInfo');\n const profileInfo = document.querySelector('#RightColumn .ProfileInfo .info');\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('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.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) {\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.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(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(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.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;\n\nconst SenderInfo: FC = ({\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 useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? 'Profile photo' : formatMediaDateTime(message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\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, {\n FC, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport download from '../../util/download';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useLang from '../../hooks/useLang';\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 = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const [isVideoDownloadAllowed, setIsVideoDownloadAllowed] = useState(false);\n const videoMediaHash = isVideo && message ? getMessageMediaHash(message, 'download') : undefined;\n const {\n mediaData: videoBlobUrl, downloadProgress,\n } = useMediaWithDownloadProgress(videoMediaHash, !isVideoDownloadAllowed);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isVideoDownloadAllowed && videoBlobUrl) {\n download(videoBlobUrl, fileName!);\n setIsVideoDownloadAllowed(false);\n }\n }, [fileName, videoBlobUrl, isVideoDownloadAllowed]);\n\n // Cancel download on slide change\n useEffect(() => {\n setIsVideoDownloadAllowed(false);\n }, [videoMediaHash]);\n\n const handleVideoDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsVideoDownloadAllowed((isAllowed) => !isAllowed);\n }, []);\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isVideoDownloadAllowed && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\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) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\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_MOBILE_SCREEN } 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) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\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_MOBILE_SCREEN) {\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
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\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
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, 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';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\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(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\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 | 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) => {\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) => {\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) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\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 \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n \n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n \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_MOBILE_SCREEN } 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 = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(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) => {\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
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\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 = ({\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(false);\n const [dragData, setDragData] = useState({\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(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(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) => {\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) => {\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 \n \n {children}\n \n \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,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\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 getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\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';\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;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\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 // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner\n ? `avatar${avatarOwner.id}-${profilePhotoIndex}.jpg`\n : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, 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 if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? '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 avatarOwner && 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 photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\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(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(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!, 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,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\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 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('.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) {\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 {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(fullMediaData || blobUrlPreview, calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false))}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n
\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(photoDimensions!, hasFooter),\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: IDimensions) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \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 | 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_MOBILE_SCREEN } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\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;\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\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 = ({\n chatsById,\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(null);\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_MOBILE_SCREEN) {\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 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(chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, currentUserId ? [currentUserId] : undefined);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n const lang = useLang();\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\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 } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\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';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\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, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\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 = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\n\nconst CalendarModal: FC = ({\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 now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\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 (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\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) => {\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) => {\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
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {formatMonthAndYear(selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n 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 {gridDate}\n )}\n
\n ))}\n
\n \n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \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();\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(date: Date) {\n const day = formatHumanDate(date, true);\n\n return `Send ${day === 'Today' ? day : `on ${day}`} at ${formatTime(date)}`;\n}\n\nexport default memo(CalendarModal);\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;\n\nconst DeleteMessageModal: FC = ({\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 \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete it just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete it for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\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';\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;\n\nconst PinMessageModal: FC = ({\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 renderModalHeader() {\n return (\n
\n

{lang('PinMessageAlertTitle')}

\n
\n );\n }\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 \n {renderMessage()}\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\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';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { selectPinnedIds } from '../../modules/selectors';\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 onClose: () => void;\n onUnpin: () => void;\n};\n\ntype StateProps = {\n pinnedMessagesCount: number;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n function renderModalHeader() {\n return (\n
\n

{lang('UnpinAllMessages')}

\n
\n );\n }\n\n function renderMessage() {\n return

Do you want to unpin all {pinnedMessagesCount} messages in this chat?

;\n }\n\n return (\n \n {renderMessage()}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const pinnedIds = chatId ? selectPinnedIds(global, chatId) : [];\n\n return {\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n)(UnpinAllMessagesModal));\n","import React, { FC, useCallback, memo } 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';\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;\n\nconst DeleteSelectedMessagesModal: FC = ({\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 handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, 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 exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\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)(DeleteSelectedMessagesModal));\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 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 DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\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};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, 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
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import React, { FC, memo } 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 } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors';\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};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n handleDelete: openDeleteModal,\n });\n\n if (!chat) {\n return undefined;\n }\n\n return (\n onClick(chatId)}\n contextActions={contextActions}\n >\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\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\n return {\n chat,\n privateChatUser,\n isPinned,\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;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\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(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, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\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
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\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_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\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 from '../../../hooks/useLang';\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;\n\nconst ChatMessage: FC = ({\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\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n useLang();\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(message, mediaBlobUrl || mediaThumbnail, searchQuery)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(message: ApiMessage, blobUrl?: string, searchQuery?: string) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\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 ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\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 = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\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_MOBILE_SCREEN } 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';\nimport { getTranslation } from '../../../util/langProvider';\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 }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\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 = ({\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 [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(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 });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\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(getTranslation('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [searchQuery, localContactIds, currentUserId, localChatIds, localUserIds, chatsById, usersById]);\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]), 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(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 const lang = useLang();\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\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 ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && }\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n {shouldShowMoreLocal ? 'Show less' : 'Show more'}\n )}\n Contacts and Chats\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n {shouldShowMoreGlobal ? 'Show less' : 'Show more'}\n )}\n Global Search\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\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 { currentUserId, messages, lastSyncTime } = 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';\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 }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\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 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(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && }\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nexport type StateProps = {\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\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 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 { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\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
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((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
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nexport function getSenderName(\n message: ApiMessage, chatsById: Record, usersById: Record,\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(sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `You → ${getChatTitle(chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(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';\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;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\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 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 \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\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;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\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 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 \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\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;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\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 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 \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && }\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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,\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';\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 onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\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 = ({\n searchQuery,\n searchDate,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\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 return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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 { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\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 = (\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, useCallback, useMemo, memo, 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_MOBILE_SCREEN } 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};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\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 \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('EditProfile')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('EnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n Delete Folder\n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('EditProfile')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('GeneralSettings')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\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 = ({\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) => {\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 \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 } 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';\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;\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 = ({\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(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 // 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) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\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 const lang = useLang();\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('BioAbout'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n This link opens a chat with you:
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\n}) => {\n const [animationData, setAnimationData] = useState>();\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 showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\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(chatsById, usersById, folder, chatIds, lang),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

{lang('FilterRecommended')}

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showError']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\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 = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\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 onReset: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\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 = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n onReset,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\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 function handleChange(event: React.ChangeEvent) {\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 \n {lang(chatType.title)}\n \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 \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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 = ({\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(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) => {\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 \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

{`Sorry, you can't add more than ${MAX_CHATS} chats.`}

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

{lang('FilterChatTypes')}

\n {chatTypes.map(renderChatType)}\n
\n

{lang('FilterChats')}

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\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';\n\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';\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};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\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 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(chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, 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 = {};\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 if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\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 { FoldersState, FolderEditDispatch } 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 state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\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(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\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';\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 = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\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
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\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 = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(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
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\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 = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(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
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const { isAnimated } = sticker;\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\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 = ({\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 firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \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_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';\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 onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: 'Send by Enter', subLabel: 'New line by Shift + Enter' },\n { value: 'ctrl-enter', label: `Send by ${IS_MAC_OS ? 'Cmd' : 'Ctrl'} + Enter`, subLabel: 'New line by Enter' },\n] : undefined;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n onScreenSelect,\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(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\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('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const lang = useLang();\n\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

Choose the desired animations amount.

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey,\n [\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: 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,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { 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 useBlur from '../../../hooks/useBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst ANIMATION_DURATION = 300;\n\nconst WallpaperTile: FC = ({\n wallpaper,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbDataUri = useBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n ANIMATION_DURATION,\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\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, 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
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor } from '../../../util/colors';\nimport useLang from '../../../hooks/useLang';\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 onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n customBackground?: string;\n isBackgroundBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n onScreenSelect,\n customBackground,\n isBackgroundBlurred,\n loadedWallpapers,\n setSettingOption,\n loadWallpapers,\n uploadWallpaper,\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 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 setSettingOption({ customBackground: undefined, patternColor: DEFAULT_PATTERN_COLOR });\n }, [setSettingOption]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setSettingOption({ customBackground: 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 setSettingOption({ patternColor: getPatternColor(color) });\n });\n }\n }, [loadedWallpapers, setSettingOption]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setSettingOption({ isBackgroundBlurred: e.target.checked });\n }, [setSettingOption]);\n\n const lang = useLang();\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { isBackgroundBlurred, customBackground } = global.settings.byKey;\n const { loadedWallpapers } = global.settings;\n\n return {\n customBackground,\n isBackgroundBlurred,\n loadedWallpapers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadWallpapers', 'uploadWallpaper',\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 } 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 useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n customBackground?: string;\n};\n\ntype DispatchProps = Pick;\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 = ({\n customBackground,\n setSettingOption,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(customBackground));\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();\n const colorCtxRef = useRef();\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 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 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 setSettingOption({\n customBackground: color,\n patternColor: getPatternColor(rgb),\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setSettingOption]);\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) => {\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) => {\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) => {\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 return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(customBackground?: string) {\n return customBackground && customBackground.startsWith('#')\n ? rgb2hsb(hex2rgb(customBackground.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,\n rectsRef: RefObject,\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(\n (global): StateProps => {\n return {\n customBackground: global.settings.byKey.customBackground,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setSettingOption']),\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';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\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};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationsSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationsSettings();\n }, [loadNotificationsSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentIsShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, isShowPreviews: currentIsShowPreviews }),\n ...(setting === 'showPreviews' && { isShowPreviews: 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) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n return (\n
\n
\n

{lang('AutodownloadPrivateChats')}

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((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 };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationsSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\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';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\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
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n {getVisibilityValue(visibilityPrivacyLastSeen)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n {getVisibilityValue(visibilityPrivacyForwarding)}\n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n {getVisibilityValue(visibilityPrivacyGroupChats)}\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\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',\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 } 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';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(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 setLanguage(langCode, () => {\n unmarkIsLoading();\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n }));\n}\n\nexport default memo(withGlobal(\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';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\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 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
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\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 function renderCurrentSession(session: ApiSession) {\n return (\n
\n

{lang('AuthSessions.CurrentSession')}

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

Other Sessions

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n\n {otherSessions && renderOtherSessions(otherSessions)}\n\n {otherSessions && (\n \n )};\n
\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(\n (global): StateProps => ({ activeSessions: global.activeSessions }),\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';\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';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\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 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',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\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';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((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 useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\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};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\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 return (\n
\n
\n \n
\n\n
\n \n
\n
\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';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((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';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\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) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\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 return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((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';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((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';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\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};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\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 const handleInputChange = (e: React.ChangeEvent) => {\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
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((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 dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\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 \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\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, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n onSelectedIdsChange: (ids: number[]) => 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_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\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 onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\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';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n onScreenSelect,\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('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(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(chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, 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 const lang = useLang();\n\n return (\n
\n \n\n \n \n \n
\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(\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';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\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\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n currentScreen,\n onScreenSelect,\n onReset,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\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() {\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\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 \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 \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 \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\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 \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection() {\n return (\n <>\n \n {renderCurrentSectionContent()}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \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_MOBILE_SCREEN } 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';\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};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\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 handleClick = useCallback(\n (id: number) => {\n openChat({ id });\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);\n }, [filter, usersById, contactIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_MOBILE_SCREEN}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\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, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: 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;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\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 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 ]),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, searchQuery, localUserIds, globalUserIds, usersById, chatsById, selectedMemberIds, currentUserId,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds, setGlobalSearchQuery, onNextStep]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\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';\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 memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\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) => {\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) => {\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
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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 { IS_MOBILE_SCREEN } 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 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 = ({\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {() => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ onReset }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\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\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\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 { getMessageMediaHash, getMessagePhoto, getMessageText } 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 const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'Copy Media',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).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, canImageBeCopied),\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: 'CopyMessageLink',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'Copy Selected Text';\n }\n\n if (canImageBeCopied) {\n return 'Copy Text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } 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 { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\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 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 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 ANIMATION_DURATION = 200;\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\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 onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\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 \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && {lang('MessageScheduleEditTime')}}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && {lang('AddToFavorites')}}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, 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 PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\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 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;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\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 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 loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = 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 closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(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 loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\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
\n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\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 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 'loadMessageLink',\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 } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\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 onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\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 toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {`${stickerSet.installedDate ? 'Remove' : 'Add'} ${stickerSet.count} stickers`}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\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_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } 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;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: 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 = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\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}) => {\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 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 \n
\n \n {IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate ? 'Delete' : (canDeleteChat ? 'Delete and Leave' : 'Leave'))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\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 useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\nimport CalendarModal from '../common/CalendarModal';\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};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n searchMessagesByDate,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\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('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('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('#MobileSearch input')!;\n searchInput.blur();\n }, [isCalendarOpen]);\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 handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeCalendar();\n }, [closeCalendar, searchMessagesByDate]);\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 const lang = useLang();\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n \n \n \n )}\n
\n \n \n \n \n \n \n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\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 };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'searchMessagesByDate',\n ]),\n)(MobileSearchFooter));\n","function isFullyVisible(container: HTMLElement, element: HTMLElement) {\n const viewportY1 = container.scrollTop;\n const viewportY2 = viewportY1 + container.offsetHeight;\n const y1 = element.offsetTop;\n const y2 = y1 + element.offsetHeight;\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionMenu.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\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\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionMenu: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\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((e: KeyboardEvent) => {\n if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionMenu custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => (\n handleUserSelect(userId)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionMenu);\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n) {\n const viewportY1 = container.scrollTop;\n const viewportY2 = viewportY1 + container.offsetHeight;\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(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.offsetTop;\n const y2 = y1 + element.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","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\nimport { EDITABLE_INPUT_MODAL_ID } from '../../../config';\n\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionMenu from './hooks/useMentionMenu';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionMenu from './MentionMenu';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n canSuggestMembers?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onClear: () => void;\n};\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n onCaptionUpdate,\n onSend,\n onClear,\n}) => {\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n\n const {\n isMentionMenuOpen, mentionFilter,\n closeMentionMenu, insertMention,\n mentionFilteredMembers,\n } = useMentionMenu(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n currentUserId,\n usersById,\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 lang = useLang();\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 = renderingAttachments.length === 1 ? 'Send Photo' : `Send ${renderingAttachments.length} Photos`;\n } else if (areAllVideos) {\n title = renderingAttachments.length === 1 ? 'Send Video' : `Send ${renderingAttachments.length} Videos`;\n } else {\n title = renderingAttachments.length === 1 ? 'Send File' : `Send ${renderingAttachments.length} Files`;\n }\n\n const isQuick = renderingAttachments.every((a) => a.quick);\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n
\n
\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 = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const focusInput = useCallback((ref: RefObject) => {\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) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return 'Please enter the question';\n }\n\n return undefined;\n }, [hasErrors, 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 'Please enter at least two options';\n }\n return undefined;\n }, [hasErrors, options]);\n\n const lang = useLang();\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\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

\n Please choose the correct answer\n

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

Options

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

Solution

\n setSolution(e.currentTarget.innerHTML)}\n />\n
\n Users will see this comment after choosing a wrong answer, good for educational purposes.\n
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\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 onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, onClick }) => {\n const handleClick = useCallback(() => {\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED ? emoji.native : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } 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 = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(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_MOBILE_SCREEN\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 \n

{lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\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 \n );\n })}\n
\n \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 { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\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;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\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;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\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, !IS_MOBILE_SCREEN);\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 selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n
\n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n
\n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\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(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_MOBILE_SCREEN\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 \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \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 { 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;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\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 = ({\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(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(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);\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 selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n
\n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\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 useBlur from '../../hooks/useBlur';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\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 thumbDataUri = useBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const previewData = previewBlobUrl || thumbDataUri;\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(previewData || 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 className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n );\n\n return (\n \n {previewData && !shouldRenderVideo && (\n \n )}\n {shouldRenderVideo && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \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 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;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\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(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
\n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\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 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 = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \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
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_MOBILE_SCREEN, 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) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\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_MOBILE_SCREEN) {\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 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 \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(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 = ({\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 CONTENT_TYPES_FOR_QUICK_UPLOAD,\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 \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 Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n {lang('AttachmentMenu.PhotoOrVideo')}\n Document\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\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 './EmojiTooltip.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;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst EmojiTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(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 'EmojiTooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(EmojiTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\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 = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, { FC, useMemo, memo } 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 { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\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};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\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(senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n
\n );\n };\n\n return (\n \n

\n {!query ? (\n 'Search messages'\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length)) || 'No'} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\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';\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;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay, loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\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
\n
\n
\n

{set.title}

\n

{set.count} stickers

\n
\n \n {isAdded ? 'Added' : 'Add'}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\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 function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\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';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\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(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 function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n\n
\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';\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;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\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(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\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 \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n {getPercentage(answerVote.votersCount, totalVoters)}%\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\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';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\n}) => {\n if (!message || !chat) {\n return ;\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
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\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 { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\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};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\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) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\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 if (chat.lastMessage) {\n deleteHistory({\n chatId: chat.id,\n maxId: chat.lastMessage!.id,\n shouldDeleteForAll: false,\n });\n }\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, chat.lastMessage, 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
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n\n return { user, chat, progress };\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';\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};\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;\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 = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\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();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\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) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\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 deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false });\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, chat.lastMessage,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n \n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\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\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', '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';\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};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\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 = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\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) => {\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 ApiChatBannedRights]),\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
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n \n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n}) => {\n const lang = useLang();\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
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\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}) => {\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();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\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) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\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\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
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n \n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\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};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\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(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\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
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

{lang(`${langPrefix1}PrivateLinkHelp`)}

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\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';\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};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\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 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
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\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
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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';\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};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\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) => {\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 ApiChatBannedRights]),\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: keyof ApiChatBannedRights) => {\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
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\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';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\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};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const lang = useLang();\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
\n
\n
\n \n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n \n
\n\n
\n

\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

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\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
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

Admins

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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';\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};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n}) => {\n const [permissions, setPermissions] = useState({});\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 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) => {\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
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\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';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\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 };\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';\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};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\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 };\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};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\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 = {\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;\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;\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 = (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, 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\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (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
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\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 = ({\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(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(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
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\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/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\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 = ({\n state,\n shippingOptions,\n currency,\n dispatch,\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: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: 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 = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\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
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\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 = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(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 \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","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","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 = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(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
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\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 = ({\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(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
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\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';\nimport { ApiError } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } from '../../modules/helpers/payments';\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 globalErrors?: ApiError[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\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 globalErrors,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, 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 \n

{error.description || 'Error'}

\n {error.description || 'Error'}\n \n OK\n \n
\n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\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 `Pay ${currencySign}${(totalPrice / 100).toFixed(2)}`;\n default:\n return 'Next Step';\n }\n }, [step, totalPrice, currencySign]);\n\n if (isProviderError) {\n return (\n \n Sorry, Telegram T doesn't support payments with this provider yet.\n Please use one of our mobile apps to do this.\n \n OK\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{ modalHeader }

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\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 globalErrors: global.errors,\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/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\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 = ({\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 currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\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: mapedPrices,\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 { 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","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","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 = ({ 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 \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \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 = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\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
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\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_MOBILE_SCREEN } 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_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\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
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\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_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\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_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\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(null);\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) {\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) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n
\n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""}