feat: added danger zone
This commit is contained in:
committed by
mrugesh mohapatra
parent
2a61d4327c
commit
e51b8bfaca
@ -26,6 +26,7 @@ import Internet from '../components/settings/Internet';
|
|||||||
import Portfolio from '../components/settings/Portfolio';
|
import Portfolio from '../components/settings/Portfolio';
|
||||||
import Honesty from '../components/settings/Honesty';
|
import Honesty from '../components/settings/Honesty';
|
||||||
import Certification from '../components/settings/Certification';
|
import Certification from '../components/settings/Certification';
|
||||||
|
import DangerZone from '../components/settings/DangerZone';
|
||||||
import RedirectHome from '../components/RedirectHome';
|
import RedirectHome from '../components/RedirectHome';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
@ -254,6 +255,7 @@ function ShowSettings(props) {
|
|||||||
verifyCert={verifyCert}
|
verifyCert={verifyCert}
|
||||||
/>
|
/>
|
||||||
<Spacer />
|
<Spacer />
|
||||||
|
<DangerZone />
|
||||||
</main>
|
</main>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
|
99
client/src/components/settings/DangerZone.js
Normal file
99
client/src/components/settings/DangerZone.js
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { Button, Alert, Panel } from '@freecodecamp/react-bootstrap';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { bindActionCreators } from 'redux';
|
||||||
|
|
||||||
|
import { FullWidthRow, ButtonSpacer, Spacer } from '../helpers';
|
||||||
|
import DeleteModal from './DeleteModal';
|
||||||
|
|
||||||
|
import {deleteAccount, resetProgress } from '../../redux/settings';
|
||||||
|
|
||||||
|
import './danger-zone.css';
|
||||||
|
import ResetModal from './ResetModal';
|
||||||
|
|
||||||
|
const propTypes = {
|
||||||
|
deleteAccount: PropTypes.func.isRequired,
|
||||||
|
resetProgress: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
const mapStateToProps = () => ({});
|
||||||
|
const mapDispatchToProps = dispatch =>
|
||||||
|
bindActionCreators({
|
||||||
|
deleteAccount,
|
||||||
|
resetProgress
|
||||||
|
}, dispatch);
|
||||||
|
|
||||||
|
class DangerZone extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
reset: false,
|
||||||
|
delete: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleResetModal = () => {
|
||||||
|
return this.setState(state => ({
|
||||||
|
...state,
|
||||||
|
reset: !state.reset
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleDeleteModal = () => {
|
||||||
|
return this.setState(state => ({
|
||||||
|
...state,
|
||||||
|
delete: !state.delete
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className='danger-zone'>
|
||||||
|
<FullWidthRow>
|
||||||
|
<Panel>
|
||||||
|
<Spacer />
|
||||||
|
<Alert bsStyle='danger' className='alert-danger-zone'>
|
||||||
|
Please be careful! Changes in this section are permanent.
|
||||||
|
</Alert>
|
||||||
|
<FullWidthRow>
|
||||||
|
<Button
|
||||||
|
block={true}
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='danger'
|
||||||
|
className='btn-danger'
|
||||||
|
type='button'
|
||||||
|
onClick={() => this.toggleResetModal()}>
|
||||||
|
Reset all of my progress
|
||||||
|
</Button>
|
||||||
|
<ButtonSpacer />
|
||||||
|
<Button
|
||||||
|
block={true}
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='danger'
|
||||||
|
className='btn-danger'
|
||||||
|
type='button'
|
||||||
|
onClick={() => this.toggleDeleteModal()}>
|
||||||
|
Delete my account
|
||||||
|
</Button>
|
||||||
|
</FullWidthRow>
|
||||||
|
</Panel>
|
||||||
|
<ResetModal
|
||||||
|
onHide={() => this.toggleResetModal()}
|
||||||
|
show={this.state.reset} />
|
||||||
|
<DeleteModal
|
||||||
|
onHide={() => this.toggleDeleteModal()}
|
||||||
|
show={this.state.delete} />
|
||||||
|
</FullWidthRow>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DangerZone.displayName = 'DangerZone';
|
||||||
|
DangerZone.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default connect(
|
||||||
|
mapStateToProps,
|
||||||
|
mapDispatchToProps
|
||||||
|
)(DangerZone);
|
76
client/src/components/settings/DeleteModal.js
Normal file
76
client/src/components/settings/DeleteModal.js
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import { ButtonSpacer } from '../helpers';
|
||||||
|
import { Button, Modal } from '@freecodecamp/react-bootstrap'
|
||||||
|
|
||||||
|
import './DangerZone'
|
||||||
|
|
||||||
|
const propTypes = {
|
||||||
|
delete: PropTypes.func.isRequired,
|
||||||
|
onHide: PropTypes.func.isRequired,
|
||||||
|
show: PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
function DeleteModal(props) {
|
||||||
|
const { show, onHide } = props;
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
aria-labelledby='modal-title'
|
||||||
|
autoFocus={true}
|
||||||
|
backdrop={true}
|
||||||
|
bsSize='lg'
|
||||||
|
keyboard={true}
|
||||||
|
onHide={onHide}
|
||||||
|
show={show}>
|
||||||
|
<Modal.Header closeButton={true}>
|
||||||
|
<Modal.Title id='modal-title'>Delete My Account</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<p>
|
||||||
|
This will really delete all your data, including all your progress
|
||||||
|
and account information.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We won't be able to recover any of it for you later,
|
||||||
|
even if you change your mind.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If there's something we could do better, send us an email instead and
|
||||||
|
we'll do our best:  
|
||||||
|
<a href='mailto:team@freecodecamp.org' title='team@freecodecamp.org'>
|
||||||
|
team@freecodecamp.org
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<Button
|
||||||
|
block={true}
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className='btn-invert'
|
||||||
|
type='button'
|
||||||
|
onClick={props.onHide}>
|
||||||
|
Nevermind, I don't want to delete my account
|
||||||
|
</Button>
|
||||||
|
<ButtonSpacer />
|
||||||
|
<Button
|
||||||
|
block={true}
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='danger'
|
||||||
|
className='btn-danger'
|
||||||
|
type='button'
|
||||||
|
onClick={props.delete}>
|
||||||
|
I am 100% certain. Delete everything related to this account
|
||||||
|
</Button>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<Button onClick={props.onHide}>Close</Button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteModal.displayName = 'DeleteModal';
|
||||||
|
DeleteModal.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default DeleteModal;
|
70
client/src/components/settings/ResetModal.js
Normal file
70
client/src/components/settings/ResetModal.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import { ButtonSpacer } from '../helpers';
|
||||||
|
import { Button, Modal } from '@freecodecamp/react-bootstrap'
|
||||||
|
|
||||||
|
import './DangerZone'
|
||||||
|
|
||||||
|
const propTypes = {
|
||||||
|
reset: PropTypes.func.isRequired,
|
||||||
|
onHide: PropTypes.func.isRequired,
|
||||||
|
show: PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
function ResetModal(props) {
|
||||||
|
const { show, onHide } = props;
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
aria-labelledby='modal-title'
|
||||||
|
autoFocus={true}
|
||||||
|
backdrop={true}
|
||||||
|
bsSize='lg'
|
||||||
|
keyboard={true}
|
||||||
|
onHide={onHide}
|
||||||
|
show={show}>
|
||||||
|
<Modal.Header closeButton={true}>
|
||||||
|
<Modal.Title id='modal-title'>Reset My Progress</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body>
|
||||||
|
<p>
|
||||||
|
This will really delete all of your progress, points, completed
|
||||||
|
challenges, our records of your projects, any certifications you have,
|
||||||
|
everything.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We won't be able to recover any of it for you later, even if you
|
||||||
|
change your mind.
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<Button
|
||||||
|
block={true}
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='primary'
|
||||||
|
className='btn-invert'
|
||||||
|
type='button'
|
||||||
|
onClick={props.onHide}>
|
||||||
|
Nevermind, I don't want to delete all of my progress
|
||||||
|
</Button>
|
||||||
|
<ButtonSpacer />
|
||||||
|
<Button
|
||||||
|
block={true}
|
||||||
|
bsSize='lg'
|
||||||
|
bsStyle='danger'
|
||||||
|
className='btn-danger'
|
||||||
|
type='button'
|
||||||
|
onClick={props.reset}>
|
||||||
|
Reset everything. I want to start from the beginning
|
||||||
|
</Button>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<Button onClick={props.onHide}>Close</Button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetModal.displayName = 'ResetModal';
|
||||||
|
ResetModal.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default ResetModal;
|
4
client/src/components/settings/danger-zone.css
Normal file
4
client/src/components/settings/danger-zone.css
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.btn-danger {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #f11e00;
|
||||||
|
}
|
@ -28,7 +28,9 @@ export const types = createTypes(
|
|||||||
...createAsyncTypes('updateMyEmail'),
|
...createAsyncTypes('updateMyEmail'),
|
||||||
...createAsyncTypes('updateUserFlag'),
|
...createAsyncTypes('updateUserFlag'),
|
||||||
...createAsyncTypes('submitProfileUI'),
|
...createAsyncTypes('submitProfileUI'),
|
||||||
...createAsyncTypes('verifyCert')
|
...createAsyncTypes('verifyCert'),
|
||||||
|
...createAsyncTypes('resetProgress'),
|
||||||
|
...createAsyncTypes('deleteAccount')
|
||||||
],
|
],
|
||||||
ns
|
ns
|
||||||
);
|
);
|
||||||
@ -88,6 +90,14 @@ export const verifyCertComplete = createAction(
|
|||||||
);
|
);
|
||||||
export const verifyCertError = createAction(types.verifyCertError);
|
export const verifyCertError = createAction(types.verifyCertError);
|
||||||
|
|
||||||
|
export const resetProgress = createAction(types.resetProgress);
|
||||||
|
export const resetProgressComplete = createAction(types.resetProgressComplete);
|
||||||
|
export const resetProgressError = createAction(types.resetProgressError);
|
||||||
|
|
||||||
|
export const deleteAccount = createAction(types.deleteAccount);
|
||||||
|
export const deleteAccountComplete = createAction(types.deleteAccountComplete);
|
||||||
|
export const deleteAccountError = createAction(types.deleteAccountError);
|
||||||
|
|
||||||
export const usernameValidationSelector = state => state[ns].usernameValidation;
|
export const usernameValidationSelector = state => state[ns].usernameValidation;
|
||||||
|
|
||||||
export const reducer = handleActions(
|
export const reducer = handleActions(
|
||||||
|
Reference in New Issue
Block a user