pizza-online
70 строк · 2.3 Кб
1'use client'
2
3import React from 'react'
4import * as SliderPrimitive from '@radix-ui/react-slider'
5
6import {cn} from '@/lib/utils'
7
8type SliderProps = {
9className?: string
10min: number
11max: number
12step: number
13formatLabel?: (value: number) => string
14value?: number[] | readonly number[]
15onValueChange?: (values: number[]) => void
16}
17
18const RangeSlider = React.forwardRef(
19({className, min, max, step, formatLabel, value, onValueChange, ...props}: SliderProps, ref) => {
20const initialValue = Array.isArray(value) ? value : [min, max]
21const [localValues, setLocalValues] = React.useState(initialValue)
22
23React.useEffect(() => {
24// Update localValues when the external value prop changes
25setLocalValues(Array.isArray(value) ? value : [min, max])
26}, [min, max, value])
27
28const handleValueChange = (newValues: number[]) => {
29setLocalValues(newValues)
30if (onValueChange) {
31onValueChange(newValues)
32}
33}
34
35return (
36<SliderPrimitive.Root
37ref={ref as React.RefObject<HTMLDivElement>}
38min={min}
39max={max}
40step={step}
41value={localValues}
42onValueChange={handleValueChange}
43className={cn('relative flex w-full touch-none select-none mb-6 items-center', className)}
44{...props}
45>
46<SliderPrimitive.Track className='relative h-1 w-full grow overflow-hidden rounded-full bg-primary/20'>
47<SliderPrimitive.Range className='absolute h-full bg-primary' />
48</SliderPrimitive.Track>
49{localValues.map((value, index) => (
50<React.Fragment key={index}>
51<div
52className='absolute text-center'
53style={{
54left: `calc(${((value - min) / (max - min)) * 100}% + 0px)`,
55top: `10px`,
56}}
57>
58<span className='text-sm'>{formatLabel ? formatLabel(value) : value}</span>
59</div>
60<SliderPrimitive.Thumb className='block h-4 w-4 rounded-full border border-primary/50 bg-white shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50' />
61</React.Fragment>
62))}
63</SliderPrimitive.Root>
64)
65}
66)
67
68RangeSlider.displayName = SliderPrimitive.Root.displayName
69
70export {RangeSlider}
71