ERP-node/frontend/lib/hooks/useResponsive.ts

73 lines
1.9 KiB
TypeScript
Raw Normal View History

2025-10-01 16:15:53 +09:00
"use client";
import { useState, useEffect } from "react";
export type Breakpoint = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
export interface ResponsiveConfig {
breakpoints: Record<Breakpoint, number>;
currentBreakpoint: Breakpoint;
isMobile: boolean;
isTablet: boolean;
isDesktop: boolean;
width: number;
height: number;
}
const defaultBreakpoints = {
xs: 0,
sm: 640,
md: 768,
lg: 1024,
xl: 1280,
"2xl": 1536,
};
export const useResponsive = (customBreakpoints?: Partial<Record<Breakpoint, number>>) => {
const breakpoints = { ...defaultBreakpoints, ...customBreakpoints };
const [windowSize, setWindowSize] = useState({
width: typeof window !== "undefined" ? window.innerWidth : 1024,
height: typeof window !== "undefined" ? window.innerHeight : 768,
});
useEffect(() => {
const handleResize = () => {
setWindowSize({
width: window.innerWidth,
height: window.innerHeight,
});
};
window.addEventListener("resize", handleResize);
return () => window.removeEventListener("resize", handleResize);
}, []);
const getCurrentBreakpoint = (): Breakpoint => {
const { width } = windowSize;
if (width >= breakpoints["2xl"]) return "2xl";
if (width >= breakpoints.xl) return "xl";
if (width >= breakpoints.lg) return "lg";
if (width >= breakpoints.md) return "md";
if (width >= breakpoints.sm) return "sm";
return "xs";
};
const currentBreakpoint = getCurrentBreakpoint();
const isMobile = currentBreakpoint === "xs" || currentBreakpoint === "sm";
const isTablet = currentBreakpoint === "md";
const isDesktop = currentBreakpoint === "lg" || currentBreakpoint === "xl" || currentBreakpoint === "2xl";
return {
breakpoints,
currentBreakpoint,
isMobile,
isTablet,
isDesktop,
width: windowSize.width,
height: windowSize.height,
};
};