{"version":3,"sources":["webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/findUpTag.ts"],"names":["placeCaretAtEnd","el","ignoreTouchCheck","document","activeElement","focus","window","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","formatPhoneNumber","originalStr","size","countriesList","forEach","country_codes","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","TelInputField","options","super","label","name","pasted","lastValue","this","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","abs","setLabel","countryCode","dataset","onInput","e","key","test","metaKey","ctrlKey","shiftKey","preventDefault","btnQr","btnNext","page","setCountries","countries","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","lastCountrySelected","lastCountryCodeSelected","inputWrapper","createElement","countryInputField","countryInput","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","c","emoji","iso2","liArr","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","defaultName","span","innerText","push","button","target","selectCountryByTarget","childNodes","querySelector","find","_countryCode","telInputField","hidePicker","setTimeout","hideTimeout","display","clearTimeout","offsetWidth","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","_value","toLowerCase","matches","names","Boolean","abbr","word","map","join","good","indexOf","cancelBubble","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","settings","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","log","Error","Array","from","children","addedScrollListener","passive","removeHeavyAnimationListener","addScrollListener","removeScrollListener","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","round","offsetHeight","getDistanceToEnd","y","ignoreNextScrollEvent","once","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","setAttribute","findUpTag","tag","closest"],"mappings":"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","file":"4.3e09949378470770bf73.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 \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\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\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 { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n 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) {\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\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\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"],"sourceRoot":""}