@@ -10,132 +10,49 @@ import userInfoMock from '../../mock/userInfo.json';
1010import { AuthContextProps } from '../../contexts/auth/consumerHOC' ;
1111import FadeInEntrance from '../../components/fadeInEntrance' ;
1212
13-
1413type Props = { } & RouteComponentProps < any , any > & AuthContextProps ;
1514
16-
17- function Login ( { disconnectUser = ( ) => { } , history, setToken, setUserInfo} : Props ) {
18- const [ email , setEmail ] = useState < string > ( '' )
19- const [ password , setPassword ] = useState < string > ( '' )
20- const [ isLogging , setIsLogging ] = useState < boolean > ( false )
15+ function Login ( {
16+ disconnectUser = ( ) => { } ,
17+ history,
18+ setToken,
19+ setUserInfo,
20+ } : Props ) {
21+ const [ email , setEmail ] = useState < string > ( '' ) ;
22+ const [ password , setPassword ] = useState < string > ( '' ) ;
23+ const [ isLogging , setIsLogging ] = useState < boolean > ( false ) ;
2124
2225 // #region on mount
2326 useEffect ( ( ) => {
2427 disconnectUser ( ) ; // diconnect user: remove token and user info
25- } , [ ] )
28+ } , [ ] ) ;
2629 // #endregion
2730
2831 // #region input callbacks
29- const handlesOnEmailChange = useCallback ( ( event : React . ChangeEvent < HTMLInputElement > ) => {
32+ const goHome = useCallback ( ( event : React . MouseEvent < HTMLButtonElement > ) => {
3033 event && event . preventDefault ( ) ;
31- // should add some validator before setState in real use cases
32- setEmail ( event . target . value . trim ( ) ) ;
34+ history . push ( { pathname : '/' } ) ;
3335 } , [ ] ) ;
3436
35- const handlesOnPasswordChange = ( event : React . ChangeEvent < HTMLInputElement > ) => {
37+ const handlesOnEmailChange = useCallback (
38+ ( event : React . ChangeEvent < HTMLInputElement > ) => {
39+ event && event . preventDefault ( ) ;
40+ // should add some validator before setState in real use cases
41+ setEmail ( event . target . value . trim ( ) ) ;
42+ } ,
43+ [ ] ,
44+ ) ;
45+
46+ const handlesOnPasswordChange = (
47+ event : React . ChangeEvent < HTMLInputElement > ,
48+ ) => {
3649 event && event . preventDefault ( ) ;
3750 // should add some validator before setState in real use cases
3851 setPassword ( event . target . value . trim ( ) ) ;
3952 } ;
40- // #endregion
4153
42- return (
43- < FadeInEntrance >
44- < div className = "content" >
45- < Row >
46- < Col md = { { size : 4 , offset : 4 } } xs = { { size : 10 , offset : 1 } } >
47- < form className = "form-horizontal" noValidate >
48- < fieldset >
49- < legend > Login</ legend >
50-
51- < div className = "form-group" >
52- < label
53- htmlFor = "inputEmail"
54- className = "col-lg-2 control-label"
55- >
56- Email
57- </ label >
58- < Col lg = { 12 } >
59- < input
60- type = "text"
61- className = "form-control"
62- id = "inputEmail"
63- placeholder = "Email"
64- autoComplete = "username email"
65- value = { email }
66- onChange = { handlesOnEmailChange }
67- />
68- </ Col >
69- </ div >
70-
71- < div className = "form-group" >
72- < label
73- htmlFor = "inputPassword"
74- className = "col-lg-2 control-label"
75- >
76- Password
77- </ label >
78- < Col lg = { 12 } >
79- < input
80- type = "password"
81- className = "form-control"
82- id = "inputPassword"
83- placeholder = "Password"
84- autoComplete = "current-password"
85- value = { password }
86- onChange = { this . handlesOnPasswordChange }
87- />
88- </ Col >
89- </ div >
90-
91- < div className = "form-group" >
92- < Col lg = { { size : 12 } } >
93- < Button
94- className = "login-button btn-block"
95- color = "primary"
96- disabled = { isLogging }
97- onClick = { this . handlesOnLogin }
98- >
99- { isLogging ? (
100- < span >
101- login in...
102- < i className = "fa fa-spinner fa-pulse fa-fw" />
103- </ span >
104- ) : (
105- < span > Login</ span >
106- ) }
107- </ Button >
108- </ Col >
109- </ div >
110- </ fieldset >
111- </ form >
112- </ Col >
113- </ Row >
114- < Row >
115- < Col md = { { size : 4 , offset : 4 } } xs = { { size : 10 , offset : 1 } } >
116- < div className = "pull-right" >
117- < Button className = "btn-block" onClick = { this . goHome } >
118- back to home
119- </ Button >
120- </ div >
121- </ Col >
122- </ Row >
123- </ div >
124- </ FadeInEntrance >
125- ) ;
126- }
127-
128-
129-
130-
131-
132-
133-
134-
135- handlesOnLogin = async ( event : React . MouseEvent < HTMLButtonElement > ) => {
136- if ( event ) {
137- event . preventDefault ( ) ;
138- }
54+ const handlesOnLogin = async ( event : React . MouseEvent < HTMLButtonElement > ) => {
55+ event && event . preventDefault ( ) ;
13956
14057 const { history, setToken, setUserInfo } = this . props ;
14158 const { email, password } = this . state ;
@@ -147,7 +64,7 @@ function Login({disconnectUser = () => {}, history, setToken, setUserInfo}: Prop
14764
14865 try {
14966 this . setState ( { isLogging : true } ) ;
150- const response = await this . logUser ( userLogin ) ;
67+ const response = await logUser ( userLogin ) ;
15168 const {
15269 data : { token, user } ,
15370 } = response ;
@@ -165,8 +82,9 @@ function Login({disconnectUser = () => {}, history, setToken, setUserInfo}: Prop
16582 /* eslint-enable no-console */
16683 }
16784 } ;
85+ // #endregion
16886
169- logUser = async ( login : string = '' , password : string = '' ) => {
87+ const logUser = async ( login : string = '' , password : string = '' ) => {
17088 const __SOME_LOGIN_API__ = 'login' ;
17189 const url = `${ getLocationOrigin ( ) } /${ __SOME_LOGIN_API__ } ` ;
17290 const method = 'post' ;
@@ -205,13 +123,92 @@ function Login({disconnectUser = () => {}, history, setToken, setUserInfo}: Prop
205123 }
206124 } ;
207125
208- goHome = ( event : React . MouseEvent < HTMLButtonElement > ) => {
209- if ( event ) {
210- event . preventDefault ( ) ;
211- }
212- const { history } = this . props ;
213- history . push ( { pathname : '/' } ) ;
214- } ;
126+ return (
127+ < FadeInEntrance >
128+ < div className = "content" >
129+ < Row >
130+ < Col md = { { size : 4 , offset : 4 } } xs = { { size : 10 , offset : 1 } } >
131+ < form className = "form-horizontal" noValidate >
132+ < fieldset >
133+ < legend > Login</ legend >
134+
135+ < div className = "form-group" >
136+ < label
137+ htmlFor = "inputEmail"
138+ className = "col-lg-2 control-label"
139+ >
140+ Email
141+ </ label >
142+ < Col lg = { 12 } >
143+ < input
144+ type = "text"
145+ className = "form-control"
146+ id = "inputEmail"
147+ placeholder = "Email"
148+ autoComplete = "username email"
149+ value = { email }
150+ onChange = { handlesOnEmailChange }
151+ />
152+ </ Col >
153+ </ div >
154+
155+ < div className = "form-group" >
156+ < label
157+ htmlFor = "inputPassword"
158+ className = "col-lg-2 control-label"
159+ >
160+ Password
161+ </ label >
162+ < Col lg = { 12 } >
163+ < input
164+ type = "password"
165+ className = "form-control"
166+ id = "inputPassword"
167+ placeholder = "Password"
168+ autoComplete = "current-password"
169+ value = { password }
170+ onChange = { handlesOnPasswordChange }
171+ />
172+ </ Col >
173+ </ div >
174+
175+ < div className = "form-group" >
176+ < Col lg = { { size : 12 } } >
177+ < Button
178+ className = "login-button btn-block"
179+ color = "primary"
180+ disabled = { isLogging }
181+ onClick = { handlesOnLogin }
182+ >
183+ { isLogging ? (
184+ < span >
185+ login in...
186+ < i className = "fa fa-spinner fa-pulse fa-fw" />
187+ </ span >
188+ ) : (
189+ < span > Login</ span >
190+ ) }
191+ </ Button >
192+ </ Col >
193+ </ div >
194+ </ fieldset >
195+ </ form >
196+ </ Col >
197+ </ Row >
198+ < Row >
199+ < Col md = { { size : 4 , offset : 4 } } xs = { { size : 10 , offset : 1 } } >
200+ < div className = "pull-right" >
201+ < Button className = "btn-block" onClick = { goHome } >
202+ back to home
203+ </ Button >
204+ </ div >
205+ </ Col >
206+ </ Row >
207+ </ div >
208+ </ FadeInEntrance >
209+ ) ;
215210}
216211
212+ Login . DisplayName = 'Login' ;
213+
217214export default Login ;
0 commit comments