telegram-tt/dist/739.5f4ff51c7729260f57ab.js.map
Alexander Zinchuk 27ebe2309a [Build]
2021-12-25 12:42:29 +01:00

1 line
50 KiB
Plaintext

{"version":3,"file":"739.5f4ff51c7729260f57ab.js","mappings":"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","sources":["webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/components/common/Avatar.tsx","webpack://telegram-t/./src/components/ui/ConfirmDialog.tsx","webpack://telegram-t/./src/components/ui/InfiniteScroll.tsx","webpack://telegram-t/./src/components/ui/Modal.tsx","webpack://telegram-t/./src/util/trapFocus.ts","webpack://telegram-t/./src/components/ui/Portal.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts","webpack://telegram-t/./src/hooks/useCurrentOrPrev.ts","webpack://telegram-t/./src/hooks/useInfiniteScroll.ts","webpack://telegram-t/./src/hooks/useMedia.ts","webpack://telegram-t/./src/util/clipboard.ts","webpack://telegram-t/./src/util/forceReflow.ts","webpack://telegram-t/./src/util/resetScroll.ts","webpack://telegram-t/./src/util/safePlay.ts"],"sourcesContent":["import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n color?: [number, number, number];\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise<RLottieClass>;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise<RLottieClass>;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC<OwnProps> = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n color,\n}) => {\n const [animation, setAnimation] = useState<RLottieInstance>();\n // eslint-disable-next-line no-null/no-null\n const container = useRef<HTMLDivElement>(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n const isFirstRender = useRef(true);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n color,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [color, animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n if (!animation) return;\n\n animation.setColor(color);\n }, [color, animation]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useEffect(() => {\n if (animation) {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n } else {\n animation.changeData(animationData);\n playAnimation();\n }\n }\n }, [playAnimation, animation, animationData]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n <div\n ref={container}\n className={fullClassName}\n // @ts-ignore\n style={style}\n />\n );\n};\n\nexport default memo(AnimatedSticker);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMediaFormat, ApiUser, ApiUserStatus,\n} from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getUserColorKey,\n getUserFullName,\n isUserId,\n isChatWithRepliesBot,\n isDeletedUser,\n isUserOnline,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n chat?: ApiChat;\n user?: ApiUser;\n userStatus?: ApiUserStatus;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent<HTMLDivElement, MouseEvent>, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC<OwnProps> = ({\n className,\n size = 'large',\n chat,\n user,\n userStatus,\n text,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n const isReplies = user && isChatWithRepliesBot(user.id);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n }\n }\n\n const blobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const hasBlobUrl = Boolean(blobUrl);\n const { transitionClassNames } = useShowTransition(hasBlobUrl, undefined, hasBlobUrl, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = <i className=\"icon-avatar-saved-messages\" />;\n } else if (isDeleted) {\n content = <i className=\"icon-avatar-deleted-account\" />;\n } else if (isReplies) {\n content = <i className=\"icon-reply-filled\" />;\n } else if (blobUrl) {\n content = (\n <img src={blobUrl} className={buildClassName('avatar-media', transitionClassNames)} alt=\"\" decoding=\"async\" />\n );\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isUserId(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && userStatus && isUserOnline(user, userStatus);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n isReplies && 'replies-bot-account',\n isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !blobUrl) && 'no-photo',\n );\n\n const hasImage = Boolean(isSavedMessages || blobUrl);\n const handleClick = useCallback((e: ReactMouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onClick) {\n onClick(e, hasImage);\n }\n }, [onClick, hasImage]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n <div className={fullClassName} onClick={handleClick} data-test-sender-id={IS_TEST ? senderId : undefined}>\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n </div>\n );\n};\n\nexport default memo(Avatar);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n children?: any;\n};\n\nconst ConfirmDialog: FC<OwnProps> = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n children,\n}) => {\n const lang = useLang();\n\n return (\n <Modal\n className=\"confirm\"\n title={title}\n header={header}\n isOpen={isOpen}\n onClose={onClose}\n onCloseAnimationEnd={onCloseAnimationEnd}\n onEnter={confirmHandler}\n >\n {text && text.split('\\\\n').map((textPart) => (\n <p>{textPart}</p>\n ))}\n {textParts || children}\n <div className={isButtonsInOneRow ? 'dialog-buttons mt-2' : ''}>\n <Button\n className=\"confirm-dialog-button\"\n isText\n onClick={confirmHandler}\n color={confirmIsDestructive ? 'danger' : 'primary'}\n >\n {confirmLabel}\n </Button>\n <Button className=\"confirm-dialog-button\" isText onClick={onClose}>{lang('Cancel')}</Button>\n </div>\n </Modal>\n );\n};\n\nexport default memo(ConfirmDialog);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent<HTMLDivElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<any>) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC<OwnProps> = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n onKeyDown,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n noScrollRestore = false,\n noScrollRestoreOnTop = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef<HTMLDivElement>(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements?: NodeListOf<HTMLDivElement>;\n isScrollTopJustUpdated?: boolean;\n currentAnchor?: HTMLDivElement | undefined;\n currentAnchorTop?: number;\n }>({});\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll<HTMLDivElement>(itemSelector);\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop!);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent<HTMLDivElement>) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n const listItemElements = stateRef.current.listItemElements!;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor?.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor?.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor?.offsetParent) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n <div\n ref={containerRef}\n className={className}\n onScroll={handleScroll}\n teactFastList={!noFastList}\n onKeyDown={onKeyDown}\n >\n {children}\n </div>\n );\n};\n\nexport default InfiniteScroll;\n","import { RefObject } from 'react';\nimport React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n dialogRef?: RefObject<HTMLDivElement>;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC<OwnProps & StateProps> = ({\n dialogRef,\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n <div className=\"modal-header\">\n {hasCloseButton && (\n <Button\n round\n color=\"translucent\"\n size=\"smaller\"\n ariaLabel={lang('Close')}\n onClick={onClose}\n >\n <i className=\"icon-close\" />\n </Button>\n )}\n <div className=\"modal-title\">{title}</div>\n </div>\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n <Portal>\n <div\n ref={modalRef}\n className={fullClassName}\n tabIndex={-1}\n role=\"dialog\"\n >\n <div className=\"modal-container\">\n <div className=\"modal-backdrop\" onClick={onClose} />\n <div className=\"modal-dialog\" ref={dialogRef}>\n {renderHeader()}\n <div className=\"modal-content custom-scroll\">\n {children}\n </div>\n </div>\n </div>\n </div>\n </Portal>\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC<OwnProps> = ({ containerId, className, children }) => {\n const elementRef = useRef<HTMLDivElement>();\n if (!elementRef.current) {\n elementRef.current = document.createElement('div');\n }\n\n useLayoutEffect(() => {\n const container = document.querySelector<HTMLDivElement>(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current!;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev<T extends any>(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: string | number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default <ListId extends string | number>(\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: ListId[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [ListId[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: ListId;\n }>();\n\n const viewportIdsRef = useRef<ListId[] | undefined>((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, LoadMoreDirection.Forwards, listSlice, listIds[0]);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, direction, listSlice, offsetId);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, direction, listSlice, offsetId);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice<ListId extends string | number>(\n sourceIds: ListId[],\n direction: LoadMoreDirection,\n listSlice: number,\n offsetId?: ListId,\n) {\n const { length } = sourceIds;\n const index = offsetId ? sourceIds.indexOf(offsetId) : 0;\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default <T extends ApiMediaFormat = ApiMediaFormat.BlobUrl>(\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory<T>(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl?: string) => {\n if (!imageUrl) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","// Used before applying CSS transition\nexport default function forceReflow(element: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetWidth;\n}\n","import { IS_IOS } from './environment';\nimport forceReflow from './forceReflow';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n\n// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=1264266\nexport function patchChromiumScroll(element: HTMLElement) {\n element.style.display = 'none';\n forceReflow(element);\n element.style.display = '';\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err, mediaEl);\n }\n });\n};\n"],"names":["lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","className","id","animationData","play","playSegment","speed","noLoop","size","quality","isLowPriority","onLoad","color","animation","setAnimation","useState","container","useRef","wasPlaying","isFrozen","isFirstRender","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","then","fastRaf","setColor","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","style","undefined","ref","chat","user","userStatus","text","isSavedMessages","lastSyncTime","onClick","isDeleted","isDeletedUser","isReplies","isChatWithRepliesBot","imageHash","getChatAvatarHash","blobUrl","useMedia","ApiMediaFormat","hasBlobUrl","Boolean","transitionClassNames","useShowTransition","lang","useLang","content","src","alt","decoding","userFullName","getUserFullName","getFirstLetters","title","getChatTitle","isUserId","isOnline","isUserOnline","getUserColorKey","hasImage","handleClick","e","senderId","IS_TEST","renderText","isOpen","onClose","onCloseAnimationEnd","header","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","children","onEnter","split","map","textPart","isText","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","cacheBuster","containerRef","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","debounce","noScroll","direction","LoadMoreDirection","length","scrollHeight","clientHeight","useLayoutEffect","state","newScrollTop","listItemElements","querySelectorAll","currentAnchor","Array","from","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","dialogRef","hasCloseButton","noBackdrop","shouldSkipHistoryAnimations","shouldRender","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","preventDefault","stopPropagation","focusableElements","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","focus","addEventListener","removeEventListener","trapFocus","forceClose","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","tabIndex","role","Button","round","ariaLabel","containerId","elementRef","createElement","querySelector","add","appendChild","TeactDOM","removeChild","onBlur","onFocus","hasFocus","window","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","usePrevious","listIds","isDisabled","listSlice","forceFullPreload","lastParamsRef","viewportIdsRef","newViewportIds","getViewportSlice","forceUpdate","useForceUpdate","prevListIds","prevIsDisabled","offsetId","areSortedArraysEqual","viewportIds","getMore","areSomeLocal","areAllLocal","sourceIds","index","indexOf","indexForDirection","Math","max","to","slice","mediaHash","noLoad","mediaFormat","delay","mediaData","mediaLoader","startedAt","Date","now","spentTime","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","setAttribute","copyTextToClipboard","str","value","selection","getSelection","rangeToRestore","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","currentTarget","img","width","height","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","type","error","DEBUG","console","forceReflow","offsetWidth","IS_IOS","overflow","patchChromiumScroll","display","mediaEl","catch","err","warn"],"sourceRoot":""}