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 { createPartyUser, deletePartyUser, updatePartyUser } from 'src/actions/party-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 { IPartyUserItem } from 'src/types/party-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!' }).optional().or(zod.literal('')), city: zod.string().min(1, { message: 'City is required!' }).optional().or(zod.literal('')), 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!' }).optional().or(zod.literal('')), status: zod.string(), address: zod.string().min(1, { message: 'Address is required!' }).optional().or(zod.literal('')), country: schemaHelper .nullableInput(zod.string().min(1, { message: 'Country is required!' }), { // message for null value message: 'Country is required!', }) .optional() .or(zod.literal('')), zipCode: zod.string().min(1, { message: 'Zip code is required!' }).optional().or(zod.literal('')), company: zod.string().min(1, { message: 'Company is required!' }).optional().or(zod.literal('')), avatarUrl: zod.string().optional().or(zod.literal('')), phoneNumber: zod.string().optional().or(zod.literal('')), isVerified: zod.boolean().default(true), // username: zod.string().optional().or(zod.literal('')), password: zod.string().optional().or(zod.literal('')), }); // ---------------------------------------------------------------------- type Props = { currentUser?: IPartyUserItem; }; export function PartyUserNewEditForm({ currentUser }: Props) { const { t } = useTranslation(); const router = useRouter(); const defaultValues: NewUserSchemaType = { status: '', avatarUrl: '', name: '新用戶名字', email: 'user@123.com', phoneNumber: '', country: '', state: '', city: '', address: '', zipCode: '', company: '', role: 'user', // Email is verified isVerified: true, // 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 deletePartyUser(currentUser.id); toast.success(t('party user deleted')); router.push(paths.dashboard.partyUser.list); } } catch (error) { console.error(error); } setDisableDeleteUserButton(false); }; const onSubmit = handleSubmit(async (data: any) => { try { const temp: any = data.avatarUrl; if (temp instanceof File) { data.avatarUrl = await fileToBase64(temp); } const sanitizedValues: IPartyUserItem = values as unknown as IPartyUserItem; if (currentUser) { // perform await updatePartyUser(sanitizedValues); } else { // perform create await createPartyUser(sanitizedValues); } toast.success(currentUser ? t('Update success!') : t('Create success!')); router.push(paths.dashboard.partyUser.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 && ( )}
); }