import { useState } from "react"; import { Breakpoint, breakpointKeys, getScreenBreakpoint, useBreakpoint, } from "./useBreakpoint"; export type BreakpointValues = Partial>; export const useBreakpointValue = (values: T | BreakpointValues) => { const [value, setValue] = useState( typeof values === "object" ? getValueByBreakpoint( values as BreakpointValues, getScreenBreakpoint() ) : values ); useBreakpoint((breakpoint) => { if (typeof values !== "object") { return; } const newValue = getValueByBreakpoint( values as BreakpointValues, breakpoint ); if (newValue !== value) { setValue(newValue); } }); return value as T; }; export function getValueByBreakpoint( values: BreakpointValues, breakpoint: number ) { const valueEntries = Object.entries(values as never); let resIdx = valueEntries.findIndex(([key]) => { const bpIdx = breakpointKeys.indexOf(key); return breakpoint <= bpIdx; }); if (resIdx < 0) { resIdx = valueEntries.length - 1; } const value = valueEntries[resIdx]?.[1] as T; return value; }