import { memo } from '../../../lib/teact/teact'; import { getGlobal } from '../../../global'; import { SNAP_EFFECT_CONTAINER_ID, SNAP_EFFECT_ID, SVG_NAMESPACE } from '../../../config'; import { selectCanAnimateSnapEffect } from '../../../global/selectors'; import jsxToHtml from '../../../util/element/jsxToHtml'; import generateUniqueId from '../../../util/generateUniqueId'; import styles from './SnapEffectContainer.module.scss'; const VISIBLITY_MARGIN = 50; const DURATION = 1000; const SnapEffectContainer = () => { return (
); }; export default memo(SnapEffectContainer); export function animateSnap(element: HTMLElement) { const global = getGlobal(); const canPlayEffect = selectCanAnimateSnapEffect(global); if (!canPlayEffect) return false; // Get element current fixed position on screen const rect = element.getBoundingClientRect(); const x = rect.left + window.scrollX; const y = rect.top + window.scrollY; const width = rect.width; const height = rect.height; // Check for visibility if (x + width + VISIBLITY_MARGIN < 0 || x - VISIBLITY_MARGIN > window.innerWidth || y + height + VISIBLITY_MARGIN < 0 || y - VISIBLITY_MARGIN > window.innerHeight) { return false; } const seed = Math.floor(Date.now() / 1000); const filterId = `${SNAP_EFFECT_ID}-${generateUniqueId()}`; const component = ( ); const svg = jsxToHtml(component)[0] as HTMLElement; const foreignObject = svg.querySelector('foreignObject')!; const computedStyle = window.getComputedStyle(element); const clone = element.cloneNode(true) as HTMLElement; Array.from(computedStyle).forEach((key) => ( clone.style.setProperty(key, computedStyle.getPropertyValue(key), 'important') )); foreignObject.appendChild(clone); const snapContainer = document.getElementById(SNAP_EFFECT_CONTAINER_ID)!; snapContainer.appendChild(svg); svg.addEventListener('animationend', () => { snapContainer.removeChild(svg); }, { once: true, }); return true; } function createFilter(id: string, smallestSide: number, baseSeed: number = 42) { return (