import { useContext, useEffect, useRef } from "react"; import { ListContext } from "@/app/components/List"; import { useResizeObserver } from "usehooks-ts"; interface SlideRangeProps { className?: string; description?: string; range?: { start?: number; stroke?: number; }; onSlide?: (v: number) => void; value?: number; step?: number; } const margin = 15; export default function SlideRange(props: SlideRangeProps) { const { className = "", description = "", range = {}, value, onSlide, step, } = props; const { start = 0, stroke = 1 } = range; const { rangeClassName, update } = useContext(ListContext); const slideRef = useRef(null); useResizeObserver({ ref: slideRef, onResize: () => { setProperty(value); }, }); const transformToWidth = (x: number = start) => { const abs = x - start; const maxWidth = (slideRef.current?.clientWidth || 1) - margin * 2; const result = (abs / stroke) * maxWidth; return result; }; const setProperty = (value?: number) => { const initWidth = transformToWidth(value); slideRef.current?.style.setProperty( "--slide-value-size", `${initWidth + margin}px`, ); }; useEffect(() => { update?.({ type: "range" }); }, []); return (
{!!description && (
{description}
)}
 
{value}
{ setProperty(e.target.valueAsNumber); onSlide?.(e.target.valueAsNumber); }} style={{ marginLeft: margin, marginRight: margin, }} />
); }