import React, { useState, useRef, useEffect, useMemo } from "react";
|
import {
|
useTranslate,
|
useNotify,
|
} from 'react-admin';
|
import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
|
import {
|
Stack,
|
Grid,
|
Box,
|
Typography,
|
TextField,
|
Button,
|
FormControl,
|
InputLabel,
|
Select,
|
MenuItem,
|
FormHelperText,
|
CircularProgress,
|
LinearProgress,
|
} from '@mui/material';
|
import { updateUserInfo } from '@/api/auth';
|
import avatar from '/avatar.jpg'
|
|
const BaseSettings = (props) => {
|
const translate = useTranslate();
|
const notify = useNotify();
|
const { children, userInfo } = props;
|
|
const {
|
control,
|
handleSubmit,
|
watch,
|
setValue,
|
getValues,
|
reset,
|
formState: {
|
errors,
|
isDirty,
|
},
|
setError,
|
clearErrors,
|
} = useForm();
|
|
const [loading, setLoading] = useState(false);
|
|
useEffect(() => {
|
if (userInfo) {
|
setValue("username", userInfo.username || "", { shouldDirty: false });
|
setValue("nickname", userInfo.nickname || "", { shouldDirty: false });
|
setValue("sex", userInfo.sex ?? "", { shouldDirty: false });
|
setValue("code", userInfo.code || "", { shouldDirty: false });
|
setValue("phone", userInfo.phone || "", { shouldDirty: false });
|
setValue("email", userInfo.email || "", { shouldDirty: false });
|
setValue("realName", userInfo.realName || "", { shouldDirty: false });
|
setValue("idCard", userInfo.idCard || "", { shouldDirty: false });
|
}
|
}, [userInfo, setValue])
|
|
const onSubmit = (data) => {
|
setLoading(true);
|
updateUserInfo({ id: userInfo.id, ...data }).then(res => {
|
setLoading(false);
|
const { code, msg, data } = res;
|
if (code === 200) {
|
notify(msg, { type: 'success', messageArgs: { _: msg } });
|
const userToPersist = {
|
avatar: avatar,
|
fullName: data.nickname,
|
id: data.id,
|
username: data.username
|
}
|
localStorage.setItem("user", JSON.stringify(userToPersist));
|
} else if (code === 10005 || code === 10006) {
|
setError('email', {
|
message: msg
|
})
|
} else {
|
notify(msg, { type: 'error', messageArgs: { _: msg } });
|
}
|
}).catch((error) => {
|
setLoading(false);
|
notify(error.message, { type: 'error', messageArgs: { _: error.message } });
|
console.error(error);
|
})
|
}
|
|
return (
|
<Box sx={{
|
position: 'relative',
|
p: 3,
|
flex: 1,
|
overflow: 'auto',
|
}}>
|
{!userInfo && (
|
<LinearProgress
|
sx={{
|
height: "2px",
|
position: 'absolute',
|
top: 0,
|
left: 0,
|
right: 0,
|
}}
|
/>
|
)}
|
<form onSubmit={handleSubmit(onSubmit)} noValidate>
|
<Stack
|
direction='column'
|
spacing={3}
|
sx={{
|
width: '30%',
|
pt: 1
|
}}
|
>
|
<Controller
|
name="username"
|
control={control}
|
defaultValue=""
|
rules={{ required: true }}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.username')}
|
variant="outlined"
|
autoComplete="off"
|
helperText={error ? translate('ra.validation.required') : ""}
|
disabled
|
/>
|
)}
|
/>
|
<Controller
|
name="nickname"
|
control={control}
|
defaultValue=""
|
rules={{ required: true }}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.nickname')}
|
variant="outlined"
|
autoComplete="off"
|
error={!!error}
|
helperText={error ? translate('ra.validation.required') : ""}
|
/>
|
)}
|
/>
|
<Controller
|
name="sex"
|
control={control}
|
defaultValue=""
|
rules={{ required: true }}
|
render={({ field, fieldState: { error } }) => (
|
<FormControl fullWidth variant="outlined" error={!!error}>
|
<InputLabel>{translate('table.field.user.sex')}</InputLabel>
|
<Select
|
{...field}
|
label={translate('table.field.user.sex')}
|
>
|
<MenuItem value={0}>
|
<em>{translate('table.field.user.sexes.unknown')}</em>
|
</MenuItem>
|
<MenuItem value={1}>{translate('table.field.user.sexes.male')}</MenuItem>
|
<MenuItem value={2}>{translate('table.field.user.sexes.female')}</MenuItem>
|
</Select>
|
{error && <FormHelperText>{translate('ra.validation.required')}</FormHelperText>}
|
</FormControl>
|
)}
|
/>
|
<Controller
|
name="code"
|
control={control}
|
defaultValue=""
|
rules={{ required: false }}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.code')}
|
variant="outlined"
|
autoComplete="off"
|
error={!!error}
|
helperText={error ? translate('ra.validation.required') : ""}
|
/>
|
)}
|
/>
|
<Controller
|
name="phone"
|
control={control}
|
defaultValue=""
|
rules={{ required: false }}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.phone')}
|
variant="outlined"
|
autoComplete="off"
|
error={!!error}
|
helperText={error ? translate('ra.validation.required') : ""}
|
/>
|
)}
|
/>
|
<Controller
|
name="email"
|
control={control}
|
defaultValue=""
|
rules={{
|
required: false,
|
pattern: {
|
value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
message: translate("ra.validation.email"),
|
},
|
}}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.email')}
|
variant="outlined"
|
autoComplete="off"
|
error={!!error}
|
helperText={error ? error.message : ""}
|
/>
|
)}
|
/>
|
<Controller
|
name="realName"
|
control={control}
|
defaultValue=""
|
rules={{ required: false }}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.realName')}
|
variant="outlined"
|
autoComplete="off"
|
error={!!error}
|
helperText={error ? translate('ra.validation.required') : ""}
|
/>
|
)}
|
/>
|
<Controller
|
name="idCard"
|
control={control}
|
defaultValue=""
|
rules={{ required: false }}
|
render={({ field, fieldState: { error } }) => (
|
<TextField
|
{...field}
|
label={translate('table.field.user.idCard')}
|
variant="outlined"
|
autoComplete="off"
|
error={!!error}
|
helperText={error ? translate('ra.validation.required') : ""}
|
/>
|
)}
|
/>
|
<Button
|
type="submit"
|
variant="contained"
|
disabled={loading || !isDirty}
|
sx={{
|
alignSelf: 'flex-start',
|
width: '120px'
|
}}
|
>
|
{loading && <CircularProgress size={25} thickness={2} />}
|
{translate('ra.action.save')}
|
</Button>
|
</Stack>
|
</form>
|
|
</Box>
|
)
|
}
|
|
export default BaseSettings;
|