From a1219e8f653bef0093d1ad0462a99c0be25b1b68 Mon Sep 17 00:00:00 2001 From: Fabien O'Carroll Date: Fri, 22 Feb 2019 07:30:00 +0100 Subject: [PATCH] Added upgrade page to members auth (#10513) no-issue --- .../members/static/auth/components/Modal.js | 16 ++- .../static/auth/pages/StripeSubscribePage.js | 118 ++++++++++++++++++ 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 core/server/lib/members/static/auth/pages/StripeSubscribePage.js diff --git a/core/server/lib/members/static/auth/components/Modal.js b/core/server/lib/members/static/auth/components/Modal.js index 72f5b53f8a..dc12c4e9d9 100644 --- a/core/server/lib/members/static/auth/components/Modal.js +++ b/core/server/lib/members/static/auth/components/Modal.js @@ -9,6 +9,7 @@ import PasswordResetSentPage from '../pages/PasswordResetSentPage'; import ResetPasswordPage from '../pages/ResetPasswordPage'; import StripePaymentPage from '../pages/StripePaymentPage'; import { IconClose } from '../components/icons'; +import StripeSubscribePage from '../pages/StripeSubscribePage'; export default class Modal extends Component { constructor(props, context) { @@ -55,7 +56,19 @@ export default class Modal extends Component { } return ( - ) + ); + } + + renderUpgradePage(props, state) { + const { error, paymentConfig } = state; + const { members } = this.context; + const closeModal = () => this.close(); + const createSubscription = (data) => this.handleAction( + members.createSubscription(data) + ); + const stripeConfig = paymentConfig && paymentConfig.find(({adapter}) => adapter === 'stripe'); + return + } render(props, state) { @@ -83,6 +96,7 @@ export default class Modal extends Component { {this.renderSignupPage({error, stripeConfig, members, signup, closeModal})} + {this.renderUpgradePage(props, state)} diff --git a/core/server/lib/members/static/auth/pages/StripeSubscribePage.js b/core/server/lib/members/static/auth/pages/StripeSubscribePage.js new file mode 100644 index 0000000000..cd0521b502 --- /dev/null +++ b/core/server/lib/members/static/auth/pages/StripeSubscribePage.js @@ -0,0 +1,118 @@ +import { Elements, StripeProvider, injectStripe } from 'react-stripe-elements'; +import { Component } from 'react'; +import FormHeader from '../components/FormHeader'; +import FormSubmit from '../components/FormSubmit'; +import FormHeaderCTA from '../components/FormHeaderCTA'; +import { IconClose } from '../components/icons'; +import NameInput from '../components/NameInput'; +import EmailInput from '../components/EmailInput'; +import PasswordInput from '../components/PasswordInput'; +import CheckoutForm from '../components/CheckoutForm'; +import Form from '../components/Form'; + +class PaymentForm extends Component { + + constructor(props) { + super(props); + } + + handleSubmit = ({ name, email, password, plan }) => { + // Within the context of `Elements`, this call to createToken knows which Element to + // tokenize, since there's only one in this group. + plan = this.props.selectedPlan ? this.props.selectedPlan.name : ""; + this.props.stripe.createToken({ name: name }).then(({ token }) => { + this.props.handleSubmit({ + adapter: 'stripe', + plan: plan, + stripeToken: token.id, + name, email, password + }); + }); + }; + + render({frameLocation}) { + return ( +
this.handleSubmit(data)}> + + + + + ); + } +} + +const PaymentFormWrapped = injectStripe(PaymentForm); + +export default class StripeSubscriptionPage extends Component { + constructor(props) { + super(props); + this.plans = props.stripeConfig.config.plans || []; + this.state = { + selectedPlan: this.plans[0] ? this.plans[0] : "" + } + } + + renderPlan({ currency, amount, id, interval, name }) { + const selectedPlanId = this.state.selectedPlan ? this.state.selectedPlan.id : ""; + return ( +
+ + +
+ ) + } + + changePlan(e) { + const plan = this.plans.find(plan => plan.id === e.target.value); + this.setState({ + selectedPlan: plan + }) + } + + renderPlans(plans) { + return ( +
this.changePlan(e)}> + { + plans.map((plan) => this.renderPlan(plan)) + } +
+ ); + } + + renderPlansSection() { + return ( +
+
+
+
+

Expensive Publication

+ Subscription +
+
+ {this.renderPlans(this.plans)} +
+ ) + } + + render({ error, handleSubmit, stripeConfig }) { + const publicKey = stripeConfig.config.publicKey || ''; + return ( +
+
+ + + + + + + + +
+ {this.renderPlansSection()} +
+ ) + } +};