-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathsdkContext.tsx
More file actions
93 lines (81 loc) · 2.15 KB
/
sdkContext.tsx
File metadata and controls
93 lines (81 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import React, { useState, useEffect, createContext } from "react";
import { useErrorBoundary } from "react-error-boundary";
import type {
Component,
CreateInstanceOptions,
EligiblePaymentMethods,
PageType,
SdkInstance,
} from "../types/paypal";
async function initSdkInstance({
clientToken,
components,
pageType,
}: CreateInstanceOptions) {
const sdkInstance = await window.paypal.createInstance({
clientToken: clientToken!,
components,
pageType,
});
const eligiblePaymentMethods = await sdkInstance.findEligibleMethods({
currencyCode: "USD",
});
return {
sdkInstance,
eligiblePaymentMethods,
};
}
interface PayPalSDKContextProps {
eligiblePaymentMethods: EligiblePaymentMethods | null;
sdkInstance: SdkInstance | null;
}
const initialContext: PayPalSDKContextProps = {
eligiblePaymentMethods: null,
sdkInstance: null,
};
interface PayPalSDKProviderProps {
components: Component[];
children: React.ReactNode;
pageType: PageType;
clientToken?: string;
}
// eslint-disable-next-line react-refresh/only-export-components
export const PayPalSDKContext =
createContext<PayPalSDKContextProps>(initialContext);
export const PayPalSDKProvider: React.FC<PayPalSDKProviderProps> = ({
clientToken,
components,
children,
pageType,
}) => {
const { showBoundary } = useErrorBoundary();
const [sdkInstance, setSdkInstance] = useState<SdkInstance | null>(null);
const [eligiblePaymentMethods, setEligiblePaymentMethods] =
useState<EligiblePaymentMethods | null>(null);
useEffect(() => {
const loadPayPalSDK = async () => {
if (!sdkInstance && clientToken) {
try {
const { sdkInstance, eligiblePaymentMethods } = await initSdkInstance(
{ clientToken, components, pageType },
);
setSdkInstance(sdkInstance);
setEligiblePaymentMethods(eligiblePaymentMethods);
} catch (error) {
showBoundary(error);
}
}
};
loadPayPalSDK();
});
return (
<PayPalSDKContext.Provider
value={{
sdkInstance,
eligiblePaymentMethods,
}}
>
{children}
</PayPalSDKContext.Provider>
);
};