@@ -7,6 +7,12 @@ import Button from 'components/Button';
7
7
import Checkbox from 'components/Checkbox' ;
8
8
import TextField from 'components/TextField' ;
9
9
import styles from './LoginModal.scss' ;
10
+ import APIService from '../../../../services/APIService' ;
11
+ import { toastr } from 'react-redux-toastr' ;
12
+ import { defaultAuth0Service } from '../../../../services/AuthService' ;
13
+
14
+ const EMAIL_REGEX = / ^ [ A - Z 0 - 9 . _ % + - ] + @ [ A - Z 0 - 9 . - ] + \. [ A - Z ] { 2 , 4 } $ / i;
15
+
10
16
/*
11
17
* customStyles
12
18
*/
@@ -50,10 +56,11 @@ FormField.propTypes = {
50
56
*/
51
57
52
58
class LogInModal extends React . Component {
53
- constructor ( ) {
54
- super ( ) ;
59
+ constructor ( props ) {
60
+ super ( props ) ;
55
61
this . state = {
56
62
modalLoginIsOpen : false ,
63
+ showForgetPassword : false ,
57
64
} ;
58
65
}
59
66
@@ -62,15 +69,14 @@ class LogInModal extends React.Component {
62
69
}
63
70
64
71
closeLoginModal ( ) {
65
- this . setState ( { modalLoginIsOpen : false } ) ;
72
+ this . setState ( { modalLoginIsOpen : false , showForgetPassword : false } ) ;
66
73
}
67
74
68
75
login ( ) {
69
76
this . setState ( { modalLoginIsOpen : true } ) ;
70
77
}
71
78
72
79
handleLogin ( handleLoggedIn , loggedUser ) {
73
- handleLoggedIn ( ) ;
74
80
const _self = this ;
75
81
setTimeout ( ( ) => {
76
82
handleLoggedIn ( ) ;
@@ -81,9 +87,53 @@ class LogInModal extends React.Component {
81
87
} , 100 ) ;
82
88
}
83
89
90
+ forgetPassword ( ) {
91
+ this . setState ( { showForgetPassword : true } ) ;
92
+ }
93
+
94
+ /**
95
+ * Login using google social network,
96
+ * this method internally uses auth0 service
97
+ */
98
+ googleLogin ( ) {
99
+ defaultAuth0Service . login ( { connection : 'google-oauth2' } , ( error ) => {
100
+ if ( error ) {
101
+ const message = error . message || 'something went wrong, please try again' ;
102
+ toastr . error ( message ) ;
103
+ }
104
+ } ) ;
105
+ }
106
+
107
+ /**
108
+ * Login using facebook social network,
109
+ * this method internally uses auth0 service
110
+ */
111
+ facebookLogin ( ) {
112
+ defaultAuth0Service . login ( { connection : 'facebook' } , ( error ) => {
113
+ if ( error ) {
114
+ const message = error . message || 'something went wrong, please try again' ;
115
+ toastr . error ( message ) ;
116
+ }
117
+ } ) ;
118
+ }
119
+
120
+ /**
121
+ * This method is invoked when reset password request is submitted
122
+ */
123
+ handleForgetPassword ( data ) {
124
+ APIService . forgotPassword ( { email : data . emailUp } ) . then ( ( ) => {
125
+ toastr . success ( '' , 'Reset password link emailed to your email address' ) ;
126
+ this . closeLoginModal ( ) ;
127
+ } ) . catch ( ( reason ) => {
128
+ const message = reason . response . body . error || 'something went wrong, please try again' ;
129
+ toastr . error ( message ) ;
130
+ this . closeLoginModal ( ) ;
131
+ } ) ;
132
+ }
133
+
84
134
render ( ) {
135
+ const _self = this ;
85
136
const { handleSubmit, fields, handleLoggedIn, loggedUser, hasError, errorText} = this . props ;
86
-
87
137
return (
88
138
< div styleName = "signin-modal" >
89
139
< div styleName = "login-signup" >
@@ -100,71 +150,88 @@ class LogInModal extends React.Component {
100
150
101
151
< div styleName = "modal-header" >
102
152
< div onClick = { this . closeLoginModal . bind ( this ) } styleName = "icon-close-modal" />
103
- < div styleName = "title" > Login to Your Account</ div >
153
+ { this . state . showForgetPassword === false && < div styleName = "title" > Login to Your Account</ div > }
154
+ { this . state . showForgetPassword === true && < div styleName = "title" > Reset forgotten password</ div > }
104
155
</ div >
156
+ { this . state . showForgetPassword === false &&
157
+ < form styleName = "login-form" onSubmit = { handleSubmit } >
158
+ < div styleName = "login-with-fb" >
159
+ < a href = "javascript:;" onClick = { this . facebookLogin . bind ( this ) } >
160
+ < i styleName = "icon-facebook" />
161
+ < span > Log In with Facebook</ span >
162
+ </ a >
163
+ </ div >
105
164
106
- < form styleName = "login-form" onSubmit = { handleSubmit } >
107
- < div styleName = "login-with-fb" >
108
- < a href = "javascript:;" >
109
- < i styleName = "icon-facebook" />
110
- < span > Log In with Facebook</ span >
111
- </ a >
112
- </ div >
113
-
114
- < div styleName = "login-with-gplus" >
115
- < a href = "javascript:;" >
116
- < i styleName = "icon-gplus" />
117
- < span > Log In with Google Plus</ span >
118
- </ a >
119
- </ div >
120
- { /* login with end */ }
121
- < div styleName = "or-border" >
122
- < div styleName = "left-line" />
123
- < div styleName = "or" > or</ div >
124
- < div styleName = "right-line" />
125
- </ div >
126
- { /* or end */ }
127
- < div >
128
- { hasError && < span className = "error-msg" > { errorText . error } </ span > }
129
- < div styleName = "email-input" >
130
- < FormField { ...fields . email } >
131
- < TextField { ...fields . email } login type = "email" label = "Email" />
132
- </ FormField >
165
+ < div styleName = "login-with-gplus" >
166
+ < a href = "javascript:;" onClick = { this . googleLogin . bind ( this ) } >
167
+ < i styleName = "icon-gplus" />
168
+ < span > Log In with Google Plus</ span >
169
+ </ a >
170
+ </ div >
171
+ { /* login with end */ }
172
+ < div styleName = "or-border" >
173
+ < div styleName = "left-line" />
174
+ < div styleName = "or" > or</ div >
175
+ < div styleName = "right-line" />
133
176
</ div >
177
+ { /* or end */ }
134
178
< div >
135
- < FormField { ...fields . password } >
136
- < TextField { ...fields . password } login type = "password" label = "Password" />
137
- </ FormField >
179
+ { hasError && < span className = "error-msg" > { errorText . error } </ span > }
180
+ < div styleName = "email-input" >
181
+ < FormField { ...fields . email } >
182
+ < TextField { ...fields . email } login type = "email" label = "Email" />
183
+ </ FormField >
184
+ </ div >
185
+ < div >
186
+ < FormField { ...fields . password } >
187
+ < TextField { ...fields . password } login type = "password" label = "Password" />
188
+ </ FormField >
189
+ </ div >
138
190
</ div >
139
- </ div >
140
- { /* input end */ }
141
- < div styleName = "rem-forget" >
142
- < div styleName = "rem-checkbox" >
143
- < Checkbox
144
- checked = { ! this . props . fields . remember . value }
145
- onChange = { ( ) => this . props . fields . remember . onChange ( ! this . props . fields . remember . value ) }
146
- id = "remember"
191
+ { /* input end */ }
192
+ < div styleName = "rem-forget" >
193
+ < div styleName = "rem-checkbox" >
194
+ < Checkbox
195
+ checked = { ! this . props . fields . remember . value }
196
+ onChange = { ( ) => this . props . fields . remember . onChange ( ! this . props . fields . remember . value ) }
197
+ id = "remember"
198
+ >
199
+ Remember me
200
+ </ Checkbox >
201
+ </ div >
202
+ < div styleName = "forget" > < a href = "javascript:;" onClick = { this . forgetPassword . bind ( this ) } > Forget Password?</ a > </ div >
203
+ </ div >
204
+ < div styleName = "login-btn" >
205
+ < Button
206
+ type = "submit" color = "black"
207
+ className = { styles . btnLogin } onClick = { ( ) => this . handleLogin ( handleLoggedIn , loggedUser ) }
147
208
>
148
- Remember me
149
- </ Checkbox >
209
+ Log In
210
+ </ Button >
211
+ </ div >
212
+ < div styleName = "dont-have" >
213
+ Don’t have an account? < a href = "javascript:;" className = "singup" > Sign Up</ a >
214
+ </ div >
215
+ </ form >
216
+ }
217
+ { this . state . showForgetPassword === true &&
218
+ < form styleName = "login-form" onSubmit = { handleSubmit ( ( data ) => _self . handleForgetPassword ( data ) ) } >
219
+ < div >
220
+ { hasError && < span className = "error-msg" > { errorText . error } </ span > }
221
+ < div styleName = "email-input" >
222
+ < FormField { ...fields . emailUp } >
223
+ < TextField { ...fields . emailUp } login type = "email" label = "Email" />
224
+ </ FormField >
225
+ </ div >
226
+ </ div >
227
+ < div styleName = "login-btn" >
228
+ < Button type = "submit" color = "black" className = { styles . btnLogin } >
229
+ Reset Password
230
+ </ Button >
150
231
</ div >
151
- < div styleName = "forget" > < a href = "javascript:;" > Forget Password?</ a > </ div >
152
- </ div >
153
- < div styleName = "login-btn" >
154
- < Button
155
- type = "submit" color = "black"
156
- className = { styles . btnLogin } onClick = { ( ) => this . handleLogin ( handleLoggedIn , loggedUser ) }
157
- >
158
- Log In
159
- </ Button >
160
- </ div >
161
- < div styleName = "dont-have" >
162
- Don’t have an account? < a href = "javascript:;" className = "singup" > Sign Up</ a >
163
- </ div >
164
- </ form >
232
+ </ form >
233
+ }
165
234
</ Modal >
166
-
167
-
168
235
</ div >
169
236
) ;
170
237
}
@@ -183,9 +250,21 @@ const fields = ['remember', 'email', 'password', 'emailUp', 'passwordUp'];
183
250
184
251
const validate = ( values ) => {
185
252
const errors = { } ;
253
+ if ( ! values . emailUp && ! values . email ) {
254
+ errors . emailUp = 'Email is required' ;
255
+ } else if ( ! EMAIL_REGEX . test ( values . emailUp ) && ! values . email ) {
256
+ errors . emailUp = 'Invalid email address' ;
257
+ }
258
+
259
+ if ( errors . emailUp && ( values . emailUp || values . email ) ) {
260
+ return errors ;
261
+ } else if ( values . emailUp ) {
262
+ return errors ;
263
+ }
264
+
186
265
if ( ! values . email ) {
187
266
errors . email = 'Email is required' ;
188
- } else if ( ! / ^ [ A - Z 0 - 9 . _ % + - ] + @ [ A - Z 0 - 9 . - ] + \. [ A - Z ] { 2 , 4 } $ / i . test ( values . email ) ) {
267
+ } else if ( ! EMAIL_REGEX . test ( values . email ) ) {
189
268
errors . email = 'Invalid email address' ;
190
269
}
191
270
if ( ! values . password ) {
0 commit comments