import { ComponentProps, useEffect, useState } from 'react'; import { useSearchParams } from 'react-router'; import { isStringBoolean } from '../../../views/common/viewUtils'; import Checkbox from '../checkbox/Checkbox'; import Input from '../input/input/Input'; import Select, { SelectOption } from '../select/Select'; import Switch from '../switch/Switch'; import InlineColourPicker from './InlineColourPicker'; import { ParamField } from './viewParams.types'; import style from './ParamInput.module.scss'; interface ParamInputProps { paramField: ParamField; } export default function ParamInput({ paramField }: ParamInputProps) { const [searchParams] = useSearchParams(); const { id, type, defaultValue } = paramField; if (type === 'persist') { if (!paramField.values || !paramField.values.length) { return null; } return ; } if (type === 'option') { const optionFromParams = searchParams.get(id); const defaultOptionValue = optionFromParams || defaultValue; if (paramField.values.length === 0) { return No options available; } return ; } if (type === 'multi-option') { const optionFromParams = searchParams.getAll(id); return ( ); } if (type === 'boolean') { return ; } if (type === 'number') { const { placeholder } = paramField; const defaultNumberValue = searchParams.get(id) ?? defaultValue; return ( ); } if (type === 'colour') { return ; } const defaultStringValue = searchParams.get(id) ?? defaultValue ?? ''; const { placeholder } = paramField; return ; } interface EditFormMultiOptionProps { paramField: ParamField & { type: 'multi-option' }; options: string[]; } function MultiOption({ paramField, options }: EditFormMultiOptionProps) { const { id, values } = paramField; const [paramState, setParamState] = useState(options); // synchronise options useEffect(() => { setParamState(options); }, [options]); const toggleValue = (value: string, checked: boolean) => { if (checked) { setParamState((prev) => [...prev, value]); } else { setParamState((prev) => prev.filter((v) => v !== value)); } }; if (values.length === 0) { return No options available; } return ( <>
{values.map((option) => { return ( ); })}
); } interface ControlledSwitchProps { id: string; initialValue: boolean; } function ControlledSwitch({ id, initialValue }: ControlledSwitchProps) { const [checked, setChecked] = useState(initialValue); // synchronise checked state useEffect(() => { setChecked(initialValue); }, [initialValue]); return ; } interface ControlledSelectProps { id: string; initialValue?: string; options: SelectOption[]; } function ControlledSelect({ id, initialValue, options }: ControlledSelectProps) { const [selected, setSelected] = useState(initialValue); // synchronise selected state useEffect(() => { setSelected(initialValue); }, [initialValue]); return ( setValue(event.target.value as T)} {...inputProps} /> ); }