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; 
 |