core/observers/route.observer.ts

core/observers/route.observer.ts is a file in Bane's Lab Site. 33 lines of code and 7 definitions.

import type { Disposer } from "#types/base.types";
import { NAVIGATION_ENTRY } from "#core/ids/route.ids";

const INPUT_EVENTS = ["wheel", "touchstart", "keydown", "pointerdown"] as const;

export const isReload = function isReload(): boolean {
    if (!("getEntriesByType" in performance)) {
        return false;
    }
    const [entry] = performance.getEntriesByType(NAVIGATION_ENTRY);
    return entry !== undefined && "type" in entry && entry.type === "reload";
};

export const holdScroll = function holdScroll(scroller: HTMLElement, top: number): Disposer {
    const observer = new ResizeObserver(() => {
        apply();
    });
    const stop = function stop(): void {
        observer.disconnect();
        for (const name of INPUT_EVENTS) {
            scroller.removeEventListener(name, stop);
        }
    };
    const apply = function apply(): void {
        scroller.scrollTo(0, top);
        if (scroller.scrollHeight - scroller.clientHeight >= top) {
            stop();
        }
    };
    for (const name of INPUT_EVENTS) {
        scroller.addEventListener(name, stop, { passive: true });
    }
    observer.observe(scroller.firstElementChild ?? scroller);
    apply();
    return stop;
};