e30e75b5d4
Changesets / Create Version PR (push) Has been cancelled
Deploy Shadcn Registry / Deploy Production (push) Has been cancelled
Template Metrics / LOC + Bundle Size (push) Has been cancelled
Code Quality / Oxlint + Oxfmt (push) Has been cancelled
Code Quality / Template Sync (push) Has been cancelled
Code Quality / Build Changed Packages (push) Has been cancelled
Code Quality / Test Changed Packages (push) Has been cancelled
Deploy Expo Example / Deploy Production (push) Has been cancelled
Deploy Ink Example / Deploy Production (push) Has been cancelled
Python Tests / pytest (assistant-stream, 3.10) (push) Has been cancelled
Python Tests / pytest (assistant-stream, 3.12) (push) Has been cancelled
Python Tests / pytest (assistant-ui-sync-server-api, 3.10) (push) Has been cancelled
Python Tests / pytest (assistant-ui-sync-server-api, 3.12) (push) Has been cancelled
33 lines
947 B
TypeScript
33 lines
947 B
TypeScript
import { useCallback, useSyncExternalStore } from "react";
|
|
|
|
export function useMediaQuery(query: string): boolean {
|
|
const getSnapshot = useCallback(() => {
|
|
if (typeof window === "undefined") return false;
|
|
return window.matchMedia(query).matches;
|
|
}, [query]);
|
|
|
|
const subscribe = useCallback(
|
|
(callback: () => void) => {
|
|
if (typeof window === "undefined") return () => {};
|
|
const mediaQueryList = window.matchMedia(query);
|
|
|
|
if (mediaQueryList.addEventListener) {
|
|
mediaQueryList.addEventListener("change", callback);
|
|
} else {
|
|
mediaQueryList.addListener(callback);
|
|
}
|
|
|
|
return () => {
|
|
if (mediaQueryList.removeEventListener) {
|
|
mediaQueryList.removeEventListener("change", callback);
|
|
} else {
|
|
mediaQueryList.removeListener(callback);
|
|
}
|
|
};
|
|
},
|
|
[query],
|
|
);
|
|
|
|
return useSyncExternalStore(subscribe, getSnapshot, () => false);
|
|
}
|