Files
element-call/src/useMediaQuery.ts
T

26 lines
799 B
TypeScript
Raw Normal View History

/*
Copyright 2023-2025 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
*/
import { useCallback, useMemo, useSyncExternalStore } from "react";
/**
* React hook that tracks whether the given media query matches.
*/
2023-09-22 18:05:13 -04:00
export function useMediaQuery(query: string): boolean {
2024-11-07 17:06:49 +00:00
const mediaQuery = useMemo(() => window.matchMedia(query), [query]);
const subscribe = useCallback(
(onChange: () => void) => {
mediaQuery.addEventListener("change", onChange);
return (): void => mediaQuery.removeEventListener("change", onChange);
},
[mediaQuery],
);
const getState = useCallback(() => mediaQuery.matches, [mediaQuery]);
return useSyncExternalStore(subscribe, getState);
2023-09-22 18:05:13 -04:00
}