type VideoFacade = HTMLElement & { dataset: DOMStringMap };
export function bindVideoFacadePreload(
root: ParentNode,
selector: string,
activate: (facade: VideoFacade) => void,
): void {
const facades = [
...(root instanceof HTMLElement && root.matches(selector) ? [root] : []),
...root.querySelectorAll(selector),
];
for (const facade of facades) {
if (facade.dataset.videoPreload !== "auto") continue;
if (facade.dataset.videoPreloadBound === "true") continue;
facade.dataset.videoPreloadBound = "true";
const prepare = () => activate(facade);
if ("IntersectionObserver" in window) {
const observer = new IntersectionObserver(
(entries) => {
if (!entries.some((entry) => entry.isIntersecting)) return;
observer.disconnect();
prepare();
},
{ rootMargin: "240px 0px" },
);
observer.observe(facade);
} else {
const idleWindow = window as Window & {
requestIdleCallback?: (
callback: IdleRequestCallback,
options?: IdleRequestOptions,
) => number;
};
if (idleWindow.requestIdleCallback) {
idleWindow.requestIdleCallback(prepare, { timeout: 1500 });
} else {
setTimeout(prepare, 0);
}
}
}
}