is-mobile.tsx 971 B

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