mirror of
https://github.com/danog/telegram-tt.git
synced 2024-11-30 04:39:00 +01:00
1 line
43 KiB
Plaintext
1 line
43 KiB
Plaintext
{"version":3,"file":"3041.b859127132d576977162.js","mappings":"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","sources":["webpack://telegram-t/./src/components/common/TrackingMonkey.tsx","webpack://telegram-t/./src/components/auth/AuthCode.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.tsx","webpack://telegram-t/./src/components/common/PasswordForm.tsx","webpack://telegram-t/./src/components/common/PasswordMonkey.tsx","webpack://telegram-t/./src/components/ui/CropModal.tsx","webpack://telegram-t/./src/components/ui/AvatarEditable.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/useTimeout.ts"],"sourcesContent":["import type { FC } from '../../lib/teact/teact';\nimport React, { useState, useCallback, memo } from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { LOCAL_TGS_URLS } from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n code: string;\n codeLength: number;\n trackingDirection: number;\n isTracking: boolean;\n isBig?: boolean;\n};\n\nconst TRACKING_START_FRAME = 15;\nconst TRACKING_END_FRAME = 180;\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst TrackingMonkey: FC<OwnProps> = ({\n code,\n codeLength,\n trackingDirection,\n isTracking,\n isBig,\n}) => {\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength;\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n function getTrackingFrames(): [number, number] {\n const startFrame = (code && code.length > 1) || trackingDirection < 0\n ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1)\n : 0;\n const endFrame = code.length === codeLength\n ? TRACKING_END_FRAME\n : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length;\n\n if (trackingDirection < 1) {\n return [\n endFrame,\n startFrame,\n ];\n }\n\n return [\n startFrame,\n endFrame,\n ];\n }\n\n return (\n <div id=\"monkey\" className={isBig ? 'big' : ''}>\n {!isFirstMonkeyLoaded && (\n <div className=\"monkey-preview\" />\n )}\n <AnimatedSticker\n size={isBig ? STICKER_SIZE_TWO_FA : STICKER_SIZE}\n className={isTracking ? 'hidden' : undefined}\n tgsUrl={LOCAL_TGS_URLS.MonkeyIdle}\n play={!isTracking}\n onLoad={handleFirstMonkeyLoad}\n />\n <AnimatedSticker\n size={isBig ? STICKER_SIZE_TWO_FA : STICKER_SIZE}\n className={!isTracking ? 'hidden' : 'shown'}\n tgsUrl={LOCAL_TGS_URLS.MonkeyTracking}\n playSegment={isTracking ? getTrackingFrames() : undefined}\n speed={2}\n noLoop\n />\n </div>\n );\n};\n\nexport default memo(TrackingMonkey);\n","import type { FormEvent } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, {\n useState, useEffect, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\nimport type { GlobalState } from '../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\n\ntype StateProps = Pick<GlobalState, 'authPhoneNumber' | 'authIsCodeViaApp' | 'authIsLoading' | 'authError'>;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC<StateProps> = ({\n authPhoneNumber,\n authIsCodeViaApp,\n authIsLoading,\n authError,\n}) => {\n const {\n setAuthCode,\n returnToAuthPhoneNumber,\n clearAuthError,\n } = getActions();\n\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [code, setCode] = useState<string>('');\n const [isTracking, setIsTracking] = useState(false);\n const [trackingDirection, setTrackingDirection] = useState(1);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, []);\n\n useHistoryBack({\n isActive: true,\n onBack: returnToAuthPhoneNumber,\n });\n\n const onCodeChange = useCallback((e: FormEvent<HTMLInputElement>) => {\n if (authError) {\n clearAuthError();\n }\n\n const { currentTarget: target } = e;\n target.value = target.value.replace(/[^\\d]+/, '').substr(0, CODE_LENGTH);\n\n if (target.value === code) {\n return;\n }\n\n setCode(target.value);\n\n if (!isTracking) {\n setIsTracking(true);\n } else if (!target.value.length) {\n setIsTracking(false);\n }\n\n if (code && code.length > target.value.length) {\n setTrackingDirection(-1);\n } else {\n setTrackingDirection(1);\n }\n\n if (target.value.length === CODE_LENGTH) {\n setAuthCode({ code: target.value });\n }\n }, [authError, clearAuthError, code, isTracking, setAuthCode]);\n\n return (\n <div id=\"auth-code-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <TrackingMonkey\n code={code}\n codeLength={CODE_LENGTH}\n isTracking={isTracking}\n trackingDirection={trackingDirection}\n />\n <h2>\n {authPhoneNumber}\n <div\n className=\"auth-number-edit\"\n onClick={returnToAuthPhoneNumber}\n role=\"button\"\n tabIndex={0}\n title={lang('WrongNumber')}\n >\n <i className=\"icon-edit\" />\n </div>\n </h2>\n <p className=\"note\">\n {renderText(lang(authIsCodeViaApp ? 'SentAppCode' : 'Login.JustSentSms'), ['simple_markdown'])}\n </p>\n <InputText\n ref={inputRef}\n id=\"sign-in-code\"\n label={lang('Code')}\n onInput={onCodeChange}\n value={code}\n error={authError && lang(authError)}\n autoComplete=\"off\"\n inputMode=\"numeric\"\n />\n {authIsLoading && <Loading />}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']),\n)(AuthCode));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo, useCallback, useState } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport MonkeyPassword from '../common/PasswordMonkey';\nimport PasswordForm from '../common/PasswordForm';\n\ntype StateProps = Pick<GlobalState, 'authIsLoading' | 'authError' | 'authHint'>;\n\nconst AuthPassword: FC<StateProps> = ({\n authIsLoading, authError, authHint,\n}) => {\n const { setAuthPassword, clearAuthError } = getActions();\n\n const lang = useLang();\n const [showPassword, setShowPassword] = useState(false);\n\n const handleChangePasswordVisibility = useCallback((isVisible) => {\n setShowPassword(isVisible);\n }, []);\n\n const handleSubmit = useCallback((password: string) => {\n setAuthPassword({ password });\n }, [setAuthPassword]);\n\n return (\n <div id=\"auth-password-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <MonkeyPassword isPasswordVisible={showPassword} />\n <h2>{lang('Login.Header.Password')}</h2>\n <p className=\"note\">{lang('Login.EnterPasswordDescription')}</p>\n <PasswordForm\n clearError={clearAuthError}\n error={authError && lang(authError)}\n hint={authHint}\n isLoading={authIsLoading}\n isPasswordVisible={showPassword}\n onChangePasswordVisibility={handleChangePasswordVisibility}\n onSubmit={handleSubmit}\n />\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']),\n)(AuthPassword));\n","import type { ChangeEvent } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { useState, memo, useCallback } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport AvatarEditable from '../ui/AvatarEditable';\n\ntype StateProps = Pick<GlobalState, 'authIsLoading' | 'authError'>;\n\nconst AuthRegister: FC<StateProps> = ({\n authIsLoading, authError,\n}) => {\n const { signUp, clearAuthError, uploadProfilePhoto } = getActions();\n\n const lang = useLang();\n const [isButtonShown, setIsButtonShown] = useState(false);\n const [croppedFile, setCroppedFile] = useState<File | undefined>();\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n const handleFirstNameChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (authError) {\n clearAuthError();\n }\n\n const { target } = event;\n\n setFirstName(target.value);\n setIsButtonShown(target.value.length > 0);\n }, [authError, clearAuthError]);\n\n const handleLastNameChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const { target } = event;\n\n setLastName(target.value);\n }, []);\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n signUp({ firstName, lastName });\n\n if (croppedFile) {\n uploadProfilePhoto({ file: croppedFile });\n }\n }\n\n return (\n <div id=\"auth-registration-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <form action=\"\" method=\"post\" onSubmit={handleSubmit}>\n <AvatarEditable onChange={setCroppedFile} />\n <h2>{lang('YourName')}</h2>\n <p className=\"note\">{lang('Login.Register.Desc')}</p>\n <InputText\n id=\"registration-first-name\"\n label={lang('Login.Register.FirstName.Placeholder')}\n onChange={handleFirstNameChange}\n value={firstName}\n error={authError && lang(authError)}\n autoComplete=\"given-name\"\n />\n <InputText\n id=\"registration-last-name\"\n label={lang('Login.Register.LastName.Placeholder')}\n onChange={handleLastNameChange}\n value={lastName}\n autoComplete=\"family-name\"\n />\n {isButtonShown && (\n <Button type=\"submit\" ripple isLoading={authIsLoading}>{lang('Next')}</Button>\n )}\n </form>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError']),\n)(AuthRegister));\n","import type { ChangeEvent } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, {\n memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport useTimeout from '../../hooks/useTimeout';\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 shouldDisablePasswordManager?: boolean;\n shouldShowSubmit?: boolean;\n shouldResetValue?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n noRipple?: boolean;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst PasswordForm: FC<OwnProps> = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n shouldShowSubmit,\n shouldResetValue,\n shouldDisablePasswordManager = false,\n noRipple = false,\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (shouldResetValue) {\n setPassword('');\n }\n }, [shouldResetValue]);\n\n useTimeout(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, FOCUS_DELAY_TIMEOUT_MS);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent<HTMLInputElement>) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n <form action=\"\" onSubmit={handleSubmit} autoComplete=\"off\">\n <div\n className={buildClassName('input-group password-input', password && 'touched', error && 'error')}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n <input\n ref={inputRef}\n className=\"form-control\"\n type={isPasswordVisible ? 'text' : 'password'}\n id=\"sign-in-password\"\n value={password || ''}\n autoComplete={shouldDisablePasswordManager ? 'one-time-code' : 'current-password'}\n onChange={onPasswordChange}\n maxLength={256}\n dir=\"auto\"\n />\n <label>{error || hint || placeholder}</label>\n <div\n className=\"toggle-password\"\n onClick={togglePasswordVisibility}\n role=\"button\"\n tabIndex={0}\n title=\"Toggle password visibility\"\n >\n <i className={isPasswordVisible ? 'icon-eye' : 'icon-eye-closed'} />\n </div>\n </div>\n {(canSubmit || shouldShowSubmit) && (\n <Button type=\"submit\" ripple={!noRipple} isLoading={isLoading} disabled={!canSubmit}>\n {submitLabel}\n </Button>\n )}\n </form>\n );\n};\n\nexport default memo(PasswordForm);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback, memo } from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { LOCAL_TGS_URLS } from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport useTimeout from '../../hooks/useTimeout';\nimport useFlag from '../../hooks/useFlag';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC<OwnProps> = ({ isPasswordVisible, isBig }) => {\n const [isFirstMonkeyLoaded, markFirstMonkeyLoaded] = useFlag(false);\n const [isPeekShown, markPeekShown] = useFlag(false);\n\n useTimeout(markPeekShown, PEEK_MONKEY_SHOW_DELAY);\n const handleFirstMonkeyLoad = useCallback(markFirstMonkeyLoaded, [markFirstMonkeyLoaded]);\n\n return (\n <div id=\"monkey\" className={isBig ? 'big' : ''}>\n {!isFirstMonkeyLoaded && (\n <div className=\"monkey-preview\" />\n )}\n <AnimatedSticker\n size={isBig ? STICKER_SIZE_TWO_FA : STICKER_SIZE}\n className={isPeekShown ? 'hidden' : 'shown'}\n tgsUrl={LOCAL_TGS_URLS.MonkeyClose}\n playSegment={SEGMENT_COVER_EYES}\n noLoop\n onLoad={handleFirstMonkeyLoad}\n />\n <AnimatedSticker\n size={isBig ? STICKER_SIZE_TWO_FA : STICKER_SIZE}\n className={isPeekShown ? 'shown' : 'hidden'}\n tgsUrl={LOCAL_TGS_URLS.MonkeyPeek}\n playSegment={isPasswordVisible ? SEGMENT_UNCOVER_EYE : SEGMENT_COVER_EYE}\n noLoop\n />\n </div>\n );\n};\n\nexport default memo(PasswordMonkey);\n","import type { FC } from '../../lib/teact/teact';\nimport React, {\n useEffect, useState, memo, useCallback,\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: 1,\n format: 'jpeg',\n circle: false,\n size: { width: 1024, height: 1024 },\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC<OwnProps> = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n const handleCropClick = useCallback(async () => {\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 }, [onChange]);\n\n return (\n <Modal\n isOpen={Boolean(file)}\n onClose={onClose}\n title=\"Drag to reposition\"\n className=\"CropModal\"\n hasCloseButton\n >\n {isCroppieReady ? (\n <div id=\"avatar-crop\" />\n ) : (\n <Loading />\n )}\n <Button\n className=\"confirm-button\"\n round\n color=\"primary\"\n onClick={handleCropClick}\n ariaLabel={lang('CropImage')}\n >\n <i className=\"icon-check\" />\n </Button>\n </Modal>\n );\n};\n\nexport default memo(CropModal);\n","import type { ChangeEvent } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, {\n useState, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC<OwnProps> = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState<File | undefined>();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState<string | undefined>(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent<HTMLInputElement>) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n const handleAvatarCrop = useCallback((croppedImg: File) => {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }, [croppedBlobUrl, onChange]);\n\n const handleModalClose = useCallback(() => {\n setSelectedFile(undefined);\n }, []);\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n <div className=\"AvatarEditable\">\n <label\n className={labelClassName}\n role=\"button\"\n tabIndex={0}\n title={title}\n >\n <input\n type=\"file\"\n onChange={handleSelectFile}\n accept=\"image/png, image/jpeg\"\n />\n <i className=\"icon-camera-add\" />\n {croppedBlobUrl && <img src={croppedBlobUrl} alt=\"Avatar\" />}\n </label>\n <CropModal file={selectedFile} onClose={handleModalClose} onChange={handleAvatarCrop} />\n </div>\n );\n};\n\nexport default memo(AvatarEditable);\n","import type { RefObject } from 'react';\nimport type { FC, TeactNode } from '../../lib/teact/teact';\nimport React, { useEffect, useRef } from '../../lib/teact/teact';\n\nimport type { TextPart } from '../../types';\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?: TeactNode;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: React.ReactNode;\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 useHistoryBack({\n isActive: isOpen,\n onBack: onClose,\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 type { FC, VirtualElement } from '../../lib/teact/teact';\nimport { useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: VirtualElement;\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, useLayoutEffect, useRef } from '../lib/teact/teact';\n\nfunction useTimeout(callback: () => void, delay?: number) {\n const savedCallback = useRef(callback);\n\n useLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (typeof delay !== 'number') {\n return undefined;\n }\n const id = setTimeout(() => savedCallback.current(), delay);\n return () => clearTimeout(id);\n }, [delay]);\n}\n\nexport default useTimeout;\n"],"names":["STICKER_SIZE","IS_SINGLE_COLUMN_LAYOUT","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","memo","code","codeLength","trackingDirection","isTracking","isBig","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","useState","TRACKING_FRAMES_PER_SYMBOL","handleFirstMonkeyLoad","useCallback","id","className","AnimatedSticker","size","STICKER_SIZE_TWO_FA","undefined","tgsUrl","LOCAL_TGS_URLS","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","withGlobal","global","pick","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","getActions","lang","useLang","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","useEffect","IS_TOUCH_ENV","current","focus","useHistoryBack","isActive","onBack","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","renderText","InputText","ref","label","onInput","error","autoComplete","inputMode","Loading","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","PasswordForm","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","handleFirstNameChange","event","handleLastNameChange","action","method","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","shouldShowSubmit","shouldResetValue","shouldDisablePasswordManager","noRipple","onInputChange","setPassword","canSubmit","setCanSubmit","useTimeout","requestAnimationFrame","select","buildClassName","dir","isRtl","MIN_PASSWORD_LENGTH","maxLength","disabled","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","markFirstMonkeyLoaded","useFlag","isPeekShown","markPeekShown","cropperResultOptions","quality","format","circle","width","height","Croppie","croppiePromise","cropper","onClose","isCroppieReady","setIsCroppieReady","async","imgFile","cropContainer","document","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","initCropper","default","ensureCroppie","then","handleCropClick","result","croppedImg","blobToFile","Modal","isOpen","Boolean","hasCloseButton","round","color","ariaLabel","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","handleAvatarCrop","URL","revokeObjectURL","createObjectURL","handleModalClose","labelClassName","files","accept","src","alt","dialogRef","header","noBackdrop","children","onCloseAnimationEnd","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","Array","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","fullClassName","Portal","containerId","elementRef","createElement","useLayoutEffect","container","querySelector","add","appendChild","TeactDOM","removeChild","callback","delay","savedCallback","setTimeout","clearTimeout"],"sourceRoot":""} |