@splitin/verification-react 0.1.0-beta.0
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/LICENSE +21 -0
- package/NOTICE +32 -0
- package/README.md +14 -0
- package/dist/appeal.cjs +63 -0
- package/dist/appeal.cjs.map +1 -0
- package/dist/appeal.d.cts +21 -0
- package/dist/appeal.d.ts +21 -0
- package/dist/appeal.d.ts.map +1 -0
- package/dist/appeal.js +61 -0
- package/dist/appeal.js.map +1 -0
- package/dist/index.cjs +126 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +49 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.cjs +501 -0
- package/dist/launcher.cjs.map +1 -0
- package/dist/launcher.d.cts +39 -0
- package/dist/launcher.d.ts +39 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +499 -0
- package/dist/launcher.js.map +1 -0
- package/dist/operations.cjs +225 -0
- package/dist/operations.cjs.map +1 -0
- package/dist/operations.d.cts +37 -0
- package/dist/operations.d.ts +37 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +223 -0
- package/dist/operations.js.map +1 -0
- package/dist/retry.cjs +16 -0
- package/dist/retry.cjs.map +1 -0
- package/dist/retry.d.cts +9 -0
- package/dist/retry.d.ts +9 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +14 -0
- package/dist/retry.js.map +1 -0
- package/dist/status.cjs +27 -0
- package/dist/status.cjs.map +1 -0
- package/dist/status.d.cts +8 -0
- package/dist/status.d.ts +8 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +25 -0
- package/dist/status.js.map +1 -0
- package/dist/support.cjs +12 -0
- package/dist/support.cjs.map +1 -0
- package/dist/support.d.cts +8 -0
- package/dist/support.d.ts +8 -0
- package/dist/support.d.ts.map +1 -0
- package/dist/support.js +10 -0
- package/dist/support.js.map +1 -0
- package/package.json +92 -0
- package/src/styles.css +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/session.ts","../src/hooks/status.ts","../src/hooks/runtime.ts","../src/css.ts","../src/copy.ts"],"names":["useState","useCallback"],"mappings":";;;;AAeO,SAAS,uBAAuB,OAAA,EAAwC;AAC7E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACzD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAA,UAAA,CAAW,OAAA,GAAU,aAAA;AAErB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAM,+BAAA,CAAgC;AAAA,IAC/D,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,IAC/B,aAAA,EAAe,CAAC,SAAA,KAAc,UAAA,CAAW,QAAQ,SAAS;AAAA,GAC3D,CAAA,EAAG,CAAC,OAAA,CAAQ,SAAS,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,qBAAqB,CAAC,CAAA;AAElH,EAAA,MAAM,OAAA,GAAU,YAAY,YAAY;AACtC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,SAAS,CAAA;AACxD,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,OAAO,KAAK,MAAA,KAAW,UAAA;AAAA,EACzB,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AACF;;;AC9CO,SAAS,sBAAsB,QAAA,EAA6C;AACjF,EAAA,MAAM,OAAA,GAAU,QAAA,EAAU,MAAA,KAAW,YAAA,IAAgB,UAAU,MAAA,KAAW,wBAAA;AAC1E,EAAA,MAAM,WAAA,GAAc,UAAU,MAAA,KAAW,sBAAA;AACzC,EAAA,MAAM,QAAA,GAAW,QAAA,IAAY,IAAA,IAAQ,CAAC,UAAA,EAAY,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,SAAS,MAAM,CAAA;AACnI,EAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,MAAA,IAAU,SAAA,EAAW,UAAA,EAAY,QAAA,EAAU,kBAAA,IAAsB,IAAA,EAAK;AACnI;ACJO,SAAS,eAAA,GAA2B;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,eAAe,CAAA;AACpD,EAAA,SAAA,CAAU,MAAM,qBAAA,CAAsB,SAAS,CAAA,EAAG,EAAE,CAAA;AACpD,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAAuB;AACtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,QAAA,KAAa,WAAA,EAAa;AAChD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,YAAyB,WAAA,GAAc,SAAS,aAAA,GAAgB,IAAA;AAC1F,IAAA,OAAO,MAAM;AAAE,MAAA,QAAA,EAAU,KAAA,EAAM;AAAA,IAAG,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;AAEO,SAAS,OAAA,GAA8F;AAC5G,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAmB,IAAI,CAAA;AAC/C,EAAA,MAAM,GAAA,GAAMC,WAAAA,CAAY,OAAO,GAAA,EAAQ,IAAA,KAA8B;AACnE,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,OAAA,CAAQ,GAAG,CAAA;AACX,IAAA,IAAI;AAAE,MAAA,MAAM,IAAA,EAAK;AAAA,IAAG,CAAA,SAAE;AAAU,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAAG;AAAA,EACjD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAA,OAAO,CAAC,MAAM,GAAG,CAAA;AACnB;;;ACzBO,IAAM,MAAA,GAAS;AAAA;AAAA,CAAA;AAItB,IAAI,QAAA,GAAW,KAAA;AAER,SAAS,mBAAA,GAA4B;AAC1C,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,WAAA,EAAa;AACjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,QAAQ,GAAA,GAAM,oBAAA;AACpB,EAAA,KAAA,CAAM,WAAA,GAAc,MAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,EAAA,QAAA,GAAW,IAAA;AACb;;;ACXO,SAAS,iBAAiB,WAAA,EAI/B;AACA,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,8BAAA;AAAA,QACP,WAAA,EAAa,+GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,IACF,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,gCAAA;AAAA,QACP,WAAA,EAAa,4EAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,IACF,KAAK,uBAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,gCAAA;AAAA,QACP,WAAA,EAAa,uEAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,8BAAA;AAAA,QACP,WAAA,EAAa,0EAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA;AAEN","file":"index.js","sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n createVerificationWebController,\n type VerificationStatusEnvelope,\n type VerificationWebControllerOptions,\n} from '@splitin/verification-web';\n\nexport interface UseVerificationSessionOptions extends Omit<VerificationWebControllerOptions, 'refreshStatus'> {\n envelope: VerificationStatusEnvelope | null;\n refreshStatus: (attemptId: string) => Promise<VerificationStatusEnvelope>;\n}\n\n/**\n * Headless session controller. Browser completion must only call refreshStatus.\n */\nexport function useVerificationSession(options: UseVerificationSessionOptions) {\n const [envelope, setEnvelope] = useState(options.envelope);\n const [message, setMessage] = useState<string | null>(null);\n const refreshStatus = options.refreshStatus;\n const refreshRef = useRef(refreshStatus);\n refreshRef.current = refreshStatus;\n\n const controller = useMemo(() => createVerificationWebController({\n plugins: options.plugins,\n pause: options.pause,\n resume: options.resume,\n retry: options.retry,\n cancel: options.cancel,\n createContinuationUrl: options.createContinuationUrl,\n refreshStatus: (attemptId) => refreshRef.current(attemptId),\n }), [options.plugins, options.pause, options.resume, options.retry, options.cancel, options.createContinuationUrl]);\n\n const refresh = useCallback(async () => {\n if (!envelope) return false;\n const next = await controller.refresh(envelope.attemptId);\n setEnvelope(next);\n return next.status === 'verified';\n }, [controller, envelope]);\n\n return {\n envelope,\n setEnvelope,\n message,\n setMessage,\n controller,\n refresh,\n onComplete: refresh,\n };\n}\n\n","import type { VerificationStatusEnvelope } from '@splitin/verification-web';\n\nexport function useVerificationStatus(envelope: VerificationStatusEnvelope | null) {\n const blocked = envelope?.status === 'processing' || envelope?.status === 'manual_review_required';\n const unavailable = envelope?.status === 'provider_unavailable';\n const terminal = envelope != null && ['verified', 'declined', 'failed', 'expired', 'canceled', 'redacted'].includes(envelope.status);\n return { blocked, unavailable, terminal, status: envelope?.status ?? 'created', disclosure: envelope?.providerDisclosure ?? null };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { isBrowserOnline, subscribeOnlineStatus } from '@splitin/verification-web';\n\nexport function useOnlineStatus(): boolean {\n const [online, setOnline] = useState(isBrowserOnline);\n useEffect(() => subscribeOnlineStatus(setOnline), []);\n return online;\n}\n\nexport function useFocusRecovery(active: boolean): void {\n useEffect(() => {\n if (!active || typeof document === 'undefined') return;\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n return () => { previous?.focus(); };\n }, [active]);\n}\n\nexport function useBusy<T extends string>(): [T | null, (key: T, task: () => Promise<void>) => Promise<void>] {\n const [busy, setBusy] = useState<T | null>(null);\n const run = useCallback(async (key: T, task: () => Promise<void>) => {\n if (busy) return;\n setBusy(key);\n try { await task(); } finally { setBusy(null); }\n }, [busy]);\n return [busy, run];\n}\n","export const styles = `\n:where(.siv){color:var(--siv-fg,#111827);background:var(--siv-bg,#fff);font-family:var(--siv-font,system-ui,sans-serif)}\n`;\n\nlet injected = false;\n\nexport function injectDefaultStyles(): void {\n if (injected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.dataset.siv = 'verification-react';\n style.textContent = styles;\n document.head.appendChild(style);\n injected = true;\n}\n","import type { VerificationPackageCode } from '@splitin/verification-adapter-sdk';\n\nexport function verificationCopy(packageCode: VerificationPackageCode | string): {\n title: string;\n description: string;\n reviewTitle: string;\n} {\n switch (packageCode) {\n case 'business_kyb':\n return {\n title: 'Secure business verification',\n description: 'The legal business is verified separately from your identity. You can pause and resume without starting over.',\n reviewTitle: 'Business review is in progress',\n };\n case 'ownership_review':\n return {\n title: 'Ownership and authority review',\n description: 'We are reviewing authority for this organization. Your action stays saved.',\n reviewTitle: 'Ownership review is in progress',\n };\n case 'associated_person_idv':\n return {\n title: 'Associated person verification',\n description: 'This identity check supports a separate business relationship review.',\n reviewTitle: 'Relationship review is in progress',\n };\n default:\n return {\n title: 'Secure identity verification',\n description: 'You can pause and resume without starting over. Your action stays saved.',\n reviewTitle: 'Identity review is in progress',\n };\n }\n}\n\nexport const CAMERA_HELP = [\n 'Allow camera access in browser settings, close other camera apps, then retry.',\n 'Use an up-to-date Safari, Chrome, Firefox, or Edge browser. If an in-app browser blocks the camera, open the continuation link in your main browser.',\n];\n"]}
|
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var verificationWeb = require('@splitin/verification-web');
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
+
var __esm = (fn, res) => function __init() {
|
|
10
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
11
|
+
};
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name in all)
|
|
14
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/plugins/stripe.tsx
|
|
18
|
+
var stripe_exports = {};
|
|
19
|
+
__export(stripe_exports, {
|
|
20
|
+
default: () => StripeIdentityLauncher
|
|
21
|
+
});
|
|
22
|
+
function StripeIdentityLauncher({
|
|
23
|
+
launchSecret,
|
|
24
|
+
publishableKey,
|
|
25
|
+
onCallback,
|
|
26
|
+
onError,
|
|
27
|
+
onOpened
|
|
28
|
+
}) {
|
|
29
|
+
const [opening, setOpening] = react.useState(false);
|
|
30
|
+
const open = react.useCallback(async () => {
|
|
31
|
+
if (opening) return;
|
|
32
|
+
const key = publishableKey ?? "";
|
|
33
|
+
if (!key.startsWith("pk_")) {
|
|
34
|
+
onError("Secure identity verification is not configured on this device. Use the hosted fallback or contact support.");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
setOpening(true);
|
|
38
|
+
onOpened?.();
|
|
39
|
+
try {
|
|
40
|
+
const { loadStripe } = await import('@stripe/stripe-js');
|
|
41
|
+
const stripe = await loadStripe(key);
|
|
42
|
+
if (!stripe) throw new Error("stripe_unavailable");
|
|
43
|
+
const result = await stripe.verifyIdentity(launchSecret);
|
|
44
|
+
if (result.error) {
|
|
45
|
+
onError(result.error.message || "Identity verification could not continue. Check camera permissions or use the hosted fallback.");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
onCallback();
|
|
49
|
+
} catch {
|
|
50
|
+
onError("Identity verification could not open. Check your connection, camera permission, or use the hosted fallback.");
|
|
51
|
+
} finally {
|
|
52
|
+
setOpening(false);
|
|
53
|
+
}
|
|
54
|
+
}, [launchSecret, onCallback, onError, onOpened, opening, publishableKey]);
|
|
55
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "data-variant": "primary", "data-testid": "stripe-identity-launcher", disabled: opening, onClick: () => void open(), children: opening ? "Opening secure verification\u2026" : "Verify identity securely" });
|
|
56
|
+
}
|
|
57
|
+
var init_stripe = __esm({
|
|
58
|
+
"src/plugins/stripe.tsx"() {
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// src/plugins/persona.tsx
|
|
63
|
+
var persona_exports = {};
|
|
64
|
+
__export(persona_exports, {
|
|
65
|
+
default: () => PersonaEmbeddedLauncher
|
|
66
|
+
});
|
|
67
|
+
function PersonaEmbeddedLauncher({
|
|
68
|
+
inquiryId,
|
|
69
|
+
environmentId,
|
|
70
|
+
launchSecret,
|
|
71
|
+
onCallback,
|
|
72
|
+
onError,
|
|
73
|
+
onOpened,
|
|
74
|
+
onPause
|
|
75
|
+
}) {
|
|
76
|
+
const mountRef = react.useRef(null);
|
|
77
|
+
const clientRef = react.useRef(null);
|
|
78
|
+
const generationRef = react.useRef(0);
|
|
79
|
+
const [ready, setReady] = react.useState(false);
|
|
80
|
+
const [opening, setOpening] = react.useState(false);
|
|
81
|
+
const prepare = react.useCallback(async () => {
|
|
82
|
+
if (clientRef.current || !mountRef.current || !inquiryId) return;
|
|
83
|
+
const generation = ++generationRef.current;
|
|
84
|
+
setOpening(true);
|
|
85
|
+
try {
|
|
86
|
+
const { Client } = await import('persona');
|
|
87
|
+
if (generation !== generationRef.current || !mountRef.current) return;
|
|
88
|
+
const client = new Client({
|
|
89
|
+
inquiryId,
|
|
90
|
+
environmentId,
|
|
91
|
+
...launchSecret ? { sessionToken: launchSecret } : {},
|
|
92
|
+
parent: mountRef.current,
|
|
93
|
+
frameWidth: "100%",
|
|
94
|
+
frameHeight: "100%",
|
|
95
|
+
onReady: () => {
|
|
96
|
+
if (generation !== generationRef.current) return;
|
|
97
|
+
onOpened?.();
|
|
98
|
+
setReady(true);
|
|
99
|
+
setOpening(false);
|
|
100
|
+
client.open();
|
|
101
|
+
},
|
|
102
|
+
onComplete: () => onCallback(),
|
|
103
|
+
onCancel: () => onPause?.(),
|
|
104
|
+
onError: () => {
|
|
105
|
+
setOpening(false);
|
|
106
|
+
onError("Secure verification could not open in this browser. Use the hosted or continuation option below.");
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
clientRef.current = client;
|
|
110
|
+
} catch {
|
|
111
|
+
setOpening(false);
|
|
112
|
+
onError("Secure verification could not open in this browser. Use the hosted or continuation option below.");
|
|
113
|
+
}
|
|
114
|
+
}, [environmentId, inquiryId, launchSecret, onCallback, onError, onOpened, onPause]);
|
|
115
|
+
react.useEffect(() => {
|
|
116
|
+
void prepare();
|
|
117
|
+
return () => {
|
|
118
|
+
generationRef.current += 1;
|
|
119
|
+
clientRef.current?.destroy();
|
|
120
|
+
clientRef.current = null;
|
|
121
|
+
setReady(false);
|
|
122
|
+
};
|
|
123
|
+
}, [prepare]);
|
|
124
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-label": "Identity verification", "data-testid": "verification-persona-embedded", children: [
|
|
125
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: mountRef, className: "siv-record", style: { minHeight: "min(560px, 62dvh)", position: "relative" }, children: opening ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", role: "status", children: "Preparing secure verification\u2026" }) : null }),
|
|
126
|
+
ready ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", onClick: () => {
|
|
127
|
+
onOpened?.();
|
|
128
|
+
clientRef.current?.open();
|
|
129
|
+
}, children: "Reopen secure verification" }) : null,
|
|
130
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-disclosure", children: "Verification technology provided by Persona." })
|
|
131
|
+
] });
|
|
132
|
+
}
|
|
133
|
+
var init_persona = __esm({
|
|
134
|
+
"src/plugins/persona.tsx"() {
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// src/plugins/plaid.tsx
|
|
139
|
+
var plaid_exports = {};
|
|
140
|
+
__export(plaid_exports, {
|
|
141
|
+
default: () => PlaidLegacyLauncher
|
|
142
|
+
});
|
|
143
|
+
function PlaidLegacyLauncher(props) {
|
|
144
|
+
const [usePlaidLink, setUsePlaidLink] = react.useState(null);
|
|
145
|
+
const onError = props.onError;
|
|
146
|
+
react.useEffect(() => {
|
|
147
|
+
let cancelled = false;
|
|
148
|
+
void import('react-plaid-link').then((mod) => {
|
|
149
|
+
if (!cancelled) setUsePlaidLink(() => mod.usePlaidLink);
|
|
150
|
+
}).catch(() => {
|
|
151
|
+
onError("Verification could not open in this browser.");
|
|
152
|
+
});
|
|
153
|
+
return () => {
|
|
154
|
+
cancelled = true;
|
|
155
|
+
};
|
|
156
|
+
}, [onError]);
|
|
157
|
+
if (!usePlaidLink) {
|
|
158
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "data-variant": "primary", disabled: true, children: "Preparing secure verification\u2026" });
|
|
159
|
+
}
|
|
160
|
+
return /* @__PURE__ */ jsxRuntime.jsx(PlaidReady, { usePlaidLink, ...props });
|
|
161
|
+
}
|
|
162
|
+
function PlaidReady({
|
|
163
|
+
usePlaidLink,
|
|
164
|
+
launchSecret,
|
|
165
|
+
onCallback,
|
|
166
|
+
onError,
|
|
167
|
+
onOpened,
|
|
168
|
+
onPause
|
|
169
|
+
}) {
|
|
170
|
+
const onSuccess = react.useCallback(() => onCallback(), [onCallback]);
|
|
171
|
+
const onExit = react.useCallback((error2) => {
|
|
172
|
+
if (error2) onError(error2.display_message || "Verification closed before it could finish.");
|
|
173
|
+
else onPause?.();
|
|
174
|
+
}, [onError, onPause]);
|
|
175
|
+
const { open, ready, error } = usePlaidLink({ token: launchSecret, onSuccess, onExit });
|
|
176
|
+
react.useEffect(() => {
|
|
177
|
+
if (error) onError("Verification could not open in this browser.");
|
|
178
|
+
}, [error, onError]);
|
|
179
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "data-variant": "primary", disabled: !ready, onClick: () => {
|
|
180
|
+
onOpened?.();
|
|
181
|
+
open();
|
|
182
|
+
}, children: ready ? "Open secure verification" : "Preparing secure verification\u2026" });
|
|
183
|
+
}
|
|
184
|
+
var init_plaid = __esm({
|
|
185
|
+
"src/plugins/plaid.tsx"() {
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
function AppealForm({ attemptId, onSubmit, onSubmitted, onCancel }) {
|
|
189
|
+
const [reasonCode, setReasonCode] = react.useState("non_biometric_alternative");
|
|
190
|
+
const [busy, setBusy] = react.useState(false);
|
|
191
|
+
const [result, setResult] = react.useState(null);
|
|
192
|
+
const [error, setError] = react.useState(null);
|
|
193
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
194
|
+
"form",
|
|
195
|
+
{
|
|
196
|
+
className: "siv siv-dialog",
|
|
197
|
+
"aria-labelledby": "siv-appeal-title",
|
|
198
|
+
onSubmit: (event) => {
|
|
199
|
+
event.preventDefault();
|
|
200
|
+
if (!onSubmit) {
|
|
201
|
+
setError("Appeal submission is not configured.");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
setBusy(true);
|
|
205
|
+
void onSubmit({
|
|
206
|
+
attemptId,
|
|
207
|
+
reasonCode,
|
|
208
|
+
nonBiometricPathRequested: reasonCode === "non_biometric_alternative"
|
|
209
|
+
}).then((next) => {
|
|
210
|
+
setResult(next);
|
|
211
|
+
onSubmitted?.(next);
|
|
212
|
+
}).catch((cause) => {
|
|
213
|
+
setError(cause instanceof Error ? cause.message : "Verification review could not be requested.");
|
|
214
|
+
}).finally(() => setBusy(false));
|
|
215
|
+
},
|
|
216
|
+
children: [
|
|
217
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "siv-title", id: "siv-appeal-title", children: "Request a verification review" }),
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: "Support sees only a safe review reference. Identity documents remain with the verification provider." }),
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "siv-field", children: [
|
|
220
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "What do you need?" }),
|
|
221
|
+
/* @__PURE__ */ jsxRuntime.jsxs("select", { className: "siv-select", value: reasonCode, onChange: (event) => setReasonCode(event.target.value), children: [
|
|
222
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "non_biometric_alternative", children: "Cannot use a selfie" }),
|
|
223
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "decision_appeal", children: "Appeal a decision" }),
|
|
224
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "accessibility_support", children: "Accessibility support" })
|
|
225
|
+
] })
|
|
226
|
+
] }),
|
|
227
|
+
result ? /* @__PURE__ */ jsxRuntime.jsxs("p", { role: "status", children: [
|
|
228
|
+
"Your review is open. Reference ",
|
|
229
|
+
result.appealId.slice(0, 8),
|
|
230
|
+
"."
|
|
231
|
+
] }) : null,
|
|
232
|
+
error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", children: error }) : null,
|
|
233
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "siv-actions", children: [
|
|
234
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", onClick: onCancel, children: "Close" }),
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", className: "siv-button", "data-variant": "primary", disabled: busy || !onSubmit, children: "Submit review request" })
|
|
236
|
+
] })
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// src/copy.ts
|
|
243
|
+
function verificationCopy(packageCode) {
|
|
244
|
+
switch (packageCode) {
|
|
245
|
+
case "business_kyb":
|
|
246
|
+
return {
|
|
247
|
+
title: "Secure business verification",
|
|
248
|
+
description: "The legal business is verified separately from your identity. You can pause and resume without starting over.",
|
|
249
|
+
reviewTitle: "Business review is in progress"
|
|
250
|
+
};
|
|
251
|
+
case "ownership_review":
|
|
252
|
+
return {
|
|
253
|
+
title: "Ownership and authority review",
|
|
254
|
+
description: "We are reviewing authority for this organization. Your action stays saved.",
|
|
255
|
+
reviewTitle: "Ownership review is in progress"
|
|
256
|
+
};
|
|
257
|
+
case "associated_person_idv":
|
|
258
|
+
return {
|
|
259
|
+
title: "Associated person verification",
|
|
260
|
+
description: "This identity check supports a separate business relationship review.",
|
|
261
|
+
reviewTitle: "Relationship review is in progress"
|
|
262
|
+
};
|
|
263
|
+
default:
|
|
264
|
+
return {
|
|
265
|
+
title: "Secure identity verification",
|
|
266
|
+
description: "You can pause and resume without starting over. Your action stays saved.",
|
|
267
|
+
reviewTitle: "Identity review is in progress"
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
var CAMERA_HELP = [
|
|
272
|
+
"Allow camera access in browser settings, close other camera apps, then retry.",
|
|
273
|
+
"Use an up-to-date Safari, Chrome, Firefox, or Edge browser. If an in-app browser blocks the camera, open the continuation link in your main browser."
|
|
274
|
+
];
|
|
275
|
+
function useOnlineStatus() {
|
|
276
|
+
const [online, setOnline] = react.useState(verificationWeb.isBrowserOnline);
|
|
277
|
+
react.useEffect(() => verificationWeb.subscribeOnlineStatus(setOnline), []);
|
|
278
|
+
return online;
|
|
279
|
+
}
|
|
280
|
+
function useFocusRecovery(active) {
|
|
281
|
+
react.useEffect(() => {
|
|
282
|
+
if (!active || typeof document === "undefined") return;
|
|
283
|
+
const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
284
|
+
return () => {
|
|
285
|
+
previous?.focus();
|
|
286
|
+
};
|
|
287
|
+
}, [active]);
|
|
288
|
+
}
|
|
289
|
+
function useBusy() {
|
|
290
|
+
const [busy, setBusy] = react.useState(null);
|
|
291
|
+
const run = react.useCallback(async (key, task) => {
|
|
292
|
+
if (busy) return;
|
|
293
|
+
setBusy(key);
|
|
294
|
+
try {
|
|
295
|
+
await task();
|
|
296
|
+
} finally {
|
|
297
|
+
setBusy(null);
|
|
298
|
+
}
|
|
299
|
+
}, [busy]);
|
|
300
|
+
return [busy, run];
|
|
301
|
+
}
|
|
302
|
+
function SupportLink({ href = "/support/verification", children = "Contact support" }) {
|
|
303
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { className: "siv-link", href, rel: "noopener noreferrer", children });
|
|
304
|
+
}
|
|
305
|
+
var StripeIdentityLauncher2 = react.lazy(() => Promise.resolve().then(() => (init_stripe(), stripe_exports)));
|
|
306
|
+
var PersonaEmbeddedLauncher2 = react.lazy(() => Promise.resolve().then(() => (init_persona(), persona_exports)));
|
|
307
|
+
var PlaidLegacyLauncher2 = react.lazy(() => Promise.resolve().then(() => (init_plaid(), plaid_exports)));
|
|
308
|
+
function VerificationLauncher({
|
|
309
|
+
open,
|
|
310
|
+
session,
|
|
311
|
+
onOpenChange,
|
|
312
|
+
onSessionChange,
|
|
313
|
+
onStatusRefresh,
|
|
314
|
+
pause,
|
|
315
|
+
retry,
|
|
316
|
+
cancel,
|
|
317
|
+
createContinuationUrl,
|
|
318
|
+
supportHref = "/support/verification",
|
|
319
|
+
stripePublishableKey,
|
|
320
|
+
personaEnvironmentId,
|
|
321
|
+
onAppeal,
|
|
322
|
+
plugins
|
|
323
|
+
}) {
|
|
324
|
+
const online = useOnlineStatus();
|
|
325
|
+
const [busy, run] = useBusy();
|
|
326
|
+
const [message, setMessage] = react.useState(null);
|
|
327
|
+
const [qrDataUrl, setQrDataUrl] = react.useState(null);
|
|
328
|
+
const [appealOpen, setAppealOpen] = react.useState(false);
|
|
329
|
+
const reducedMotion = verificationWeb.prefersReducedMotion();
|
|
330
|
+
const surface = verificationWeb.clientSurface();
|
|
331
|
+
const mediaDevicesMissing = typeof navigator === "undefined" || !navigator.mediaDevices;
|
|
332
|
+
const [started, setStarted] = react.useState(!reducedMotion);
|
|
333
|
+
const [cameraHelp, setCameraHelp] = react.useState(mediaDevicesMissing);
|
|
334
|
+
const dialogRef = react.useRef(null);
|
|
335
|
+
useFocusRecovery(open);
|
|
336
|
+
const continuationUrl = react.useMemo(() => {
|
|
337
|
+
if (!session.continuation) return null;
|
|
338
|
+
if (createContinuationUrl) return createContinuationUrl(session.continuation.token);
|
|
339
|
+
return session.continuation.token;
|
|
340
|
+
}, [createContinuationUrl, session.continuation]);
|
|
341
|
+
react.useEffect(() => {
|
|
342
|
+
let live = true;
|
|
343
|
+
setQrDataUrl(null);
|
|
344
|
+
if (!continuationUrl) return;
|
|
345
|
+
void verificationWeb.createQrDataUrl(continuationUrl).then((url) => {
|
|
346
|
+
if (live) setQrDataUrl(url);
|
|
347
|
+
});
|
|
348
|
+
return () => {
|
|
349
|
+
live = false;
|
|
350
|
+
};
|
|
351
|
+
}, [continuationUrl]);
|
|
352
|
+
const refresh = react.useCallback(async () => {
|
|
353
|
+
await run("refresh", async () => {
|
|
354
|
+
const result = await onStatusRefresh();
|
|
355
|
+
if (typeof result === "object") {
|
|
356
|
+
onSessionChange(result);
|
|
357
|
+
setMessage(result.status === "verified" ? "Verified. Returning to your saved action\u2026" : "Your status is not approved yet. We\u2019ll keep your action saved.");
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
setMessage(result ? "Verified. Returning to your saved action\u2026" : "Your status is not approved yet. We\u2019ll keep your action saved.");
|
|
361
|
+
});
|
|
362
|
+
}, [onSessionChange, onStatusRefresh, run]);
|
|
363
|
+
const providerCallback = react.useCallback(() => {
|
|
364
|
+
setMessage("Verification was submitted. Checking the server-side result now.");
|
|
365
|
+
void refresh();
|
|
366
|
+
}, [refresh]);
|
|
367
|
+
const handlePluginError = react.useCallback((errorMessage) => {
|
|
368
|
+
setMessage(errorMessage);
|
|
369
|
+
if (/camera|permission/i.test(errorMessage) || typeof navigator === "undefined" || !navigator.mediaDevices) {
|
|
370
|
+
setCameraHelp(true);
|
|
371
|
+
}
|
|
372
|
+
}, []);
|
|
373
|
+
const pauseAndClose = react.useCallback(async () => {
|
|
374
|
+
await run("pause", async () => {
|
|
375
|
+
if (pause) {
|
|
376
|
+
const result = await pause();
|
|
377
|
+
if ("attemptId" in result) onSessionChange(result);
|
|
378
|
+
else onSessionChange({ ...session, status: result.status, canResume: true });
|
|
379
|
+
}
|
|
380
|
+
onOpenChange(false);
|
|
381
|
+
});
|
|
382
|
+
}, [onOpenChange, onSessionChange, pause, run, session]);
|
|
383
|
+
if (!open) return null;
|
|
384
|
+
const launcherKey = session.launch?.launcherKey ?? session.launcherKey ?? "none";
|
|
385
|
+
const blocked = session.status === "processing" || session.status === "manual_review_required";
|
|
386
|
+
const unavailable = session.status === "provider_unavailable" || !online;
|
|
387
|
+
const nonInteractive = session.presentation === "none";
|
|
388
|
+
const copy = verificationCopy(session.packageCode);
|
|
389
|
+
const launchSecret = session.launch?.transientSecret ?? "";
|
|
390
|
+
const CustomPlugin = plugins?.[launcherKey];
|
|
391
|
+
const pluginProps = {
|
|
392
|
+
launchSecret,
|
|
393
|
+
publishableKey: stripePublishableKey,
|
|
394
|
+
inquiryId: session.launch?.continuationReference,
|
|
395
|
+
environmentId: personaEnvironmentId,
|
|
396
|
+
onCallback: providerCallback,
|
|
397
|
+
onError: handlePluginError,
|
|
398
|
+
onOpened: () => void 0,
|
|
399
|
+
onPause: () => {
|
|
400
|
+
void pauseAndClose();
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
404
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
405
|
+
"div",
|
|
406
|
+
{
|
|
407
|
+
className: "siv siv-dialog",
|
|
408
|
+
role: "dialog",
|
|
409
|
+
"aria-modal": "true",
|
|
410
|
+
"aria-labelledby": "siv-launcher-title",
|
|
411
|
+
"data-testid": "verification-launcher",
|
|
412
|
+
"data-reduced-motion": reducedMotion ? "true" : "false",
|
|
413
|
+
"data-surface": surface,
|
|
414
|
+
ref: dialogRef,
|
|
415
|
+
children: [
|
|
416
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "siv-header", children: [
|
|
417
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
418
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "siv-title", id: "siv-launcher-title", children: copy.title }),
|
|
419
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: copy.description })
|
|
420
|
+
] }),
|
|
421
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "aria-label": "Pause verification and close", onClick: () => void pauseAndClose(), disabled: Boolean(busy), children: "Pause" })
|
|
422
|
+
] }),
|
|
423
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { "aria-live": "polite", "aria-atomic": "true", className: "siv-live", children: [
|
|
424
|
+
!online ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-alert", role: "status", children: "You are offline. Your place is saved. Reconnect to resume verification." }) : null,
|
|
425
|
+
blocked ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "siv-alert", role: "status", children: [
|
|
426
|
+
session.status === "manual_review_required" ? "A review is in progress." : "We are checking your verification.",
|
|
427
|
+
" The protected action stays blocked until an approved server-side decision arrives."
|
|
428
|
+
] }) : null,
|
|
429
|
+
nonInteractive && !blocked && !unavailable ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "siv-alert", role: "status", children: [
|
|
430
|
+
copy.reviewTitle,
|
|
431
|
+
". No additional browser step is required right now."
|
|
432
|
+
] }) : null,
|
|
433
|
+
unavailable && online ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-alert", role: "status", children: "Verification is temporarily unavailable. Retry later, continue on another device, or contact support." }) : null,
|
|
434
|
+
message ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-alert", role: "status", children: message }) : null,
|
|
435
|
+
cameraHelp ? /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "verification-camera-help", className: "siv-alert", role: "status", children: [
|
|
436
|
+
CAMERA_HELP.map((line) => /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: line }, line)),
|
|
437
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "siv-copy", children: [
|
|
438
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Continue on another device" }),
|
|
439
|
+
" if this camera cannot open."
|
|
440
|
+
] })
|
|
441
|
+
] }) : null
|
|
442
|
+
] }),
|
|
443
|
+
reducedMotion && !started && !blocked && !unavailable ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "data-variant": "primary", onClick: () => setStarted(true), children: "Start verification" }) : null,
|
|
444
|
+
started && !blocked && !unavailable && CustomPlugin ? /* @__PURE__ */ jsxRuntime.jsx(CustomPlugin, { ...pluginProps }) : null,
|
|
445
|
+
started && !blocked && !unavailable && !CustomPlugin && launcherKey === "persona_embedded" && session.launch ? /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", children: "Preparing secure verification\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(PersonaEmbeddedLauncher2, { ...pluginProps, inquiryId: session.launch.continuationReference }) }) : null,
|
|
446
|
+
started && !blocked && !unavailable && !CustomPlugin && launcherKey === "plaid_link" && launchSecret ? /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", children: "Preparing secure verification\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(PlaidLegacyLauncher2, { ...pluginProps }) }) : null,
|
|
447
|
+
started && !blocked && !unavailable && !CustomPlugin && launcherKey === "stripe_identity" && launchSecret ? /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", children: "Preparing secure verification\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(StripeIdentityLauncher2, { ...pluginProps }) }) : null,
|
|
448
|
+
session.providerDisclosure ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-disclosure", "data-testid": "verification-provider-disclosure", children: session.providerDisclosure }) : null,
|
|
449
|
+
session.launch?.hostedUrl ? /* @__PURE__ */ jsxRuntime.jsx("a", { className: "siv-link", "data-testid": "verification-hosted-fallback", href: session.launch.hostedUrl, target: "_blank", rel: "noopener noreferrer", children: "Open hosted verification" }) : null,
|
|
450
|
+
!nonInteractive ? /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "siv-grid", "aria-label": "Continue on another device", "data-emphasis": cameraHelp ? "true" : "false", children: [
|
|
451
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: "Use a one-time link or scan the QR code. The link contains no provider result and expires shortly." }),
|
|
452
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", disabled: !continuationUrl, onClick: () => continuationUrl && void navigator.clipboard.writeText(continuationUrl).then(() => setMessage("Secure continuation link copied. It expires shortly and works once.")), children: "Copy secure continuation link" }),
|
|
453
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "verification-qr-fallback", children: qrDataUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
454
|
+
"img",
|
|
455
|
+
{
|
|
456
|
+
src: qrDataUrl,
|
|
457
|
+
alt: "QR code to continue verification on another device",
|
|
458
|
+
width: 144,
|
|
459
|
+
height: 144,
|
|
460
|
+
className: reducedMotion ? void 0 : "siv-qr-animate"
|
|
461
|
+
}
|
|
462
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: "QR code unavailable. Use the continuation link." }) })
|
|
463
|
+
] }) : null,
|
|
464
|
+
!nonInteractive ? /* @__PURE__ */ jsxRuntime.jsxs("details", { "data-testid": "verification-browser-troubleshooting", children: [
|
|
465
|
+
/* @__PURE__ */ jsxRuntime.jsx("summary", { children: "Camera or browser trouble?" }),
|
|
466
|
+
CAMERA_HELP.map((line) => /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: line }, line)),
|
|
467
|
+
verificationWeb.isInstalledPwa() ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "siv-copy", children: "This app is installed. If the camera is blocked, open the continuation link in your system browser." }) : null,
|
|
468
|
+
/* @__PURE__ */ jsxRuntime.jsx(SupportLink, { href: supportHref })
|
|
469
|
+
] }) : null,
|
|
470
|
+
/* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "siv-footer siv-actions", children: [
|
|
471
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "data-variant": "danger", onClick: () => void run("cancel", async () => {
|
|
472
|
+
if (!cancel) return;
|
|
473
|
+
const result = await cancel();
|
|
474
|
+
onSessionChange("attemptId" in result ? result : { ...session, status: result.status, canResume: false, canRetry: true });
|
|
475
|
+
setMessage("Verification was canceled. Your saved action was not submitted.");
|
|
476
|
+
}), disabled: Boolean(busy), children: "Cancel verification" }),
|
|
477
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", onClick: () => setAppealOpen(true), disabled: Boolean(busy), children: "Request a review" }),
|
|
478
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", onClick: () => void run("retry", async () => {
|
|
479
|
+
if (!retry || !session.canRetry || !online) return;
|
|
480
|
+
onSessionChange(await retry());
|
|
481
|
+
}), disabled: Boolean(busy) || !session.canRetry || !online, children: "Retry" }),
|
|
482
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "siv-button", "data-variant": "primary", onClick: () => void refresh(), disabled: Boolean(busy) || !online, children: "Check status" })
|
|
483
|
+
] })
|
|
484
|
+
]
|
|
485
|
+
}
|
|
486
|
+
),
|
|
487
|
+
appealOpen ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
488
|
+
AppealForm,
|
|
489
|
+
{
|
|
490
|
+
attemptId: session.attemptId,
|
|
491
|
+
onSubmit: onAppeal,
|
|
492
|
+
onSubmitted: () => setAppealOpen(false),
|
|
493
|
+
onCancel: () => setAppealOpen(false)
|
|
494
|
+
}
|
|
495
|
+
) : null
|
|
496
|
+
] });
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
exports.VerificationLauncher = VerificationLauncher;
|
|
500
|
+
//# sourceMappingURL=launcher.cjs.map
|
|
501
|
+
//# sourceMappingURL=launcher.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugins/stripe.tsx","../src/plugins/persona.tsx","../src/plugins/plaid.tsx","../src/appeal/AppealForm.tsx","../src/copy.ts","../src/hooks/runtime.ts","../src/support/SupportLink.tsx","../src/launcher/VerificationLauncher.tsx"],"names":["useState","useCallback","jsx","useRef","useEffect","jsxs","error","isBrowserOnline","subscribeOnlineStatus","StripeIdentityLauncher","lazy","PersonaEmbeddedLauncher","PlaidLegacyLauncher","prefersReducedMotion","clientSurface","useMemo","createQrDataUrl","Fragment","Suspense","isInstalledPwa"],"mappings":"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","file":"launcher.cjs","sourcesContent":["import { useCallback, useState } from 'react';\n\nexport interface ProviderLauncherProps {\n launchSecret: string;\n publishableKey?: string;\n environmentId?: string;\n inquiryId?: string;\n onCallback: () => void;\n onError: (message: string) => void;\n onOpened?: () => void;\n onPause?: () => void;\n}\n\nexport default function StripeIdentityLauncher({\n launchSecret,\n publishableKey,\n onCallback,\n onError,\n onOpened,\n}: ProviderLauncherProps) {\n const [opening, setOpening] = useState(false);\n\n const open = useCallback(async () => {\n if (opening) return;\n const key = publishableKey ?? '';\n if (!key.startsWith('pk_')) {\n onError('Secure identity verification is not configured on this device. Use the hosted fallback or contact support.');\n return;\n }\n setOpening(true);\n onOpened?.();\n try {\n const { loadStripe } = await import('@stripe/stripe-js');\n const stripe = await loadStripe(key);\n if (!stripe) throw new Error('stripe_unavailable');\n const result = await stripe.verifyIdentity(launchSecret);\n if (result.error) {\n onError(result.error.message || 'Identity verification could not continue. Check camera permissions or use the hosted fallback.');\n return;\n }\n onCallback();\n } catch {\n onError('Identity verification could not open. Check your connection, camera permission, or use the hosted fallback.');\n } finally {\n setOpening(false);\n }\n }, [launchSecret, onCallback, onError, onOpened, opening, publishableKey]);\n\n return (\n <button type=\"button\" className=\"siv-button\" data-variant=\"primary\" data-testid=\"stripe-identity-launcher\" disabled={opening} onClick={() => void open()}>\n {opening ? 'Opening secure verification…' : 'Verify identity securely'}\n </button>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ProviderLauncherProps } from './stripe.tsx';\n\nexport default function PersonaEmbeddedLauncher({\n inquiryId,\n environmentId,\n launchSecret,\n onCallback,\n onError,\n onOpened,\n onPause,\n}: ProviderLauncherProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const clientRef = useRef<{ open(): void; destroy(): void } | null>(null);\n const generationRef = useRef(0);\n const [ready, setReady] = useState(false);\n const [opening, setOpening] = useState(false);\n\n const prepare = useCallback(async () => {\n if (clientRef.current || !mountRef.current || !inquiryId) return;\n const generation = ++generationRef.current;\n setOpening(true);\n try {\n const { Client } = await import('persona');\n if (generation !== generationRef.current || !mountRef.current) return;\n const client = new Client({\n inquiryId,\n environmentId,\n ...(launchSecret ? { sessionToken: launchSecret } : {}),\n parent: mountRef.current,\n frameWidth: '100%',\n frameHeight: '100%',\n onReady: () => {\n if (generation !== generationRef.current) return;\n onOpened?.();\n setReady(true);\n setOpening(false);\n client.open();\n },\n onComplete: () => onCallback(),\n onCancel: () => onPause?.(),\n onError: () => {\n setOpening(false);\n onError('Secure verification could not open in this browser. Use the hosted or continuation option below.');\n },\n });\n clientRef.current = client;\n } catch {\n setOpening(false);\n onError('Secure verification could not open in this browser. Use the hosted or continuation option below.');\n }\n }, [environmentId, inquiryId, launchSecret, onCallback, onError, onOpened, onPause]);\n\n useEffect(() => {\n void prepare();\n return () => {\n generationRef.current += 1;\n clientRef.current?.destroy();\n clientRef.current = null;\n setReady(false);\n };\n }, [prepare]);\n\n return (\n <section aria-label=\"Identity verification\" data-testid=\"verification-persona-embedded\">\n <div ref={mountRef} className=\"siv-record\" style={{ minHeight: 'min(560px, 62dvh)', position: 'relative' }}>\n {opening ? <p className=\"siv-copy\" role=\"status\">Preparing secure verification…</p> : null}\n </div>\n {ready ? (\n <button type=\"button\" className=\"siv-button\" onClick={() => { onOpened?.(); clientRef.current?.open(); }}>\n Reopen secure verification\n </button>\n ) : null}\n <p className=\"siv-disclosure\">Verification technology provided by Persona.</p>\n </section>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ProviderLauncherProps } from './stripe.tsx';\n\ntype PlaidHook = (config: {\n token: string;\n onSuccess: () => void;\n onExit: (error: { display_message?: string | null } | null) => void;\n}) => { open: () => void; ready: boolean; error: Error | null };\n\nexport default function PlaidLegacyLauncher(props: ProviderLauncherProps) {\n const [usePlaidLink, setUsePlaidLink] = useState<PlaidHook | null>(null);\n const onError = props.onError;\n\n useEffect(() => {\n let cancelled = false;\n void import('react-plaid-link').then((mod) => {\n if (!cancelled) setUsePlaidLink(() => mod.usePlaidLink as PlaidHook);\n }).catch(() => {\n onError('Verification could not open in this browser.');\n });\n return () => { cancelled = true; };\n }, [onError]);\n\n if (!usePlaidLink) {\n return (\n <button type=\"button\" className=\"siv-button\" data-variant=\"primary\" disabled>\n Preparing secure verification…\n </button>\n );\n }\n return <PlaidReady usePlaidLink={usePlaidLink} {...props} />;\n}\n\nfunction PlaidReady({\n usePlaidLink,\n launchSecret,\n onCallback,\n onError,\n onOpened,\n onPause,\n}: ProviderLauncherProps & { usePlaidLink: PlaidHook }) {\n const onSuccess = useCallback(() => onCallback(), [onCallback]);\n const onExit = useCallback((error: { display_message?: string | null } | null) => {\n if (error) onError(error.display_message || 'Verification closed before it could finish.');\n else onPause?.();\n }, [onError, onPause]);\n const { open, ready, error } = usePlaidLink({ token: launchSecret, onSuccess, onExit });\n\n useEffect(() => {\n if (error) onError('Verification could not open in this browser.');\n }, [error, onError]);\n\n return (\n <button type=\"button\" className=\"siv-button\" data-variant=\"primary\" disabled={!ready} onClick={() => { onOpened?.(); open(); }}>\n {ready ? 'Open secure verification' : 'Preparing secure verification…'}\n </button>\n );\n}\n","import { useState } from 'react';\n\nexport interface AppealFormProps {\n attemptId?: string;\n onSubmit?: (input: {\n attemptId?: string;\n reasonCode: 'non_biometric_alternative' | 'decision_appeal' | 'accessibility_support';\n nonBiometricPathRequested: boolean;\n }) => Promise<{ appealId: string; status: string }>;\n onSubmitted?: (result: { appealId: string; status: string }) => void;\n onCancel?: () => void;\n}\n\nexport function AppealForm({ attemptId, onSubmit, onSubmitted, onCancel }: AppealFormProps) {\n const [reasonCode, setReasonCode] = useState<'non_biometric_alternative' | 'decision_appeal' | 'accessibility_support'>('non_biometric_alternative');\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<{ appealId: string; status: string } | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <form\n className=\"siv siv-dialog\"\n aria-labelledby=\"siv-appeal-title\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!onSubmit) {\n setError('Appeal submission is not configured.');\n return;\n }\n setBusy(true);\n void onSubmit({\n attemptId,\n reasonCode,\n nonBiometricPathRequested: reasonCode === 'non_biometric_alternative',\n }).then((next) => {\n setResult(next);\n onSubmitted?.(next);\n }).catch((cause) => {\n setError(cause instanceof Error ? cause.message : 'Verification review could not be requested.');\n }).finally(() => setBusy(false));\n }}\n >\n <h2 className=\"siv-title\" id=\"siv-appeal-title\">Request a verification review</h2>\n <p className=\"siv-copy\">Support sees only a safe review reference. Identity documents remain with the verification provider.</p>\n <label className=\"siv-field\">\n <span>What do you need?</span>\n <select className=\"siv-select\" value={reasonCode} onChange={(event) => setReasonCode(event.target.value as typeof reasonCode)}>\n <option value=\"non_biometric_alternative\">Cannot use a selfie</option>\n <option value=\"decision_appeal\">Appeal a decision</option>\n <option value=\"accessibility_support\">Accessibility support</option>\n </select>\n </label>\n {result ? <p role=\"status\">Your review is open. Reference {result.appealId.slice(0, 8)}.</p> : null}\n {error ? <p role=\"alert\">{error}</p> : null}\n <div className=\"siv-actions\">\n <button type=\"button\" className=\"siv-button\" onClick={onCancel}>Close</button>\n <button type=\"submit\" className=\"siv-button\" data-variant=\"primary\" disabled={busy || !onSubmit}>Submit review request</button>\n </div>\n </form>\n );\n}\n\nexport default AppealForm;\n","import type { VerificationPackageCode } from '@splitin/verification-adapter-sdk';\n\nexport function verificationCopy(packageCode: VerificationPackageCode | string): {\n title: string;\n description: string;\n reviewTitle: string;\n} {\n switch (packageCode) {\n case 'business_kyb':\n return {\n title: 'Secure business verification',\n description: 'The legal business is verified separately from your identity. You can pause and resume without starting over.',\n reviewTitle: 'Business review is in progress',\n };\n case 'ownership_review':\n return {\n title: 'Ownership and authority review',\n description: 'We are reviewing authority for this organization. Your action stays saved.',\n reviewTitle: 'Ownership review is in progress',\n };\n case 'associated_person_idv':\n return {\n title: 'Associated person verification',\n description: 'This identity check supports a separate business relationship review.',\n reviewTitle: 'Relationship review is in progress',\n };\n default:\n return {\n title: 'Secure identity verification',\n description: 'You can pause and resume without starting over. Your action stays saved.',\n reviewTitle: 'Identity review is in progress',\n };\n }\n}\n\nexport const CAMERA_HELP = [\n 'Allow camera access in browser settings, close other camera apps, then retry.',\n 'Use an up-to-date Safari, Chrome, Firefox, or Edge browser. If an in-app browser blocks the camera, open the continuation link in your main browser.',\n];\n","import { useCallback, useEffect, useState } from 'react';\nimport { isBrowserOnline, subscribeOnlineStatus } from '@splitin/verification-web';\n\nexport function useOnlineStatus(): boolean {\n const [online, setOnline] = useState(isBrowserOnline);\n useEffect(() => subscribeOnlineStatus(setOnline), []);\n return online;\n}\n\nexport function useFocusRecovery(active: boolean): void {\n useEffect(() => {\n if (!active || typeof document === 'undefined') return;\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n return () => { previous?.focus(); };\n }, [active]);\n}\n\nexport function useBusy<T extends string>(): [T | null, (key: T, task: () => Promise<void>) => Promise<void>] {\n const [busy, setBusy] = useState<T | null>(null);\n const run = useCallback(async (key: T, task: () => Promise<void>) => {\n if (busy) return;\n setBusy(key);\n try { await task(); } finally { setBusy(null); }\n }, [busy]);\n return [busy, run];\n}\n","export function SupportLink({ href = '/support/verification', children = 'Contact support' }: {\n href?: string;\n children?: string;\n}) {\n return (\n <a className=\"siv-link\" href={href} rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n}\n\nexport default SupportLink;\n","import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState, type ComponentType } from 'react';\nimport {\n clientSurface,\n createQrDataUrl,\n isInstalledPwa,\n prefersReducedMotion,\n type VerificationStatusEnvelope,\n} from '@splitin/verification-web';\n\nimport { AppealForm, type AppealFormProps } from '../appeal/AppealForm.tsx';\nimport { CAMERA_HELP, verificationCopy } from '../copy.ts';\nimport { useBusy, useFocusRecovery, useOnlineStatus } from '../hooks/runtime.ts';\nimport type { ProviderLauncherProps } from '../plugins/stripe.tsx';\nimport { SupportLink } from '../support/SupportLink.tsx';\n\nconst StripeIdentityLauncher = lazy(() => import('../plugins/stripe.tsx'));\nconst PersonaEmbeddedLauncher = lazy(() => import('../plugins/persona.tsx'));\nconst PlaidLegacyLauncher = lazy(() => import('../plugins/plaid.tsx'));\n\nexport interface VerificationLauncherProps {\n open: boolean;\n session: VerificationStatusEnvelope;\n onOpenChange: (open: boolean) => void;\n onSessionChange: (session: VerificationStatusEnvelope) => void;\n onStatusRefresh: () => Promise<boolean | VerificationStatusEnvelope>;\n pause?: () => Promise<VerificationStatusEnvelope | { status: VerificationStatusEnvelope['status'] }>;\n retry?: () => Promise<VerificationStatusEnvelope>;\n cancel?: () => Promise<VerificationStatusEnvelope | { status: VerificationStatusEnvelope['status'] }>;\n createContinuationUrl?: (token: string) => string;\n supportHref?: string;\n stripePublishableKey?: string;\n personaEnvironmentId?: string;\n onAppeal?: AppealFormProps['onSubmit'];\n plugins?: Record<string, ComponentType<ProviderLauncherProps>>;\n}\n\nexport function VerificationLauncher({\n open,\n session,\n onOpenChange,\n onSessionChange,\n onStatusRefresh,\n pause,\n retry,\n cancel,\n createContinuationUrl,\n supportHref = '/support/verification',\n stripePublishableKey,\n personaEnvironmentId,\n onAppeal,\n plugins,\n}: VerificationLauncherProps) {\n const online = useOnlineStatus();\n const [busy, run] = useBusy<'pause' | 'cancel' | 'retry' | 'refresh'>();\n const [message, setMessage] = useState<string | null>(null);\n const [qrDataUrl, setQrDataUrl] = useState<string | null>(null);\n const [appealOpen, setAppealOpen] = useState(false);\n const reducedMotion = prefersReducedMotion();\n const surface = clientSurface();\n const mediaDevicesMissing = typeof navigator === 'undefined' || !navigator.mediaDevices;\n const [started, setStarted] = useState(!reducedMotion);\n const [cameraHelp, setCameraHelp] = useState(mediaDevicesMissing);\n const dialogRef = useRef<HTMLDivElement>(null);\n useFocusRecovery(open);\n\n const continuationUrl = useMemo(() => {\n if (!session.continuation) return null;\n if (createContinuationUrl) return createContinuationUrl(session.continuation.token);\n return session.continuation.token;\n }, [createContinuationUrl, session.continuation]);\n\n useEffect(() => {\n let live = true;\n setQrDataUrl(null);\n if (!continuationUrl) return;\n void createQrDataUrl(continuationUrl).then((url) => { if (live) setQrDataUrl(url); });\n return () => { live = false; };\n }, [continuationUrl]);\n\n const refresh = useCallback(async () => {\n await run('refresh', async () => {\n const result = await onStatusRefresh();\n if (typeof result === 'object') {\n onSessionChange(result);\n setMessage(result.status === 'verified'\n ? 'Verified. Returning to your saved action…'\n : 'Your status is not approved yet. We’ll keep your action saved.');\n return;\n }\n setMessage(result\n ? 'Verified. Returning to your saved action…'\n : 'Your status is not approved yet. We’ll keep your action saved.');\n });\n }, [onSessionChange, onStatusRefresh, run]);\n\n const providerCallback = useCallback(() => {\n setMessage('Verification was submitted. Checking the server-side result now.');\n void refresh();\n }, [refresh]);\n\n const handlePluginError = useCallback((errorMessage: string) => {\n setMessage(errorMessage);\n if (/camera|permission/i.test(errorMessage) || typeof navigator === 'undefined' || !navigator.mediaDevices) {\n setCameraHelp(true);\n }\n }, []);\n\n const pauseAndClose = useCallback(async () => {\n await run('pause', async () => {\n if (pause) {\n const result = await pause();\n if ('attemptId' in result) onSessionChange(result);\n else onSessionChange({ ...session, status: result.status, canResume: true });\n }\n onOpenChange(false);\n });\n }, [onOpenChange, onSessionChange, pause, run, session]);\n\n if (!open) return null;\n\n const launcherKey = session.launch?.launcherKey ?? session.launcherKey ?? 'none';\n const blocked = session.status === 'processing' || session.status === 'manual_review_required';\n const unavailable = session.status === 'provider_unavailable' || !online;\n const nonInteractive = session.presentation === 'none';\n const copy = verificationCopy(session.packageCode);\n const launchSecret = session.launch?.transientSecret ?? '';\n const CustomPlugin = plugins?.[launcherKey];\n const pluginProps: ProviderLauncherProps = {\n launchSecret,\n publishableKey: stripePublishableKey,\n inquiryId: session.launch?.continuationReference,\n environmentId: personaEnvironmentId,\n onCallback: providerCallback,\n onError: handlePluginError,\n onOpened: () => undefined,\n onPause: () => { void pauseAndClose(); },\n };\n\n return (\n <>\n <div\n className=\"siv siv-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"siv-launcher-title\"\n data-testid=\"verification-launcher\"\n data-reduced-motion={reducedMotion ? 'true' : 'false'}\n data-surface={surface}\n ref={dialogRef}\n >\n <header className=\"siv-header\">\n <div>\n <h2 className=\"siv-title\" id=\"siv-launcher-title\">{copy.title}</h2>\n <p className=\"siv-copy\">{copy.description}</p>\n </div>\n <button type=\"button\" className=\"siv-button\" aria-label=\"Pause verification and close\" onClick={() => void pauseAndClose()} disabled={Boolean(busy)}>Pause</button>\n </header>\n\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"siv-live\">\n {!online ? <p className=\"siv-alert\" role=\"status\">You are offline. Your place is saved. Reconnect to resume verification.</p> : null}\n {blocked ? <p className=\"siv-alert\" role=\"status\">{session.status === 'manual_review_required' ? 'A review is in progress.' : 'We are checking your verification.'} The protected action stays blocked until an approved server-side decision arrives.</p> : null}\n {nonInteractive && !blocked && !unavailable ? <p className=\"siv-alert\" role=\"status\">{copy.reviewTitle}. No additional browser step is required right now.</p> : null}\n {unavailable && online ? <p className=\"siv-alert\" role=\"status\">Verification is temporarily unavailable. Retry later, continue on another device, or contact support.</p> : null}\n {message ? <p className=\"siv-alert\" role=\"status\">{message}</p> : null}\n {cameraHelp ? (\n <div data-testid=\"verification-camera-help\" className=\"siv-alert\" role=\"status\">\n {CAMERA_HELP.map((line) => <p key={line} className=\"siv-copy\">{line}</p>)}\n <p className=\"siv-copy\"><strong>Continue on another device</strong> if this camera cannot open.</p>\n </div>\n ) : null}\n </div>\n\n {reducedMotion && !started && !blocked && !unavailable ? (\n <button type=\"button\" className=\"siv-button\" data-variant=\"primary\" onClick={() => setStarted(true)}>\n Start verification\n </button>\n ) : null}\n\n {started && !blocked && !unavailable && CustomPlugin ? <CustomPlugin {...pluginProps} /> : null}\n {started && !blocked && !unavailable && !CustomPlugin && launcherKey === 'persona_embedded' && session.launch ? (\n <Suspense fallback={<p role=\"status\">Preparing secure verification…</p>}>\n <PersonaEmbeddedLauncher {...pluginProps} inquiryId={session.launch.continuationReference} />\n </Suspense>\n ) : null}\n {started && !blocked && !unavailable && !CustomPlugin && launcherKey === 'plaid_link' && launchSecret ? (\n <Suspense fallback={<p role=\"status\">Preparing secure verification…</p>}>\n <PlaidLegacyLauncher {...pluginProps} />\n </Suspense>\n ) : null}\n {started && !blocked && !unavailable && !CustomPlugin && launcherKey === 'stripe_identity' && launchSecret ? (\n <Suspense fallback={<p role=\"status\">Preparing secure verification…</p>}>\n <StripeIdentityLauncher {...pluginProps} />\n </Suspense>\n ) : null}\n\n {session.providerDisclosure ? <p className=\"siv-disclosure\" data-testid=\"verification-provider-disclosure\">{session.providerDisclosure}</p> : null}\n {session.launch?.hostedUrl ? (\n <a className=\"siv-link\" data-testid=\"verification-hosted-fallback\" href={session.launch.hostedUrl} target=\"_blank\" rel=\"noopener noreferrer\">Open hosted verification</a>\n ) : null}\n\n {!nonInteractive ? (\n <section className=\"siv-grid\" aria-label=\"Continue on another device\" data-emphasis={cameraHelp ? 'true' : 'false'}>\n <p className=\"siv-copy\">Use a one-time link or scan the QR code. The link contains no provider result and expires shortly.</p>\n <button type=\"button\" className=\"siv-button\" disabled={!continuationUrl} onClick={() => continuationUrl && void navigator.clipboard.writeText(continuationUrl).then(() => setMessage('Secure continuation link copied. It expires shortly and works once.'))}>Copy secure continuation link</button>\n <div data-testid=\"verification-qr-fallback\">\n {qrDataUrl ? (\n <img\n src={qrDataUrl}\n alt=\"QR code to continue verification on another device\"\n width={144}\n height={144}\n className={reducedMotion ? undefined : 'siv-qr-animate'}\n />\n ) : <p className=\"siv-copy\">QR code unavailable. Use the continuation link.</p>}\n </div>\n </section>\n ) : null}\n\n {!nonInteractive ? (\n <details data-testid=\"verification-browser-troubleshooting\">\n <summary>Camera or browser trouble?</summary>\n {CAMERA_HELP.map((line) => <p key={line} className=\"siv-copy\">{line}</p>)}\n {isInstalledPwa() ? <p className=\"siv-copy\">This app is installed. If the camera is blocked, open the continuation link in your system browser.</p> : null}\n <SupportLink href={supportHref} />\n </details>\n ) : null}\n\n <footer className=\"siv-footer siv-actions\">\n <button type=\"button\" className=\"siv-button\" data-variant=\"danger\" onClick={() => void run('cancel', async () => {\n if (!cancel) return;\n const result = await cancel();\n onSessionChange('attemptId' in result ? result : { ...session, status: result.status, canResume: false, canRetry: true });\n setMessage('Verification was canceled. Your saved action was not submitted.');\n })} disabled={Boolean(busy)}>Cancel verification</button>\n <button type=\"button\" className=\"siv-button\" onClick={() => setAppealOpen(true)} disabled={Boolean(busy)}>Request a review</button>\n <button type=\"button\" className=\"siv-button\" onClick={() => void run('retry', async () => {\n if (!retry || !session.canRetry || !online) return;\n onSessionChange(await retry());\n })} disabled={Boolean(busy) || !session.canRetry || !online}>Retry</button>\n <button type=\"button\" className=\"siv-button\" data-variant=\"primary\" onClick={() => void refresh()} disabled={Boolean(busy) || !online}>Check status</button>\n </footer>\n </div>\n {appealOpen ? (\n <AppealForm\n attemptId={session.attemptId}\n onSubmit={onAppeal}\n onSubmitted={() => setAppealOpen(false)}\n onCancel={() => setAppealOpen(false)}\n />\n ) : null}\n </>\n );\n}\n\nexport default VerificationLauncher;\n"]}
|