.ts
TypeScript
(application/typescript)
import React from "react";
import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";

import { breakpoints } from "../style";

type Breakpoints = keyof typeof breakpoints;

export function useMediaQuery(query: Breakpoints, type: "min" | "max" = "min") {
  const [matches, setMatches] = React.useState(false);

  useIsomorphicLayoutEffect(() => {
    const mediaQuery = window.matchMedia(
      `(${type}-width: ${breakpoints[query]})`,
    );
    setMatches(mediaQuery.matches);

    mediaQuery.addEventListener("change", (event) => {
      setMatches(event.matches);
    });

    return () =>
      mediaQuery.removeEventListener("change", (event) => {
        setMatches(event.matches);
      });
  }, [query]);

  return matches;
}