fix(use-mobile): use sync external storage to wait before initial render

This commit is contained in:
Nicolas Meienberger 2026-03-03 17:13:32 +01:00
parent f511095fde
commit 7ed543ec8c

View file

@ -2,18 +2,20 @@ import * as React from "react";
const MOBILE_BREAKPOINT = 768; const MOBILE_BREAKPOINT = 768;
export function useIsMobile() { function subscribe(callback: () => void) {
const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined); const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
mql.addEventListener("change", callback);
React.useEffect(() => { return () => mql.removeEventListener("change", callback);
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); }
const onChange = () => {
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); function getSnapshot() {
}; return window.innerWidth < MOBILE_BREAKPOINT;
mql.addEventListener("change", onChange); }
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
return () => mql.removeEventListener("change", onChange); function getServerSnapshot() {
}, []); return false;
}
return !!isMobile;
export function useIsMobile() {
return React.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
} }