54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import * as React from "react";
|
|
|
|
const MOBILE_BREAKPOINT = 640;
|
|
const TABLET_BREAKPOINT = 1024;
|
|
|
|
export type Breakpoint = "mobile" | "tablet" | "desktop";
|
|
|
|
export type ResponsiveBreakpoint = {
|
|
breakpoint: Breakpoint;
|
|
isMobile: boolean;
|
|
isTablet: boolean;
|
|
isDesktop: boolean;
|
|
};
|
|
|
|
function getBreakpoint(width: number): Breakpoint {
|
|
if (width < MOBILE_BREAKPOINT) return "mobile";
|
|
if (width < TABLET_BREAKPOINT) return "tablet";
|
|
return "desktop";
|
|
}
|
|
|
|
export function useResponsiveBreakpoint(): ResponsiveBreakpoint {
|
|
const [breakpoint, setBreakpoint] = React.useState<Breakpoint>("desktop");
|
|
|
|
React.useEffect(() => {
|
|
const updateBreakpoint = () => {
|
|
setBreakpoint(getBreakpoint(window.innerWidth));
|
|
};
|
|
|
|
// Set initial value
|
|
updateBreakpoint();
|
|
|
|
// Listen for resize events
|
|
const mqlMobile = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
|
|
const mqlTablet = window.matchMedia(
|
|
`(min-width: ${MOBILE_BREAKPOINT}px) and (max-width: ${TABLET_BREAKPOINT - 1}px)`,
|
|
);
|
|
|
|
mqlMobile.addEventListener("change", updateBreakpoint);
|
|
mqlTablet.addEventListener("change", updateBreakpoint);
|
|
|
|
return () => {
|
|
mqlMobile.removeEventListener("change", updateBreakpoint);
|
|
mqlTablet.removeEventListener("change", updateBreakpoint);
|
|
};
|
|
}, []);
|
|
|
|
return {
|
|
breakpoint,
|
|
isMobile: breakpoint === "mobile",
|
|
isTablet: breakpoint === "tablet",
|
|
isDesktop: breakpoint === "desktop",
|
|
};
|
|
}
|