import { Group, Modal, Button, Stack } from '@mantine/core'; import React from 'react'; import { useNuiEvent } from '../../hooks/useNuiEvent'; import { useLocales } from '../../providers/LocaleProvider'; import { fetchNui } from '../../utils/fetchNui'; import { OptionValue } from '../../typings'; import InputField from './components/fields/input'; import CheckboxField from './components/fields/checkbox'; import SelectField from './components/fields/select'; import NumberField from './components/fields/number'; import SliderField from './components/fields/slider'; import { useFieldArray, useForm } from 'react-hook-form'; import ColorField from './components/fields/color'; import DateField from './components/fields/date'; import TextareaField from './components/fields/textarea'; import TimeField from './components/fields/time'; import type { InputProps } from '../../typings'; export type FormValues = { test: { value: any; }[]; }; const InputDialog: React.FC = () => { const [fields, setFields] = React.useState({ heading: '', rows: [{ type: 'input', label: '' }], }); const [visible, setVisible] = React.useState(false); const { locale } = useLocales(); const form = useForm<{ test: { value: any }[] }>({}); const fieldForm = useFieldArray({ control: form.control, name: 'test', }); useNuiEvent('openDialog', (data) => { setFields(data); setVisible(true); data.rows.forEach((row, index) => { fieldForm.insert( index, { value: row.type !== 'checkbox' ? row.type === 'date' || row.type === 'date-range' || row.type === 'time' ? // Set date to current one if default is set to true row.default === true ? new Date().getTime() : Array.isArray(row.default) ? row.default.map((date) => new Date(date).getTime()) : row.default && new Date(row.default).getTime() : row.default : row.checked, } || { value: null } ); // Backwards compat with new Select data type if (row.type === 'select' || row.type === 'multi-select') { row.options = row.options.map((option) => !option.label ? { ...option, label: option.value } : option ) as Array; } }); }); useNuiEvent('closeInputDialog', () => { setVisible(false); }); const handleClose = async () => { setVisible(false); await new Promise((resolve) => setTimeout(resolve, 200)); form.reset(); fieldForm.remove(); fetchNui('inputData'); }; const onSubmit = form.handleSubmit(async (data) => { setVisible(false); const values: any[] = []; Object.values(data.test).forEach((obj: { value: any }) => values.push(obj.value)); await new Promise((resolve) => setTimeout(resolve, 200)); form.reset(); fieldForm.remove(); fetchNui('inputData', values); }); return ( <>
{fieldForm.fields.map((item, index) => { const row = fields.rows[index]; return ( {row.type === 'input' && ( )} {row.type === 'checkbox' && ( )} {(row.type === 'select' || row.type === 'multi-select') && ( )} {row.type === 'number' && } {row.type === 'slider' && } {row.type === 'color' && } {row.type === 'time' && } {row.type === 'date' || row.type === 'date-range' ? ( ) : null} {row.type === 'textarea' && ( )} ); })}
); }; export default InputDialog;