mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-01-28 17:52:21 +01:00
2033329342
and prrofile-custom-fields/
92 lines
3.1 KiB
TypeScript
92 lines
3.1 KiB
TypeScript
import React, { ReactNode, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { FabModal } from '../../base/fab-modal';
|
|
import { PaymentSchedule } from '../../../models/payment-schedule';
|
|
import { User } from '../../../models/user';
|
|
import mastercardLogo from '../../../../../images/mastercard.png';
|
|
import visaLogo from '../../../../../images/visa.png';
|
|
import payzenLogo from '../../../../../images/payzen-secure.png';
|
|
import { PayzenForm } from './payzen-form';
|
|
|
|
interface PayzenCardUpdateModalProps {
|
|
isOpen: boolean,
|
|
toggleModal: () => void,
|
|
onSuccess: () => void,
|
|
schedule: PaymentSchedule,
|
|
operator: User
|
|
}
|
|
|
|
/**
|
|
* Modal dialog to allow the member to update his payment card for a payment schedule, when the PayZen gateway is used
|
|
*/
|
|
export const PayzenCardUpdateModal: React.FC<PayzenCardUpdateModalProps> = ({ isOpen, toggleModal, onSuccess, schedule, operator }) => {
|
|
const { t } = useTranslation('shared');
|
|
|
|
// prevent submitting the form to update the card details, until the user has filled correctly all required fields
|
|
const [canSubmitUpdateCard, setCanSubmitUpdateCard] = useState<boolean>(true);
|
|
// we save errors here, if any, for display purposes.
|
|
const [errors, setErrors] = useState<string>(null);
|
|
|
|
// the unique identifier of the html form
|
|
const formId = 'payzen-card';
|
|
|
|
/**
|
|
* Return the logos, shown in the modal footer.
|
|
*/
|
|
const logoFooter = (): ReactNode => {
|
|
return (
|
|
<div className="payzen-modal-icons">
|
|
<img src={payzenLogo} alt="powered by PayZen" />
|
|
<img src={mastercardLogo} alt="mastercard" />
|
|
<img src={visaLogo} alt="visa" />
|
|
</div>
|
|
);
|
|
};
|
|
|
|
/**
|
|
* When the user clicks the submit button, we disable it to prevent double form submission
|
|
*/
|
|
const handleCardUpdateSubmit = (): void => {
|
|
setCanSubmitUpdateCard(false);
|
|
};
|
|
|
|
/**
|
|
* When the card was not updated, show the error
|
|
*/
|
|
const handleCardUpdateError = (error): void => {
|
|
setErrors(error);
|
|
setCanSubmitUpdateCard(true);
|
|
};
|
|
|
|
return (
|
|
<FabModal title={t('app.shared.payzen_card_update_modal.update_card')}
|
|
isOpen={isOpen}
|
|
toggleModal={toggleModal}
|
|
closeButton={false}
|
|
customFooter={logoFooter()}
|
|
className="payzen-card-update-modal">
|
|
{schedule && <PayzenForm onSubmit={handleCardUpdateSubmit}
|
|
onSuccess={onSuccess}
|
|
onError={handleCardUpdateError}
|
|
className="card-form"
|
|
paymentSchedule={schedule}
|
|
operator={operator}
|
|
customer={schedule.user as User}
|
|
updateCard={true}
|
|
formId={formId} >
|
|
{errors && <div className="payzen-errors">
|
|
{errors}
|
|
</div>}
|
|
</PayzenForm>}
|
|
<div className="submit-card">
|
|
{canSubmitUpdateCard && <button type="submit" disabled={!canSubmitUpdateCard} form={formId} className="submit-card-btn">{t('app.shared.payzen_card_update_modal.validate_button')}</button>}
|
|
{!canSubmitUpdateCard && <div className="payment-pending">
|
|
<div className="fa-2x">
|
|
<i className="fas fa-circle-notch fa-spin" />
|
|
</div>
|
|
</div>}
|
|
</div>
|
|
</FabModal>
|
|
);
|
|
};
|