1 line
81 KiB
Plaintext
1 line
81 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/lib/lottieLoader.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/components/transition.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/helpers/animation.ts"],"names":["module","exports","Worker","pagesManager","pageId","this","pagesDiv","document","getElementById","scrollableDiv","querySelector","selectTab","horizontalMenu","page","onShown","isAuthPage","style","display","id","pageEl","lottieLoader","loadLottieWorkers","fastSmoothScroll","firstElementChild","className","onFirstMount","onMount","installed","body","args","res","Promise","err","console","error","setPage","convert","value","Math","round","min","max","RLottiePlayer","el","worker","options","super","reqId","width","height","paused","direction","speed","autoplay","loop","group","frames","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","undefined","skipDelta","pixelRatio","window","devicePixelRatio","needUpscale","isMobile","noCache","Infinity","canvas","createElement","classList","add","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","methodName","sendQuery","jsonString","setMainLoop","clearPendingRAF","clearTimeout","rafId","renderFirstFrame","pause","curFrame","frameCount","requestFrame","stop","play","onDestroy","frame","frameNo","data","set","putImageData","dispatchEvent","frInterval","delta","Date","now","frThen","setTimeout","renderFrame2","renderFrame","length","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","diff","addEventListener","appendChild","time","QueryableWorker","defaultListener","onError","onerror","onmessage","event","Object","queryMethodListener","queryMethodArguments","call","message","postMessage","terminate","queryMethod","transfer","forEach","arg","ArrayBuffer","push","buffer","LottieLoader","isWebAssemblySupported","loadPromise","reject","loaded","workersLimit","players","workers","curWorkerNum","log","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","getAnimations","animation","checkAnimation","element","player","resolve","remain","object","toneIndex","replacements","COLORREPLACEMENTS","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","params","url","fetch","then","arrayBuffer","gzipUncompress","str","loadAnimationWorker","assign","animationData","race","newAnimationData","JSON","parse","applyReplacements","stringify","parseInt","container","Error","initPlayer","addAnimation","idx","loadFromData","animationIntersector","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","idle","isIDLE","entry","target","isIntersecting","delete","clearCache","on","doc","type","checkAnimations","found","remove","HTMLVideoElement","src","load","findAndSplice","unobserve","settings","stickers","observe","blurred","destroy","groups","keys","removeAnimation","has","animations","requestAnimationFrame","refreshGroup","FocusDirection","position","margin","maxDistance","forceDirection","forceDuration","axis","animationsEnabled","Static","scrollWithJs","getBoundingClientRect","elementRect","containerRect","offsetTop","top","scrollTop","Up","Down","promise","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementPosition","elementSize","containerSize","scrollPosition","scrollSize","path","remainingPath","duration","abs","startAt","tick","t","currentPath","transition","slideNavigation","tabContent","prevTabContent","toRight","elements","reverse","filter","transform","offsetWidth","slideTabs","TransitionSlider","content","transitionTime","onTransitionEnd","isHeavy","animationFunction","dataset","Transition","onTransitionEndCallbacks","Map","animationDeferred","animationStarted","from","animate","self","HTMLElement","prevId","_from","to","children","onTransitionEndCallback","toggle","callback","timeout","performance","e","parentElement","get","tabs","onClick","scrollableX","proxy","Proxy","apply","that","selectTarget","canChange","scrollIntoViewNew","rootScope","contains","prev","tagName","toLowerCase","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","parent","findUpAsChild","tab","instances","cancelAnimationByKey","key","instance","getAnimationInstance","isCancelled","deferred","animateSingle","createAnimationInstance"],"mappings":"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","file":"3.68f6c12c212c5b69a7bb.chunk.js","sourcesContent":["module.exports = function() {\n return new Worker(__webpack_public_path__ + \"aeda10c6461aad01822d.worker.js\");\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 Page from \"./page\";\r\nimport { whichChild } from \"../helpers/dom\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType<typeof horizontalMenu>;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll(this.scrollableDiv, this.scrollableDiv.firstElementChild as HTMLElement, 'start');\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\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 pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise<any> | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\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 RLottieWorker from 'worker-loader!./rlottie/rlottie.worker';\r\nimport animationIntersector from \"../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { clamp } from '../helpers/number';\r\nimport { pause } from '../helpers/schedulers';\r\nimport { isAndroid, isApple, isAppleMobile, isSafari } from \"../helpers/userAgent\";\r\nimport { logger, LogLevels } from \"./logger\";\r\nimport apiManager from \"./mtproto/mtprotoworker\";\r\n\r\nlet convert = (value: number) => {\r\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\r\n};\r\n\r\ntype RLottiePlayerListeners = 'enterFrame' | 'ready' | 'firstFrame' | 'cached';\r\ntype RLottieOptions = {\r\n container: HTMLElement, \r\n autoplay?: boolean, \r\n animationData: string, \r\n loop?: boolean, \r\n width?: number,\r\n height?: number,\r\n group?: string,\r\n noCache?: true,\r\n needUpscale?: true,\r\n skipRatio?: number\r\n};\r\n\r\nexport class RLottiePlayer extends EventListenerBase<{\r\n enterFrame: (frameNo: number) => void,\r\n ready: () => void,\r\n firstFrame: () => void,\r\n cached: () => void\r\n}> {\r\n public static reqId = 0;\r\n\r\n public reqId = 0;\r\n public curFrame: number;\r\n public frameCount: number;\r\n public fps: number;\r\n public skipDelta: number;\r\n\r\n public worker: QueryableWorker;\r\n \r\n public width = 0;\r\n public height = 0;\r\n\r\n public el: HTMLElement;\r\n public canvas: HTMLCanvasElement;\r\n public context: CanvasRenderingContext2D;\r\n\r\n public paused = true;\r\n //public paused = false;\r\n public direction = 1;\r\n public speed = 1;\r\n public autoplay = true;\r\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\r\n public loop = true;\r\n public _loop: boolean; // ! will be used to store original value for settings.stickers.loop\r\n public group = '';\r\n\r\n private frInterval: number;\r\n private frThen: number;\r\n private rafId: number;\r\n\r\n //private caching = false;\r\n //private removed = false;\r\n\r\n private frames: {[frameNo: string]: Uint8ClampedArray} = {};\r\n public imageData: ImageData;\r\n public clamped: Uint8ClampedArray;\r\n public cachingDelta = 0;\r\n\r\n //private playedTimes = 0;\r\n\r\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\r\n private frameListener: () => void;\r\n\r\n constructor({el, worker, options}: {\r\n el: HTMLElement,\r\n worker: QueryableWorker,\r\n options: RLottieOptions\r\n }) {\r\n super(true);\r\n\r\n this.reqId = ++RLottiePlayer['reqId'];\r\n this.el = el;\r\n this.worker = worker;\r\n\r\n for(let i in options) {\r\n if(this.hasOwnProperty(i)) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n this._loop = this.loop;\r\n this._autoplay = this.autoplay;\r\n\r\n // * Skip ratio (30fps)\r\n let skipRatio: number;\r\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\r\n else if((isAndroid || isAppleMobile || (isApple && !isSafari)) && this.width < 100 && this.height < 100) {\r\n skipRatio = 0.5;\r\n }\r\n\r\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\r\n\r\n //options.needUpscale = true;\r\n\r\n // * Pixel ratio\r\n //const pixelRatio = window.devicePixelRatio;\r\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\r\n if(pixelRatio > 1) {\r\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\r\n if(options.needUpscale) {\r\n this.width = Math.round(this.width * pixelRatio);\r\n this.height = Math.round(this.height * pixelRatio);\r\n } else if(pixelRatio > 1) {\r\n if(this.width > 100 && this.height > 100) {\r\n if(isApple || !mediaSizes.isMobile) {\r\n /* this.width = Math.round(this.width * (pixelRatio - 1));\r\n this.height = Math.round(this.height * (pixelRatio - 1)); */\r\n this.width = Math.round(this.width * pixelRatio);\r\n this.height = Math.round(this.height * pixelRatio);\r\n } else if(pixelRatio > 2.5) {\r\n this.width = Math.round(this.width * (pixelRatio - 1.5));\r\n this.height = Math.round(this.height * (pixelRatio - 1.5));\r\n }\r\n } else {\r\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\r\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\r\n }\r\n }\r\n }\r\n\r\n //options.noCache = true;\r\n \r\n // * Cache frames params\r\n if(!options.noCache/* && false */) {\r\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\r\n if(isApple && this.width > 100 && this.height > 100) {\r\n this.cachingDelta = 2; //2 // 50%\r\n } else if(this.width < 100 && this.height < 100) {\r\n this.cachingDelta = Infinity; // 100%\r\n } else {\r\n this.cachingDelta = 4; // 75%\r\n }\r\n }\r\n \r\n // this.cachingDelta = Infinity;\r\n // if(isApple) {\r\n // this.cachingDelta = 0; //2 // 50%\r\n // }\r\n\r\n /* this.width *= 0.8;\r\n this.height *= 0.8; */\r\n \r\n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('rlottie');\r\n this.canvas.width = this.width;\r\n this.canvas.height = this.height;\r\n this.context = this.canvas.getContext('2d');\r\n\r\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\r\n this.imageData = new ImageData(this.width, this.height);\r\n }\r\n\r\n public clearCache() {\r\n this.frames = {};\r\n }\r\n\r\n public sendQuery(methodName: string, ...args: any[]) {\r\n //console.trace('RLottie sendQuery:', methodName);\r\n this.worker.sendQuery(methodName, this.reqId, ...args);\r\n }\r\n\r\n public loadFromData(jsonString: string) {\r\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\r\n }\r\n\r\n public play() {\r\n if(!this.paused) return;\r\n\r\n //return;\r\n\r\n //console.log('RLOTTIE PLAY' + this.reqId);\r\n\r\n this.paused = false;\r\n this.setMainLoop();\r\n }\r\n\r\n public pause(clearPendingRAF = true) {\r\n if(this.paused) return;\r\n\r\n this.paused = true;\r\n if(clearPendingRAF) {\r\n clearTimeout(this.rafId);\r\n }\r\n //window.cancelAnimationFrame(this.rafId);\r\n }\r\n\r\n public stop(renderFirstFrame = true) {\r\n this.pause();\r\n\r\n this.curFrame = this.direction === 1 ? 0 : this.frameCount;\r\n if(renderFirstFrame) {\r\n this.requestFrame(this.curFrame);\r\n //this.sendQuery('renderFrame', this.curFrame);\r\n }\r\n }\r\n\r\n public restart() {\r\n this.stop(false);\r\n this.play();\r\n }\r\n\r\n public setSpeed(speed: number) {\r\n this.speed = speed;\r\n\r\n if(!this.paused) {\r\n this.setMainLoop();\r\n }\r\n }\r\n\r\n public setDirection(direction: number) {\r\n this.direction = direction;\r\n \r\n if(!this.paused) {\r\n this.setMainLoop();\r\n }\r\n }\r\n\r\n public remove() {\r\n //alert('remove');\r\n lottieLoader.onDestroy(this.reqId);\r\n this.pause();\r\n this.sendQuery('destroy');\r\n //this.removed = true;\r\n }\r\n\r\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\r\n /* this.setListenerResult('enterFrame', frameNo);\r\n return; */\r\n\r\n try {\r\n this.imageData.data.set(frame);\r\n \r\n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\r\n //let perf = performance.now();\r\n this.context.putImageData(this.imageData, 0, 0);\r\n //console.log('renderFrame2 perf:', performance.now() - perf);\r\n } catch(err) {\r\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\r\n this.autoplay = false;\r\n this.pause();\r\n return;\r\n }\r\n \r\n //console.log('set result enterFrame', frameNo);\r\n this.dispatchEvent('enterFrame', frameNo);\r\n }\r\n\r\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\r\n //console.log('renderFrame', frameNo, this);\r\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames[frameNo]) {\r\n this.frames[frameNo] = new Uint8ClampedArray(frame);//frame;\r\n }\r\n\r\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\r\n this.setListenerResult('enterFrame', frameNo);\r\n if(frameNo === (this.frameCount - 1)) {\r\n this.setListenerResult('cached');\r\n }\r\n\r\n return;\r\n } */\r\n\r\n if(this.frInterval) {\r\n const now = Date.now(), delta = now - this.frThen;\r\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\r\n\r\n if(delta < 0) {\r\n if(this.rafId) clearTimeout(this.rafId);\r\n return this.rafId = window.setTimeout(() => {\r\n this.renderFrame2(frame, frameNo);\r\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\r\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\r\n }\r\n }\r\n\r\n this.renderFrame2(frame, frameNo);\r\n }\r\n\r\n public requestFrame(frameNo: number) {\r\n if(this.frames[frameNo]) {\r\n this.renderFrame(this.frames[frameNo], frameNo);\r\n } else if(isSafari) {\r\n this.sendQuery('renderFrame', frameNo);\r\n } else {\r\n if(!this.clamped.length) { // fix detached\r\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\r\n }\r\n \r\n this.sendQuery('renderFrame', frameNo, this.clamped);\r\n }\r\n }\r\n\r\n private mainLoopForwards() {\r\n const frame = (this.curFrame + this.skipDelta) >= this.frameCount ? this.curFrame = 0 : this.curFrame += this.skipDelta;\r\n //console.log('mainLoopForwards', this.curFrame, this.skipDelta, frame);\r\n\r\n this.requestFrame(frame);\r\n if((frame + this.skipDelta) >= this.frameCount) {\r\n //this.playedTimes++;\r\n\r\n if(!this.loop) {\r\n this.pause(false);\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n \r\n private mainLoopBackwards() {\r\n const frame = (this.curFrame - this.skipDelta) < 0 ? this.curFrame = this.frameCount - 1 : this.curFrame -= this.skipDelta;\r\n //console.log('mainLoopBackwards', this.curFrame, this.skipDelta, frame);\r\n\r\n this.requestFrame(frame);\r\n if((frame - this.skipDelta) < 0) {\r\n //this.playedTimes++;\r\n\r\n if(!this.loop) {\r\n this.pause(false);\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public setMainLoop() {\r\n //window.cancelAnimationFrame(this.rafId);\r\n clearTimeout(this.rafId);\r\n\r\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\r\n this.frThen = Date.now() - this.frInterval;\r\n\r\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\r\n\r\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\r\n this.currentMethod = method;\r\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\r\n\r\n //setTimeout(() => {\r\n //this.addListener('enterFrame', this.frameListener);\r\n //}, 0);\r\n\r\n if(this.frameListener && this.listenerResults.hasOwnProperty('enterFrame')) {\r\n this.frameListener();\r\n }\r\n \r\n //this.mainLoop(method);\r\n //this.r(method);\r\n //method();\r\n }\r\n\r\n public async onLoad(frameCount: number, fps: number) {\r\n this.curFrame = this.direction === 1 ? 0 : frameCount - 1;\r\n this.frameCount = frameCount;\r\n this.fps = fps;\r\n\r\n // * Handle 30fps stickers if 30fps set\r\n if(this.fps < 60 && this.skipDelta !== 1) {\r\n const diff = 60 / fps;\r\n this.skipDelta = this.skipDelta / diff | 0;\r\n }\r\n\r\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\r\n this.frThen = Date.now() - this.frInterval;\r\n //this.sendQuery('renderFrame', 0);\r\n \r\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \r\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \r\n\r\n /* console.time('cache' + this.reqId);\r\n for(let i = 0; i < frameCount; ++i) {\r\n //if(this.removed) return;\r\n \r\n if(i % 4) {\r\n await new Promise((resolve) => {\r\n delete this.listenerResults.enterFrame;\r\n this.addListener('enterFrame', resolve, true);\r\n this.requestFrame(i);\r\n }); \r\n }\r\n }\r\n \r\n console.timeEnd('cache' + this.reqId); */\r\n //console.log('cached');\r\n /* this.el.innerHTML = '';\r\n this.el.append(this.canvas);\r\n return; */\r\n\r\n this.requestFrame(0);\r\n this.dispatchEvent('ready');\r\n this.addEventListener('enterFrame', () => {\r\n this.dispatchEvent('firstFrame');\r\n\r\n this.el.appendChild(this.canvas);\r\n\r\n //console.log('enterFrame firstFrame');\r\n \r\n //let lastTime = this.frThen;\r\n this.frameListener = () => {\r\n if(this.paused) {\r\n return;\r\n }\r\n\r\n const time = Date.now();\r\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\r\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\r\n return;\r\n } */\r\n\r\n //lastTime = time;\r\n\r\n this.frThen = time + this.frInterval;\r\n const canContinue = this.currentMethod();\r\n if(!canContinue && !this.loop && this.autoplay) {\r\n this.autoplay = false;\r\n }\r\n };\r\n\r\n this.addEventListener('enterFrame', this.frameListener);\r\n }, true);\r\n }\r\n}\r\n\r\nclass QueryableWorker extends EventListenerBase<any> {\r\n constructor(private worker: Worker, private defaultListener: (data: any) => void = () => {}, onError?: (error: any) => void) {\r\n super();\r\n\r\n if(onError) {\r\n this.worker.onerror = onError;\r\n }\r\n\r\n this.worker.onmessage = (event) => {\r\n //return;\r\n //console.log('worker onmessage', event.data);\r\n if(event.data instanceof Object &&\r\n event.data.hasOwnProperty('queryMethodListener') &&\r\n event.data.hasOwnProperty('queryMethodArguments')) {\r\n /* if(event.data.queryMethodListener === 'frame') {\r\n return;\r\n } */\r\n\r\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\r\n } else {\r\n this.defaultListener.call(this, event.data);\r\n }\r\n };\r\n }\r\n\r\n public postMessage(message: any) {\r\n this.worker.postMessage(message);\r\n }\r\n\r\n public terminate() {\r\n this.worker.terminate();\r\n }\r\n\r\n public sendQuery(queryMethod: string, ...args: any[]) {\r\n if(isSafari) {\r\n this.worker.postMessage({\r\n 'queryMethod': queryMethod,\r\n 'queryMethodArguments': args\r\n });\r\n } else {\r\n //const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\r\n const transfer: ArrayBuffer[] = [];\r\n args.forEach(arg => {\r\n if(arg instanceof ArrayBuffer) {\r\n transfer.push(arg);\r\n }\r\n \r\n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\r\n transfer.push(arg.buffer);\r\n }\r\n });\r\n \r\n //console.log('transfer', transfer);\r\n this.worker.postMessage({\r\n 'queryMethod': queryMethod,\r\n 'queryMethodArguments': args\r\n }, transfer as PostMessageOptions);\r\n }\r\n }\r\n}\r\n\r\ntype LottieShape = {\r\n c: {\r\n k: number[]\r\n },\r\n ty: 'st' | 'fl',\r\n it?: LottieShape[]\r\n};\r\nclass LottieLoader {\r\n public isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n public loadPromise: Promise<void> = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n public loaded = false;\r\n\r\n // https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\r\n private static COLORREPLACEMENTS = [\r\n [\r\n [0xf77e41, 0xcb7b55],\r\n\t\t\t[0xffb139, 0xf6b689],\r\n\t\t\t[0xffd140, 0xffcda7],\r\n\t\t\t[0xffdf79, 0xffdfc5],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0xa45a38],\r\n\t\t\t[0xffb139, 0xdf986b],\r\n\t\t\t[0xffd140, 0xedb183],\r\n\t\t\t[0xffdf79, 0xf4c3a0],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0x703a17],\r\n\t\t\t[0xffb139, 0xab673d],\r\n\t\t\t[0xffd140, 0xc37f4e],\r\n\t\t\t[0xffdf79, 0xd89667],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0x4a2409],\r\n\t\t\t[0xffb139, 0x7d3e0e],\r\n\t\t\t[0xffd140, 0x965529],\r\n\t\t\t[0xffdf79, 0xa96337],\r\n ],\r\n\r\n [\r\n\t\t\t[0xf77e41, 0x200f0a],\r\n\t\t\t[0xffb139, 0x412924],\r\n\t\t\t[0xffd140, 0x593d37],\r\n\t\t\t[0xffdf79, 0x63453f],\r\n ]\r\n ];\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogLevels.error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n private applyReplacements(object: {\r\n layers: Array<{shapes: LottieShape[]}>\r\n }, toneIndex: number) {\r\n const replacements = LottieLoader.COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\r\n\r\n const applyTo = (smth: LottieShape) => {\r\n const k = smth.c.k;\r\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\r\n\r\n const foundReplacement = replacements.find(p => p[0] === color);\r\n if(foundReplacement) {\r\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\r\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\r\n k[2] = (foundReplacement[1] & 255) / 255;\r\n }\r\n\r\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\r\n };\r\n\r\n const checkSmth = (smth: LottieShape) => {\r\n switch(smth.ty) {\r\n case 'st':\r\n case 'fl':\r\n applyTo(smth);\r\n break;\r\n }\r\n\r\n if(smth.hasOwnProperty('it')) {\r\n iterateIt(smth.it);\r\n }\r\n };\r\n\r\n const iterateIt = (it: LottieShape['it']) => {\r\n for(const smth of it) {\r\n checkSmth(smth);\r\n }\r\n };\r\n\r\n try {\r\n for(const layer of object.layers) {\r\n if(!layer.shapes) continue;\r\n \r\n for(const shape of layer.shapes) {\r\n if(!shape.it) {\r\n checkSmth(shape);\r\n continue;\r\n }\r\n\r\n iterateIt(shape.it);\r\n }\r\n }\r\n } catch(err) {\r\n this.log.warn('cant apply replacements', err, object, toneIndex);\r\n }\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit<RLottieOptions, 'animationData'>, url: string): Promise<RLottiePlayer> {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n \r\n return fetch(url)\r\n .then(res => res.arrayBuffer())\r\n .then(data => apiManager.gzipUncompress<string>(data, true))\r\n /* .then(str => {\r\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(str => {\r\n return this.loadAnimationWorker(Object.assign(params, {animationData: str/* JSON.parse(str) */, needUpscale: true}));\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer): Promise<void> {\r\n return Promise.race([\r\n /* new Promise<void>((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise<void>((resolve) => {\r\n player.addEventListener('firstFrame', resolve, true);\r\n }),\r\n pause(2500)\r\n ]);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = '', toneIndex = -1): Promise<RLottiePlayer> {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(params.animationData);\r\n this.applyReplacements(newAnimationData, toneIndex);\r\n params.animationData = JSON.stringify(newAnimationData);\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n animationIntersector.addAnimation(player, group);\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n rlPlayer.clamped = frame;\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\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 { isInDOM } from \"../helpers/dom\";\r\nimport { RLottiePlayer } from \"../lib/lottieLoader\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { isSafari } from \"../helpers/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n public observer: IntersectionObserver;\r\n private visible: Set<AnimationItem> = new Set();\r\n\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n rootScope.on('audio_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.on('audio_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && isSafari) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n for(const group in this.byGroups) {\r\n this.byGroups[group].findAndSplice(p => p === player);\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n if(rootScope.idle.isIDLE) return;\r\n \r\n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n if(group && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n this.byGroups[group] = [];\r\n return;\r\n }\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n animations.forEach(player => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;","/*\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 fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport { isInDOM } from './dom';\r\n\r\nconst MAX_DISTANCE = 1500;\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport default function fastSmoothScroll(\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin = 0,\r\n maxDistance = MAX_DISTANCE,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis: 'x' | 'y' = 'y'\r\n) {\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(forceDirection === FocusDirection.Static) {\r\n forceDuration = 0;\r\n return scrollWithJs(container, element, position, margin, forceDuration, axis);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n if(axis === 'y' && element !== container && isInDOM(element) && container.getBoundingClientRect) {\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n \r\n const offsetTop = elementRect.top - containerRect.top;\r\n if(forceDirection === undefined) {\r\n if(offsetTop < -maxDistance) {\r\n container.scrollTop += (offsetTop + maxDistance);\r\n } else if(offsetTop > maxDistance) {\r\n container.scrollTop += (offsetTop - maxDistance);\r\n }\r\n } else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n }\r\n /* const { offsetTop } = element;\r\n\r\n if(forceDirection === undefined) {\r\n const offset = offsetTop - container.scrollTop;\r\n\r\n if(offset < -maxDistance) {\r\n container.scrollTop += (offset + maxDistance);\r\n } else if(offset > maxDistance) {\r\n container.scrollTop += (offset - maxDistance);\r\n }\r\n } else if(forceDirection === FocusDirection.Up) {\r\n container.scrollTop = offsetTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) {\r\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\r\n } */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(container, element, position, margin, forceDuration, axis)\r\n .then(resolve);\r\n });\r\n });\r\n\r\n return axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(\r\n container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number, axis: 'x' | 'y' = 'y'\r\n) {\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = containerRect[sizeKey];\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] + (elementSize - elementRect[sizeKey]) - containerRect[rectEndKey];\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (containerSize / 2)\r\n : elementPosition - margin;\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction transition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\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 { whichChild } from \"../helpers/dom\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (content: HTMLElement, type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (content: HTMLElement, animationFunction: TransitionFunction, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\r\n const onTransitionEndCallbacks: Map<HTMLElement, Function> = new Map();\r\n let animationDeferred: CancellablePromise<void>;\r\n let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(animationFunction ? 'transitionend' : 'animationend', (e) => {\r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n\r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n\r\n if(e.target !== from) {\r\n return;\r\n }\r\n\r\n if(!animationDeferred && isHeavy) return;\r\n\r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n\r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n });\r\n\r\n function selectTab(id: number | HTMLElement, animate = true) {\r\n const self = selectTab;\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = self.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const _from = from;\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!animate) {\r\n if(_from) _from.classList.remove('active', 'to', 'from'); \r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating', 'disable-hover');\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType<TransitionFunction>;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(_from/* && false */) {\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise<void>();\r\n animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;","/*\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 { whichChild } from \"../helpers/dom\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew(target.parentElement.children[id] as HTMLElement, 'center', undefined, undefined, animate ? undefined : FocusDirection.Static, transitionTime, 'x');\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\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 findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\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\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise<void>\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map<AnimationInstanceKey, AnimationInstance> = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise<void>()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n"],"sourceRoot":""} |