PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
4.16.7.2 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 / DonationForms / resources / registrars / templates / fields / Amount / CurrencySwitcher.tsx
give / src / DonationForms / resources / registrars / templates / fields / Amount Last commit date
CurrencySwitcher.tsx 2 years ago CustomAmount.tsx 1 year ago DonationAmountCurrency.tsx 2 years ago DonationAmountLevels.tsx 1 month ago index.tsx 1 month ago withCurrencySettings.tsx 1 month ago
CurrencySwitcher.tsx
112 lines
1 import {CurrencySwitcherSetting} from '@givewp/forms/types';
2 import {ChangeEvent, useMemo} from 'react';
3 import amountFormatter from '@givewp/forms/app/utilities/amountFormatter';
4
5 /**
6 * @since 3.0.0
7 */
8 const convertCurrencySettingsToOptions = (currencySettings: CurrencySwitcherSetting[]): CurrencyOption[] => {
9 return currencySettings.map(({id}) => {
10 const formatter = amountFormatter(id);
11 const symbol = formatter.formatToParts().find(({type}) => type === 'currency').value;
12
13 return {
14 id,
15 symbol,
16 };
17 });
18 };
19
20 /**
21 * @since 3.0.0
22 */
23 export type CurrencyOption = {
24 id: string;
25 symbol: string;
26 };
27
28 /**
29 * Find the currency setting by currency id
30 *
31 * @since 3.0.0
32 */
33 export const getCurrencySetting = (
34 currency: string,
35 currencySettings: CurrencySwitcherSetting[]
36 ): CurrencySwitcherSetting | undefined => {
37 return currencySettings.find(({id}) => id === currency);
38 };
39
40 /**
41 * @since 3.0.0
42 */
43 export const isBaseCurrency = (currencySetting: CurrencySwitcherSetting) => currencySetting.exchangeRate === 0;
44
45 /**
46 * Calculate the amount based on the currency exchange rate, taking into account the from and to currency values
47 *
48 * @since 3.0.0
49 */
50 export const calculateCurrencyAmount = (
51 amount: number,
52 fromCurrency: string,
53 toCurrency: string,
54 currencySettings: CurrencySwitcherSetting[]
55 ): number => {
56 const fromCurrencySetting = getCurrencySetting(fromCurrency, currencySettings);
57 const toCurrencySetting = getCurrencySetting(toCurrency, currencySettings);
58
59 // convert from currency to base amount by dividing by the current exchange rate
60 // make sure to round the amount to avoid floating point issues
61 if (fromCurrencySetting !== undefined && !isBaseCurrency(fromCurrencySetting)) {
62 amount = Math.round(amount / fromCurrencySetting.exchangeRate);
63 }
64
65 // convert to next currency by multiplying by the next exchange rate
66 if (toCurrencySetting !== undefined && !isBaseCurrency(toCurrencySetting)) {
67 amount = amount * toCurrencySetting.exchangeRate;
68 }
69
70 return amount;
71 };
72
73 /**
74 * @since 3.0.0
75 */
76 type CurrencySwitcherProps = {
77 defaultCurrency: string;
78 currencySettings: CurrencySwitcherSetting[];
79 onSelect?: (event: ChangeEvent<HTMLSelectElement>) => void;
80 };
81
82 /**
83 * The currency select and static component
84 *
85 * @since 3.0.0
86 */
87 function CurrencySwitcher({defaultCurrency, currencySettings, onSelect}: CurrencySwitcherProps) {
88 const currencyOptions = useMemo(
89 () => convertCurrencySettingsToOptions(currencySettings),
90 [JSON.stringify(currencySettings)]
91 );
92
93 return (
94 <span className="givewp-fields-amount__currency-select-container">
95 <select
96 className="givewp-fields-amount__currency-select"
97 onChange={onSelect}
98 defaultValue={defaultCurrency}
99 >
100 {currencyOptions.map((option) => {
101 return (
102 <option key={option.id} value={option.id}>
103 {option.id} {option.symbol}
104 </option>
105 );
106 })}
107 </select>
108 </span>
109 );
110 }
111 export default CurrencySwitcher;
112