Files
sendou.ink/app/hooks/useMainContentWidth.ts
Kalle 10feace73d
Some checks failed
E2E Tests / e2e (push) Has been cancelled
Tests and checks on push / run-checks-and-tests (push) Has been cancelled
Updates translation progress / update-translation-progress-issue (push) Has been cancelled
Drive layout breakpoints with media and container queries instead of resize listeners
2026-09-02 22:04:54 +03:00

34 lines
726 B
TypeScript

import * as React from "react";
const listeners = new Set<() => void>();
let observer: ResizeObserver | null = null;
function subscribe(listener: () => void) {
listeners.add(listener);
if (!observer) {
observer = new ResizeObserver(() => {
for (const notify of listeners) {
notify();
}
});
const main = document.querySelector("main");
if (main) observer.observe(main);
}
return () => {
listeners.delete(listener);
if (listeners.size === 0) {
observer?.disconnect();
observer = null;
}
};
}
function getSnapshot() {
return document.querySelector("main")?.clientWidth ?? 0;
}
export function useMainContentWidth() {
return React.useSyncExternalStore(subscribe, getSnapshot, () => 0);
}