PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.3.1
GiveWP – Donation Plugin and Fundraising Platform v3.3.1
4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / DonorDashboards / resources / js / app / components / subscription-manager / index.js
give / src / DonorDashboards / resources / js / app / components / subscription-manager Last commit date
amount-control 4 years ago payment-method-control 3 years ago utils 3 years ago index.js 4 years ago style.scss 4 years ago
index.js
123 lines
1 import {Fragment, useMemo, useRef, useState} from 'react';
2 import FieldRow from '../field-row';
3 import Button from '../button';
4 import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
5
6 import {__} from '@wordpress/i18n';
7
8 import AmountControl from './amount-control';
9 import PaymentMethodControl from './payment-method-control';
10
11 import {updateSubscriptionWithAPI} from './utils';
12
13 import './style.scss';
14
15 /**
16 * Normalize an amount
17 *
18 * @param {string} float
19 * @param {number} decimals
20 * @return {string|NaN}
21 */
22 const normalizeAmount = (float, decimals) => Number.parseFloat(float).toFixed(decimals);
23
24 // There is no error handling whatsoever, that will be necessary.
25 const SubscriptionManager = ({id, subscription}) => {
26 const gatewayRef = useRef();
27
28 const [amount, setAmount] = useState(() =>
29 normalizeAmount(subscription.payment.amount.raw, subscription.payment.currency.numberDecimals)
30 );
31 const [isUpdating, setIsUpdating] = useState(false);
32 const [updated, setUpdated] = useState(false);
33
34 // Prepare data for amount control
35 const {max, min, options} = useMemo(() => {
36 const {numberDecimals} = subscription.payment.currency;
37 const {custom_amount} = subscription.form;
38
39 const options = subscription.form.amounts.map((amount) => ({
40 value: normalizeAmount(amount.raw, numberDecimals),
41 label: amount.formatted,
42 }));
43
44 if (custom_amount) {
45 options.push({
46 value: 'custom_amount',
47 label: __('Custom Amount', 'give'),
48 });
49 }
50
51 return {
52 max: normalizeAmount(custom_amount?.maximum, numberDecimals),
53 min: normalizeAmount(custom_amount?.minimum, numberDecimals),
54 options,
55 };
56 }, [subscription]);
57
58 const handleUpdate = async () => {
59 if (isUpdating) {
60 return;
61 }
62
63 setIsUpdating(true);
64
65 const paymentMethod = gatewayRef.current ?
66 await gatewayRef.current.getPaymentMethod() :
67 {};
68
69 if ('error' in paymentMethod) {
70 setIsUpdating(false);
71 return;
72 }
73
74 await updateSubscriptionWithAPI({
75 id,
76 amount,
77 paymentMethod,
78 });
79
80 setUpdated(true);
81 setIsUpdating(false);
82 };
83
84 return (
85 <Fragment>
86 <AmountControl
87 currency={subscription.payment.currency}
88 options={options}
89 max={max}
90 min={min}
91 value={amount}
92 onChange={setAmount}
93 />
94 <PaymentMethodControl
95 forwardedRef={gatewayRef}
96 label={__('Payment Method', 'give')}
97 gateway={subscription.gateway}
98 />
99 <FieldRow>
100 <div>
101 <Button onClick={handleUpdate}>
102 {updated ? (
103 <Fragment>
104 {__('Updated', 'give')} <FontAwesomeIcon icon="check" fixedWidth/>
105 </Fragment>
106 ) : (
107 <Fragment>
108 {__('Update Subscription', 'give')}{' '}
109 <FontAwesomeIcon
110 className={isUpdating ? 'give-donor-dashboard__subscription-manager-spinner' : ''}
111 icon={isUpdating ? 'spinner' : 'save'}
112 fixedWidth
113 />
114 </Fragment>
115 )}
116 </Button>
117 </div>
118 </FieldRow>
119 </Fragment>
120 );
121 };
122 export default SubscriptionManager;
123