feat: add donation form to certificate

This commit is contained in:
Ahmad Abdolsaheb
2019-12-10 15:32:19 +01:00
committed by mrugesh
parent 01d1315835
commit 053dbfbba4
4 changed files with 86 additions and 23 deletions

View File

@ -3,7 +3,9 @@ import PropTypes from 'prop-types';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { Grid, Row, Col, Image } from '@freecodecamp/react-bootstrap'; import { Grid, Row, Col, Image, Button } from '@freecodecamp/react-bootstrap';
// eslint-disable-next-line max-len
import MinimalDonateForm from '../components/Donation/components/MinimalDonateForm';
import { import {
showCertSelector, showCertSelector,
@ -19,7 +21,7 @@ import standardErrorMessage from '../utils/standardErrorMessage';
import reallyWeirdErrorMessage from '../utils/reallyWeirdErrorMessage'; import reallyWeirdErrorMessage from '../utils/reallyWeirdErrorMessage';
import RedirectHome from '../components/RedirectHome'; import RedirectHome from '../components/RedirectHome';
import { Loader, Link } from '../components/helpers'; import { Loader, Spacer } from '../components/helpers';
const propTypes = { const propTypes = {
cert: PropTypes.shape({ cert: PropTypes.shape({
@ -73,6 +75,18 @@ const mapDispatchToProps = dispatch =>
bindActionCreators({ createFlashMessage, showCert }, dispatch); bindActionCreators({ createFlashMessage, showCert }, dispatch);
class ShowCertification extends Component { class ShowCertification extends Component {
constructor(...args) {
super(...args);
this.state = {
showCloseBtn: false,
donationClosed: false
};
this.hideDonationSection = this.hideDonationSection.bind(this);
this.showDonationCloseBtn = this.showDonationCloseBtn.bind(this);
}
componentDidMount() { componentDidMount() {
const { username, certName, validCertName, showCert } = this.props; const { username, certName, validCertName, showCert } = this.props;
if (validCertName) { if (validCertName) {
@ -80,7 +94,17 @@ class ShowCertification extends Component {
} }
return null; return null;
} }
hideDonationSection() {
this.setState({ donationClosed: true });
}
showDonationCloseBtn() {
this.setState({ showCloseBtn: true });
}
render() { render() {
console.log(this.props);
const { const {
cert, cert,
fetchState, fetchState,
@ -92,6 +116,8 @@ class ShowCertification extends Component {
userFetchState userFetchState
} = this.props; } = this.props;
const { donationClosed, showCloseBtn } = this.state;
if (!validCertName) { if (!validCertName) {
createFlashMessage(standardErrorMessage); createFlashMessage(standardErrorMessage);
return <RedirectHome />; return <RedirectHome />;
@ -122,22 +148,49 @@ class ShowCertification extends Component {
completionTime completionTime
} = cert; } = cert;
let conditionalDonationMessage = ''; let conditionalDonationSection = '';
if (userComplete && signedInUserName === username && !isDonating) { const donationCloseBtn = (
conditionalDonationMessage = ( <div>
<Grid> <Spacer />
<Row className='certification-donation text-center'> <Button
<p> block={true}
Only you can see this message. Congratulations on earning this bsSize='sm'
certification. Its no easy task. Running freeCodeCamp isnt easy bsStyle='primary'
either. Nor is it cheap. Help us help you and many other people onClick={this.hideDonationSection}
around the world. Make a tax-deductible supporting donation to our >
nonprofit today. close
</p> </Button>
<Link className={'btn'} to={'/donate'}> </div>
Check out our donation dashboard );
</Link>
if (
userComplete &&
signedInUserName === username &&
!isDonating &&
!donationClosed
) {
conditionalDonationSection = (
<Grid className='donation-section'>
<Row className='certification-donation'>
<Col sm={10} smOffset={1} xs={12}>
<p>
Only you can see this message. Congratulations on earning this
certification. Its no easy task. Running freeCodeCamp isnt
easy either. Nor is it cheap. Help us help you and many other
people around the world. Make a tax-deductible supporting
donation to our nonprofit today.
</p>
</Col>
</Row>
<MinimalDonateForm
changeCloseBtnLabel={this.showDonationCloseBtn}
defaultTheme='light'
/>
<Row className='certification-donation'>
<Col sm={10} smOffset={1} xs={12}>
{showCloseBtn ? donationCloseBtn : ''}
</Col>
</Row> </Row>
</Grid> </Grid>
); );
@ -145,7 +198,7 @@ class ShowCertification extends Component {
return ( return (
<div className='certificate-outer-wrapper'> <div className='certificate-outer-wrapper'>
{conditionalDonationMessage} {conditionalDonationSection}
<Grid className='certificate-wrapper certification-namespace'> <Grid className='certificate-wrapper certification-namespace'>
<Row> <Row>
<header> <header>

View File

@ -19,6 +19,7 @@ import { userSelector } from '../../../redux';
const propTypes = { const propTypes = {
changeCloseBtnLabel: PropTypes.func, changeCloseBtnLabel: PropTypes.func,
defaultTheme: PropTypes.string,
donationAmount: PropTypes.number.isRequired, donationAmount: PropTypes.number.isRequired,
donationDuration: PropTypes.string.isRequired, donationDuration: PropTypes.string.isRequired,
email: PropTypes.string, email: PropTypes.string,
@ -176,7 +177,7 @@ class DonateFormChildViewForHOC extends Component {
renderDonateForm() { renderDonateForm() {
const { isFormValid } = this.state; const { isFormValid } = this.state;
const { getDonationButtonLabel, theme } = this.props; const { getDonationButtonLabel, theme, defaultTheme } = this.props;
return ( return (
<Form className='donation-form' onSubmit={this.handleSubmit}> <Form className='donation-form' onSubmit={this.handleSubmit}>
<FormGroup className='donation-email-container'> <FormGroup className='donation-email-container'>
@ -193,7 +194,7 @@ class DonateFormChildViewForHOC extends Component {
</FormGroup> </FormGroup>
<StripeCardForm <StripeCardForm
getValidationState={this.getValidationState} getValidationState={this.getValidationState}
theme={theme} theme={defaultTheme ? defaultTheme : theme}
/> />
<Button <Button
block={true} block={true}

View File

@ -29,6 +29,7 @@ const numToCommas = num =>
const propTypes = { const propTypes = {
changeCloseBtnLabel: PropTypes.func, changeCloseBtnLabel: PropTypes.func,
defaultTheme: PropTypes.string,
isDonating: PropTypes.bool, isDonating: PropTypes.bool,
isSignedIn: PropTypes.bool, isSignedIn: PropTypes.bool,
navigate: PropTypes.func.isRequired, navigate: PropTypes.func.isRequired,
@ -137,7 +138,7 @@ class ModalDonateForm extends Component {
stripe stripe
} = this.state; } = this.state;
const { changeCloseBtnLabel } = this.props; const { changeCloseBtnLabel, defaultTheme } = this.props;
return ( return (
<div> <div>
{paymentType === 'Card' ? ( {paymentType === 'Card' ? (
@ -145,6 +146,7 @@ class ModalDonateForm extends Component {
<Elements> <Elements>
<DonateFormChildViewForHOC <DonateFormChildViewForHOC
changeCloseBtnLabel={changeCloseBtnLabel} changeCloseBtnLabel={changeCloseBtnLabel}
defaultTheme={defaultTheme}
donationAmount={donationAmount} donationAmount={donationAmount}
donationDuration={donationDuration} donationDuration={donationDuration}
getDonationButtonLabel={this.getDonationButtonLabel} getDonationButtonLabel={this.getDonationButtonLabel}

View File

@ -38,8 +38,8 @@
flex-direction: column; flex-direction: column;
} }
.certificate-outer-wrapper .certification-donation { .certificate-outer-wrapper .donation-section {
padding: 15px 0px; padding: 20px 0px;
} }
.certificate-outer-wrapper .certification-donation .btn { .certificate-outer-wrapper .certification-donation .btn {
@ -54,6 +54,13 @@
color: var(--gray-05); color: var(--gray-05);
} }
.certificate-outer-wrapper .btn[disabled],
.certificate-outer-wrapper .btn[disabled]:hover {
background-color: var(--gray-15);
border-color: var(--quaternary-color);
color: var(--quaternary-color);
}
.certification-namespace header { .certification-namespace header {
width: 100%; width: 100%;
height: 140px; height: 140px;