import { SubmitHandler, useForm } from 'react-hook-form' import { CreateField } from '../interfaces/create' import { Box, Button, CircularProgress, Stack, TextField, Typography } from '@mui/material'; import { AxiosResponse } from 'axios'; interface Props { title?: string; submitHandler?: (data: any) => Promise>; fields: CreateField[]; submitButtonText?: string; mutateHandler?: any; defaultValues?: {}; watchValues?: string[]; } function FormFields({ title = '', submitHandler, fields, submitButtonText = 'Сохранить', mutateHandler, defaultValues }: Props) { const getDefaultValues = (fields: CreateField[]) => { let result: { [key: string]: string | boolean } = {} fields.forEach((field: CreateField) => { result[field.key] = field.defaultValue || defaultValues?.[field.key as keyof {}] }) return result } const { register, handleSubmit, reset, watch, formState: { errors, isSubmitting, dirtyFields, isValid } } = useForm({ mode: 'onChange', defaultValues: defaultValues ? getDefaultValues(fields) : {} }) const onSubmit: SubmitHandler = async (data) => { fields.forEach((field: CreateField) => { if (field.include === false) { delete data[field.key] } }) try { const submitResponse = await submitHandler?.(data) mutateHandler?.(JSON.stringify(submitResponse?.data)) reset(submitResponse?.data) } catch (error) { console.error(error) } } return (
{title} {fields.map((field: CreateField) => { return ( { if (field.watch) { if (watch(field.watch) != val) { return field.watchMessage || '' } } }, })} error={!!errors[field.key]} helperText={errors[field.key]?.message} /> ) })}
) } export default FormFields