PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.5.0
GiveWP – Donation Plugin and Fundraising Platform v4.5.0
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
142 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.0.0
91 */
92 export default function useFormData() {
93 const {totals} = useDonationSummaryContext();
94 const {useWatch} = window.givewp.form.hooks;
95
96 const firstName = useWatch({name: 'firstName'}) as string;
97 const lastName = useWatch({name: 'lastName'}) as string | undefined;
98 const email = useWatch({name: 'email'}) as string;
99 const phone = useWatch({name: 'phone'}) as string | undefined;
100 const billingAddress = {
101 addressLine1: useWatch({name: 'address1'}) as string | undefined,
102 addressLine2: useWatch({name: 'address2'}) as string | undefined,
103 city: useWatch({name: 'city'}) as string | undefined,
104 state: useWatch({name: 'state'}) as string | undefined,
105 postalCode: useWatch({name: 'zip'}) as string | undefined,
106 country: useWatch({name: 'country'}) as string | undefined,
107 };
108 const amount = useWatch({name: 'amount'}) as string;
109 const currency = useWatch({name: 'currency'}) as string;
110 const subscriptionPeriod = useWatch({name: 'subscriptionPeriod'}) as subscriptionPeriod | undefined;
111 const subscriptionFrequency = useWatch({name: 'subscriptionFrequency'}) as number | undefined;
112 const subscriptionInstallments = useWatch({name: 'subscriptionInstallments'});
113 const donationType = useWatch({name: 'donationType'}) as 'single' | 'subscription' | undefined;
114
115 const amountTotal = getAmountTotal(totals, Number(amount));
116 const amountTotalInMinorUnits = amountToMinorUnit(amountTotal.toString(), currency);
117 const subscriptionAmountTotal = getSubscriptionTotal(totals, Number(amount));
118 const subscriptionAmountTotalInMinorUnits = amountToMinorUnit(subscriptionAmountTotal.toString(), currency);
119
120 const donationAmount = Number(amount);
121 const donationAmountMinor = amountToMinorUnit(amount, currency);
122
123 const isOneTime = donationType === 'single';
124 const isRecurring = donationType === 'subscription';
125
126 return {
127 firstName,
128 lastName,
129 email,
130 phone,
131 currency,
132 billingAddress,
133 amount: isOneTime ? amountTotal : subscriptionAmountTotal,
134 amountInMinorUnits: isOneTime ? amountTotalInMinorUnits : subscriptionAmountTotalInMinorUnits,
135 isOneTime,
136 isRecurring,
137 subscriptionPeriod,
138 subscriptionFrequency,
139 subscriptionInstallments,
140 };
141 }
142