"use client"; import { useState, useEffect } from "react"; export type Breakpoint = "xs" | "sm" | "md" | "lg" | "xl" | "2xl"; export interface ResponsiveConfig { breakpoints: Record; 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>) => { 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, }; };