import { zodResolver } from '@hookform/resolvers/zod'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Card from '@mui/material/Card'; import FormControlLabel from '@mui/material/FormControlLabel'; import Grid from '@mui/material/Grid'; import Stack from '@mui/material/Stack'; import Switch from '@mui/material/Switch'; import Typography from '@mui/material/Typography'; import { useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { isValidPhoneNumber } from 'react-phone-number-input/input'; import { createUser, deleteUser, saveUser } from 'src/actions/user'; import { Field, Form, schemaHelper } from 'src/components/hook-form'; import { Label } from 'src/components/label'; import { toast } from 'src/components/snackbar'; import { useRouter } from 'src/routes/hooks'; import { paths } from 'src/routes/paths'; import type { IUserItem } from 'src/types/user'; import { fileToBase64 } from 'src/utils/file-to-base64'; import { fData } from 'src/utils/format-number'; import { z as zod } from 'zod'; // ---------------------------------------------------------------------- export type NewUserSchemaType = zod.infer; export const NewUserSchema = zod.object({ name: zod.string().min(1, { message: 'Name is required!' }), city: zod.string().min(1, { message: 'City is required!' }), role: zod.string().min(1, { message: 'Role is required!' }), email: zod .string() .min(1, { message: 'Email is required!' }) .email({ message: 'Email must be a valid email address!' }), state: zod.string().min(1, { message: 'State is required!' }), status: zod.string(), address: zod.string().min(1, { message: 'Address is required!' }), country: schemaHelper.nullableInput(zod.string().min(1, { message: 'Country is required!' }), { // message for null value message: 'Country is required!', }), zipCode: zod.string().min(1, { message: 'Zip code is required!' }), company: zod.string().min(1, { message: 'Company is required!' }), avatarUrl: schemaHelper.file({ message: 'Avatar is required!' }), phoneNumber: schemaHelper.phoneNumber({ isValid: isValidPhoneNumber }), isVerified: zod.boolean(), username: zod.string(), password: zod.string(), }); // ---------------------------------------------------------------------- type Props = { currentUser?: IUserItem; }; export function UserNewEditForm({ currentUser }: Props) { const { t } = useTranslation(); const router = useRouter(); const defaultValues: NewUserSchemaType = { status: '', avatarUrl: null, isVerified: true, name: '新用戶名字', email: 'user@123.com', phoneNumber: '+85291234567', country: 'Hong Kong', state: 'HK', city: 'hong kong', address: 'Kwun Tong, Sau Mau Ping', zipCode: '00000', company: 'test company', role: 'user', // username: '', password: '', }; const methods = useForm({ mode: 'onSubmit', resolver: zodResolver(NewUserSchema), defaultValues, values: currentUser, }); const { reset, watch, control, handleSubmit, formState: { errors, isSubmitting }, } = methods; const values = watch(); const [disableDeleteUserButton, setDisableDeleteUserButton] = useState(false); const handleDeleteUserClick = async () => { setDisableDeleteUserButton(true); try { if (currentUser) { await deleteUser(currentUser.id); toast.success(t('user deleted')); router.push(paths.dashboard.user.list); } } catch (error) { console.error(error); } setDisableDeleteUserButton(false); }; const onSubmit = handleSubmit(async (data: any) => { try { await new Promise((resolve) => setTimeout(resolve, 500)); reset(); const temp: any = data.avatarUrl; if (temp instanceof File) { data.avatarUrl = await fileToBase64(temp); } if (currentUser) { // perform save await saveUser(currentUser.id, data); } else { // perform create await createUser(data); } toast.success(currentUser ? t('Update success!') : t('Create success!')); router.push(paths.dashboard.user.list); // console.info('DATA', data); } catch (error) { console.error(error); } }); return (
{currentUser && ( )} {t('Allowed')} *.jpeg, *.jpg, *.png, *.gif
{t('max size of')} {fData(3145728)} } />
{currentUser && ( ( field.onChange(event.target.checked ? 'banned' : 'active') } /> )} /> } label={ <> {t('Banned')} {t('Apply disable account')} } sx={{ mx: 0, mb: 3, width: 1, justifyContent: 'space-between', }} /> )} {t('Email verified')} {t('Disabling this will automatically send the user a verification email')} } sx={{ mx: 0, width: 1, justifyContent: 'space-between' }} /> {currentUser && ( )}
); }