Files
freeCodeCamp/client/src/components/Donation/PaypalButton.js

109 lines
2.9 KiB
JavaScript
Raw Normal View History

2020-03-13 12:25:57 +03:00
/* eslint-disable camelcase */
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { PayPalButton } from 'react-paypal-button-v2';
import { paypalClientId } from '../../../config/env.json';
import { verifySubscriptionPaypal } from '../../utils/ajax';
import { paypalConfig } from '../../../../config/donation-settings';
import { signInLoadingSelector, userSelector, executeGA } from '../../redux';
const { durationPlans } = paypalConfig;
2020-03-13 12:25:57 +03:00
export class PaypalButton extends Component {
constructor(...props) {
super(...props);
this.state = {
2020-03-17 21:16:08 +05:30
planId: durationPlans.year['6000'].planId
2020-03-13 12:25:57 +03:00
};
this.handleApproval = this.handleApproval.bind(this);
}
handleApproval = data => {
2020-03-17 21:16:08 +05:30
this.props.handleProcessing('year', 6000, 'Paypal payment submission');
2020-03-13 12:25:57 +03:00
this.props.onDonationStateChange(false, true, '');
verifySubscriptionPaypal(data)
.then(response => {
const data = response && response.data;
this.props.onDonationStateChange(
true,
false,
data.error ? data.error : ''
);
})
.catch(error => {
const data =
error.response && error.response.data
? error.response.data
: {
error:
'Something is not right. Please contact team@freecodecamp.org'
};
this.props.onDonationStateChange(false, false, data.error);
});
};
render() {
return (
<PayPalButton
createSubscription={(data, actions) => {
executeGA({
type: 'event',
data: {
category: 'Donation',
action: `Modal Paypal clicked`
}
});
return actions.subscription.create({
plan_id: this.state.planId
});
}}
onApprove={data => {
this.handleApproval(data);
}}
onCancel={() => {
this.props.onDonationStateChange(
false,
false,
'Payment has been canceled.'
);
}}
onError={() =>
this.props.onDonationStateChange(false, false, 'Please try again.')
}
options={{
vault: true,
disableFunding: 'card',
clientId: paypalClientId
}}
style={{
tagline: false,
height: 43
}}
/>
);
}
}
const propTypes = {
handleProcessing: PropTypes.func,
isDonating: PropTypes.bool,
onDonationStateChange: PropTypes.func
};
const mapStateToProps = createSelector(
userSelector,
signInLoadingSelector,
({ isDonating }, showLoading) => ({
isDonating,
showLoading
})
);
PaypalButton.displayName = 'PaypalButton';
PaypalButton.propTypes = propTypes;
export default connect(mapStateToProps)(PaypalButton);