PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 11 months ago useFormSubmitButton.ts 1 year ago useVisibilityCondition.ts 4 months ago
useFormData.ts
143 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.1.0 Round return value
48 * @since 4.0.0
49 */
50 const getAmountTotal = (totals: DonationTotals, amount: number) =>
51 normalizeAmount(
52 Number(
53 Object.values({
54 ...totals,
55 amount,
56 }).reduce((total: number, amount: number) => {
57 return total + amount;
58 }, 0)
59 )
60 );
61
62 /**
63 * Subscription total calculation
64 * TODO: figure out which totals will be included in subscriptions
65 *
66 * @since 4.1.0 Round return value
67 * @since 4.0.0
68 */
69 const getSubscriptionTotal = (totals: DonationTotals, amount: number) => {
70 let total = 0;
71
72 // Subscriptions currently only support donation amount (TODO: and potentially feeRecovery values)
73 const allowedKeys = ['feeRecovery'];
74
75 for (const [key, value] of Object.entries(totals)) {
76 if (allowedKeys.includes(key)) {
77 total += value;
78 }
79 }
80
81 return normalizeAmount(Number(total + amount));
82 };
83
84 /**
85 * @since 4.1.0
86 */
87 const normalizeAmount = (amount: number) => Math.round(amount * 100) / 100;
88
89 /**
90 * @since 4.6.0 Set minor units for donation and subscription amounts when currency is zero decimal
91 * @since 4.0.0
92 */
93 export default function useFormData() {
94 const {totals} = useDonationSummaryContext();
95 const {useWatch} = window.givewp.form.hooks;
96
97 const firstName = useWatch({name: 'firstName'}) as string;
98 const lastName = useWatch({name: 'lastName'}) as string | undefined;
99 const email = useWatch({name: 'email'}) as string;
100 const phone = useWatch({name: 'phone'}) as string | undefined;
101 const billingAddress = {
102 addressLine1: useWatch({name: 'address1'}) as string | undefined,
103 addressLine2: useWatch({name: 'address2'}) as string | undefined,
104 city: useWatch({name: 'city'}) as string | undefined,
105 state: useWatch({name: 'state'}) as string | undefined,
106 postalCode: useWatch({name: 'zip'}) as string | undefined,
107 country: useWatch({name: 'country'}) as string | undefined,
108 };
109 const amount = useWatch({name: 'amount'}) as string;
110 const currency = useWatch({name: 'currency'}) as string;
111 const subscriptionPeriod = useWatch({name: 'subscriptionPeriod'}) as subscriptionPeriod | undefined;
112 const subscriptionFrequency = useWatch({name: 'subscriptionFrequency'}) as number | undefined;
113 const subscriptionInstallments = useWatch({name: 'subscriptionInstallments'});
114 const donationType = useWatch({name: 'donationType'}) as 'single' | 'subscription' | undefined;
115
116 const amountTotal = getAmountTotal(totals, Number(amount));
117 const amountTotalInMinorUnits = amountToMinorUnit(amountTotal.toString(), currency);
118 const subscriptionAmountTotal = getSubscriptionTotal(totals, Number(amount));
119 const subscriptionAmountTotalInMinorUnits = amountToMinorUnit(subscriptionAmountTotal.toString(), currency);
120
121 const donationAmount = zeroDecimalCurrencies.includes(currency) ? amountTotalInMinorUnits : amountTotal;
122 const subscriptionAmount = zeroDecimalCurrencies.includes(currency) ? subscriptionAmountTotalInMinorUnits : subscriptionAmountTotal;
123
124 const isOneTime = donationType === 'single';
125 const isRecurring = donationType === 'subscription';
126
127 return {
128 firstName,
129 lastName,
130 email,
131 phone,
132 currency,
133 billingAddress,
134 amount: isOneTime ? donationAmount : subscriptionAmount,
135 amountInMinorUnits: isOneTime ? amountTotalInMinorUnits : subscriptionAmountTotalInMinorUnits,
136 isOneTime,
137 isRecurring,
138 subscriptionPeriod,
139 subscriptionFrequency,
140 subscriptionInstallments,
141 };
142 }
143