| import { useEffect, useState } from 'react'; | |
| /** | |
| * Subscribe to a CSS media query and re-render when it flips. | |
| * Cheap: one matchMedia listener for the lifetime of the consumer. | |
| */ | |
| export function useMediaQuery(query) { | |
| const [matches, setMatches] = useState(() => | |
| typeof window !== 'undefined' && window.matchMedia | |
| ? window.matchMedia(query).matches | |
| : false, | |
| ); | |
| useEffect(() => { | |
| if (typeof window === 'undefined' || !window.matchMedia) return; | |
| const mql = window.matchMedia(query); | |
| const onChange = (e) => setMatches(e.matches); | |
| setMatches(mql.matches); | |
| mql.addEventListener('change', onChange); | |
| return () => mql.removeEventListener('change', onChange); | |
| }, [query]); | |
| return matches; | |
| } | |