@evervault/evervault-react-native 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/components/3DS/ThreeDSecure.js +34 -0
- package/dist/commonjs/components/3DS/ThreeDSecure.js.map +1 -0
- package/dist/commonjs/components/3DS/ThreeDSecureFrame.js +45 -0
- package/dist/commonjs/components/3DS/ThreeDSecureFrame.js.map +1 -0
- package/dist/commonjs/components/3DS/config.js +9 -0
- package/dist/commonjs/components/3DS/config.js.map +1 -0
- package/dist/commonjs/components/3DS/context.js +9 -0
- package/dist/commonjs/components/3DS/context.js.map +1 -0
- package/dist/commonjs/components/3DS/index.js +20 -0
- package/dist/commonjs/components/3DS/index.js.map +1 -0
- package/dist/commonjs/components/3DS/styles.js +63 -0
- package/dist/commonjs/components/3DS/styles.js.map +1 -0
- package/dist/commonjs/components/3DS/threeDSSession.js +109 -0
- package/dist/commonjs/components/3DS/threeDSSession.js.map +1 -0
- package/dist/commonjs/components/3DS/types.js +2 -0
- package/dist/commonjs/components/3DS/types.js.map +1 -0
- package/dist/commonjs/components/3DS/useThreeDSecure.js +46 -0
- package/dist/commonjs/components/3DS/useThreeDSecure.js.map +1 -0
- package/dist/commonjs/index.js +13 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/module/components/3DS/ThreeDSecure.js +28 -0
- package/dist/module/components/3DS/ThreeDSecure.js.map +1 -0
- package/dist/module/components/3DS/ThreeDSecureFrame.js +36 -0
- package/dist/module/components/3DS/ThreeDSecureFrame.js.map +1 -0
- package/dist/module/components/3DS/config.js +3 -0
- package/dist/module/components/3DS/config.js.map +1 -0
- package/dist/module/components/3DS/context.js +3 -0
- package/dist/module/components/3DS/context.js.map +1 -0
- package/dist/module/components/3DS/index.js +3 -0
- package/dist/module/components/3DS/index.js.map +1 -0
- package/dist/module/components/3DS/styles.js +58 -0
- package/dist/module/components/3DS/styles.js.map +1 -0
- package/dist/module/components/3DS/threeDSSession.js +100 -0
- package/dist/module/components/3DS/threeDSSession.js.map +1 -0
- package/dist/module/components/3DS/types.js +2 -0
- package/dist/module/components/3DS/types.js.map +1 -0
- package/dist/module/components/3DS/useThreeDSecure.js +40 -0
- package/dist/module/components/3DS/useThreeDSecure.js.map +1 -0
- package/dist/module/index.js +1 -0
- package/dist/module/index.js.map +1 -1
- package/dist/typescript/src/components/3DS/ThreeDSecure.d.ts +8 -0
- package/dist/typescript/src/components/3DS/ThreeDSecure.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/ThreeDSecureFrame.d.ts +3 -0
- package/dist/typescript/src/components/3DS/ThreeDSecureFrame.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/config.d.ts +3 -0
- package/dist/typescript/src/components/3DS/config.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/context.d.ts +4 -0
- package/dist/typescript/src/components/3DS/context.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/index.d.ts +3 -0
- package/dist/typescript/src/components/3DS/index.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/styles.d.ts +57 -0
- package/dist/typescript/src/components/3DS/styles.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/threeDSSession.d.ts +10 -0
- package/dist/typescript/src/components/3DS/threeDSSession.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/types.d.ts +42 -0
- package/dist/typescript/src/components/3DS/types.d.ts.map +1 -0
- package/dist/typescript/src/components/3DS/useThreeDSecure.d.ts +3 -0
- package/dist/typescript/src/components/3DS/useThreeDSecure.d.ts.map +1 -0
- package/dist/typescript/src/components/Card/types.d.ts +1 -1
- package/dist/typescript/src/components/Card/types.d.ts.map +1 -1
- package/dist/typescript/src/index.d.ts +1 -0
- package/dist/typescript/src/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/components/3DS/ThreeDSecure.tsx +32 -0
- package/src/components/3DS/ThreeDSecureFrame.tsx +39 -0
- package/src/components/3DS/config.ts +2 -0
- package/src/components/3DS/context.tsx +4 -0
- package/src/components/3DS/index.ts +2 -0
- package/src/components/3DS/styles.tsx +63 -0
- package/src/components/3DS/threeDSSession.ts +132 -0
- package/src/components/3DS/types.ts +46 -0
- package/src/components/3DS/useThreeDSecure.tsx +51 -0
- package/src/components/Card/types.ts +2 -1
- package/src/index.tsx +1 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ThreeDSecureCallbacks,
|
|
3
|
+
ThreeDSecureSessionsParams,
|
|
4
|
+
ThreeDSecureSession,
|
|
5
|
+
ThreeDSecureSessionResponse,
|
|
6
|
+
} from "./types";
|
|
7
|
+
import { EV_API_DOMAIN } from "./config";
|
|
8
|
+
|
|
9
|
+
const stopPolling = (
|
|
10
|
+
intervalRef: React.MutableRefObject<NodeJS.Timeout | null>,
|
|
11
|
+
setIsVisible: (show: boolean) => void,
|
|
12
|
+
) => {
|
|
13
|
+
setIsVisible(false);
|
|
14
|
+
clearInterval(intervalRef.current!);
|
|
15
|
+
intervalRef.current = null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const startSession = async (
|
|
19
|
+
session: ThreeDSecureSession,
|
|
20
|
+
callbacks: ThreeDSecureCallbacks,
|
|
21
|
+
intervalRef: React.MutableRefObject<NodeJS.Timeout | null>,
|
|
22
|
+
setIsVisible: (show: boolean) => void
|
|
23
|
+
) => {
|
|
24
|
+
try {
|
|
25
|
+
const sessionState = await session.get();
|
|
26
|
+
|
|
27
|
+
switch (sessionState.status) {
|
|
28
|
+
case "success":
|
|
29
|
+
stopPolling(intervalRef, setIsVisible);
|
|
30
|
+
callbacks.onSuccess();
|
|
31
|
+
break;
|
|
32
|
+
case "failure":
|
|
33
|
+
stopPolling(intervalRef, setIsVisible);
|
|
34
|
+
callbacks.onFailure(new Error("3DS session failed"));
|
|
35
|
+
break;
|
|
36
|
+
case "action-required":
|
|
37
|
+
setIsVisible(true);
|
|
38
|
+
pollSession(session, callbacks, intervalRef, setIsVisible);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error("Error checking session state", error);
|
|
45
|
+
callbacks.onError(new Error("Failed to check 3DS session state"));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const pollSession = (
|
|
50
|
+
session: ThreeDSecureSession,
|
|
51
|
+
callbacks: ThreeDSecureCallbacks,
|
|
52
|
+
intervalRef: React.MutableRefObject<NodeJS.Timeout | null>,
|
|
53
|
+
setIsVisible: (show: boolean) => void,
|
|
54
|
+
interval: number = 3000
|
|
55
|
+
) => {
|
|
56
|
+
intervalRef.current = setInterval(async () => {
|
|
57
|
+
try {
|
|
58
|
+
const pollResponse: ThreeDSecureSessionResponse = await session.get();
|
|
59
|
+
if (pollResponse.status === "success") {
|
|
60
|
+
stopPolling(intervalRef, setIsVisible);
|
|
61
|
+
callbacks.onSuccess();
|
|
62
|
+
} else if (pollResponse.status === "failure") {
|
|
63
|
+
stopPolling(intervalRef, setIsVisible);
|
|
64
|
+
callbacks.onFailure(new Error("3DS session failed"));
|
|
65
|
+
} else {
|
|
66
|
+
setIsVisible(true);
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
stopPolling(intervalRef, setIsVisible);
|
|
70
|
+
console.error("Error polling session", error);
|
|
71
|
+
callbacks.onError(new Error("Error polling 3DS session"));
|
|
72
|
+
}
|
|
73
|
+
}, interval);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export function threeDSecureSession({
|
|
77
|
+
sessionId,
|
|
78
|
+
appId,
|
|
79
|
+
callbacks,
|
|
80
|
+
intervalRef,
|
|
81
|
+
setIsVisible,
|
|
82
|
+
}: ThreeDSecureSessionsParams): ThreeDSecureSession {
|
|
83
|
+
const get = async (): Promise<ThreeDSecureSessionResponse> => {
|
|
84
|
+
try {
|
|
85
|
+
const response = await fetch(
|
|
86
|
+
`https://${EV_API_DOMAIN}/frontend/3ds/browser-sessions/${sessionId}`,
|
|
87
|
+
{
|
|
88
|
+
headers: {
|
|
89
|
+
"x-evervault-app-id": appId,
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const result = (await response.json()) as ThreeDSecureSessionResponse;
|
|
95
|
+
return result;
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.error("Error fetching 3DS session status", error);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const cancel = async (): Promise<void> => {
|
|
103
|
+
try {
|
|
104
|
+
await fetch(
|
|
105
|
+
`https://${EV_API_DOMAIN}/frontend/3ds/browser-sessions/${sessionId}`,
|
|
106
|
+
{
|
|
107
|
+
method: "PATCH",
|
|
108
|
+
headers: {
|
|
109
|
+
"Content-Type": "application/json",
|
|
110
|
+
"x-evervault-app-id": appId,
|
|
111
|
+
},
|
|
112
|
+
body: JSON.stringify({ outcome: "cancelled" }),
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
callbacks.onFailure(new Error("3DS session cancelled by user"));
|
|
117
|
+
setIsVisible(false);
|
|
118
|
+
if (intervalRef.current) {
|
|
119
|
+
clearInterval(intervalRef.current);
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error("Error cancelling 3DS session", error);
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
sessionId,
|
|
129
|
+
get,
|
|
130
|
+
cancel,
|
|
131
|
+
} as ThreeDSecureSession;
|
|
132
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
export interface ThreeDSecureCallbacks {
|
|
3
|
+
onError: (error: Error) => void;
|
|
4
|
+
onFailure: (error: Error) => void;
|
|
5
|
+
onSuccess: () => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ThreeDSecureInitialState {
|
|
9
|
+
session: ThreeDSecureSession | null;
|
|
10
|
+
isVisible: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ThreeDSecureProviderProps {
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
state: ThreeDSecureState;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ThreeDSecureSession {
|
|
19
|
+
cancel: () => Promise<void>;
|
|
20
|
+
get: () => Promise<ThreeDSecureSessionResponse>;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ThreeDSecureSessionResponse {
|
|
25
|
+
nextAction: {
|
|
26
|
+
creq?: string;
|
|
27
|
+
type: string;
|
|
28
|
+
url?: string;
|
|
29
|
+
};
|
|
30
|
+
status: SessionStatus;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ThreeDSecureSessionsParams {
|
|
34
|
+
appId: string;
|
|
35
|
+
callbacks: ThreeDSecureCallbacks;
|
|
36
|
+
intervalRef: React.MutableRefObject<NodeJS.Timeout | null>;
|
|
37
|
+
sessionId: string;
|
|
38
|
+
setIsVisible: (show: boolean) => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ThreeDSecureState extends ThreeDSecureInitialState {
|
|
42
|
+
cancel: () => Promise<void>;
|
|
43
|
+
start: (sessionId: string, callbacks: ThreeDSecureCallbacks) => void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type SessionStatus = "action-required" | "failure" | "success";
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { useRef } from "react";
|
|
3
|
+
import { useEvervault } from "../EvervaultProvider";
|
|
4
|
+
import { startSession, threeDSecureSession } from "./threeDSSession";
|
|
5
|
+
import {
|
|
6
|
+
ThreeDSecureCallbacks,
|
|
7
|
+
ThreeDSecureSession,
|
|
8
|
+
ThreeDSecureState
|
|
9
|
+
} from "./types";
|
|
10
|
+
|
|
11
|
+
export const useThreeDSecure = (): ThreeDSecureState => {
|
|
12
|
+
const { appUuid } = useEvervault();
|
|
13
|
+
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
|
14
|
+
const [session, setSession] = useState<ThreeDSecureSession | null>(null)
|
|
15
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
16
|
+
|
|
17
|
+
if (!appUuid) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
"useThreeDSecure must be used within an Evervault Provider"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const start = (sessionId: string, callbacks: ThreeDSecureCallbacks) => {
|
|
24
|
+
const session = threeDSecureSession({
|
|
25
|
+
sessionId,
|
|
26
|
+
appId: appUuid,
|
|
27
|
+
callbacks,
|
|
28
|
+
intervalRef,
|
|
29
|
+
setIsVisible,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
setSession(session);
|
|
33
|
+
|
|
34
|
+
startSession(session, callbacks, intervalRef, setIsVisible);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const cancel = async () => {
|
|
38
|
+
if (session) {
|
|
39
|
+
await session.cancel();
|
|
40
|
+
} else {
|
|
41
|
+
console.warn("No 3DS session to cancel");
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
start,
|
|
47
|
+
cancel,
|
|
48
|
+
session,
|
|
49
|
+
isVisible: isVisible,
|
|
50
|
+
};
|
|
51
|
+
};
|