{"version":3,"file":"325.977514b16cbc045987c7.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/fileManager.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n private removeHeavyAnimationListener: () => void;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n\r\n this.removeHeavyAnimationListener();\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n"],"names":["CheckboxField","constructor","options","label","this","document","createElement","classList","add","restriction","round","disabled","toggleDisability","input","span","type","name","id","checked","stateKey","then","state","stateValue","stateValues","indexOf","setValueSilently","addEventListener","value","text","_i18n","textArgs","append","toggle","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withRipple","ripple","undefined","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","ScrollableBase","el","logPrefix","container","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","window","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","forEach","c","setListeners","removeHeavyAnimationListener","passive","capture","removeListeners","removeEventListener","element","scrollIntoViewNew","Scrollable","onScrollOffset","withPaddingContainer","super","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","prepend","elements","padding","getDistanceToEnd","Math","offsetHeight","isScrolledDown","y","ScrollableX","splitCount","IS_TOUCH_SUPPORTED","scrollHorizontally","e","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","TelInputField","pasted","lastValue","telEl","HTMLInputElement","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","IS_APPLE","IS_ANDROID","style","setProperty","originalFunc","bind","remove","formattedPhoneNumber","abs","length","IS_APPLE_MOBILE","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","test","metaKey","ctrlKey","shiftKey","preventDefault","readBlobAs","blob","method","Promise","resolve","reader","FileReader","target","result","readBlobAsArrayBuffer","readBlobAsUint8Array","buffer","Uint8Array","findUpTag","tag","closest","placeCaretAtEnd","ignoreTouchCheck","activeElement","focus","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","setAttribute","removeAttribute","prefixes","Map","maxPrefixLength","setPrefix","prefix","country_code","max","set","formatPhoneNumber","originalStr","size","country_codes","prefixCountry","str","phoneCode","slice","i","get","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","push","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","match","save","response","put","getFile","fileName","saveFile","Blob","Response","headers","callback","reject","rejected","timeout","setTimeout","res","err","clearTimeout","getFileWriter","mimeType","fakeWriter","catch","static","enabled","all","map","storage","blobSupported","isAvailable","write","fileWriter","bytes","arr","getFakeFileWriter","saveFileCallback","blobParts","part","truncate","finalize","saveToStorage"],"sourceRoot":""}