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