import { AffixProps, AffixTargetType } from "./AffixProps"; import { injectValue } from "../_util/inject-value"; export function getTarget(target: AffixProps["target"]) { return injectValue<[], AffixTargetType>(target)() || window; } export function getRect(target: AffixTargetType): ClientRect { if (target && target !== window) { return (target as HTMLElement).getBoundingClientRect(); } return { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth, width: window.innerWidth, height: window.innerHeight, }; } export function getFixed( target: AffixProps["target"], placeholder: HTMLDivElement, offset: number, isTop: boolean = true ): number { if (typeof offset === "undefined") { return undefined; } const targetElement = getRect(getTarget(target)); if (isTop && targetElement.top > getRect(placeholder).top - offset) { return offset + targetElement.top; } if (!isTop && targetElement.bottom < getRect(placeholder).bottom + offset) { return offset + window.innerHeight - targetElement.bottom; } return undefined; } export function throttle(fn: Function) { let rafId; return (...args) => { if (!rafId) { rafId = requestAnimationFrame(() => { rafId = null; fn(...args); }); } }; }