From f3ca6ee5045769aaef48735ff53dde202cd44fe4 Mon Sep 17 00:00:00 2001 From: ANTOND <71350868+antond15@users.noreply.github.com> Date: Wed, 10 Aug 2022 21:05:27 +0200 Subject: [PATCH] feat(web/dialog): add slider input type (#69) --- web/src/features/dialog/InputDialog.tsx | 15 ++++-- web/src/features/dialog/components/slider.tsx | 51 +++++++++++++++++++ web/src/interfaces/dialog.ts | 9 ++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 web/src/features/dialog/components/slider.tsx diff --git a/web/src/features/dialog/InputDialog.tsx b/web/src/features/dialog/InputDialog.tsx index 4880acd..d2d15b9 100644 --- a/web/src/features/dialog/InputDialog.tsx +++ b/web/src/features/dialog/InputDialog.tsx @@ -13,15 +13,16 @@ import { useKeyPress } from "../../hooks/useKeyPress"; import { useLocales } from "../../providers/LocaleProvider"; import { debugData } from "../../utils/debugData"; import { fetchNui } from "../../utils/fetchNui"; -import { IInput, ICheckbox, ISelect, INumber } from "../../interfaces/dialog"; +import { IInput, ICheckbox, ISelect, INumber, ISlider } from "../../interfaces/dialog"; import InputField from "./components/input"; import CheckboxField from "./components/checkbox"; import SelectField from "./components/select"; import NumberField from "./components/number"; +import SliderField from "./components/slider"; interface Props { heading: string; - rows: Array; + rows: Array; } // debugData([ @@ -44,6 +45,7 @@ interface Props { // ], // }, // { type: "number", label: "Number counter", default: 12 }, +// { type: "slider", label: "Slide bar", min: 10, max: 50, step: 2 }, // ], // }, // }, @@ -111,7 +113,7 @@ const InputDialog: React.FC = () => { {fields.heading} - {fields.rows.map((row: IInput | ICheckbox | ISelect | INumber, index) => ( + {fields.rows.map((row: IInput | ICheckbox | ISelect | INumber | ISlider, index) => ( {row.type === "input" && ( { handleChange={handleChange} /> )} + {row.type === "slider" && ( + + )} ))} diff --git a/web/src/features/dialog/components/slider.tsx b/web/src/features/dialog/components/slider.tsx new file mode 100644 index 0000000..3350395 --- /dev/null +++ b/web/src/features/dialog/components/slider.tsx @@ -0,0 +1,51 @@ +import { Box, Text, Slider, SliderTrack, SliderFilledTrack, SliderThumb, HStack, Tooltip } from "@chakra-ui/react"; +import { useEffect, useState } from "react"; +import { ISlider } from "../../../interfaces/dialog"; + +interface Props { + row: ISlider; + index: number; + handleChange: (value: number, index: number) => void; +} + +const SliderField: React.FC = (props) => { + useEffect(() => { + if(props.row.default) props.handleChange(props.row.default, props.index); + }, []); + + const [sliderValue, setSliderValue] = useState(props.row.default || props.row.min || 0); + + return ( + <> + + {props.row.label} + props.handleChange(val, props.index)} + onChange={(val: number) => setSliderValue(val)} + defaultValue={props.row.default || props.row.min || 0} + min={props.row.min} + max={props.row.max} + step={props.row.step} + > + + + + + + + + + {props.row.min || 0} + {props.row.max || 100} + + + + ); +}; + +export default SliderField; diff --git a/web/src/interfaces/dialog.ts b/web/src/interfaces/dialog.ts index 1a7eec1..062e323 100644 --- a/web/src/interfaces/dialog.ts +++ b/web/src/interfaces/dialog.ts @@ -28,3 +28,12 @@ export interface INumber { placeholder?: string; default?: number; } + +export interface ISlider { + type: "slider", + label: string; + default?: number; + min?: number; + max?: number; + step?: number; +}