2021-04-08 15:21:24 +02:00
|
|
|
import React, { FunctionComponent, ReactNode } from 'react';
|
2020-12-08 17:30:33 +01:00
|
|
|
import { SetupIntent } from '@stripe/stripe-js';
|
2021-04-08 10:46:09 +02:00
|
|
|
import { StripeElements } from './stripe-elements';
|
2020-11-25 17:13:45 +01:00
|
|
|
import { StripeForm } from './stripe-form';
|
2021-04-09 08:47:34 +02:00
|
|
|
import { GatewayFormProps, AbstractPaymentModal } from '../abstract-payment-modal';
|
|
|
|
import { CartItems, PaymentConfirmation } from '../../../models/payment';
|
|
|
|
import { PaymentSchedule } from '../../../models/payment-schedule';
|
|
|
|
import { User } from '../../../models/user';
|
2020-11-25 17:13:45 +01:00
|
|
|
|
2021-04-09 08:47:34 +02:00
|
|
|
import stripeLogo from '../../../../../images/powered_by_stripe.png';
|
|
|
|
import mastercardLogo from '../../../../../images/mastercard.png';
|
|
|
|
import visaLogo from '../../../../../images/visa.png';
|
2020-11-24 13:26:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
interface StripeModalProps {
|
|
|
|
isOpen: boolean,
|
|
|
|
toggleModal: () => void,
|
2020-12-08 17:30:33 +01:00
|
|
|
afterSuccess: (result: SetupIntent|PaymentConfirmation) => void,
|
2020-12-01 17:55:23 +01:00
|
|
|
cartItems: CartItems,
|
2020-11-24 13:26:15 +01:00
|
|
|
currentUser: User,
|
2020-12-01 17:55:23 +01:00
|
|
|
schedule: PaymentSchedule,
|
2020-12-08 12:26:03 +01:00
|
|
|
customer: User
|
2020-11-24 13:26:15 +01:00
|
|
|
}
|
|
|
|
|
2021-04-07 16:21:12 +02:00
|
|
|
/**
|
2021-04-08 15:21:24 +02:00
|
|
|
* This component enables the user to input his card data or process payments, using the Stripe gateway.
|
2021-04-07 16:21:12 +02:00
|
|
|
* Supports Strong-Customer Authentication (SCA).
|
2021-04-09 12:09:54 +02:00
|
|
|
*
|
|
|
|
* This component should not be called directly. Prefer using <PaymentModal> which can handle the configuration
|
|
|
|
* of a different payment gateway.
|
2021-04-07 16:21:12 +02:00
|
|
|
*/
|
2021-04-09 09:03:59 +02:00
|
|
|
export const StripeModal: React.FC<StripeModalProps> = ({ isOpen, toggleModal, afterSuccess, cartItems, currentUser, schedule, customer }) => {
|
2020-11-24 16:26:18 +01:00
|
|
|
/**
|
2020-11-30 16:52:55 +01:00
|
|
|
* Return the logos, shown in the modal footer.
|
2020-11-24 13:26:15 +01:00
|
|
|
*/
|
2020-11-30 16:52:55 +01:00
|
|
|
const logoFooter = (): ReactNode => {
|
2020-11-24 13:26:15 +01:00
|
|
|
return (
|
2020-11-30 16:52:55 +01:00
|
|
|
<div className="stripe-modal-icons">
|
|
|
|
<i className="fa fa-lock fa-2x m-r-sm pos-rlt" />
|
|
|
|
<img src={stripeLogo} alt="powered by stripe" />
|
|
|
|
<img src={mastercardLogo} alt="mastercard" />
|
|
|
|
<img src={visaLogo} alt="visa" />
|
|
|
|
</div>
|
2020-11-24 13:26:15 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2020-12-02 10:06:18 +01:00
|
|
|
/**
|
2021-04-08 15:21:24 +02:00
|
|
|
* Integrates the StripeForm into the parent PaymentModal
|
2020-12-01 17:55:23 +01:00
|
|
|
*/
|
2021-04-08 15:21:24 +02:00
|
|
|
const renderForm: FunctionComponent<GatewayFormProps> = ({ onSubmit, onSuccess, onError, operator, className, formId, cartItems, customer, paymentSchedule, children}) => {
|
|
|
|
return (
|
|
|
|
<StripeElements>
|
|
|
|
<StripeForm onSubmit={onSubmit}
|
|
|
|
onSuccess={onSuccess}
|
|
|
|
onError={onError}
|
|
|
|
operator={operator}
|
|
|
|
className={className}
|
|
|
|
formId={formId}
|
2020-12-01 17:55:23 +01:00
|
|
|
cartItems={cartItems}
|
2020-12-08 12:26:03 +01:00
|
|
|
customer={customer}
|
2021-04-08 15:21:24 +02:00
|
|
|
paymentSchedule={paymentSchedule}>
|
|
|
|
{children}
|
2020-11-30 16:52:55 +01:00
|
|
|
</StripeForm>
|
2021-04-08 15:21:24 +02:00
|
|
|
</StripeElements>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
2021-04-09 08:40:46 +02:00
|
|
|
<AbstractPaymentModal className="stripe-modal"
|
|
|
|
isOpen={isOpen}
|
|
|
|
toggleModal={toggleModal}
|
|
|
|
logoFooter={logoFooter()}
|
|
|
|
formId="stripe-form"
|
|
|
|
formClassName="stripe-form"
|
|
|
|
currentUser={currentUser}
|
|
|
|
cartItems={cartItems}
|
|
|
|
customer={customer}
|
|
|
|
afterSuccess={afterSuccess}
|
|
|
|
schedule={schedule}
|
|
|
|
GatewayForm={renderForm} />
|
2020-11-24 13:26:15 +01:00
|
|
|
);
|
|
|
|
}
|