useMedia.tsx 759 B

12345678910111213141516171819202122232425262728293031323334353637
  1. import {useEffect, useState} from 'react';
  2. /**
  3. * Hook that updates when a media query result changes
  4. */
  5. export default function useMedia(query: string) {
  6. const [state, setState] = useState(() => window.matchMedia?.(query)?.matches);
  7. useEffect(() => {
  8. let mounted = true;
  9. if (!window.matchMedia) {
  10. return undefined;
  11. }
  12. const mql = window.matchMedia(query);
  13. const onChange = () => {
  14. if (!mounted) {
  15. return;
  16. }
  17. setState(!!mql.matches);
  18. };
  19. mql.addEventListener('change', onChange);
  20. setState(mql.matches);
  21. return () => {
  22. mounted = false;
  23. mql.removeEventListener('change', onChange);
  24. };
  25. }, [query]);
  26. if (!window.matchMedia) {
  27. return false;
  28. }
  29. return state;
  30. }