Finished Forgot Password request, Reset Password request
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import React, { Component } from "react";
|
||||
import { Route, Switch } from "react-router-dom";
|
||||
|
||||
import ForgotPassword from "./Auth/ForgotPassword";
|
||||
import Login from "./Auth/Login";
|
||||
import Register from "./Auth/Register";
|
||||
import ResetPassword from "./Auth/ResetPassword";
|
||||
import Settings from "./Auth/Settings";
|
||||
import VerifyEmail from "./Auth/VerifyEmail";
|
||||
import PrivateRoute from "./Shared/PrivateRoute";
|
||||
@@ -34,6 +36,8 @@ class App extends Component {
|
||||
component={VerifyEmail}
|
||||
/>
|
||||
<PrivateRoute path="/auth/settings" component={Settings} />
|
||||
<Route path="/auth/forgot-password" component={ForgotPassword} />
|
||||
<Route path="/auth/reset-password/:uid/:token" component={ResetPassword} />
|
||||
<Route component={NoMatch} />
|
||||
</Switch>
|
||||
</div>
|
||||
|
98
src/components/Auth/ForgotPassword.jsx
Normal file
98
src/components/Auth/ForgotPassword.jsx
Normal file
@@ -0,0 +1,98 @@
|
||||
import React, { Component } from "react";
|
||||
import { connect } from "react-redux";
|
||||
import { Link, Redirect } from "react-router-dom";
|
||||
import { Button, Container, Form, Header, Message } from "semantic-ui-react";
|
||||
|
||||
import {
|
||||
clearAuthRequestError,
|
||||
clearAuthRequestSuccess,
|
||||
setFormEmail
|
||||
} from "../../actions/auth/reducer.actions";
|
||||
import { sendForgotPasswordRequest } from "../../actions/auth/saga.actions";
|
||||
import Error from "../Shared/Error";
|
||||
|
||||
class ForgotPassword extends Component {
|
||||
componentWillMount() {
|
||||
this.props.dispatch(clearAuthRequestError());
|
||||
this.props.dispatch(clearAuthRequestSuccess());
|
||||
}
|
||||
|
||||
changeEmail = event => {
|
||||
this.props.dispatch(setFormEmail(event.target.value));
|
||||
};
|
||||
|
||||
onSubmitForgotPassword = event => {
|
||||
event.preventDefault();
|
||||
const { dispatch, email } = this.props;
|
||||
dispatch(sendForgotPasswordRequest({ email }));
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
isSendingAuthRequest,
|
||||
authRequestError,
|
||||
authRequestSuccess,
|
||||
email,
|
||||
userToken
|
||||
} = this.props;
|
||||
if (userToken) return <Redirect to={"/"} />;
|
||||
return (
|
||||
<ForgotPasswordView
|
||||
isSendingAuthRequest={isSendingAuthRequest}
|
||||
authRequestError={authRequestError}
|
||||
authRequestSuccess={authRequestSuccess}
|
||||
email={email}
|
||||
changeEmail={this.changeEmail}
|
||||
onSubmitForgotPassword={this.onSubmitForgotPassword}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function mapStateToProps(state) {
|
||||
return { ...state.auth };
|
||||
}
|
||||
|
||||
const ForgotPasswordView = ({
|
||||
isSendingAuthRequest,
|
||||
authRequestError,
|
||||
authRequestSuccess,
|
||||
email,
|
||||
changeEmail,
|
||||
onSubmitForgotPassword
|
||||
}) => (
|
||||
<Container>
|
||||
<Header>Forgot Password</Header>
|
||||
<p>Enter your email and we will send you a link to reset your password.</p>
|
||||
<Form
|
||||
loading={isSendingAuthRequest}
|
||||
onSubmit={onSubmitForgotPassword}
|
||||
error={!!authRequestError}
|
||||
success={!!authRequestSuccess}
|
||||
>
|
||||
<Form.Field>
|
||||
<label>Email</label>
|
||||
<input
|
||||
placeholder="bob@gmail.com"
|
||||
type="email"
|
||||
value={email}
|
||||
onChange={changeEmail}
|
||||
/>
|
||||
</Form.Field>
|
||||
<Error
|
||||
header="Forgot Password Request failed!"
|
||||
error={authRequestError}
|
||||
/>
|
||||
<Message success>
|
||||
<Message.Header>Password Reset Sent!</Message.Header>
|
||||
<p>If the email exists, a password reset link will be sent to it.</p>
|
||||
</Message>
|
||||
<Button.Group>
|
||||
<Button type="submit" primary>Request Password Reset</Button>
|
||||
<Button as={Link} to="/auth/login" secondary>Login</Button>
|
||||
</Button.Group>
|
||||
</Form>
|
||||
</Container>
|
||||
);
|
||||
|
||||
export default connect(mapStateToProps)(ForgotPassword);
|
@@ -1,7 +1,7 @@
|
||||
import React, { Component } from "react";
|
||||
import { connect } from "react-redux";
|
||||
import { Redirect } from "react-router-dom";
|
||||
import { Container, Form, Header, Message } from "semantic-ui-react";
|
||||
import { Link, Redirect } from "react-router-dom";
|
||||
import { Button, Container, Form, Header, Message } from "semantic-ui-react";
|
||||
|
||||
import {
|
||||
clearAuthRequestError,
|
||||
@@ -102,7 +102,12 @@ const LoginView = ({
|
||||
<Message.Header>Login successful!</Message.Header>
|
||||
<p>Redirecting you now...</p>
|
||||
</Message>
|
||||
<Form.Button>Login</Form.Button>
|
||||
<Button.Group>
|
||||
<Button type="submit" primary>Login</Button>
|
||||
<Button as={Link} to="/auth/forgot-password" secondary>
|
||||
Forgot Password
|
||||
</Button>
|
||||
</Button.Group>
|
||||
</Form>
|
||||
</Container>
|
||||
);
|
||||
|
@@ -117,7 +117,7 @@ const RegisterView = ({
|
||||
/>
|
||||
</Form.Field>
|
||||
<Form.Field>
|
||||
<label>Password Confirmation</label>
|
||||
<label>Confirm Password</label>
|
||||
<input
|
||||
placeholder="••••••••"
|
||||
type="password"
|
||||
@@ -130,7 +130,7 @@ const RegisterView = ({
|
||||
<Message.Header>Confirmation Email Sent!</Message.Header>
|
||||
<p>Please check your email to confirm your registration.</p>
|
||||
</Message>
|
||||
<Form.Button>Register</Form.Button>
|
||||
<Form.Button primary>Register</Form.Button>
|
||||
</Form>
|
||||
</Container>
|
||||
);
|
||||
|
118
src/components/Auth/ResetPassword.jsx
Normal file
118
src/components/Auth/ResetPassword.jsx
Normal file
@@ -0,0 +1,118 @@
|
||||
import React, { Component } from "react";
|
||||
import { connect } from "react-redux";
|
||||
import { Link, Redirect } from "react-router-dom";
|
||||
import { Container, Form, Header, Message } from "semantic-ui-react";
|
||||
|
||||
import {
|
||||
clearAuthRequestError,
|
||||
clearAuthRequestSuccess,
|
||||
setFormPassword,
|
||||
setFormPasswordConfirmation
|
||||
} from "../../actions/auth/reducer.actions";
|
||||
import { sendResetPasswordRequest } from "../../actions/auth/saga.actions";
|
||||
import Error from "../Shared/Error";
|
||||
|
||||
class ResetPassword extends Component {
|
||||
componentWillMount() {
|
||||
this.props.dispatch(clearAuthRequestError());
|
||||
this.props.dispatch(clearAuthRequestSuccess());
|
||||
}
|
||||
|
||||
changePassword = event => {
|
||||
this.props.dispatch(setFormPassword(event.target.value));
|
||||
};
|
||||
|
||||
changePasswordConfirmation = event => {
|
||||
this.props.dispatch(setFormPasswordConfirmation(event.target.value));
|
||||
};
|
||||
|
||||
onSubmitResetPassword = event => {
|
||||
event.preventDefault();
|
||||
const { dispatch, password, passwordConfirmation } = this.props;
|
||||
const { uid, token } = this.props.match.params;
|
||||
dispatch(
|
||||
sendResetPasswordRequest({
|
||||
uid,
|
||||
token,
|
||||
new_password1: password,
|
||||
new_password2: passwordConfirmation
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
isSendingAuthRequest,
|
||||
authRequestError,
|
||||
authRequestSuccess,
|
||||
password,
|
||||
passwordConfirmation,
|
||||
userToken
|
||||
} = this.props;
|
||||
if (userToken) return <Redirect to={"/"} />;
|
||||
return (
|
||||
<ResetPasswordView
|
||||
isSendingAuthRequest={isSendingAuthRequest}
|
||||
authRequestError={authRequestError}
|
||||
authRequestSuccess={authRequestSuccess}
|
||||
password={password}
|
||||
passwordConfirmation={passwordConfirmation}
|
||||
changePassword={this.changePassword}
|
||||
changePasswordConfirmation={this.changePasswordConfirmation}
|
||||
onSubmitResetPassword={this.onSubmitResetPassword}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function mapStateToProps(state) {
|
||||
return { ...state.auth };
|
||||
}
|
||||
|
||||
const ResetPasswordView = ({
|
||||
isSendingAuthRequest,
|
||||
authRequestError,
|
||||
authRequestSuccess,
|
||||
password,
|
||||
passwordConfirmation,
|
||||
changePassword,
|
||||
changePasswordConfirmation,
|
||||
onSubmitResetPassword
|
||||
}) => (
|
||||
<Container>
|
||||
<Header>Reset Password</Header>
|
||||
<Form
|
||||
loading={isSendingAuthRequest}
|
||||
onSubmit={onSubmitResetPassword}
|
||||
error={!!authRequestError}
|
||||
success={!!authRequestSuccess}
|
||||
>
|
||||
<Form.Field>
|
||||
<label>New Password</label>
|
||||
<input
|
||||
placeholder="••••••••"
|
||||
type="password"
|
||||
value={password}
|
||||
onChange={changePassword}
|
||||
/>
|
||||
</Form.Field>
|
||||
<Form.Field>
|
||||
<label>Confirm New Password</label>
|
||||
<input
|
||||
placeholder="••••••••"
|
||||
type="password"
|
||||
value={passwordConfirmation}
|
||||
onChange={changePasswordConfirmation}
|
||||
/>
|
||||
</Form.Field>
|
||||
<Error header="Reset Password failed!" error={authRequestError} />
|
||||
<Message success>
|
||||
<Message.Header>Password Reset!</Message.Header>
|
||||
<p>You may now <Link to="/auth/login">log in</Link> with the new credentials.</p>
|
||||
</Message>
|
||||
<Form.Button primary>Reset Password</Form.Button>{" "}
|
||||
</Form>
|
||||
</Container>
|
||||
);
|
||||
|
||||
export default connect(mapStateToProps)(ResetPassword);
|
@@ -131,7 +131,7 @@ const SettingsView = ({
|
||||
<Message.Header>Password Successfully Changed!</Message.Header>
|
||||
<p>New password has been set.</p>
|
||||
</Message>
|
||||
<Form.Button>Change Password</Form.Button>
|
||||
<Form.Button primary>Change Password</Form.Button>
|
||||
</Form>
|
||||
</Segment>
|
||||
</Container>
|
||||
|
@@ -88,7 +88,7 @@ const VerifyEmailView = ({
|
||||
<Message.Header>Email Verified!</Message.Header>
|
||||
<p>Please proceed to <Link to="/auth/login">log in</Link>.</p>
|
||||
</Message>
|
||||
<Form.Button>Verify Email</Form.Button>
|
||||
<Form.Button primary>Verify Email</Form.Button>
|
||||
</Form>
|
||||
</Container>
|
||||
);
|
||||
|
Reference in New Issue
Block a user