is-mobile.tsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import React, { useState, useEffect, useRef, useContext } from "react";
  2. import variables from "./css/variables.module.scss";
  3. const context = React.createContext(false);
  4. const getIsMobileMatcher = () => {
  5. return window.matchMedia
  6. ? window.matchMedia(variables.isMobileQuery)
  7. : (({
  8. matches: false,
  9. addListener: () => {},
  10. removeListener: () => {},
  11. } as any) as MediaQueryList);
  12. };
  13. export const IsMobileProvider = ({
  14. children,
  15. }: {
  16. children: React.ReactNode;
  17. }) => {
  18. const query = useRef<MediaQueryList>();
  19. if (!query.current) {
  20. query.current = getIsMobileMatcher();
  21. }
  22. const [isMobile, setMobile] = useState(query.current.matches);
  23. useEffect(() => {
  24. const handler = () => setMobile(query.current!.matches);
  25. query.current!.addListener(handler);
  26. return () => query.current!.removeListener(handler);
  27. }, []);
  28. return <context.Provider value={isMobile}>{children}</context.Provider>;
  29. };
  30. export const isMobile = () => getIsMobileMatcher().matches;
  31. export const useIsMobile = () => useContext(context);