@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.
Files changed (74) hide show
  1. package/dist/commonjs/components/3DS/ThreeDSecure.js +34 -0
  2. package/dist/commonjs/components/3DS/ThreeDSecure.js.map +1 -0
  3. package/dist/commonjs/components/3DS/ThreeDSecureFrame.js +45 -0
  4. package/dist/commonjs/components/3DS/ThreeDSecureFrame.js.map +1 -0
  5. package/dist/commonjs/components/3DS/config.js +9 -0
  6. package/dist/commonjs/components/3DS/config.js.map +1 -0
  7. package/dist/commonjs/components/3DS/context.js +9 -0
  8. package/dist/commonjs/components/3DS/context.js.map +1 -0
  9. package/dist/commonjs/components/3DS/index.js +20 -0
  10. package/dist/commonjs/components/3DS/index.js.map +1 -0
  11. package/dist/commonjs/components/3DS/styles.js +63 -0
  12. package/dist/commonjs/components/3DS/styles.js.map +1 -0
  13. package/dist/commonjs/components/3DS/threeDSSession.js +109 -0
  14. package/dist/commonjs/components/3DS/threeDSSession.js.map +1 -0
  15. package/dist/commonjs/components/3DS/types.js +2 -0
  16. package/dist/commonjs/components/3DS/types.js.map +1 -0
  17. package/dist/commonjs/components/3DS/useThreeDSecure.js +46 -0
  18. package/dist/commonjs/components/3DS/useThreeDSecure.js.map +1 -0
  19. package/dist/commonjs/index.js +13 -0
  20. package/dist/commonjs/index.js.map +1 -1
  21. package/dist/module/components/3DS/ThreeDSecure.js +28 -0
  22. package/dist/module/components/3DS/ThreeDSecure.js.map +1 -0
  23. package/dist/module/components/3DS/ThreeDSecureFrame.js +36 -0
  24. package/dist/module/components/3DS/ThreeDSecureFrame.js.map +1 -0
  25. package/dist/module/components/3DS/config.js +3 -0
  26. package/dist/module/components/3DS/config.js.map +1 -0
  27. package/dist/module/components/3DS/context.js +3 -0
  28. package/dist/module/components/3DS/context.js.map +1 -0
  29. package/dist/module/components/3DS/index.js +3 -0
  30. package/dist/module/components/3DS/index.js.map +1 -0
  31. package/dist/module/components/3DS/styles.js +58 -0
  32. package/dist/module/components/3DS/styles.js.map +1 -0
  33. package/dist/module/components/3DS/threeDSSession.js +100 -0
  34. package/dist/module/components/3DS/threeDSSession.js.map +1 -0
  35. package/dist/module/components/3DS/types.js +2 -0
  36. package/dist/module/components/3DS/types.js.map +1 -0
  37. package/dist/module/components/3DS/useThreeDSecure.js +40 -0
  38. package/dist/module/components/3DS/useThreeDSecure.js.map +1 -0
  39. package/dist/module/index.js +1 -0
  40. package/dist/module/index.js.map +1 -1
  41. package/dist/typescript/src/components/3DS/ThreeDSecure.d.ts +8 -0
  42. package/dist/typescript/src/components/3DS/ThreeDSecure.d.ts.map +1 -0
  43. package/dist/typescript/src/components/3DS/ThreeDSecureFrame.d.ts +3 -0
  44. package/dist/typescript/src/components/3DS/ThreeDSecureFrame.d.ts.map +1 -0
  45. package/dist/typescript/src/components/3DS/config.d.ts +3 -0
  46. package/dist/typescript/src/components/3DS/config.d.ts.map +1 -0
  47. package/dist/typescript/src/components/3DS/context.d.ts +4 -0
  48. package/dist/typescript/src/components/3DS/context.d.ts.map +1 -0
  49. package/dist/typescript/src/components/3DS/index.d.ts +3 -0
  50. package/dist/typescript/src/components/3DS/index.d.ts.map +1 -0
  51. package/dist/typescript/src/components/3DS/styles.d.ts +57 -0
  52. package/dist/typescript/src/components/3DS/styles.d.ts.map +1 -0
  53. package/dist/typescript/src/components/3DS/threeDSSession.d.ts +10 -0
  54. package/dist/typescript/src/components/3DS/threeDSSession.d.ts.map +1 -0
  55. package/dist/typescript/src/components/3DS/types.d.ts +42 -0
  56. package/dist/typescript/src/components/3DS/types.d.ts.map +1 -0
  57. package/dist/typescript/src/components/3DS/useThreeDSecure.d.ts +3 -0
  58. package/dist/typescript/src/components/3DS/useThreeDSecure.d.ts.map +1 -0
  59. package/dist/typescript/src/components/Card/types.d.ts +1 -1
  60. package/dist/typescript/src/components/Card/types.d.ts.map +1 -1
  61. package/dist/typescript/src/index.d.ts +1 -0
  62. package/dist/typescript/src/index.d.ts.map +1 -1
  63. package/package.json +3 -2
  64. package/src/components/3DS/ThreeDSecure.tsx +32 -0
  65. package/src/components/3DS/ThreeDSecureFrame.tsx +39 -0
  66. package/src/components/3DS/config.ts +2 -0
  67. package/src/components/3DS/context.tsx +4 -0
  68. package/src/components/3DS/index.ts +2 -0
  69. package/src/components/3DS/styles.tsx +63 -0
  70. package/src/components/3DS/threeDSSession.ts +132 -0
  71. package/src/components/3DS/types.ts +46 -0
  72. package/src/components/3DS/useThreeDSecure.tsx +51 -0
  73. package/src/components/Card/types.ts +2 -1
  74. 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
+ };
@@ -11,7 +11,8 @@ export type CardBrandName =
11
11
  | "elo"
12
12
  | "hipercard"
13
13
  | "hiper"
14
- | "szep";
14
+ | "szep"
15
+ | "uatp";
15
16
 
16
17
  export interface CardConfig {
17
18
  acceptedBrands?: CardBrandName[];
package/src/index.tsx CHANGED
@@ -1,4 +1,5 @@
1
1
  export { type CardProps, Card } from "./components/Card";
2
+ export { ThreeDSecure, useThreeDSecure } from "./components/3DS";
2
3
  export { init, encrypt } from "./sdk";
3
4
  export type {
4
5
  CardPayload,