import React, { useState, useRef, useEffect, useMemo } from "react"; 
 | 
import { useLocation } from 'react-router-dom'; 
 | 
import { 
 | 
    Box, 
 | 
    CircularProgress, 
 | 
    Typography, 
 | 
    Button, 
 | 
    TextField, 
 | 
    Stack, 
 | 
    Autocomplete, 
 | 
    InputAdornment, 
 | 
    IconButton, 
 | 
} from '@mui/material'; 
 | 
import { 
 | 
    useTranslate, 
 | 
    useLogin, 
 | 
    localStorageStore, 
 | 
    useNotify, 
 | 
} from 'react-admin'; 
 | 
import { getSystemDicts } from "@/api/auth"; 
 | 
import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; 
 | 
import ProviderChoices from "./ProviderChoices"; 
 | 
import Visibility from '@mui/icons-material/Visibility'; 
 | 
import VisibilityOff from '@mui/icons-material/VisibilityOff'; 
 | 
  
 | 
const Login = (props) => { 
 | 
    const translate = useTranslate(); 
 | 
    const notify = useNotify(); 
 | 
    const login = useLogin(); 
 | 
    const location = useLocation(); 
 | 
    const { systemInfo: { mode }, tenantList } = props; 
 | 
  
 | 
    const { control, handleSubmit, watch, setValue, getValues, setError, clearErrors } = useForm(); 
 | 
  
 | 
    const [loading, setLoading] = useState(false); 
 | 
    const [showPassword, setShowPassword] = useState(false); 
 | 
  
 | 
    const username = watch('username'); 
 | 
    const password = watch('password'); 
 | 
    const tenantId = watch('tenantId'); 
 | 
     
 | 
    useEffect(() => { 
 | 
        if (tenantList.length > 0 && !tenantId) { 
 | 
            const rememberTenantId = localStorage.getItem('remember_tenantId'); 
 | 
            if (rememberTenantId && tenantList.some(t => t.id === Number(rememberTenantId))) { 
 | 
                setValue('tenantId', Number(rememberTenantId)); 
 | 
            } else { 
 | 
                setValue('tenantId', tenantList[0].id); 
 | 
            } 
 | 
        } 
 | 
    }, [tenantList, setValue]); 
 | 
  
 | 
    const onSubmit = (data) => { 
 | 
        getSystemDicts().then(data => { 
 | 
            localStorage.setItem('sys_dicts', JSON.stringify(data)); 
 | 
        }) 
 | 
        setLoading(true); 
 | 
        login( 
 | 
            data, 
 | 
            location.state ? (location.state).nextPathname : '/' 
 | 
        ).catch((res) => { 
 | 
            setLoading(false); 
 | 
            const { code, msg, data } = res; 
 | 
            if (code === 10003) { 
 | 
                setError('username', { 
 | 
                    message: msg 
 | 
                }) 
 | 
            } else if (code === 10004) { 
 | 
                setError('username', { 
 | 
                    message: msg 
 | 
                }) 
 | 
            } else if (code === 10001) { 
 | 
                setError('password', { 
 | 
                    message: msg 
 | 
                }) 
 | 
            } else { 
 | 
                notify(msg, { type: 'error', messageArgs: { _: msg } }); 
 | 
            } 
 | 
        }); 
 | 
    }; 
 | 
  
 | 
    return ( 
 | 
        <> 
 | 
            <Box 
 | 
                p={2} 
 | 
                display="flex" 
 | 
                flexDirection='column' 
 | 
                component="form" onSubmit={handleSubmit(onSubmit)} noValidate 
 | 
            > 
 | 
                <Stack spacing={2}> 
 | 
                    {mode === 'OFFLINE' && ( 
 | 
                        <Controller 
 | 
                            name="tenantId" 
 | 
                            control={control} 
 | 
                            rules={{ required: true }} 
 | 
                            defaultValue={tenantList.length > 0 ? tenantList[0].id : ''} 
 | 
                            render={({ field: { onChange, value, ref } }) => { 
 | 
                                const selectedTenant = tenantList.find(tenant => tenant.id === value) || null; 
 | 
                                return ( 
 | 
                                    <Autocomplete 
 | 
                                        options={tenantList} 
 | 
                                        getOptionLabel={(option) => option.name} 
 | 
                                        value={selectedTenant} 
 | 
                                        onChange={(_, newValue) => { 
 | 
                                            const newTenantId = newValue ? newValue.id : ''; 
 | 
                                            onChange(newTenantId); 
 | 
                                            localStorage.setItem('remember_tenantId', newTenantId); 
 | 
                                        }} 
 | 
                                        renderInput={(params) => ( 
 | 
                                            <TextField 
 | 
                                                {...params} 
 | 
                                                label={translate("page.login.tenant")} 
 | 
                                                variant="standard" 
 | 
                                                inputRef={ref} 
 | 
                                            /> 
 | 
                                        )} 
 | 
                                    /> 
 | 
                                ); 
 | 
                            }} 
 | 
                        /> 
 | 
                    )} 
 | 
  
 | 
                    <Controller 
 | 
                        name="username" 
 | 
                        control={control} 
 | 
                        defaultValue="" 
 | 
                        rules={{ required: true }} 
 | 
                        render={({ field, fieldState: { error } }) => ( 
 | 
                            <TextField 
 | 
                                {...field} 
 | 
                                label={translate("page.login.username")} 
 | 
                                variant="standard" 
 | 
                                disabled={loading} 
 | 
                                autoFocus 
 | 
                                autoComplete="off" 
 | 
                                error={!!error} 
 | 
                                helperText={error?.message || ""} 
 | 
                            /> 
 | 
                        )} 
 | 
                    /> 
 | 
  
 | 
                    <Controller 
 | 
                        name="password" 
 | 
                        control={control} 
 | 
                        defaultValue="" 
 | 
                        rules={{ required: true }} 
 | 
                        render={({ field, fieldState: { error } }) => ( 
 | 
                            <TextField 
 | 
                                {...field} 
 | 
                                label={translate("page.login.password")} 
 | 
                                type={showPassword ? 'text' : 'password'} 
 | 
                                variant="standard" 
 | 
                                disabled={loading} 
 | 
                                autoComplete="off" 
 | 
                                error={!!error} 
 | 
                                helperText={error?.message || ""} 
 | 
                                InputProps={{ 
 | 
                                    endAdornment: ( 
 | 
                                        <InputAdornment position="end"> 
 | 
                                            <IconButton 
 | 
                                                aria-label="toggle password visibility" 
 | 
                                                onClick={() => setShowPassword((show) => !show)} 
 | 
                                                onMouseDown={(event) => { event.preventDefault() }} 
 | 
                                                edge="end" 
 | 
                                            > 
 | 
                                                {showPassword ? <VisibilityOff /> : <Visibility />} 
 | 
                                            </IconButton> 
 | 
                                        </InputAdornment> 
 | 
                                    ), 
 | 
                                }} 
 | 
                            /> 
 | 
                        )} 
 | 
                    /> 
 | 
  
 | 
                    <Box /> 
 | 
  
 | 
                    <Button 
 | 
                        type="submit" 
 | 
                        variant="contained" 
 | 
                        disabled={loading || !((mode === 'OFFLINE' ? tenantId : true) && username && password)} 
 | 
                    > 
 | 
                        {loading && <CircularProgress size={25} thickness={2} />} 
 | 
                        {translate('page.login.button.login')} 
 | 
                    </Button> 
 | 
  
 | 
                </Stack> 
 | 
                {/* <Box mt={1} mb={1} sx={{ textAlign: 'center' }}>or</Box> */} 
 | 
  
 | 
                {/* <ProviderChoices type="LOG IN" /> */} 
 | 
            </Box > 
 | 
        </> 
 | 
    ) 
 | 
} 
 | 
  
 | 
export default Login; 
 |