UNPKG

@sqala/threedsecure-react

Version:

A React library for implementing 3D Secure authentication flows in payment applications

83 lines (82 loc) 3.28 kB
import { useState as l, useCallback as v } from "react"; import { AuthenticationState as o } from "../types/authentication.js"; import { useApi as B } from "./useApi.js"; import { useDsMethod as I } from "./useDsMethod.js"; import { useChallenge as V } from "./useChallenge.js"; import { v as H } from "../v4-CRLUkzQ6.js"; const J = ({ baseUrl: S, publicKey: x, container: i }) => { const [A, c] = l(!1), [C, E] = l(!1), [w, D] = l(null), [M, k] = l(null), [F, R] = l(null), { setBrowserData: u, executeAuthentication: m } = B({ baseUrl: S, publicKey: x }), { executeDsMethod: g } = I(i), { executeChallenge: f } = V(i), h = v((r, d) => { d("Handle result", r), E(!0), k({ id: r.id, transStatus: r.transStatus, transStatusReason: r.transStatusReason, authenticationValue: r.authenticationValue, eci: r.eci, dsTransId: r.dsTransId, protocolVersion: r.protocolVersion, failReason: r.failReason, isSuccess: () => r.state === o.AuthorizedToAttempt || r.state === o.Completed }); }, []), T = v( async (r) => { const d = H(), e = (t, ...z) => { console.log(`[${d}] useThreeDSecure: ${t}`, ...z); }; e("Execute start"); const { abortController: y, ...p } = r, s = y ?? new AbortController(), a = { dsMethod: document.createElement("iframe"), challenge: document.createElement("iframe") }, n = { dsMethod: document.createElement("form"), challenge: document.createElement("form") }, b = () => { e("Clean up"), a.dsMethod.remove(), n.dsMethod.remove(), a.challenge.remove(), n.challenge.remove(); }; if (s.signal.aborted) { e("Already aborted, not executing"), c(!1), b(); return; } s.signal.addEventListener("abort", (t) => { e("Aborted via event listener handler", t), c(!1), b(); }); try { if (c(!0), e("Starting setBrowserData"), await u(p, s.signal, e), e("Finished setBrowserData"), s.signal.aborted) { e("Aborted after finishing setBrowserData"); return; } for await (const t of m(p, s.signal, e)) { if (s.signal.aborted) { e("Aborted during execution"); break; } switch (e("Handle flowStep", t), D(t.state), t.state) { case o.PendingDirectoryServer: await g(t, a.dsMethod, n.dsMethod); break; case o.PendingChallenge: a.dsMethod.remove(), n.dsMethod.remove(), await f(t, a.challenge, n.challenge); break; case o.ChallengeCompleted: a.challenge.remove(), n.challenge.remove(); break; case o.Failed: case o.Completed: case o.AuthorizedToAttempt: s.abort("completed"), h(t, e); break; } } } catch (t) { e("Error", t), s.abort("error"), R(t instanceof Error ? t.message : "Failed to execute 3DS"); } finally { e("Execution finished"); } }, [u, m, g, f, h] ); return { isExecuting: A, isFinalized: C, status: w, result: M, execute: T, error: F }; }; export { J as useThreeDSecure }; //# sourceMappingURL=useThreeDSecure.js.map