tweb/public/6.20c444db88e2e357fc97.chun...

1 line
74 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/blob/readBlobAs.ts"],"names":["readBlobAsUint8Array","blob","readBlobAs","readBlobAsArrayBuffer","then","buffer","Uint8Array","blobSupported","blobConstruct","e","this","fileWriter","bytes","Blob","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","length","finalize","saveToStorage","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","Response","headers","size","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","TelInputField","options","super","label","name","pasted","lastValue","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","window","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","Math","abs","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","metaKey","ctrlKey","shiftKey","preventDefault","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","append","init","document","findUpAttribute","target","text","entities","plainText","originalEvent","clipboardData","getData","usePlainText","html","trim","span","createElement","curChild","nextSibling","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","filter","_","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","height","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","state","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","Array","from","children","forEach","c","removeHeavyAnimationListener","passive","capture","removeEventListener","element","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","id","checked","stateKey","getState","stateValue","stateValues","indexOf","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","settings","animationsEnabled","afterTimeout","removeAttribute","field","withEntities","lines","line","join","combineSameEntities","sortEntities","findUpTag","tag","closest","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","selNode","selOffset","offset","substr","parentNode","parentElement","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","hasAttribute","placeCaretAtEnd","ignoreTouchCheck","activeElement","focus","collapse","body","createTextRange","textRange","moveToElementText","reader","FileReader","result"],"mappings":"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","file":"6.20c444db88e2e357fc97.chunk.js","sourcesContent":["/*\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","/*\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","/*\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 <igor.beatle@gmail.com>\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<FileManager['getFakeFileWriter']>, bytes: Uint8Array | Blob | string): Promise<void> {\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<Blob>) {\r\n const blobParts: Array<Uint8Array | string> = [];\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","/*\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<Cache>;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType<typeof logger> = 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<Cache> {\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<any> {\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<T>(callback: (cache: Cache) => Promise<T>) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise<T>(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","/*\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<typeof formatPhoneNumber>) => 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<typeof formatPhoneNumber>;\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","/*\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(/<style([\\s\\S]*)<\\/style>/, '');\r\n html = html.replace(/<!--([\\s\\S]*)-->/, '');\r\n\r\n const match = html.match(/<body>([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like <p>asd</p>\\n<p>zxc</p>\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n <div contenteditable=\"${String(!!canBeEdited)}\" class=\"input-field-input\"></div>\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 { 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<HTMLElement, Scrollable> = 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<typeof logger>;\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<ScrollOptions, 'container'>) {\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","/*\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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","/*\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 <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 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\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract<MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler'>;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\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","/*\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<string>;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise<string>;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise<ArrayBuffer>;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise<any> {\n // const perf = performance.now();\n return new Promise<any>((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"],"sourceRoot":""}