PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.4.0
GiveWP – Donation Plugin and Fundraising Platform v4.4.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 / Donors / resources / admin / components / Inputs / Phone / index.tsx
give / src / Donors / resources / admin / components / Inputs / Phone Last commit date
index.tsx 1 year ago styles.module.scss 1 year ago
index.tsx
94 lines
1 /**
2 * External Dependencies
3 */
4 import { __ } from '@wordpress/i18n';
5 import { useState, useEffect } from 'react';
6 import IntlTelInput from 'intl-tel-input/react';
7 import 'intl-tel-input/build/css/intlTelInput.css';
8
9 /**
10 * Internal Dependencies
11 */
12 import { getDonorOptionsWindowData } from '@givewp/donors/utils';
13 import styles from './styles.module.scss';
14
15 const { intlTelInputSettings } = getDonorOptionsWindowData();
16
17 /**
18 * @since 4.4.0
19 */
20 type PhoneInputProps = {
21 id?: string;
22 value?: string;
23 onChange: (value: string) => void;
24 onError?: (errorMessage: string | null) => void;
25 className?: string;
26 };
27
28 /**
29 * @since 4.4.0
30 */
31 export default function PhoneInput({ id, value, onChange, onError, className }: PhoneInputProps) {
32 const [country, setCountry] = useState<string>(intlTelInputSettings.initialCountry);
33
34 const isIntlTelInput = intlTelInputSettings.initialCountry && intlTelInputSettings.utilsScriptUrl;
35
36 useEffect(() => {
37 if (!isIntlTelInput) {
38 return;
39 }
40
41 // This timeout is necessary to properly load the utilsScript - without this, the autoPlaceholder feature doesn't work.
42 const interval = setTimeout(() => {
43 window.intlTelInputGlobals.loadUtils(intlTelInputSettings.utilsScriptUrl);
44 // It's necessary to fix a missing left padding that can happen in certain cases.
45 document.querySelectorAll('.iti__tel-input').forEach(function (input: HTMLInputElement) {
46 // @ts-ignore
47 const countryContainerWidth = document.querySelector('.iti__country-container').offsetWidth;
48 input.style.paddingLeft = String(countryContainerWidth + 4) + 'px';
49 });
50 }, 100);
51
52 return () => {
53 clearInterval(interval);
54 };
55 }, [isIntlTelInput]);
56
57 const onChangeNumber = (number: string) => {
58 // Safety check to ensure intlTelInputUtils is available before using it
59 if (number && window.intlTelInputUtils && !window.intlTelInputUtils.isValidNumber(number, country)) {
60 const errorCode = window.intlTelInputUtils.getValidationError(number, country);
61 onChange(String(errorCode));
62 if (onError) {
63 onError(intlTelInputSettings.errorMap[errorCode]);
64 }
65 } else {
66 onChange(number);
67 if (onError) {
68 onError(null);
69 }
70 }
71 };
72
73 return (
74 <div id={id} className={`${styles.phoneInput} ${className || ''}`}>
75 <IntlTelInput
76 initialValue={value}
77 onChangeCountry={setCountry}
78 onChangeNumber={onChangeNumber}
79 initOptions={{
80 initialCountry: intlTelInputSettings.initialCountry,
81 showSelectedDialCode: intlTelInputSettings.showSelectedDialCode,
82 strictMode: intlTelInputSettings.strictMode,
83 i18n: intlTelInputSettings.i18n,
84 useFullscreenPopup: intlTelInputSettings.useFullscreenPopup,
85 utilsScript: intlTelInputSettings.utilsScriptUrl,
86 }}
87 inputProps={{
88 'aria-label': __('Phone number', 'give'),
89 }}
90 />
91 </div>
92 );
93 }
94