is-mobile.tsx 981 B

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