1 line
40 KiB
Plaintext
1 line
40 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/helpers/noop.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/components/ripple.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/config/modes.ts"],"names":["noop","RootScope","super","overlaysActive","myId","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","peerId","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","e","id","status","name","undefined","_themeColorElem","document","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","classList","toggle","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","rippleClickId","ripple","elem","callback","onEnd","prepend","add","r","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","target","includes","tagName","touchEnd","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","DEBUG","debug","MOUNT_CLASS_TO","self","fastRafCallbacks","fastRaf","push","currentCallbacks","forEach","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","i","fastRafPromise","then","doubleRaf","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","addNotifyListener","deferred","reject","catch","finally","cancel","Object","assign","EventListenerBase","reuseResults","_constructor","listenerResults","options","hasOwnProperty","pop","obj","findAndSplice","l","arr","slice","listener","findIndex","sequentialDom","promises","raf","bind","scheduled","kind","promise","scheduleFlush","do","element","read","write","isInDOM","isConnected","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker"],"mappings":"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","file":"19.804c41f1066e7188e13a.chunk.js","sourcesContent":["export default function noop() {}\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 type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage } from \"./appManagers/appMessagesManager\";\nimport type { Poll, PollResults } from \"./appManagers/appPollsManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type Chat from \"../components/chat/chat\";\nimport type { UserAuth } from \"./mtproto/mtproto_config\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nexport type BroadcastEvents = {\n 'user_update': number,\n 'user_auth': UserAuth,\n 'peer_changed': number,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: number, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: number, maxId: number},\n 'peer_typings': {peerId: number, typings: UserTyping[]},\n 'peer_block': {peerId: number, blocked: boolean},\n 'peer_title_edit': number,\n 'peer_bio_edit': number,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_order': number[],\n \n 'dialog_draft': {peerId: number, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: number},\n 'dialog_flush': {peerId: number},\n 'dialog_drop': {peerId: number, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: number, migrateTo: number},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: string]: Dialog},\n 'dialogs_archived_unread': {count: number},\n \n 'history_append': {storage: MessagesStorage, peerId: number, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: number, mid: number},\n 'history_reply_markup': {peerId: number},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: number, msgs: Set<number>},\n 'history_forbidden': number,\n 'history_reload': number,\n 'history_focus': {peerId: number, threadId?: number, mid?: number},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: number, mid: number},\n 'message_views': {peerId: number, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: Message.message},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: number, mids: number[]},\n 'messages_media_read': {peerId: number, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: number, mid: number},\n 'scheduled_delete': {peerId: number, mids: number[]},\n\n 'album_edit': {peerId: number, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': number | void,\n 'state_synchronizing': number | void,\n \n 'contacts_update': number,\n 'avatar_update': number,\n 'chat_full_update': number,\n 'poll_update': {poll: Poll, results: PollResults},\n 'chat_update': number,\n 'invalidate_participants': number,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: string, msgs: {peerId: number, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: number, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude<NotifyPeer['_'], 'notifyPeer'>, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': string,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId = 0;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId = 0;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial<Config.config> = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n });\n\n this.addEventListener('user_auth', (e) => {\n this.myId = e.id;\n });\n\n this.addEventListener('connection_status_change', (e) => {\n const status = e;\n this.connectionStatus[e.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\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 findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise<number>;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise<DOMHighResTimeStamp>;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise<void>((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\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 noop from \"./noop\";\r\n\r\nexport interface CancellablePromise<T> extends Promise<T> {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise<T>() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise<T> = new Promise<T>((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise<ReturnType<typeof resolve>>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap<any, Record<any, Set<any>>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback<T> = (data: T) => \r\n// export default class EventListenerBase<Listeners extends {[name: string]: Function}> {\r\nexport default class EventListenerBase<Listeners extends Record<string, Function>> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes<Listeners[k]>\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener<T extends keyof Listeners>(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener<T extends keyof Listeners>(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent<T extends keyof Listeners>(name: T, ...args: ArgumentTypes<Listeners[T]>) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array<SuperReturnType<Listeners[typeof name]>> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n arr.push(listener.callback(...args));\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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 { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise<void>,\r\n write: CancellablePromise<void>\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise<void>();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\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\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\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\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n"],"sourceRoot":""} |