1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  | import * as React from 'react'; 
 |  import { useState } from 'react'; 
 |  import { useLocation } from 'react-router-dom'; 
 |  import { 
 |      Avatar, 
 |      Box, 
 |      Button, 
 |      Card, 
 |      CardActions, 
 |      CircularProgress, 
 |  } from '@mui/material'; 
 |  import LockIcon from '@mui/icons-material/Lock'; 
 |  import { 
 |      Form, 
 |      required, 
 |      TextInput, 
 |      useTranslate, 
 |      useLogin, 
 |      useNotify, 
 |  } from 'react-admin'; 
 |  import { LOGIN_BACKGROUND } from '@/config/setting'; 
 |    
 |  const Login = () => { 
 |      const [loading, setLoading] = useState(false); 
 |      const translate = useTranslate(); 
 |    
 |      const notify = useNotify(); 
 |      const login = useLogin(); 
 |      const location = useLocation(); 
 |    
 |      const handleSubmit = (auth) => { 
 |          setLoading(true); 
 |          // js native confirm && root 
 |          login( 
 |              auth, 
 |              location.state ? (location.state).nextPathname : '/' 
 |          ).catch((error) => { 
 |              setLoading(false); 
 |              notify( 
 |                  typeof error === 'string' 
 |                      ? error 
 |                      : typeof error === 'undefined' || !error.message 
 |                          ? 'ra.auth.sign_in_error' 
 |                          : error.message, 
 |                  { 
 |                      type: 'error', 
 |                      messageArgs: { 
 |                          _: 
 |                              typeof error === 'string' 
 |                                  ? error 
 |                                  : error && error.message 
 |                                      ? error.message 
 |                                      : undefined, 
 |                      }, 
 |                  } 
 |              ); 
 |          }); 
 |      }; 
 |    
 |      return ( 
 |          <Form onSubmit={handleSubmit} noValidate> 
 |              {/* https://unsplash.com/ */} 
 |              <Box 
 |                  sx={{ 
 |                      display: 'flex', 
 |                      flexDirection: 'column', 
 |                      minHeight: '100vh', 
 |                      alignItems: 'center', 
 |                      justifyContent: 'flex-start', 
 |                      // justifyContent: 'center', 
 |                      background: `url(/login_bg2.jpg)`, 
 |                      backgroundRepeat: 'no-repeat', 
 |                      backgroundSize: 'cover', 
 |                  }} 
 |              > 
 |                  <video 
 |                      autoPlay 
 |                      loop 
 |                      muted 
 |                      style={{ 
 |                          position: 'fixed', 
 |                          top: 0, 
 |                          left: 0, 
 |                          width: '100%', 
 |                          height: '100%', 
 |                          // objectFit: 'cover', 
 |                          // objectFit: 'contain', 
 |                          objectFit: 'fill', 
 |                          // objectFit: 'scale-down', 
 |                          zIndex: 0, 
 |                      }} 
 |                  > 
 |                      {LOGIN_BACKGROUND === 'media' && ( 
 |                          <source src="/login_bg1.mp4" type="video/mp4" /> 
 |                      )} 
 |                  </video> 
 |    
 |                  <Card sx={{ 
 |                      minWidth: 300, 
 |                      marginTop: '6em', 
 |                      zIndex: 1 
 |                  }}> 
 |                      <Box 
 |                          sx={{ 
 |                              margin: '1em', 
 |                              display: 'flex', 
 |                              justifyContent: 'center', 
 |                          }} 
 |                      > 
 |                          <Avatar sx={{ bgcolor: 'secondary.main' }}> 
 |                              <LockIcon /> 
 |                          </Avatar> 
 |                      </Box> 
 |                      <Box 
 |                          sx={{ 
 |                              marginTop: '1em', 
 |                              display: 'flex', 
 |                              justifyContent: 'center', 
 |                              color: theme => theme.palette.grey[500], 
 |                          }} 
 |                      > 
 |                          Hint: root / 123456 
 |                      </Box> 
 |                      <Box sx={{ padding: '0 1em 1em 1em' }}> 
 |                          <Box sx={{ marginTop: '1em' }}> 
 |                              <TextInput 
 |                                  autoFocus 
 |                                  source="username" 
 |                                  label={translate('ra.auth.username')} 
 |                                  disabled={loading} 
 |                                  validate={required()} 
 |                              /> 
 |                          </Box> 
 |                          <Box sx={{ marginTop: '1em' }}> 
 |                              <TextInput 
 |                                  source="password" 
 |                                  label={translate('ra.auth.password')} 
 |                                  type="password" 
 |                                  disabled={loading} 
 |                                  validate={required()} 
 |                              /> 
 |                          </Box> 
 |                      </Box> 
 |                      <CardActions sx={{ padding: '0 1em 1em 1em' }}> 
 |                          <Button 
 |                              variant="contained" 
 |                              type="submit" 
 |                              color="primary" 
 |                              disabled={loading} 
 |                              fullWidth 
 |                          > 
 |                              {loading && ( 
 |                                  <CircularProgress size={25} thickness={2} /> 
 |                              )} 
 |                              {translate('ra.auth.sign_in')} 
 |                          </Button> 
 |                      </CardActions> 
 |                  </Card> 
 |              </Box> 
 |          </Form> 
 |      ); 
 |  }; 
 |    
 |  export default Login; 
 |  
  |