@evervault/react-native 2.4.0 → 2.5.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/build/ThreeDSecure/event.d.ts +11 -0
- package/build/ThreeDSecure/event.d.ts.map +1 -0
- package/build/ThreeDSecure/session.d.ts +4 -4
- package/build/ThreeDSecure/session.d.ts.map +1 -1
- package/build/ThreeDSecure/types.d.ts +15 -3
- package/build/ThreeDSecure/types.d.ts.map +1 -1
- package/build/ThreeDSecure/useThreeDSecure.d.ts +4 -1
- package/build/ThreeDSecure/useThreeDSecure.d.ts.map +1 -1
- package/build/index.cjs.js +138 -80
- package/build/index.cjs.js.map +1 -1
- package/build/index.esm.js +138 -80
- package/package.json +2 -2
- package/src/ThreeDSecure/event.ts +19 -0
- package/src/ThreeDSecure/session.test.ts +219 -24
- package/src/ThreeDSecure/session.ts +76 -24
- package/src/ThreeDSecure/types.ts +17 -4
- package/src/ThreeDSecure/useThreeDSecure.test.tsx +112 -1
- package/src/ThreeDSecure/useThreeDSecure.ts +23 -6
|
@@ -2,6 +2,7 @@ import { PropsWithChildren } from "react";
|
|
|
2
2
|
import { EvervaultProvider } from "../EvervaultProvider";
|
|
3
3
|
import { act, renderHook } from "@testing-library/react-native";
|
|
4
4
|
import { useThreeDSecure } from "./useThreeDSecure";
|
|
5
|
+
import { ThreeDSecureEvent } from "./event";
|
|
5
6
|
|
|
6
7
|
function wrapper({ children }: PropsWithChildren) {
|
|
7
8
|
return (
|
|
@@ -17,6 +18,10 @@ const callbacks = {
|
|
|
17
18
|
onFailure: vi.fn(),
|
|
18
19
|
};
|
|
19
20
|
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
vi.clearAllMocks();
|
|
23
|
+
});
|
|
24
|
+
|
|
20
25
|
it("returns the correct state", () => {
|
|
21
26
|
const { result } = renderHook(() => useThreeDSecure(), {
|
|
22
27
|
wrapper,
|
|
@@ -31,7 +36,7 @@ it("returns the correct state", () => {
|
|
|
31
36
|
});
|
|
32
37
|
|
|
33
38
|
it("starts a session when action is required", async () => {
|
|
34
|
-
const { result
|
|
39
|
+
const { result } = renderHook(() => useThreeDSecure(), {
|
|
35
40
|
wrapper,
|
|
36
41
|
});
|
|
37
42
|
|
|
@@ -49,6 +54,112 @@ it("starts a session when action is required", async () => {
|
|
|
49
54
|
expect(result.current.isVisible).toBe(true);
|
|
50
55
|
});
|
|
51
56
|
|
|
57
|
+
it("fails the session when failOnChallenge is true and a challenge is required", async () => {
|
|
58
|
+
const { result } = renderHook(() => useThreeDSecure(), {
|
|
59
|
+
wrapper,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
vi.spyOn(global, "fetch").mockResolvedValue({
|
|
63
|
+
json: () => Promise.resolve({ status: "action-required" }),
|
|
64
|
+
} as any);
|
|
65
|
+
|
|
66
|
+
const onRequestChallenge = vi.fn();
|
|
67
|
+
|
|
68
|
+
await act(() =>
|
|
69
|
+
result.current.start("session_123", {
|
|
70
|
+
...callbacks,
|
|
71
|
+
onRequestChallenge,
|
|
72
|
+
failOnChallenge: true,
|
|
73
|
+
})
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
expect(callbacks.onFailure).toHaveBeenCalled();
|
|
77
|
+
expect(onRequestChallenge).not.toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("fails the session when failOnChallenge is a function that returns true and a challenge is required", async () => {
|
|
81
|
+
const { result } = renderHook(() => useThreeDSecure(), {
|
|
82
|
+
wrapper,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
vi.spyOn(global, "fetch").mockResolvedValue({
|
|
86
|
+
json: () => Promise.resolve({ status: "action-required" }),
|
|
87
|
+
} as any);
|
|
88
|
+
|
|
89
|
+
const onRequestChallenge = vi.fn();
|
|
90
|
+
|
|
91
|
+
await act(() =>
|
|
92
|
+
result.current.start("session_123", {
|
|
93
|
+
...callbacks,
|
|
94
|
+
onRequestChallenge,
|
|
95
|
+
failOnChallenge: () => Promise.resolve(true),
|
|
96
|
+
})
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
expect(callbacks.onFailure).toHaveBeenCalled();
|
|
100
|
+
expect(onRequestChallenge).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("fails the session when failOnChallenge resolves true at hook level and a challenge is required", async () => {
|
|
104
|
+
const { result } = renderHook(
|
|
105
|
+
() =>
|
|
106
|
+
useThreeDSecure({
|
|
107
|
+
failOnChallenge: () => Promise.resolve(true),
|
|
108
|
+
}),
|
|
109
|
+
{
|
|
110
|
+
wrapper,
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
vi.spyOn(global, "fetch").mockResolvedValue({
|
|
115
|
+
json: () => Promise.resolve({ status: "action-required" }),
|
|
116
|
+
} as any);
|
|
117
|
+
|
|
118
|
+
const onRequestChallenge = vi.fn();
|
|
119
|
+
await act(() =>
|
|
120
|
+
result.current.start("session_123", {
|
|
121
|
+
...callbacks,
|
|
122
|
+
onRequestChallenge,
|
|
123
|
+
})
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
expect(onRequestChallenge).not.toHaveBeenCalled();
|
|
127
|
+
expect(callbacks.onFailure).toHaveBeenCalled();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("fails the session when onRequestChallenge is called and defaultPrevented is true", async () => {
|
|
131
|
+
const { result } = renderHook(() => useThreeDSecure(), {
|
|
132
|
+
wrapper,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
vi.spyOn(global, "fetch").mockResolvedValue({
|
|
136
|
+
json: () => Promise.resolve({ status: "action-required" }),
|
|
137
|
+
} as any);
|
|
138
|
+
|
|
139
|
+
let onRequestChallenge = vi.fn((event: ThreeDSecureEvent) =>
|
|
140
|
+
event.preventDefault()
|
|
141
|
+
);
|
|
142
|
+
await act(() =>
|
|
143
|
+
result.current.start("session_123", {
|
|
144
|
+
...callbacks,
|
|
145
|
+
onRequestChallenge,
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
expect(onRequestChallenge).toHaveBeenCalled();
|
|
149
|
+
expect(callbacks.onFailure).toHaveBeenCalled();
|
|
150
|
+
|
|
151
|
+
let onFailure = vi.fn();
|
|
152
|
+
onRequestChallenge = vi.fn();
|
|
153
|
+
await act(() =>
|
|
154
|
+
result.current.start("session_123", {
|
|
155
|
+
onFailure,
|
|
156
|
+
onRequestChallenge,
|
|
157
|
+
})
|
|
158
|
+
);
|
|
159
|
+
expect(onRequestChallenge).toHaveBeenCalled();
|
|
160
|
+
expect(onFailure).not.toHaveBeenCalled();
|
|
161
|
+
});
|
|
162
|
+
|
|
52
163
|
it("calls the success callback when the session is successful", async () => {
|
|
53
164
|
const { result } = renderHook(() => useThreeDSecure(), {
|
|
54
165
|
wrapper,
|
|
@@ -1,30 +1,47 @@
|
|
|
1
1
|
import { useCallback, useMemo, useState } from "react";
|
|
2
2
|
import { useRef } from "react";
|
|
3
3
|
import { startSession, threeDSecureSession } from "./session";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
ThreeDSecureOptions,
|
|
6
|
+
ThreeDSecureSession,
|
|
7
|
+
ThreeDSecureState,
|
|
8
|
+
} from "./types";
|
|
5
9
|
import { useEvervault } from "../useEvervault";
|
|
6
10
|
|
|
7
|
-
export
|
|
11
|
+
export interface UseThreeDSecureOptions {
|
|
12
|
+
failOnChallenge?: boolean | (() => Promise<boolean>);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function useThreeDSecure(
|
|
16
|
+
options?: UseThreeDSecureOptions
|
|
17
|
+
): ThreeDSecureState {
|
|
8
18
|
const { appId } = useEvervault();
|
|
9
19
|
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
|
10
20
|
const [session, setSession] = useState<ThreeDSecureSession | null>(null);
|
|
11
21
|
const [isVisible, setIsVisible] = useState(false);
|
|
12
22
|
|
|
23
|
+
const failOnChallenge = options?.failOnChallenge ?? false;
|
|
24
|
+
|
|
13
25
|
const start = useCallback<ThreeDSecureState["start"]>(
|
|
14
|
-
(sessionId,
|
|
26
|
+
(sessionId, options) => {
|
|
27
|
+
const startOptions: ThreeDSecureOptions = {
|
|
28
|
+
...options,
|
|
29
|
+
failOnChallenge: options?.failOnChallenge ?? failOnChallenge,
|
|
30
|
+
};
|
|
31
|
+
|
|
15
32
|
const session = threeDSecureSession({
|
|
16
33
|
sessionId,
|
|
17
34
|
appId,
|
|
18
|
-
|
|
35
|
+
options: startOptions,
|
|
19
36
|
intervalRef,
|
|
20
37
|
setIsVisible,
|
|
21
38
|
});
|
|
22
39
|
|
|
23
40
|
setSession(session);
|
|
24
41
|
|
|
25
|
-
startSession(session,
|
|
42
|
+
startSession(session, startOptions, intervalRef, setIsVisible);
|
|
26
43
|
},
|
|
27
|
-
[appId]
|
|
44
|
+
[appId, failOnChallenge]
|
|
28
45
|
);
|
|
29
46
|
|
|
30
47
|
const cancel = useCallback<ThreeDSecureState["cancel"]>(async () => {
|