diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 98de2a4c1..33586c9ff 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -21,3 +21,4 @@ export * from './card'; export * from './date-formatter'; export * from './video-loop'; export * from './disclosure'; +export * from './utils/use-media-query'; diff --git a/packages/react/src/utils/use-media-query.ts b/packages/react/src/utils/use-media-query.ts new file mode 100644 index 000000000..677ab7fa3 --- /dev/null +++ b/packages/react/src/utils/use-media-query.ts @@ -0,0 +1,21 @@ +'use client'; +import { useEffect, useState } from 'react'; + +export interface MediaQueryResult { + matches: boolean; +} + +export function useMediaQuery(mediaQuery: string): MediaQueryResult { + const [matches, setMatches] = useState(false); + useEffect(() => { + const listener = window.matchMedia(mediaQuery); + setMatches(listener.matches); + + const handler = (e: MediaQueryListEvent) => setMatches(e.matches); + + listener.addEventListener('change', handler); + return () => listener.removeEventListener('change', handler); + }, [mediaQuery]); + + return { matches }; +}