1 line
73 KiB
Plaintext
1 line
73 KiB
Plaintext
{"version":3,"sources":["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"],"names":["blobSupported","blobConstruct","e","this","mimeType","size","saveFileCallback","bytes","Uint8Array","write","part","offset","set","truncate","trim","slice","finalize","saveToStorage","blob","getParts","replaceParts","parts","dbName","useStorage","test","STORAGES","length","openDatabase","push","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","then","Blob","Response","headers","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fileSize","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","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","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","Array","from","children","forEach","c","addedScrollListener","passive","capture","removeEventListener","removeHeavyAnimationListener","addScrollListener","removeScrollListener","element","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ignoreNextScrollEvent","once","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","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"],"mappings":"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","file":"6.77d0690099bec1ee0f68.chunk.js","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 * 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\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 getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise<Blob>) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\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);\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, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (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 protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\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 addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n \r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\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.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\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.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\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 this.cancelMeasure();\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) 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 // lastScrollDirection check is useless here, every callback should decide on its own\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 public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\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 public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\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"],"sourceRoot":""} |