Add password reset, fixes #13

stable/1.0.x
Alex Gleason 2020-05-24 19:37:15 -05:00
rodzic 69df2728f4
commit 438d8009d4
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 7211D1F99744FBB7
5 zmienionych plików z 62 dodań i 6 usunięć

Wyświetl plik

@ -162,7 +162,8 @@ export function resetPassword(nickNameOrEmail) {
return api(getState).post('/auth/password', params).then(() => {
dispatch({ type: RESET_PASSWORD_SUCCESS });
}).catch(error => {
dispatch({ type: RESET_PASSWORD_FAIL });
dispatch({ type: RESET_PASSWORD_FAIL, error });
throw error;
});
};
}

Wyświetl plik

@ -1,5 +1,6 @@
import React from 'react';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { logIn } from 'gabsocial/actions/auth';
import { fetchMe } from 'gabsocial/actions/me';
@ -40,9 +41,9 @@ class LoginForm extends ImmutablePureComponent {
<div className='input password optional user_password'>
<input aria-label='Password' className='password optional' placeholder='Password' type='password' name='password' />
</div>
{/* <p className='hint subtle-hint'>
<Link to='/auth/password/new'>Trouble logging in?</Link>
</p> */}
<p className='hint subtle-hint'>
<Link to='/auth/reset_password'>Trouble logging in?</Link>
</p>
</div>
</fieldset>
<div className='actions'>

Wyświetl plik

@ -0,0 +1,50 @@
import React from 'react';
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { resetPassword } from 'gabsocial/actions/auth';
import { SimpleForm, FieldsGroup, TextInput } from 'gabsocial/features/forms';
import { Redirect } from 'react-router-dom';
import { showAlert } from 'gabsocial/actions/alerts';
export default @connect()
class PasswordReset extends ImmutablePureComponent {
state = {
isLoading: false,
success: false,
}
handleSubmit = e => {
const { dispatch } = this.props;
const nicknameOrEmail = e.target.nickname_or_email.value;
this.setState({ isLoading: true });
dispatch(resetPassword(nicknameOrEmail)).then(() => {
this.setState({ isLoading: false, success: true });
dispatch(showAlert('Password reset received. Check your email for further instructions.', ''));
}).catch(error => {
this.setState({ isLoading: false });
});
}
render() {
if (this.state.success) return <Redirect to='/' />;
return (
<SimpleForm onSubmit={this.handleSubmit}>
<fieldset disabled={this.state.isLoading}>
<FieldsGroup>
<TextInput
name='nickname_or_email'
label='Email or username'
placeholder='me@example.com'
/>
</FieldsGroup>
</fieldset>
<div className='actions'>
<button name='button' type='submit' className='btn button button-primary'>Reset password</button>
</div>
</SimpleForm>
);
}
}

Wyświetl plik

@ -71,6 +71,7 @@ import {
LoginPage,
Preferences,
EditProfile,
PasswordReset,
} from './util/async-components';
// Dummy import, to make sure that <Status /> ends up in the application bundle.
@ -191,9 +192,8 @@ class SwitchingColumnsArea extends React.PureComponent {
return (
<Switch>
{/* <WrappedRoute path='/' component={} publicRoute exact /> */}
<WrappedRoute path='/auth/sign_in' component={LoginPage} publicRoute exact />
{/* <WrappedRoute path='/auth/sign_out' component={LogoutForm} publicRoute exact /> */}
<WrappedRoute path='/auth/reset_password' component={PasswordReset} publicRoute exact />
<WrappedRoute path='/' exact page={HomePage} component={HomeTimeline} content={children} />
<WrappedRoute path='/timeline/local' exact page={HomePage} component={CommunityTimeline} content={children} />

Wyświetl plik

@ -173,3 +173,7 @@ export function Preferences() {
export function EditProfile() {
return import(/* webpackChunkName: "features/edit_profile" */'../../edit_profile');
}
export function PasswordReset() {
return import(/* webpackChunkName: "features/auth_login" */'../../auth_login/components/password_reset');
}