PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.0.0
GiveWP – Donation Plugin and Fundraising Platform v4.0.0
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 / DonationForms / resources / app / hooks / useFormData.ts
give / src / DonationForms / resources / app / hooks Last commit date
useCurrencyFormatter.ts 2 years ago useDonationSummary.ts 1 year ago useFormData.ts 1 year ago useFormSubmitButton.ts 1 year ago useVisibilityCondition.ts 2 years ago
useFormData.ts
133 lines
1 import type {DonationTotals} from '@givewp/forms/app/store/donation-summary';
2 import {useDonationSummaryContext} from '@givewp/forms/app/store/donation-summary';
3 import type {subscriptionPeriod} from '@givewp/forms/registrars/templates/groups/DonationAmount/subscriptionPeriod';
4
5 /**
6 * Zero decimal currencies are currencies that do not have a minor unit.
7 * For example, the Japanese Yen (JPY) does not have a minor unit.
8 * @since 4.0.0
9 *
10 * @see https://stripe.com/docs/currencies#zero-decimal
11 */
12 const zeroDecimalCurrencies = [
13 'BIF',
14 'CLP',
15 'DJF',
16 'GNF',
17 'JPY',
18 'KMF',
19 'KRW',
20 'MGA',
21 'PYG',
22 'RWF',
23 'UGX',
24 'VND',
25 'VUV',
26 'XAF',
27 'XOF',
28 'XPF',
29 ];
30
31 /**
32 * Takes in an amount value in dollar units and returns the calculated cents (minor) amount
33 *
34 * @since 4.0.0
35 */
36 const amountToMinorUnit = (amount: string, currency: string) => {
37 if (zeroDecimalCurrencies.includes(currency)) {
38 return Math.round(parseFloat(amount));
39 }
40
41 return Math.round(parseFloat(amount) * 100);
42 };
43
44 /**
45 * Donation total calculation
46 *
47 * @since 4.0.0
48 */
49 const getAmountTotal = (totals: DonationTotals, amount: number) =>
50 Number(
51 Object.values({
52 ...totals,
53 amount,
54 }).reduce((total: number, amount: number) => {
55 return total + amount;
56 }, 0)
57 );
58
59 /**
60 * Subscription total calculation
61 * TODO: figure out which totals will be included in subscriptions
62 *
63 * @since 4.0.0
64 */
65 const getSubscriptionTotal = (totals: DonationTotals, amount: number) => {
66 let total = 0;
67
68 // Subscriptions currently only support donation amount (TODO: and potentially feeRecovery values)
69 const allowedKeys = ['feeRecovery'];
70
71 for (const [key, value] of Object.entries(totals)) {
72 if (allowedKeys.includes(key)) {
73 total += value;
74 }
75 }
76
77 return Number(total + amount);
78 };
79
80 /**
81 * @since 4.0.0
82 */
83 export default function useFormData() {
84 const {totals} = useDonationSummaryContext();
85 const {useWatch} = window.givewp.form.hooks;
86
87 const firstName = useWatch({name: 'firstName'}) as string;
88 const lastName = useWatch({name: 'lastName'}) as string | undefined;
89 const email = useWatch({name: 'email'}) as string;
90 const phone = useWatch({name: 'phone'}) as string | undefined;
91 const billingAddress = {
92 addressLine1: useWatch({name: 'address1'}) as string | undefined,
93 addressLine2: useWatch({name: 'address2'}) as string | undefined,
94 city: useWatch({name: 'city'}) as string | undefined,
95 state: useWatch({name: 'state'}) as string | undefined,
96 postalCode: useWatch({name: 'zip'}) as string | undefined,
97 country: useWatch({name: 'country'}) as string | undefined,
98 };
99 const amount = useWatch({name: 'amount'}) as string;
100 const currency = useWatch({name: 'currency'}) as string;
101 const subscriptionPeriod = useWatch({name: 'subscriptionPeriod'}) as subscriptionPeriod | undefined;
102 const subscriptionFrequency = useWatch({name: 'subscriptionFrequency'}) as number | undefined;
103 const subscriptionInstallments = useWatch({name: 'subscriptionInstallments'});
104 const donationType = useWatch({name: 'donationType'}) as 'single' | 'subscription' | undefined;
105
106 const amountTotal = getAmountTotal(totals, Number(amount));
107 const amountTotalInMinorUnits = amountToMinorUnit(amountTotal.toString(), currency);
108 const subscriptionAmountTotal = getSubscriptionTotal(totals, Number(amount));
109 const subscriptionAmountTotalInMinorUnits = amountToMinorUnit(subscriptionAmountTotal.toString(), currency);
110
111 const donationAmount = Number(amount);
112 const donationAmountMinor = amountToMinorUnit(amount, currency);
113
114 const isOneTime = donationType === 'single';
115 const isRecurring = donationType === 'subscription';
116
117 return {
118 firstName,
119 lastName,
120 email,
121 phone,
122 currency,
123 billingAddress,
124 amount: isOneTime ? amountTotal : subscriptionAmountTotal,
125 amountInMinorUnits: isOneTime ? amountTotalInMinorUnits : subscriptionAmountTotalInMinorUnits,
126 isOneTime,
127 isRecurring,
128 subscriptionPeriod,
129 subscriptionFrequency,
130 subscriptionInstallments,
131 };
132 }
133