import { memo, useCallback, useEffect, useState } from 'react'; import type { FC } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import PersonAddIcon from '@mui/icons-material/PersonAdd'; import SaveIcon from '@mui/icons-material/Save'; import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; import { dialogStyle } from 'CustomTheme'; import type Schema from 'async-validator'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, ValidatedPasswordField, ValidatedTextField } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { UserType } from 'types'; import { updateValue } from 'utils'; import { validate } from 'validators'; interface UserFormProps { creating: boolean; validator: Schema; user?: UserType; setUser: React.Dispatch>; onDoneEditing: () => void; onCancelEditing: () => void; } const User: FC = ({ creating, validator, user, setUser, onDoneEditing, onCancelEditing }) => { const { LL } = useI18nContext(); const updateFormValue = updateValue((updater) => { setUser((prevState) => { if (!prevState) return prevState; return updater( prevState as unknown as Record ) as unknown as UserType; }); }); const [fieldErrors, setFieldErrors] = useState(); const open = !!user; useEffect(() => { if (open) { setFieldErrors(undefined); } }, [open]); const validateAndDone = useCallback(async () => { if (user) { try { setFieldErrors(undefined); await validate(validator, user); onDoneEditing(); } catch (error) { setFieldErrors(error as ValidateFieldsError); } } }, [user, validator, onDoneEditing]); return ( {user && ( <> {creating ? LL.ADD(1) : LL.MODIFY()} {LL.USER(1)} } label={LL.IS_ADMIN(1)} /> )} ); }; export default memo(User);