import { useContext, useEffect, useRef } from "react"; import { ListContext } from "@/app/components/List"; import useResizeObserver from "use-resize-observer"; 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); const { ref, width = 1 } = useResizeObserver(); ref(slideRef.current); const transformToWidth = (x: number = start) => { const abs = x - start; const maxWidth = width - 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(() => { setProperty(value); update?.({ type: "range" }); }, [width]); return (
{!!description && (
{description}
)}
 
{value}
{ setProperty(e.target.valueAsNumber); onSlide?.(e.target.valueAsNumber); }} style={{ marginLeft: margin, marginRight: margin, }} />
); }