1 line
111 KiB
Plaintext
1 line
111 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/number/clamp.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/components/transition.ts","webpack:///./src/environment/canUseTransferables.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/array/indexOfAndSplice.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/array/forEachReverse.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/dom/whichChild.ts"],"names":["FocusDirection","fastSmoothScroll","options","undefined","margin","maxDistance","axis","settings","animationsEnabled","forceDirection","Static","forceDuration","scrollWithJs","promise","then","element","container","getNormalSize","position","Promise","resolve","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","getBoundingClientRect","containerRect","document","body","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","Math","abs","scrollTop","remainingPath","max","min","target","absPath","duration","startAt","Date","now","transition","shortTransition","longTransition","tick","t","currentPath","round","startCallback","distanceToEnd","isInDOM","isConnected","clamp","v","instances","Map","cancelAnimationByKey","key","instance","get","getAnimationInstance","isCancelled","deferred","animateSingle","set","delete","createAnimationInstance","animate","findUpAsChild","el","parent","parentElement","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","that","args","id","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","slideNavigation","prevTabContent","toRight","width","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","CAN_USE_TRANSFERABLES","navigator","userAgent","match","err","cache","this","name","frames","counter","height","color","toneIndex","Boolean","join","worker","super","reqId","paused","direction","speed","autoplay","loop","group","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","mediaSizes","isMobile","noCache","Infinity","canvas","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","data","setMainLoop","clearPendingRAF","rafId","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","lottieLoader","onDestroy","releaseCache","cleanup","frame","r","g","b","length","frameNo","applyColor","applyInversing","putImageData","console","error","dispatchEvent","has","frInterval","delta","frThen","renderFrame2","renderFrame","onLap","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","setSpeed","bounds","setMinMax","playToFrameOnFrameCallback","renderIfPaused","frameCount","diff","parentNode","appendChild","time","ScreenSize","MediaSize","boxSize","fitted","aspect","makeMediaSize","MediaSizes","screenSizes","mobile","value","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","documentName","desktop","handleResize","innerWidth","activeScreen","wasScreen","active","rAF","cancelAnimationFrame","Worker_fn","Worker","onerror","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","forEach","arg","ArrayBuffer","push","buffer","isWebAssemblySupported","loadPromise","reject","loaded","workersLimit","players","workers","curWorkerNum","log","logger","Error","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","blob","arrayBuffer","invokeCrypto","arr","blobConstruct","newParams","Object","assign","animationData","loadAnimationWorker","race","middleware","parseInt","initPlayer","addAnimation","idx","loadFromData","indexOfAndSplice","array","item","indexOf","spliced","splice","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","entry","find","p","isIntersecting","clearCache","overrideIdleGroups","doc","checkAnimations","override","found","HTMLVideoElement","src","load","unobserve","stickers","observe","blurred","destroy","groups","keys","animations","removeAnimation","idle","isIDLE","refreshGroup","forEachReverse","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","className","onFirstMount","onMount","installed","setPage","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promises","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","elem","previousElementSibling"],"mappings":"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","file":"0.50ca39d9514acbfe6a6a.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\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf, fastRafPromise } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\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 const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise<void> {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\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 = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let 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] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\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 if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -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 }\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 absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_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 transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\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 if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(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 * 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","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\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\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport deferredPromise, { CancellablePromise } 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","/*\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\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\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX\r\n) {\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({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\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 // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\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 // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\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 = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\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 if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \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 if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\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(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\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(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\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 _from = from;\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 onTransitionEndCallbacks.delete(_from);\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","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\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 CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport clamp from \"../../helpers/number/clamp\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map<number, Uint8ClampedArray>;\nclass RLottieCache {\n private cache: Map<string, {frames: RLottieCacheMap, counter: number}>;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.086dfed03cbca80766c6.bundle.worker.js\");\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as Transferable[]);\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 RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise<void> = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\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', LogTypes.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 }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit<RLottieOptions, 'animationData' | 'name'>, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\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 => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data)).then(arr => blobConstruct(arr as Uint8Array, ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(blob => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\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, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): 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(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\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\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\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 if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \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","export default function indexOfAndSplice<T>(array: Array<T>, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\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 rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\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 private observer: IntersectionObserver;\r\n private visible: Set<AnimationItem> = new Set();\r\n\r\n private overrideIdleGroups: Set<string>;\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 \r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n \r\n const animation = player.animation;\r\n if(animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n rootScope.addEventListener('media_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.addEventListener('media_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 setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\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 && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\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 if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (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 (!rootScope.idle.isIDLE || this.overrideIdleGroups.has(player.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","export default function forEachReverse<T>(array: Array<T>, callback: (value: T, index?: number, array?: Array<T>) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\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 Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\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({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\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\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise<void> = deferredPromise<void>();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise<any>, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise<void>();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\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 whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n"],"sourceRoot":""} |