You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.1 KiB
99 lines
2.1 KiB
import { Title } from "./Title";
|
|
import { Slider } from "antd";
|
|
import { useEffect, useState } from "react";
|
|
|
|
const Mark = ({ value }) => {
|
|
return (
|
|
<span className={"text-grey text-xs bg-white-background-light"}>
|
|
{value}
|
|
</span>
|
|
);
|
|
};
|
|
|
|
const getInitialMarks = (fullRange, value) => {
|
|
if (Array.isArray(value)) {
|
|
const [min, max] = value;
|
|
return {
|
|
...fullRange,
|
|
[min]: <Mark value={min} />,
|
|
[max]: <Mark value={max} />,
|
|
};
|
|
} else {
|
|
return {
|
|
...fullRange,
|
|
[value]: <Mark value={value} />,
|
|
};
|
|
}
|
|
};
|
|
|
|
export const SliderComponent = ({
|
|
title,
|
|
value: initialValue,
|
|
onChange,
|
|
onAfterChange,
|
|
min = 0,
|
|
max = 100,
|
|
range = false,
|
|
step = 1,
|
|
disabled = false,
|
|
onMouseEnter,
|
|
onMouseLeave,
|
|
showZeroMark = false,
|
|
}) => {
|
|
const fullRangeMarks = {
|
|
[min]: <Mark value={min} />,
|
|
[max]: <Mark value={max} />,
|
|
};
|
|
const [value, setValue] = useState(initialValue);
|
|
const [marks, setMarks] = useState(
|
|
getInitialMarks(fullRangeMarks, initialValue)
|
|
);
|
|
|
|
useEffect(() => {
|
|
setValue(initialValue);
|
|
setMarks(getInitialMarks(fullRangeMarks, initialValue));
|
|
}, [initialValue]);
|
|
|
|
const handleAfterChange = (value) => {
|
|
if (Array.isArray(value)) {
|
|
const [min, max] = value;
|
|
setMarks({
|
|
...fullRangeMarks,
|
|
[min]: <Mark value={min} />,
|
|
[max]: <Mark value={max} />,
|
|
});
|
|
} else {
|
|
setMarks({
|
|
...fullRangeMarks,
|
|
[value]: <Mark value={value} />,
|
|
});
|
|
}
|
|
|
|
onAfterChange?.(value);
|
|
};
|
|
|
|
const handleChange = (value) => {
|
|
setValue(value);
|
|
onChange?.(value);
|
|
};
|
|
|
|
const finalMarks = showZeroMark ? { ...marks, 0: <Mark value={0} /> } : marks;
|
|
|
|
return (
|
|
<div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
|
|
<Title text={title} />
|
|
<Slider
|
|
range={range}
|
|
value={value}
|
|
marks={finalMarks}
|
|
onChange={handleChange}
|
|
onAfterChange={handleAfterChange}
|
|
min={min}
|
|
max={max}
|
|
step={step}
|
|
disabled={disabled}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|