@sqala/threedsecure-react
Version:
A React library for implementing 3D Secure authentication flows in payment applications
83 lines (82 loc) • 3.28 kB
JavaScript
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