123456789101112131415161718192021222324252627282930313233343536373839 |
- import {useEffect, useState} from 'react';
- /**
- * Hook that updates when a media query result changes
- */
- export default function useMedia(query: string) {
- const [state, setState] = useState(
- () => window.matchMedia && window.matchMedia(query)?.matches
- );
- useEffect(() => {
- let mounted = true;
- if (!window.matchMedia) {
- return undefined;
- }
- const mql = window.matchMedia(query);
- const onChange = () => {
- if (!mounted) {
- return;
- }
- setState(!!mql.matches);
- };
- mql.addEventListener('change', onChange);
- setState(mql.matches);
- return () => {
- mounted = false;
- mql.removeEventListener('change', onChange);
- };
- }, [query]);
- if (!window.matchMedia) {
- return false;
- }
- return state;
- }
|