import { Group, Modal, Button, Stack } from '@mantine/core'; import React, { FormEvent, useRef } from 'react'; import { useNuiEvent } from '../../hooks/useNuiEvent'; import { useLocales } from '../../providers/LocaleProvider'; import { fetchNui } from '../../utils/fetchNui'; import { IInput, ICheckbox, ISelect, INumber, ISlider } from '../../interfaces/dialog'; 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'; export interface InputProps { heading: string; rows: Array; } export type FormValues = { test: { value: any; }[]; }; const InputDialog: React.FC = () => { const [fields, setFields] = React.useState({ heading: '', rows: [{ type: 'input', label: '' }], }); const [inputData, setInputData] = React.useState>([]); const [passwordStates, setPasswordStates] = React.useState([]); const [visible, setVisible] = React.useState(false); const { locale } = useLocales(); const form = useForm<{ test: { value: any }[] }>({}); const fieldForm = useFieldArray({ control: form.control, name: 'test', }); const handlePasswordStates = (index: number) => { setPasswordStates({ ...passwordStates, [index]: !passwordStates[index], }); }; useNuiEvent('openDialog', (data) => { setPasswordStates([]); setFields(data); setInputData([]); setVisible(true); data.rows.forEach((row, index) => { fieldForm.insert(index, { value: row.type !== 'checkbox' ? row.default : row.checked } || { value: null }); }); }); useNuiEvent('closeInputDialog', () => { setVisible(false); }); const handleClose = () => { setVisible(false); fetchNui('inputData'); }; const handleChange = (value: string | number | boolean, index: number) => { setInputData((previousData) => { previousData[index] = value; return previousData; }); }; const handleConfirm = () => { setVisible(false); fetchNui('inputData', inputData); }; const onSubmit = form.handleSubmit(async (data) => { const values: any[] = []; Object.values(data.test).forEach((obj: { value: any }) => values.push(obj.value)); console.log(values); await new Promise((resolve) => setTimeout(resolve, 200)); form.reset(); fieldForm.remove(); }); return ( <> { if (e.key === 'Enter' && visible) return handleConfirm(); }} styles={{ title: { textAlign: 'center', width: '100%', fontSize: 18 } }} title={fields.heading} withCloseButton={false} overlayOpacity={0.5} transition="fade" exitTransitionDuration={150} >
{fieldForm.fields.map((item, index) => { const row = fields.rows[index]; return ( {row.type === 'input' && ( )} {row.type === 'checkbox' && ( )} {row.type === 'select' && } {row.type === 'number' && } {row.type === 'slider' && } ); })}
); }; export default InputDialog;