import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import { useTranslation } from 'react-i18next'; import { Slider as RangeSlider } from '@/components/rangeslider'; import { Input } from '@/components/ui/input'; const SliderContainer = styled.div` display: flex; flex-direction: column; align-items: stretch; justify-content: stretch; padding-block: 1em; > .output { display: flex; justify-content: space-between; margin-top: 1em; > output { width: 100%; } > output:first-child { margin-right: 0.5em; } > output:last-child { margin-left: 0.5em; } } `; interface ValueInputProps { min: number; max: number; value: number; resetValue: number; onChange: (value: number) => void; step?: number; } const ValueInput: React.FC = (props) => { const { min, max, value, step, resetValue, onChange } = props; const [innerValue, setInnerValue] = useState(`${value ?? resetValue}`); const handleSubmitValue = () => { const v = Number(innerValue); if (!isNaN(v) && v <= max && v >= min) { onChange(v); } else { onChange(resetValue); setInnerValue(`${resetValue}`); } }; useEffect(() => { setInnerValue(`${value ?? resetValue}`); }, [value]); return ( setInnerValue(e.target.value)} onBlur={handleSubmitValue} onKeyDown={(e) => { if (e.key === 'Enter' && !e.nativeEvent.isComposing) { handleSubmitValue(); } }} /> ); }; interface SliderProps { min: number; max: number; value: [number | null, number | null]; onChange: (value: [number, number]) => void; } const Slider: React.FC = React.memo(function Slider({ min, max, value, onChange }) { const { t } = useTranslation(); // step to last digit, e.g. 0.7 => 0.1 const stepDigit = 10 ** Math.floor(Math.log10((max - min) / 100)); return ( onChange([min, max])} />
{t('filters.range.start_value')}
{ onChange([newValue, value[1] ?? max])} /> }
{t('filters.range.end_value')}
{ onChange([value[0] ?? min, newValue])} /> }
); }); export default Slider;