vesant-sdk 2.0.0-dev.9578c07 → 2.0.0-dev.9a74cc1

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/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/version.ts","../src/core/errors.ts","../src/shared/browser-utils.ts","../src/geolocation/ciphertext.ts","../src/geolocation/hooks.ts","../src/compliance/hooks.ts","../src/risk-profile/hooks.ts","../src/kyc/images.ts","../src/kyc/FaceCaptureModal.tsx","../src/kyc/hooks.ts"],"names":["useState","useRef","useCallback","error","useEffect","React","err","client","createRoot","createElement"],"mappings":"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","file":"react.js","sourcesContent":["/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '2.0.0';\n","/**\n * Error hierarchy for Vesant SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class VesantError extends Error {\n public requestId?: string;\n\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'VesantError';\n Object.setPrototypeOf(this, VesantError.prototype);\n }\n}\n\n/** @deprecated Use VesantError instead */\nexport const CGSError = VesantError;\n/** @deprecated Use VesantError instead */\nexport type CGSError = VesantError;\n\nexport class NetworkError extends VesantError {\n constructor(message: string, public originalError?: unknown) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\nexport class ValidationError extends VesantError {\n constructor(message: string, fields?: string[]) {\n super(message, 'VALIDATION_ERROR', 400, { fields });\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class ServiceUnavailableError extends VesantError {\n constructor(message: string = 'Service unavailable') {\n super(message, 'SERVICE_UNAVAILABLE', 503);\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n\nexport class ComplianceBlockedError extends VesantError {\n constructor(reasons: import('./types').BlockReason[]) {\n super('Access blocked due to compliance rules', 'COMPLIANCE_BLOCKED', 403, { reasons });\n this.name = 'ComplianceBlockedError';\n Object.setPrototypeOf(this, ComplianceBlockedError.prototype);\n }\n}\n\nexport class AuthenticationError extends VesantError {\n constructor(message: string = 'Authentication failed') {\n super(message, 'AUTHENTICATION_ERROR', 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\nexport class RateLimitError extends VesantError {\n constructor(public retryAfter?: number) {\n super('Rate limit exceeded', 'RATE_LIMIT_EXCEEDED', 429, { retryAfter });\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\nexport class TimeoutError extends VesantError {\n constructor(public timeout: number) {\n super(`Request timeout after ${timeout}ms`, 'TIMEOUT', 408, { timeout });\n this.name = 'TimeoutError';\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nexport class ComplianceError extends VesantError {\n constructor(\n message: string,\n public originalError?: unknown,\n code: string = 'COMPLIANCE_ERROR'\n ) {\n super(message, code);\n this.name = 'ComplianceError';\n Object.setPrototypeOf(this, ComplianceError.prototype);\n }\n}\n\nexport class CircuitBreakerOpenError extends VesantError {\n constructor() {\n super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n this.name = 'CircuitBreakerOpenError';\n Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n }\n}\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return generateUUID();\n }\n\n const storageKey = 'vesant_device_id';\n let deviceId = localStorage.getItem(storageKey);\n\n if (!deviceId) {\n deviceId = generateUUID();\n localStorage.setItem(storageKey, deviceId);\n }\n\n return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n} {\n if (typeof navigator === 'undefined') {\n return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n }\n\n const ua = navigator.userAgent;\n let browser = 'unknown';\n let browserVersion = '';\n let os = 'unknown';\n let osVersion = '';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n browser = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Edg/')) {\n browser = 'Edge';\n browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Chrome/')) {\n browser = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n browser = 'Safari';\n browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n browser = 'Opera';\n browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n }\n\n // Detect OS\n if (ua.includes('Windows')) {\n os = 'Windows';\n if (ua.includes('Windows NT 10.0')) osVersion = '10';\n else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n } else if (ua.includes('Mac OS X')) {\n os = 'macOS';\n osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n } else if (ua.includes('Linux')) {\n os = 'Linux';\n } else if (ua.includes('Android')) {\n os = 'Android';\n osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n os = 'iOS';\n osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n }\n\n return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n CipherTextPayload,\n CipherTextOptions,\n CipherTextResult,\n CipherTextReason,\n GeolocationConfigResponse,\n} from './types';\nimport { SDK_VERSION } from '../core/version';\nimport { VesantError } from '../core/errors';\nimport { getBrowserInfo, generateDeviceId as getOrCreateDeviceId } from '../shared/browser-utils';\n\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Compute HMAC-SHA256 of a message using the given key.\n * Uses Web Crypto API (browser/modern Node) with node:crypto fallback.\n */\nasync function computeHMAC(key: string, message: string): Promise<string> {\n // Try Web Crypto API first (works in browsers and Node 18+)\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const msgData = encoder.encode(message);\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signature = await globalThis.crypto.subtle.sign('HMAC', cryptoKey, msgData);\n const bytes = new Uint8Array(signature);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // Fallback: Node.js crypto module\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createHmac } = await import('node:crypto');\n return createHmac('sha256', key).update(message).digest('hex');\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n if (typeof document === 'undefined') return null;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl) return null;\n\n const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return null;\n\n return {\n vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n if (typeof navigator === 'undefined') return undefined;\n\n const connection = (navigator as any).connection ||\n (navigator as any).mozConnection ||\n (navigator as any).webkitConnection;\n\n if (!connection) return undefined;\n\n return {\n effective_type: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n save_data: connection.saveData,\n };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n timeout: number = 10000,\n highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n if (typeof navigator === 'undefined' || !navigator.geolocation) {\n return null;\n }\n\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const { latitude, longitude, accuracy } = position.coords;\n\n // Validate coordinates\n if (latitude < -90 || latitude > 90) {\n resolve(null);\n return;\n }\n if (longitude < -180 || longitude > 180) {\n resolve(null);\n return;\n }\n if (accuracy !== null && accuracy !== undefined && accuracy <= 0) {\n resolve(null);\n return;\n }\n\n resolve({\n latitude,\n longitude,\n accuracy,\n altitude: position.coords.altitude ?? undefined,\n altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n heading: position.coords.heading ?? undefined,\n speed: position.coords.speed ?? undefined,\n timestamp: position.timestamp,\n });\n },\n () => {\n // Location denied or error - resolve with null (non-fatal)\n resolve(null);\n },\n {\n enableHighAccuracy: highAccuracy,\n timeout: timeout,\n maximumAge: 0,\n }\n );\n });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n const browserInfo = getBrowserInfo();\n const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n return {\n device_id: getOrCreateDeviceId(),\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n browser: browserInfo.browser,\n browser_version: browserInfo.browser_version,\n os: browserInfo.os,\n os_version: browserInfo.os_version,\n screen_resolution:\n typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n hardware_concurrency:\n typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n touch_support:\n typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n webgl_vendor: webglInfo?.vendor,\n webgl_renderer: webglInfo?.renderer,\n };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n const json = JSON.stringify(payload);\n\n if (typeof btoa !== 'undefined') {\n // Browser\n return btoa(unescape(encodeURIComponent(json)));\n } else if (typeof Buffer !== 'undefined') {\n // Node.js\n return Buffer.from(json, 'utf-8').toString('base64');\n }\n\n throw new VesantError('No base64 encoding method available', 'BASE64_UNAVAILABLE');\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n * reason: 'registration',\n * requestLocation: true,\n * locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n * console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(\n options: CipherTextOptions,\n config?: GeolocationConfigResponse\n): Promise<CipherTextResult> {\n const warnings: string[] = [];\n\n // Auto-enable GPS if tenant config requires it for this event type\n let requestLocation = options.requestLocation ?? false;\n let gpsRequiredByConfig = false;\n if (config?.require_gps) {\n const reason = options.reason;\n if (\n (reason === 'login' && config.require_gps.login) ||\n (reason === 'registration' && config.require_gps.registration) ||\n (reason === 'transaction' && config.require_gps.transaction)\n ) {\n if (!requestLocation) {\n gpsRequiredByConfig = true;\n }\n requestLocation = true;\n }\n }\n\n // Collect device data\n const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n // Optionally request GPS location\n let locationData: CipherTextPayload['location'] | undefined;\n if (requestLocation) {\n const location = await requestGPSLocation(\n options.locationTimeout || 10000,\n options.highAccuracy !== false\n );\n\n if (location) {\n locationData = location;\n } else if (gpsRequiredByConfig) {\n throw new VesantError(\n `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`,\n 'GPS_REQUIRED'\n );\n } else {\n warnings.push('GPS location not available or permission denied');\n }\n }\n\n // Collect network info\n let networkData: CipherTextPayload['network'] | undefined;\n if (options.includeNetworkInfo !== false) {\n networkData = getNetworkInfo();\n }\n\n // Build payload\n const now = new Date();\n const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n const payload: CipherTextPayload = {\n device: deviceData,\n location: locationData,\n network: networkData,\n metadata: {\n collected_at: now.toISOString(),\n sdk_version: SDK_VERSION,\n collection_reason: options.reason,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n },\n };\n\n // Encode payload (no obfuscation - HTTPS provides transport security)\n const encoded = encodePayload(payload);\n\n // Create final cipherText with version and timestamp prefix\n const timestamp = now.getTime().toString(36); // Base36 timestamp\n\n let cipherText: string;\n const hmacKey = options.signingKey || options.apiKey;\n if (hmacKey) {\n // v02: HMAC-signed — format: 02.{timestamp}.{base64}.{hmac}\n const message = `02.${timestamp}.${encoded}`;\n const hmac = await computeHMAC(hmacKey, message);\n cipherText = `${message}.${hmac}`;\n } else {\n // v01: unsigned (backwards compat)\n cipherText = `01.${timestamp}.${encoded}`;\n }\n\n return {\n cipherText,\n locationCaptured: !!locationData,\n warnings: warnings.length > 0 ? warnings : undefined,\n generatedAt: now.toISOString(),\n expiresAt: expiry.toISOString(),\n };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n try {\n const parts = cipherText.split('.');\n // v01: 3 parts, v02: 4 parts (4th is HMAC — ignored when decoding)\n if (parts.length !== 3 && parts.length !== 4) return null;\n\n const [version, , encodedB64] = parts;\n if (version !== '01' && version !== '02') return null;\n\n // Decode matches encode: just base64 decode (no obfuscation)\n const json = decodeURIComponent(escape(atob(encodedB64)));\n\n return JSON.parse(json) as CipherTextPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n try {\n const parts = cipherText.split('.');\n if (parts.length !== 3 && parts.length !== 4) return true;\n\n const timestampB36 = parts[1];\n const timestamp = parseInt(timestampB36, 36);\n const now = Date.now();\n const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n return now - timestamp > expiryMs;\n } catch {\n return true;\n }\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason, GeolocationConfigResponse };\n","/**\n * React Hooks for Vesant Geolocation SDK\n *\n * Provides convenient React hooks for using the geolocation service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GeolocationClient } from './client';\nimport { generateCipherText } from './ciphertext';\nimport { getBrowserInfo as getBrowserInfoShared, generateDeviceId } from '../shared/browser-utils';\nimport type {\n LocationVerification,\n VerifyIPRequest,\n ComplianceCheckResponse,\n PaginationParams,\n UseGeolocationOptions,\n UseGeolocationResult,\n DeviceFingerprintRequest,\n CipherTextOptions,\n CipherTextResult,\n GeolocationConfigResponse,\n // Location Request Types\n LocationRequest,\n LocationRequestFilters,\n CreateLocationRequestRequest,\n LocationRequestResult,\n LocationRequestStatus,\n LocationShareInfo,\n LocationCaptureRequest,\n LocationCaptureResponse,\n UseLocationRequestsOptions,\n UseLocationRequestsResult,\n UseLocationCaptureOptions,\n UseLocationCaptureResult,\n} from './types';\n\n// ============================================================================\n// useGeolocation Hook\n// ============================================================================\n\n/**\n * React hook for IP verification and compliance checking\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Geolocation verification state and methods\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { verification, loading, error, verifyIP } = useGeolocation(client, {\n * autoVerify: true,\n * eventType: \"login\",\n * includeDeviceFingerprint: true\n * });\n *\n * useEffect(() => {\n * if (verification?.is_blocked) {\n * alert(\"Access blocked: \" + verification.risk_reasons.join(\", \"));\n * }\n * }, [verification]);\n *\n * return <div>Risk Level: {verification?.risk_level}</div>;\n * }\n * ```\n */\nexport function useGeolocation(\n client: GeolocationClient,\n options: UseGeolocationOptions = {}\n): UseGeolocationResult {\n const [verification, setVerification] = useState<LocationVerification | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyIP = useCallback(\n async (request: VerifyIPRequest): Promise<LocationVerification> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyIP(request);\n setVerification(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Verification failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const checkCompliance = useCallback(\n async (countryISO: string): Promise<ComplianceCheckResponse> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.checkCompliance(countryISO);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Compliance check failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n if (verification) {\n await verifyIP({\n ip_address: verification.ip_address,\n user_id: optionsRef.current.userId || '',\n event_type: optionsRef.current.eventType || 'api_access',\n });\n }\n }, [verification, verifyIP]);\n\n // Auto-verify on mount if enabled\n useEffect(() => {\n if (optionsRef.current.autoVerify) {\n // Try to get user's IP from a service or use placeholder\n const detectAndVerify = async () => {\n try {\n // In production, you'd use a service like ipify.org or get from server\n const ipResponse = await fetch('https://api.ipify.org?format=json');\n const { ip } = await ipResponse.json();\n\n let deviceFingerprint: DeviceFingerprintRequest | undefined;\n\n if (optionsRef.current.includeDeviceFingerprint && typeof window !== 'undefined') {\n const deviceId = generateDeviceId();\n deviceFingerprint = {\n device_id: deviceId,\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n };\n }\n\n await verifyIP({\n ip_address: ip,\n user_id: optionsRef.current.userId || '',\n event_type: optionsRef.current.eventType || 'page_view',\n device_fingerprint: deviceFingerprint,\n });\n } catch (err) {\n console.error('[Vesant SDK] Auto-verification failed:', err instanceof Error ? err.message : 'Unknown error');\n }\n };\n\n detectAndVerify();\n }\n }, [verifyIP]);\n\n return {\n verification,\n loading,\n error,\n verifyIP,\n checkCompliance,\n refresh,\n };\n}\n\n// ============================================================================\n// Helper Functions (re-export shared utils for backwards compatibility)\n// ============================================================================\n\nexport { getBrowserInfoShared as getBrowserInfo };\n\n/**\n * Create a complete device fingerprint for the current browser.\n * Returns safe defaults when running server-side.\n */\nexport function createDeviceFingerprint(): DeviceFingerprintRequest {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return {\n device_id: generateDeviceId(),\n user_agent: '',\n platform: '',\n };\n }\n\n const browserInfo = getBrowserInfoShared();\n const deviceId = generateDeviceId();\n\n return {\n device_id: deviceId,\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n ...browserInfo,\n };\n}\n\n// ============================================================================\n// useCipherText Hook\n// ============================================================================\n\n/**\n * React hook for generating cipherText\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const { generate, configLoading, configError } = useCipherText(geoClient);\n *\n * const handleLogin = async () => {\n * const result = await generate({ reason: 'login' });\n * if (result) {\n * await loginMutation({ email, password, cipherText: result.cipherText });\n * }\n * };\n * }\n * ```\n */\nexport function useCipherText(client?: GeolocationClient): {\n generate: (options: CipherTextOptions) => Promise<CipherTextResult | null>;\n configLoading: boolean;\n configError: Error | null;\n} {\n const [configLoading, setConfigLoading] = useState<boolean>(!!client);\n const [configError, setConfigError] = useState<Error | null>(null);\n const configRef = useRef<GeolocationConfigResponse | undefined>(undefined);\n const configPromiseRef = useRef<Promise<GeolocationConfigResponse> | null>(null);\n\n // Fetch GPS config once on mount if client is provided\n useEffect(() => {\n if (!client) return;\n\n let cancelled = false;\n setConfigLoading(true);\n\n const promise = client.getGPSConfig();\n configPromiseRef.current = promise;\n\n promise.then((cfg: GeolocationConfigResponse) => {\n if (!cancelled) {\n configRef.current = cfg;\n setConfigLoading(false);\n }\n }).catch((err: Error) => {\n if (!cancelled) {\n setConfigError(err);\n setConfigLoading(false);\n }\n });\n\n return () => { cancelled = true; };\n }, [client]);\n\n const generate = useCallback(\n async (options: CipherTextOptions): Promise<CipherTextResult | null> => {\n try {\n // Ensure config is loaded before generating (avoids race condition)\n if (configPromiseRef.current) {\n try {\n const cfg = await configPromiseRef.current;\n configRef.current = cfg;\n } catch {\n // Config fetch error already tracked in configError state\n }\n }\n return await generateCipherText(options, configRef.current);\n } catch (error) {\n console.error('[Vesant SDK] Failed to generate cipherText:', error instanceof Error ? error.message : 'Unknown error');\n return null;\n }\n },\n []\n );\n\n return { generate, configLoading, configError };\n}\n\n// ============================================================================\n// useLocationRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing location requests (admin/compliance officer)\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Location request state and management methods\n */\nexport function useLocationRequests(\n client: GeolocationClient,\n options: UseLocationRequestsOptions = {}\n): UseLocationRequestsResult {\n const [requests, setRequests] = useState<LocationRequest[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const pollIntervalRef = useRef<ReturnType<typeof setInterval>>();\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const fetchRequests = useCallback(\n async (filters?: LocationRequestFilters, pagination?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listLocationRequests(\n filters || optionsRef.current.filters,\n pagination || optionsRef.current.pagination\n );\n setRequests(result.requests);\n setTotal(result.total);\n setPage(result.page);\n setTotalPages(result.total_pages);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch location requests');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const createRequest = useCallback(\n async (request: CreateLocationRequestRequest): Promise<LocationRequestResult> => {\n setError(null);\n\n try {\n const result = await client.createLocationRequest(request);\n // Add to local state\n setRequests((prev) => [result.request, ...prev]);\n setTotal((prev) => prev + 1);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const getRequest = useCallback(\n async (requestId: string): Promise<LocationRequest> => {\n try {\n return await client.getLocationRequest(requestId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const cancelRequest = useCallback(\n async (requestId: string): Promise<void> => {\n try {\n await client.cancelLocationRequest(requestId);\n // Update local state\n setRequests((prev) =>\n prev.map((req) =>\n req.id === requestId ? { ...req, status: 'cancelled' as LocationRequestStatus } : req\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to cancel location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const resendRequest = useCallback(\n async (requestId: string, contact: { email?: string; phone?: string }): Promise<void> => {\n try {\n await client.resendLocationRequest(requestId, contact);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to resend location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchRequests();\n }, [fetchRequests]);\n\n // Auto-fetch on mount if enabled\n useEffect(() => {\n if (optionsRef.current.autoFetch) {\n fetchRequests();\n }\n }, [fetchRequests]);\n\n // Set up polling if enabled\n useEffect(() => {\n const pollInterval = optionsRef.current.pollInterval;\n if (pollInterval && pollInterval > 0) {\n pollIntervalRef.current = setInterval(() => {\n fetchRequests();\n }, pollInterval);\n\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n }\n };\n }\n return undefined;\n }, [fetchRequests]);\n\n return {\n requests,\n total,\n page,\n totalPages,\n loading,\n error,\n fetchRequests,\n createRequest,\n getRequest,\n cancelRequest,\n resendRequest,\n refresh,\n };\n}\n\n// ============================================================================\n// useLocationCapture Hook (Customer-facing)\n// ============================================================================\n\n/**\n * React hook for location capture (customer-facing)\n *\n * Use this hook in the customer's browser to capture and submit their location.\n * The token is obtained from the share link sent via SMS/email.\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options with token\n * @returns Location capture state and methods\n */\nexport function useLocationCapture(\n client: GeolocationClient,\n options: UseLocationCaptureOptions\n): UseLocationCaptureResult {\n const [shareInfo, setShareInfo] = useState<LocationShareInfo | null>(null);\n const [captureResponse, setCaptureResponse] = useState<LocationCaptureResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const isExpired = shareInfo?.is_expired ?? false;\n const isCompleted = shareInfo?.is_completed ?? false;\n\n const fetchShareInfo = useCallback(async (): Promise<LocationShareInfo> => {\n setLoading(true);\n setError(null);\n\n try {\n const info = await client.getLocationShareInfo(options.token);\n setShareInfo(info);\n return info;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch share info');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client, options.token]);\n\n const submitLocation = useCallback(\n async (capture: LocationCaptureRequest): Promise<LocationCaptureResponse> => {\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await client.captureLocation(options.token, capture);\n setCaptureResponse(response);\n\n // Update share info to reflect completion\n if (response.success) {\n setShareInfo((prev) =>\n prev ? { ...prev, is_completed: true, status: 'completed' } : prev\n );\n }\n\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to submit location');\n setError(error);\n throw error;\n } finally {\n setSubmitting(false);\n }\n },\n [client, options.token]\n );\n\n const captureAndSubmitGPS = useCallback(async (): Promise<LocationCaptureResponse> => {\n setSubmitting(true);\n setError(null);\n\n try {\n // Build device info (always available, regardless of GPS)\n const deviceInfo =\n typeof navigator !== 'undefined'\n ? {\n platform: navigator.platform,\n ...getBrowserInfoShared(),\n }\n : undefined;\n const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : undefined;\n\n // Try to get GPS position\n let position: GeolocationPosition | null = null;\n let gpsError: Error | null = null;\n\n try {\n position = await new Promise<GeolocationPosition>((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('Geolocation is not supported by this browser'));\n return;\n }\n\n navigator.geolocation.getCurrentPosition(resolve, reject, {\n enableHighAccuracy: true,\n timeout: 30000,\n maximumAge: 0,\n });\n });\n } catch (err) {\n // Capture the GPS error but don't throw yet — we'll fall back to IP-based capture\n if (err instanceof GeolocationPositionError) {\n switch (err.code) {\n case err.PERMISSION_DENIED:\n gpsError = new Error('Location permission denied. Submitting with IP-based location.');\n break;\n case err.POSITION_UNAVAILABLE:\n gpsError = new Error('GPS unavailable. Submitting with IP-based location.');\n break;\n case err.TIMEOUT:\n gpsError = new Error('GPS timed out. Submitting with IP-based location.');\n break;\n default:\n gpsError = new Error('GPS failed. Submitting with IP-based location.');\n }\n } else {\n gpsError = err instanceof Error ? err : new Error('GPS failed. Submitting with IP-based location.');\n }\n }\n\n // Build capture request\n const capture: LocationCaptureRequest = {\n user_agent: userAgent,\n device_info: deviceInfo,\n };\n\n // Add GPS coordinates if available and valid\n if (position) {\n const { latitude, longitude, accuracy } = position.coords;\n if (latitude >= -90 && latitude <= 90 && longitude >= -180 && longitude <= 180) {\n capture.latitude = latitude;\n capture.longitude = longitude;\n if (accuracy !== null && accuracy !== undefined && accuracy > 0) {\n capture.accuracy = accuracy;\n }\n }\n }\n\n // If GPS failed, set a non-fatal warning so the UI can show it\n if (gpsError) {\n setError(gpsError);\n }\n\n // Always submit — server handles GPS/WiFi/IP fallback chain\n return await submitLocation(capture);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to capture location');\n setError(error);\n throw error;\n } finally {\n setSubmitting(false);\n }\n }, [submitLocation]);\n\n // Auto-fetch share info on mount if enabled\n useEffect(() => {\n if (options.autoFetch && options.token) {\n fetchShareInfo();\n }\n }, [options.autoFetch, options.token, fetchShareInfo]);\n\n // Auto-request GPS if enabled and share info is loaded\n useEffect(() => {\n if (options.autoRequestGPS && shareInfo && !isExpired && !isCompleted) {\n captureAndSubmitGPS().catch(() => {\n // Error is already set in state, just catch to prevent unhandled rejection\n });\n }\n }, [options.autoRequestGPS, shareInfo, isExpired, isCompleted, captureAndSubmitGPS]);\n\n return {\n shareInfo,\n captureResponse,\n loading,\n submitting,\n error,\n isExpired,\n isCompleted,\n fetchShareInfo,\n submitLocation,\n captureAndSubmitGPS,\n };\n}\n","/**\n * React hooks for compliance verification workflows\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ComplianceClient } from './client';\nimport type {\n RegistrationVerificationRequest,\n RegistrationVerificationResponse,\n LoginVerificationRequest,\n LoginVerificationResponse,\n TransactionVerificationRequest,\n TransactionVerificationResponse,\n} from './types';\n\n// ============================================================================\n// useRegistration Hook\n// ============================================================================\n\nexport interface UseRegistrationOptions {\n onSuccess?: (result: RegistrationVerificationResponse) => void;\n onBlocked?: (result: RegistrationVerificationResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseRegistrationResult {\n verification: RegistrationVerificationResponse | null;\n loading: boolean;\n error: Error | null;\n verifyRegistration: (request: RegistrationVerificationRequest) => Promise<RegistrationVerificationResponse>;\n}\n\n/**\n * Hook for registration verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n *\n * @example\n * ```typescript\n * const { verifyRegistration, loading, error } = useRegistration(sdk, {\n * onSuccess: (result) => {\n * console.log('Registration approved!', result.profile);\n * navigate('/dashboard');\n * },\n * onBlocked: (result) => {\n * alert(`Registration blocked: ${result.blockReasons.join(', ')}`);\n * }\n * });\n *\n * const handleSubmit = async (formData) => {\n * await verifyRegistration({\n * customerId: formData.customerId,\n * fullName: formData.fullName,\n * emailAddress: formData.email,\n * ipAddress: await getClientIP(),\n * deviceFingerprint: getDeviceFingerprint()\n * });\n * };\n * ```\n */\nexport function useRegistration(\n client: ComplianceClient,\n options: UseRegistrationOptions = {}\n): UseRegistrationResult {\n const [verification, setVerification] = useState<RegistrationVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyRegistration = useCallback(\n async (request: RegistrationVerificationRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyAtRegistration(request);\n setVerification(result);\n\n if (result.allowed && optionsRef.current.onSuccess) {\n optionsRef.current.onSuccess(result);\n }\n\n if (!result.allowed && optionsRef.current.onBlocked) {\n optionsRef.current.onBlocked(result);\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Registration verification failed');\n setError(error);\n\n if (optionsRef.current.onError) {\n optionsRef.current.onError(error);\n }\n\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n verification,\n loading,\n error,\n verifyRegistration,\n };\n}\n\n// ============================================================================\n// useLoginVerification Hook\n// ============================================================================\n\nexport interface UseLoginVerificationOptions {\n onSuccess?: (result: LoginVerificationResponse) => void;\n onBlocked?: (result: LoginVerificationResponse) => void;\n onStepUpRequired?: (result: LoginVerificationResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseLoginVerificationResult {\n verification: LoginVerificationResponse | null;\n loading: boolean;\n error: Error | null;\n verifyLogin: (request: LoginVerificationRequest) => Promise<LoginVerificationResponse>;\n}\n\n/**\n * Hook for login verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n */\nexport function useLoginVerification(\n client: ComplianceClient,\n options: UseLoginVerificationOptions = {}\n): UseLoginVerificationResult {\n const [verification, setVerification] = useState<LoginVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyLogin = useCallback(\n async (request: LoginVerificationRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyAtLogin(request);\n setVerification(result);\n\n if (result.allowed) {\n if (result.requiresStepUp && optionsRef.current.onStepUpRequired) {\n optionsRef.current.onStepUpRequired(result);\n } else if (optionsRef.current.onSuccess) {\n optionsRef.current.onSuccess(result);\n }\n } else if (optionsRef.current.onBlocked) {\n optionsRef.current.onBlocked(result);\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Login verification failed');\n setError(error);\n\n if (optionsRef.current.onError) {\n optionsRef.current.onError(error);\n }\n\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n verification,\n loading,\n error,\n verifyLogin,\n };\n}\n\n// ============================================================================\n// useTransactionVerification Hook\n// ============================================================================\n\nexport interface UseTransactionVerificationOptions {\n onSuccess?: (result: TransactionVerificationResponse) => void;\n onBlocked?: (result: TransactionVerificationResponse) => void;\n onApprovalRequired?: (result: TransactionVerificationResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseTransactionVerificationResult {\n verification: TransactionVerificationResponse | null;\n loading: boolean;\n error: Error | null;\n verifyTransaction: (request: TransactionVerificationRequest) => Promise<TransactionVerificationResponse>;\n}\n\n/**\n * Hook for transaction verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n *\n * @example\n * ```typescript\n * const { verifyTransaction, loading } = useTransactionVerification(sdk, {\n * onSuccess: (result) => {\n * processTransaction(result);\n * },\n * onApprovalRequired: (result) => {\n * queueForReview(result);\n * },\n * onBlocked: (result) => {\n * alert(`Transaction blocked: ${result.blockReasons.join(', ')}`);\n * }\n * });\n * ```\n */\nexport function useTransactionVerification(\n client: ComplianceClient,\n options: UseTransactionVerificationOptions = {}\n): UseTransactionVerificationResult {\n const [verification, setVerification] = useState<TransactionVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyTransaction = useCallback(\n async (request: TransactionVerificationRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyAtTransaction(request);\n setVerification(result);\n\n if (result.allowed && optionsRef.current.onSuccess) {\n optionsRef.current.onSuccess(result);\n } else if (result.requiresApproval && optionsRef.current.onApprovalRequired) {\n optionsRef.current.onApprovalRequired(result);\n } else if (!result.allowed && optionsRef.current.onBlocked) {\n optionsRef.current.onBlocked(result);\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Transaction verification failed');\n setError(error);\n\n if (optionsRef.current.onError) {\n optionsRef.current.onError(error);\n }\n\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n verification,\n loading,\n error,\n verifyTransaction,\n };\n}\n","/**\n * React hooks for customer risk profile management\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { VesantError } from '../core/errors';\nimport type { RiskProfileClient } from './client';\nimport type { CustomerProfile } from './types';\n\n// ============================================================================\n// useCustomerProfile Hook\n// ============================================================================\n\nexport interface UseCustomerProfileOptions {\n autoFetch?: boolean;\n}\n\nexport interface UseCustomerProfileResult {\n profile: CustomerProfile | null;\n loading: boolean;\n error: Error | null;\n fetchProfile: () => Promise<CustomerProfile>;\n updateProfile: (updates: Partial<CustomerProfile>) => Promise<CustomerProfile>;\n refresh: () => Promise<CustomerProfile>;\n}\n\n/**\n * Hook for managing customer risk profiles\n *\n * @param client - RiskProfileClient instance\n * @param customerId - Customer ID to fetch profile for\n * @param options - Hook options\n *\n * @example\n * ```typescript\n * const { profile, loading, error, updateProfile } = useCustomerProfile(\n * riskClient,\n * 'CUST-12345',\n * { autoFetch: true }\n * );\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n * if (!profile) return <NotFound />;\n *\n * return (\n * <div>\n * <h1>{profile.full_name}</h1>\n * <RiskScore score={profile.risk_score} category={profile.risk_category} />\n * </div>\n * );\n * ```\n */\nexport function useCustomerProfile(\n client: RiskProfileClient,\n customerId: string,\n options: UseCustomerProfileOptions = {}\n): UseCustomerProfileResult {\n const [profile, setProfile] = useState<CustomerProfile | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchProfile = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getProfile(customerId);\n setProfile(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch profile');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client, customerId]);\n\n const profileRef = useRef(profile);\n profileRef.current = profile;\n\n const updateProfile = useCallback(\n async (updates: Partial<CustomerProfile>) => {\n if (!profileRef.current) throw new VesantError('Profile not loaded', 'PROFILE_NOT_LOADED');\n\n setLoading(true);\n setError(null);\n\n try {\n const updated = await client.updateProfile(profileRef.current.id, updates);\n setProfile(updated);\n return updated;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update profile');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n useEffect(() => {\n if (options.autoFetch && customerId) {\n fetchProfile();\n }\n }, [options.autoFetch, customerId, fetchProfile]);\n\n return {\n profile,\n loading,\n error,\n fetchProfile,\n updateProfile,\n refresh: fetchProfile,\n };\n}\n\n","export const Camera = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPCEtLSBVcGxvYWRlZCB0bzogU1ZHIFJlcG8sIHd3dy5zdmdyZXBvLmNvbSwgR2VuZXJhdG9yOiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4NCjxzdmcgdmVyc2lvbj0iMS4wIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgDQoJIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDY0IDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA2NCA2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBmaWxsPSIjMjMxRjIwIiBkPSJNNjAsMTBINDkuNjU2bC02LjgyOC02LjgyOEM0Mi4wNzgsMi40MjIsNDEuMDYyLDIsNDAsMkgyNGMtMS4wNjIsMC0yLjA3OCwwLjQyMi0yLjgyOCwxLjE3MkwxNC4zNDQsMTBINA0KCQljLTIuMjExLDAtNCwxLjc4OS00LDR2NDRjMCwyLjIxMSwxLjc4OSw0LDQsNGg1NmMyLjIxMSwwLDQtMS43ODksNC00VjE0QzY0LDExLjc4OSw2Mi4yMTEsMTAsNjAsMTB6IE0zMiw1MA0KCQljLTguODM2LDAtMTYtNy4xNjQtMTYtMTZzNy4xNjQtMTYsMTYtMTZzMTYsNy4xNjQsMTYsMTZTNDAuODM2LDUwLDMyLDUweiIvPg0KCTxjaXJjbGUgZmlsbD0iIzIzMUYyMCIgY3g9IjMyIiBjeT0iMzQiIHI9IjgiLz4NCjwvZz4NCjwvc3ZnPg==\"\nexport const Done=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik04LjUgMTIuNUwxMC41IDE0LjVMMTUuNSA5LjUiIHN0cm9rZT0iIzFDMjc0QyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTcgMy4zMzc4MkM4LjQ3MDg3IDIuNDg2OTcgMTAuMTc4NiAyIDEyIDJDMTcuNTIyOCAyIDIyIDYuNDc3MTUgMjIgMTJDMjIgMTcuNTIyOCAxNy41MjI4IDIyIDEyIDIyQzYuNDc3MTUgMjIgMiAxNy41MjI4IDIgMTJDMiAxMC4xNzg2IDIuNDg2OTcgOC40NzA4NyAzLjMzNzgyIDciIHN0cm9rZT0iIzFDMjc0QyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPg0KPC9zdmc+\"\nexport const Close = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xNC41IDkuNTAwMDJMOS41IDE0LjVNOS40OTk5OCA5LjVMMTQuNSAxNC41IiBzdHJva2U9IiMxQzI3NEMiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCjxwYXRoIGQ9Ik03IDMuMzM3ODJDOC40NzA4NyAyLjQ4Njk3IDEwLjE3ODYgMiAxMiAyQzE3LjUyMjggMiAyMiA2LjQ3NzE1IDIyIDEyQzIyIDE3LjUyMjggMTcuNTIyOCAyMiAxMiAyMkM2LjQ3NzE1IDIyIDIgMTcuNTIyOCAyIDEyQzIgMTAuMTc4NiAyLjQ4Njk3IDguNDcwODcgMy4zMzc4MiA3IiBzdHJva2U9IiMxQzI3NEMiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCjwvc3ZnPg==\"\nexport const Upload=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xNyAxN0gxNy4wMU0xNS42IDE0SDE4QzE4LjkzMTkgMTQgMTkuMzk3OCAxNCAxOS43NjU0IDE0LjE1MjJDMjAuMjU1NCAxNC4zNTUyIDIwLjY0NDggMTQuNzQ0NiAyMC44NDc4IDE1LjIzNDZDMjEgMTUuNjAyMiAyMSAxNi4wNjgxIDIxIDE3QzIxIDE3LjkzMTkgMjEgMTguMzk3OCAyMC44NDc4IDE4Ljc2NTRDMjAuNjQ0OCAxOS4yNTU0IDIwLjI1NTQgMTkuNjQ0OCAxOS43NjU0IDE5Ljg0NzhDMTkuMzk3OCAyMCAxOC45MzE5IDIwIDE4IDIwSDZDNS4wNjgxMiAyMCA0LjYwMjE4IDIwIDQuMjM0NjMgMTkuODQ3OEMzLjc0NDU4IDE5LjY0NDggMy4zNTUyMyAxOS4yNTU0IDMuMTUyMjQgMTguNzY1NEMzIDE4LjM5NzggMyAxNy45MzE5IDMgMTdDMyAxNi4wNjgxIDMgMTUuNjAyMiAzLjE1MjI0IDE1LjIzNDZDMy4zNTUyMyAxNC43NDQ2IDMuNzQ0NTggMTQuMzU1MiA0LjIzNDYzIDE0LjE1MjJDNC42MDIxOCAxNCA1LjA2ODEyIDE0IDYgMTRIOC40TTEyIDE1VjRNMTIgNEwxNSA3TTEyIDRMOSA3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8L3N2Zz4=\"","import React, { useEffect, useRef, useState } from \"react\"\nimport { KycClient } from \"./client\"\nimport type {\n CreateReuseKycSessionResponse,\n ReuseKycCallback,\n} from \"./types\"\nimport { Camera, Close, Done, Upload } from \"./images\"\n\nexport interface FaceCaptureModalProps {\n client: KycClient\n session: CreateReuseKycSessionResponse\n onComplete: (result: ReuseKycCallback | null) => void\n\n /**\n * Initial UX. `'ask'` shows the device picker (default on desktop).\n * `'this'` skips straight to capture (default on mobile). `'mobile'`\n * skips straight to QR.\n */\n defaultDevice?: \"ask\" | \"this\" | \"mobile\"\n\n /**\n * Override the default QR renderer. Receives the payload string and\n * returns a React node to render inside the QR slot. Default uses a\n * public QR rendering service (api.qrserver.com).\n */\n renderQR?: (payload: string) => React.ReactNode\n}\n\ntype Stage =\n | { kind: \"choose\" }\n | { kind: \"qr\"; mobileConnected: boolean }\n | { kind: \"capture\"; declinedReason?: string }\n | { kind: \"submitting\" }\n | { kind: \"accepted\"; result: ReuseKycCallback }\n | { kind: \"declined\"; result: ReuseKycCallback }\n | { kind: \"max_attempts\"; result: ReuseKycCallback }\n | { kind: \"error\"; message: string }\n\n// The capture stage has three sub-modes: an idle landing screen with\n// instructions and an \"Open Camera\" CTA, the live camera view itself\n// (front camera via getUserMedia), and a preview where the user confirms\n// or retakes before submitting. Submission only fires from the preview\n// step so the user always reviews the selfie first — matching the\n// cgs-frontend ReuseKycSubmitForm flow.\ntype CaptureMode = \"idle\" | \"live\" | \"preview\"\n\nconst MOBILE_UA = /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i\n\nconst LIVENESS_MESSAGES = [\n \"Align your face in the oval\",\n \"Face too far. Please, move closer to the camera\",\n \"Looking good! Stay still...\",\n \"Processing liveness...\",\n]\n\nfunction headerSubtitle(stageKind: Stage[\"kind\"]): string {\n switch (stageKind) {\n case \"qr\": return \"Use your phone to continue\"\n case \"accepted\": return \"All set\"\n case \"declined\": return \"Verification didn't match — try once more\"\n case \"max_attempts\": return \"We couldn't verify you\"\n default: return \"Please capture a clear photo of your face\"\n }\n}\n\nfunction defaultRenderQR(payload: string): React.ReactNode {\n // Free public QR service — no key required. Consumers can override\n // via the `renderQR` prop to use a self-hosted renderer.\n const url = `https://api.qrserver.com/v1/create-qr-code/?size=220x220&data=${encodeURIComponent(payload)}`\n return <img src={url} alt=\"QR code\" width={220} height={220} />\n}\n\nfunction FaceCaptureModal({\n client,\n session,\n onComplete,\n defaultDevice,\n renderQR,\n}: Readonly<FaceCaptureModalProps>): React.ReactElement {\n const isMobile = typeof navigator !== \"undefined\" && MOBILE_UA.test(navigator.userAgent)\n const initialStage: Stage = (() => {\n const choice = defaultDevice ?? (isMobile ? \"this\" : \"ask\")\n if (choice === \"this\") return { kind: \"capture\" }\n if (choice === \"mobile\") return { kind: \"qr\", mobileConnected: false }\n return { kind: \"choose\" }\n })()\n\n const [stage, setStage] = useState<Stage>(initialStage)\n const [attempts, setAttempts] = useState<number>(session.attempts)\n const maxAttempts = session.max_attempts || 1\n // Last declined reason observed while the user is still retrying on\n // mobile during the QR-handoff stage. Surfaced inline on the QR view so\n // the desktop watcher knows what happened without forcing the desktop\n // out of the handoff flow.\n const [qrDeclinedReason, setQrDeclinedReason] = useState<string | null>(null)\n // Capture sub-state. `idle` shows instructions + Open Camera; `live`\n // shows the in-modal getUserMedia preview; `preview` shows the captured\n // selfie with Submit / Retake — submission only fires from preview.\n const [captureMode, setCaptureMode] = useState<CaptureMode>(\"idle\")\n const [capturedPreview, setCapturedPreview] = useState<string | null>(null)\n const [capturedBase64, setCapturedBase64] = useState<string | null>(null)\n // Rotating placeholder hints shown above the camera preview while the\n // user is composing the selfie. Pure UX — no real liveness detection.\n const [livenessMessage, setLivenessMessage] = useState<string>(LIVENESS_MESSAGES[0])\n\n // Use the server-provided handoff URL as the QR payload. The kyc-service\n // builds it from BASE_URL_FRONTEND so it always points at a known-working\n // page (cgs-frontend's /reuse-kyc-submit). Fall back to the legacy\n // vesant:// scheme only when the server didn't populate `link` (env not\n // configured) — consumers should override `renderQR` in that case.\n const qrPayload = session.link || `vesant://reuse-kyc?token=${encodeURIComponent(session.token)}`\n\n const cancelledRef = useRef(false)\n // submittingRef guards against re-entry on `/face/submit`. A single click\n // must produce exactly one Shufti call even if the consumer somehow\n // double-mounts the modal (React StrictMode dev re-runs, double-click\n // handlers, etc.).\n const submittingRef = useRef(false)\n\n // Desktop QR poll — checks mobile_connected, then fetches the final status.\n useEffect(() => {\n if (stage.kind !== \"qr\") return\n let stopped = false\n const intervalMs = 2000\n const deadline = Date.now() + 15 * 60 * 1000 // matches the 15-min Redis TTL\n\n let mobileSeen = stage.mobileConnected\n\n const tick = async () => {\n if (stopped || cancelledRef.current) return\n try {\n if (mobileSeen) {\n const result = await client.getReuseKycSessionStatus(session.reference)\n if (result.status === \"accepted\") {\n setStage({ kind: \"accepted\", result })\n stopped = true\n return\n }\n if (result.status === \"declined\") {\n setAttempts(maxAttempts - (result.data?.retries_remaining ?? 0))\n if (result.data?.retry_limit_exceeded) {\n // Terminal — flip to max_attempts and stop polling.\n setStage({ kind: \"max_attempts\", result })\n stopped = true\n return\n }\n // Non-terminal decline: the user is still retrying on their\n // phone. Stay on the QR view and keep polling — surface the\n // last decline reason inline so the desktop watcher sees\n // what happened without yanking the modal into the capture\n // UI (which would defeat the whole QR handoff).\n if (result.declined_reason) {\n setQrDeclinedReason(result.declined_reason)\n }\n }\n } else {\n const handoff = await client.getHandoffSession(session.token)\n if (handoff.mobile_connected) {\n mobileSeen = true\n setStage({ kind: \"qr\", mobileConnected: true })\n }\n }\n } catch {\n // 404 (session expired in Redis) is fine — try again next tick.\n }\n if (Date.now() < deadline) {\n setTimeout(tick, intervalMs)\n }\n }\n tick()\n return () => {\n stopped = true\n }\n // Intentionally key only on the stage transition into 'qr' /\n // connection flip — `client` and `session` are stable for the modal's\n // lifetime and re-running this effect on them would restart the poll.\n }, [stage.kind, stage.kind === \"qr\" ? stage.mobileConnected : false])\n\n // applyResult routes a server response (synchronous submit response OR a\n // post-timeout poll) into the modal's terminal stage. Returns true when\n // the result was terminal (accepted / declined / max_attempts), false\n // when the server hasn't decided yet so we should keep waiting / error.\n const applyResult = (result: ReuseKycCallback): boolean => {\n if (result.status === \"accepted\") {\n setStage({ kind: \"accepted\", result })\n return true\n }\n if (result.status === \"declined\") {\n const nextAttempts = maxAttempts - (result.data?.retries_remaining ?? 0)\n setAttempts(nextAttempts)\n // Clear the captured preview so the rejected image never leaks\n // back into the next render — the declined screen only shows the\n // reason + Retake button, and any subsequent Retake → live →\n // preview cycle starts with a fresh frame.\n setCapturedPreview(null)\n setCapturedBase64(null)\n if (result.data?.retry_limit_exceeded) {\n setStage({ kind: \"max_attempts\", result })\n } else {\n setStage({ kind: \"declined\", result })\n }\n return true\n }\n return false\n }\n\n // runSubmit fires exactly one POST per capture and races it against a\n // delayed poll of /face/verify/{reference}. Whichever returns a\n // terminal status first wins. See ReuseKycSubmitForm for the same\n // pattern explained in detail.\n const runSubmit = async (proof: string) => {\n if (submittingRef.current) return\n submittingRef.current = true\n setStage({ kind: \"submitting\" })\n\n let settled = false\n const ref = session.reference\n\n try {\n const postPromise = (async () => {\n try {\n const data = await client.submitReuseKycSession({\n token: session.token,\n reference: ref,\n proof,\n })\n return { ok: true as const, data }\n } catch (err) {\n return { ok: false as const, error: err }\n }\n })()\n\n const pollPromise = (async (): Promise<ReuseKycCallback | null> => {\n await new Promise((r) => setTimeout(r, 12_000))\n const deadline = Date.now() + 120_000\n while (Date.now() < deadline) {\n if (settled || cancelledRef.current) return null\n try {\n const r = await client.getReuseKycSessionStatus(ref)\n if (r.status === \"accepted\" || r.status === \"declined\") return r\n } catch {\n // network blip — keep polling\n }\n if (settled || cancelledRef.current) return null\n await new Promise((r) => setTimeout(r, 3_000))\n }\n return null\n })()\n\n const winner = await Promise.race([\n postPromise.then((r) =>\n r.ok\n ? ({ from: \"post\" as const, data: r.data })\n : ({ from: \"post_err\" as const }),\n ),\n pollPromise.then((data) =>\n data\n ? ({ from: \"poll\" as const, data })\n : ({ from: \"poll_done\" as const }),\n ),\n ])\n settled = true\n\n if (winner.from === \"post\" && applyResult(winner.data)) return\n if (winner.from === \"poll\" && applyResult(winner.data)) return\n\n const [postResult, pollResult] = await Promise.all([postPromise, pollPromise])\n if (postResult.ok && applyResult(postResult.data)) return\n if (pollResult && applyResult(pollResult)) return\n\n const err = postResult.ok ? null : postResult.error\n setStage({\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Submission failed. Please try again.\",\n })\n } finally {\n settled = true\n submittingRef.current = false\n }\n }\n\n // LiveCamera returns a full data URL (data:image/jpeg;base64,…). Stash\n // both forms: the data URL drives the <img> preview tag; the raw\n // base64 is what /face/submit expects. No submission yet — the user\n // reviews on the preview screen first and then clicks Submit.\n const handleCameraCapture = (dataUrl: string) => {\n const raw = dataUrl.split(\",\")[1] ?? \"\"\n setCapturedPreview(dataUrl)\n setCapturedBase64(raw)\n setCaptureMode(\"preview\")\n }\n\n const handleCameraCancel = () => setCaptureMode(\"idle\")\n\n const handleRetake = () => {\n setCapturedPreview(null)\n setCapturedBase64(null)\n setCaptureMode(\"live\")\n }\n\n const handleConfirmSubmit = () => {\n if (!capturedBase64) return\n void runSubmit(capturedBase64)\n }\n\n const handleOpenCamera = () => {\n if (submittingRef.current) return\n setCaptureMode(\"live\")\n }\n\n // Retake from the declined screen — jumps the user straight back into\n // the camera with no stale image or reason hanging around. The\n // explicit setCaptureMode/setStage pair replaces the previous auto-\n // reset effect so the live transition wins.\n const handleRetakeAfterDecline = () => {\n setCapturedPreview(null)\n setCapturedBase64(null)\n setCaptureMode(\"live\")\n setStage({ kind: \"capture\" })\n }\n\n // Simulated liveness-message rotation while the camera is open.\n useEffect(() => {\n if (captureMode !== \"live\") return\n setLivenessMessage(LIVENESS_MESSAGES[0])\n let i = 0\n const interval = setInterval(() => {\n i = (i + 1) % LIVENESS_MESSAGES.length\n setLivenessMessage(LIVENESS_MESSAGES[i])\n }, 3000)\n return () => clearInterval(interval)\n }, [captureMode])\n\n const close = (result: ReuseKycCallback | null) => {\n cancelledRef.current = true\n onComplete(result)\n }\n\n // ──────────────────────────────────────────────────────────────────\n // Stage renderers\n // ──────────────────────────────────────────────────────────────────\n\n const renderChoose = () => (\n <div style={contentStyle}>\n <div style={visualGuideContainerStyle}>\n <div style={visualGuideStyle}>\n <div style={circleStyle}>\n <img src={Camera} alt=\"\" width={48} height={48} />\n </div>\n </div>\n </div>\n <p style={subtitleStyle}>How would you like to verify?</p>\n <div style={buttonsContainerStyle}>\n <button\n style={primaryButtonStyle}\n onClick={() => setStage({ kind: \"capture\" })}\n >\n <img src={isMobile ? Camera : Upload} alt=\"\" width={20} height={20} />\n <span>Continue on this device</span>\n </button>\n <button\n style={secondaryButtonStyle}\n onClick={() => setStage({ kind: \"qr\", mobileConnected: false })}\n >\n Continue on mobile (scan QR)\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n </div>\n )\n\n const renderQRStage = (mobileConnected: boolean) => (\n <div style={contentStyle}>\n <div style={qrBoxStyle}>{(renderQR ?? defaultRenderQR)(qrPayload)}</div>\n <p style={subtitleStyle}>\n {mobileConnected\n ? \"Phone connected. Complete the capture on your mobile device…\"\n : \"Scan this QR with your phone camera, then complete the face capture there.\"}\n </p>\n {mobileConnected && <div style={{ ...spinnerStyle, margin: \"12px auto\" }} />}\n {qrDeclinedReason && (\n <div style={alertBoxStyle}>\n <strong>Last attempt was declined.</strong>\n <p style={alertTextStyle}>{qrDeclinedReason}</p>\n <p style={{ ...alertTextStyle, marginTop: 4 }}>\n Try again on your phone. Attempt {Math.min(attempts + 1, maxAttempts)} of {maxAttempts}.\n </p>\n </div>\n )}\n <div style={buttonsContainerStyle}>\n <button\n style={secondaryButtonStyle}\n onClick={() => setStage({ kind: \"capture\" })}\n >\n Use this device instead\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n </div>\n )\n\n const renderCapture = (declinedReason?: string) => {\n if (captureMode === \"live\") {\n return (\n <div style={contentStyle}>\n <LiveCamera\n onCapture={handleCameraCapture}\n onCancel={handleCameraCancel}\n message={livenessMessage}\n />\n <p style={attemptsTextStyle}>\n Attempt {attempts + 1} of {maxAttempts}\n </p>\n </div>\n )\n }\n\n if (captureMode === \"preview\" && capturedPreview) {\n return (\n <div style={contentStyle}>\n {declinedReason && (\n <div style={alertBoxStyle}>\n <strong>Verification declined.</strong>\n <p style={alertTextStyle}>{declinedReason}</p>\n </div>\n )}\n <p style={subtitleStyle}>Looks good? Submit this selfie or retake it.</p>\n <div style={previewBoxStyle}>\n <img src={capturedPreview} alt=\"Captured selfie preview\" style={previewImgStyle} />\n </div>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={handleConfirmSubmit}>\n <img src={Done} alt=\"\" width={20} height={20} />\n <span>Submit</span>\n </button>\n <button style={secondaryButtonStyle} onClick={handleRetake}>\n Retake\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n <p style={attemptsTextStyle}>\n Attempt {attempts + 1} of {maxAttempts}\n </p>\n </div>\n )\n }\n\n return (\n <div style={contentStyle}>\n <div style={visualGuideContainerStyle}>\n <div style={visualGuideStyle}>\n <div style={circleStyle}>\n <img src={Camera} alt=\"\" width={48} height={48} />\n </div>\n <div style={badgeStyle}>\n <img src={Done} alt=\"\" width={16} height={16} />\n </div>\n </div>\n </div>\n {declinedReason && (\n <div style={alertBoxStyle}>\n <strong>Verification declined.</strong>\n <p style={alertTextStyle}>{declinedReason}</p>\n </div>\n )}\n <div style={instructionsBoxStyle}>\n <h3 style={instructionsTitleStyle}>Tips for best results:</h3>\n <ul style={instructionsListStyle}>\n <li style={instructionItemStyle}><span style={bulletStyle}>•</span><span>Ensure good lighting on your face</span></li>\n <li style={instructionItemStyle}><span style={bulletStyle}>•</span><span>Remove glasses or accessories if possible</span></li>\n <li style={instructionItemStyle}><span style={bulletStyle}>•</span><span>Look directly at the camera</span></li>\n </ul>\n </div>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={handleOpenCamera}>\n <img src={Camera} alt=\"\" width={20} height={20} />\n <span>{declinedReason ? \"Try again\" : \"Open Camera\"}</span>\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n <p style={attemptsTextStyle}>\n Attempt {attempts + 1} of {maxAttempts}\n </p>\n </div>\n )\n }\n\n const renderSubmitting = () => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={{ ...spinnerStyle, margin: \"24px auto\", width: 32, height: 32 }} />\n <p style={subtitleStyle}>Verifying your photo…</p>\n <p style={{ ...attemptsTextStyle, marginTop: 8 }}>This usually takes a few seconds.</p>\n </div>\n )\n\n const renderAccepted = (result: ReuseKycCallback) => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={successCircleStyle}>\n <img src={Done} alt=\"\" width={48} height={48} />\n </div>\n <h3 style={titleStyle}>Verified</h3>\n <p style={subtitleStyle}>Your identity has been confirmed. You can continue.</p>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={() => close(result)}>Continue</button>\n </div>\n </div>\n )\n\n // Dedicated declined screen — shows only the reason + Retake + Cancel.\n // No preview of the rejected image and no Submit button: a Retake\n // here always means \"open the camera fresh\", never \"resubmit the same\n // selfie\", which matches the cgs-frontend DeclinedState pattern.\n const renderDeclined = (result: ReuseKycCallback) => (\n <div style={contentStyle}>\n <div style={alertBoxStyle}>\n <strong>Verification declined.</strong>\n <p style={alertTextStyle}>\n {result.declined_reason ?? \"We couldn't match your selfie. Please take a new one.\"}\n </p>\n </div>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={handleRetakeAfterDecline}>\n <img src={Camera} alt=\"\" width={20} height={20} />\n <span>Retake</span>\n </button>\n <button style={cancelButtonStyle} onClick={() => close(result)}>Cancel</button>\n </div>\n <p style={attemptsTextStyle}>\n Attempt {Math.min(attempts + 1, maxAttempts)} of {maxAttempts}\n </p>\n </div>\n )\n\n const renderMaxAttempts = (result: ReuseKycCallback) => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={errorCircleStyle}>!</div>\n <h3 style={titleStyle}>Maximum attempts reached</h3>\n <p style={subtitleStyle}>\n {result.declined_reason ?? \"We couldn't verify your identity after several attempts.\"}\n </p>\n {result.data?.freeze_account && (\n <p style={alertTextStyle}>\n For your security, your account has been temporarily restricted\n {result.data.freeze_duration_minutes\n ? ` for ${result.data.freeze_duration_minutes} minutes`\n : \"\"}\n . Please contact support if you need immediate help.\n </p>\n )}\n {result.data?.enforce_logout && (\n <p style={alertTextStyle}>You will be signed out of your session.</p>\n )}\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={() => close(result)}>Close</button>\n </div>\n </div>\n )\n\n const renderError = (message: string) => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={errorCircleStyle}>!</div>\n <h3 style={titleStyle}>Something went wrong</h3>\n <p style={alertTextStyle}>{message}</p>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={() => setStage({ kind: \"capture\" })}>\n Try again\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n </div>\n )\n\n const body = (() => {\n switch (stage.kind) {\n case \"choose\": return renderChoose()\n case \"qr\": return renderQRStage(stage.mobileConnected)\n case \"capture\": return renderCapture(stage.declinedReason)\n case \"submitting\": return renderSubmitting()\n case \"accepted\": return renderAccepted(stage.result)\n case \"declined\": return renderDeclined(stage.result)\n case \"max_attempts\": return renderMaxAttempts(stage.result)\n case \"error\": return renderError(stage.message)\n }\n })()\n\n return (\n <>\n <style>{keyframes}</style>\n <div style={overlayStyle}>\n <div style={modalStyle}>\n <div style={headerStyle}>\n <button\n onClick={() => close(null)}\n style={closeButtonStyle}\n aria-label=\"Close\"\n >\n <img src={Close} alt=\"\" width={16} height={16} />\n </button>\n <h2 style={titleStyle}>Face Verification</h2>\n <p style={subtitleStyle}>{headerSubtitle(stage.kind)}</p>\n </div>\n\n {body}\n\n <div style={footerStyle}>\n <p style={footerTextStyle}>\n Your photo is securely processed and used only for verification.\n </p>\n </div>\n </div>\n </div>\n </>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// Styles (inline)\n// ─────────────────────────────────────────────────────────────────────\n\nconst keyframes = `\n@keyframes fadeIn { from { opacity: 0 } to { opacity: 1 } }\n@keyframes zoomIn { from { transform: scale(.96); opacity: 0 } to { transform: scale(1); opacity: 1 } }\n@keyframes spin { to { transform: rotate(360deg) } }\n`\n\nconst overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,.6)\",\n backdropFilter: \"blur(4px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 999999,\n padding: 16,\n animation: \"fadeIn .2s ease-out\",\n}\n\nconst modalStyle: React.CSSProperties = {\n background: \"#fff\",\n borderRadius: 16,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,.25)\",\n width: \"100%\",\n maxWidth: 448,\n animation: \"zoomIn .2s ease-out\",\n}\n\nconst headerStyle: React.CSSProperties = {\n position: \"relative\",\n padding: \"24px 24px 16px\",\n borderBottom: \"1px solid #f3f4f6\",\n}\n\nconst closeButtonStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 16,\n right: 16,\n padding: 8,\n background: \"transparent\",\n border: \"none\",\n borderRadius: 8,\n cursor: \"pointer\",\n}\n\nconst titleStyle: React.CSSProperties = { margin: \"0 0 4px\", fontSize: 18, fontWeight: 600, color: \"#111827\" }\nconst subtitleStyle: React.CSSProperties = { margin: 0, fontSize: 14, color: \"#6b7280\" }\n\nconst contentStyle: React.CSSProperties = {\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n}\n\nconst visualGuideContainerStyle: React.CSSProperties = { display: \"flex\", justifyContent: \"center\" }\nconst visualGuideStyle: React.CSSProperties = { position: \"relative\" }\nconst circleStyle: React.CSSProperties = {\n width: 96,\n height: 96,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, rgba(0, 188, 125, 0.2) 0%, rgba(0, 188, 125, 0.05) 100%)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n}\nconst badgeStyle: React.CSSProperties = {\n position: \"absolute\",\n bottom: -4,\n right: -4,\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n background: \"#ffffff\",\n border: \"2px solid #00bc7d\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n}\n\nconst successCircleStyle: React.CSSProperties = {\n ...circleStyle,\n background: \"linear-gradient(135deg, rgba(0, 188, 125, 0.25) 0%, rgba(0, 188, 125, 0.1) 100%)\",\n margin: \"0 auto\",\n}\n\nconst errorCircleStyle: React.CSSProperties = {\n width: 64,\n height: 64,\n borderRadius: \"50%\",\n background: \"#fee2e2\",\n color: \"#b91c1c\",\n fontSize: 32,\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"0 auto\",\n}\n\nconst qrBoxStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"center\",\n padding: 12,\n background: \"linear-gradient(135deg, #f9fafb 0%, rgba(243, 244, 246, 0.5) 100%)\",\n borderRadius: 12,\n}\n\nconst alertBoxStyle: React.CSSProperties = {\n background: \"#fef3c7\",\n border: \"1px solid #fde68a\",\n color: \"#92400e\",\n borderRadius: 8,\n padding: 12,\n fontSize: 14,\n}\nconst alertTextStyle: React.CSSProperties = { margin: \"4px 0 0\", fontSize: 13, color: \"#92400e\" }\n\nconst instructionsBoxStyle: React.CSSProperties = {\n background: \"linear-gradient(135deg, #f9fafb 0%, rgba(243, 244, 246, 0.5) 100%)\",\n borderRadius: 8,\n padding: 16,\n}\nconst instructionsTitleStyle: React.CSSProperties = { margin: \"0 0 8px\", fontSize: 14, fontWeight: 600, color: \"#374151\" }\nconst instructionsListStyle: React.CSSProperties = { margin: 0, padding: 0, listStyle: \"none\" }\nconst instructionItemStyle: React.CSSProperties = { display: \"flex\", gap: 8, fontSize: 13, color: \"#4b5563\", lineHeight: 1.5 }\nconst bulletStyle: React.CSSProperties = { color: \"#00bc7d\" }\n\nconst previewBoxStyle: React.CSSProperties = {\n borderRadius: 12,\n overflow: \"hidden\",\n border: \"2px solid rgba(0, 188, 125, 0.4)\",\n background: \"#0f172a\",\n display: \"flex\",\n justifyContent: \"center\",\n}\nconst previewImgStyle: React.CSSProperties = {\n width: \"100%\",\n maxHeight: 320,\n objectFit: \"contain\",\n background: \"#0f172a\",\n}\n\nconst buttonsContainerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n}\n\nconst primaryButtonStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n padding: \"12px 16px\",\n background: \"#00bc7d\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: 8,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n}\n\nconst secondaryButtonStyle: React.CSSProperties = {\n ...primaryButtonStyle,\n background: \"#ffffff\",\n color: \"#374151\",\n border: \"2px solid #e5e7eb\",\n}\n\nconst cancelButtonStyle: React.CSSProperties = {\n ...primaryButtonStyle,\n background: \"transparent\",\n color: \"#6b7280\",\n border: \"none\",\n}\n\nconst spinnerStyle: React.CSSProperties = {\n width: 16,\n height: 16,\n border: \"2px solid rgba(0, 188, 125, 0.25)\",\n borderTopColor: \"#00bc7d\",\n borderRadius: \"50%\",\n animation: \"spin .8s linear infinite\",\n}\n\nconst attemptsTextStyle: React.CSSProperties = {\n margin: \"8px 0 0\",\n fontSize: 12,\n color: \"#9ca3af\",\n textAlign: \"center\",\n}\n\nconst footerStyle: React.CSSProperties = { padding: \"12px 24px 16px\", borderTop: \"1px solid #f3f4f6\" }\nconst footerTextStyle: React.CSSProperties = { margin: 0, fontSize: 12, color: \"#9ca3af\", textAlign: \"center\" }\n\n// ─────────────────────────────────────────────────────────────────────\n// LiveCamera — in-modal getUserMedia preview + capture button\n// ─────────────────────────────────────────────────────────────────────\n\ninterface LiveCameraProps {\n onCapture: (dataUrl: string) => void\n onCancel: () => void\n message?: string\n}\n\nfunction LiveCamera({ onCapture, onCancel, message }: Readonly<LiveCameraProps>): React.ReactElement {\n const videoRef = useRef<HTMLVideoElement>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const [ready, setReady] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n async function init() {\n try {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n throw new Error(\"Camera is not available in this browser\")\n }\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n facingMode: \"user\",\n width: { ideal: 1280 },\n height: { ideal: 1280 },\n },\n audio: false,\n })\n if (cancelled) {\n stream.getTracks().forEach((t) => t.stop())\n return\n }\n streamRef.current = stream\n const video = videoRef.current\n if (video) {\n video.srcObject = stream\n video.onloadedmetadata = () => {\n video.play().catch(() => { /* autoplay block — user gesture already happened */ })\n setReady(true)\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Unable to access camera\")\n }\n }\n init()\n return () => {\n cancelled = true\n streamRef.current?.getTracks().forEach((t) => t.stop())\n streamRef.current = null\n }\n }, [])\n\n const capture = () => {\n const video = videoRef.current\n if (!video || !video.videoWidth) return\n // Center-crop to a square so the selfie matches the on-screen face\n // oval. Mirror horizontally because the front-camera preview is\n // mirrored for the user but the raw video frame is not.\n const size = Math.min(video.videoWidth, video.videoHeight)\n const sx = (video.videoWidth - size) / 2\n const sy = (video.videoHeight - size) / 2\n const canvas = document.createElement(\"canvas\")\n canvas.width = size\n canvas.height = size\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n ctx.translate(size, 0)\n ctx.scale(-1, 1)\n ctx.drawImage(video, sx, sy, size, size, 0, 0, size, size)\n // Stop the stream as soon as we have the frame — frees the camera\n // hardware while the user reviews the preview.\n streamRef.current?.getTracks().forEach((t) => t.stop())\n streamRef.current = null\n onCapture(canvas.toDataURL(\"image/jpeg\", 0.9))\n }\n\n if (error) {\n return (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\", padding: 0 }}>\n <div style={errorCircleStyle}>!</div>\n <h3 style={titleStyle}>Camera unavailable</h3>\n <p style={alertTextStyle}>{error}</p>\n <div style={buttonsContainerStyle}>\n <button style={secondaryButtonStyle} onClick={onCancel}>Back</button>\n </div>\n </div>\n )\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <div style={videoFrameStyle}>\n <video\n ref={videoRef}\n playsInline\n muted\n autoPlay\n style={videoStyle}\n />\n <div style={faceOvalOverlayStyle} aria-hidden=\"true\" />\n {!ready && <div style={videoLoadingStyle}>Starting camera…</div>}\n </div>\n {message && <p style={livenessMessageStyle}>{message}</p>}\n <div style={buttonsContainerStyle}>\n <button\n style={ready ? primaryButtonStyle : { ...primaryButtonStyle, opacity: 0.5, cursor: \"not-allowed\" }}\n onClick={capture}\n disabled={!ready}\n >\n <img src={Camera} alt=\"\" width={20} height={20} />\n <span>Capture</span>\n </button>\n <button style={secondaryButtonStyle} onClick={onCancel}>Cancel</button>\n </div>\n </div>\n )\n}\n\nconst videoFrameStyle: React.CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n aspectRatio: \"1 / 1\",\n borderRadius: 12,\n overflow: \"hidden\",\n background: \"#0f172a\",\n}\n\nconst videoStyle: React.CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n transform: \"scaleX(-1)\", // mirror so the preview matches the user's POV\n}\n\nconst faceOvalOverlayStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n background:\n \"radial-gradient(ellipse 38% 50% at center, transparent 60%, rgba(15, 23, 42, 0.55) 62%)\",\n border: \"2px solid rgba(0, 188, 125, 0.6)\",\n borderRadius: 12,\n}\n\nconst videoLoadingStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#e5e7eb\",\n fontSize: 14,\n fontWeight: 500,\n}\n\nconst livenessMessageStyle: React.CSSProperties = {\n margin: 0,\n textAlign: \"center\",\n fontSize: 13,\n fontWeight: 500,\n color: \"#374151\",\n background: \"rgba(0, 188, 125, 0.08)\",\n border: \"1px solid rgba(0, 188, 125, 0.25)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n}\n\nexport default FaceCaptureModal\n","/**\n * React Hooks for Vesant KYC SDK\n *\n * Provides convenient React hooks for using the KYC service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef, createElement } from 'react';\nimport { createRoot } from \"react-dom/client\"\nimport FaceCaptureModal from \"./FaceCaptureModal\"\nimport { KycClient } from './client';\nimport type {\n KycRequest,\n KycRequestFilters,\n DocumentVerificationRequest,\n DocumentVerificationResponse,\n KycStatus,\n KycAlert,\n KycAlertFilters,\n UpdateKycAlertRequest,\n KycOverview,\n KycPreferences,\n UpdateKycPreferencesRequest,\n PaginationParams,\n UseKycSubmissionOptions,\n UseKycSubmissionResult,\n UseKycRequestsOptions,\n UseKycRequestsResult,\n UseKycAlertsOptions,\n UseKycAlertsResult,\n UseKycOverviewOptions,\n UseKycOverviewResult,\n UseKycPreferencesResult,\n CreateReuseKycSessionRequest,\n CreateReuseKycSessionResponse,\n ReuseKycCallback,\n} from './types';\n\n// ============================================================================\n// Shared Hooks for Auto-fetch and Polling\n// ============================================================================\n\n/** Hook for auto-fetching on mount */\nfunction useAutoFetch(autoFetch: boolean | undefined, fetchFn: () => void): void {\n useEffect(() => {\n if (autoFetch) {\n fetchFn();\n }\n }, [autoFetch, fetchFn]);\n}\n\n/** Hook for setting up polling intervals */\nfunction usePolling(pollInterval: number | undefined, fetchFn: () => void): void {\n const pollIntervalRef = useRef<ReturnType<typeof setInterval>>();\n\n useEffect(() => {\n if (pollInterval && pollInterval > 0) {\n pollIntervalRef.current = setInterval(fetchFn, pollInterval);\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n }\n };\n }\n return undefined;\n }, [pollInterval, fetchFn]);\n}\n\n// ============================================================================\n// useKycSubmission Hook\n// ============================================================================\n\n/**\n * React hook for submitting KYC document verification\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC submission state and methods\n *\n * @example\n * ```tsx\n * function KycForm() {\n * const { submit, submission, loading, error, reset } = useKycSubmission(client, {\n * onComplete: (result) => {\n * console.log(\"Verification submitted:\", result.reference);\n * },\n * onError: (err) => {\n * console.error(\"Submission failed:\", err.message);\n * }\n * });\n *\n * const handleSubmit = async (formData: FormData) => {\n * await submit({\n * reference: formData.get(\"customerId\"),\n * email: formData.get(\"email\"),\n * document: {\n * proof: formData.get(\"documentImage\"),\n * selected_type: [\"id_card\", \"passport\"]\n * }\n * });\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * {loading && <Spinner />}\n * {error && <ErrorMessage>{error.message}</ErrorMessage>}\n * {submission && <SuccessMessage>Submitted: {submission.reference}</SuccessMessage>}\n * </form>\n * );\n * }\n * ```\n */\nexport function useKycSubmission(\n client: KycClient,\n options: UseKycSubmissionOptions = {}\n): UseKycSubmissionResult {\n const [submission, setSubmission] = useState<DocumentVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const submit = useCallback(\n async (request: DocumentVerificationRequest): Promise<DocumentVerificationResponse> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.submitVerification(request);\n setSubmission(result);\n options.onComplete?.(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Verification submission failed');\n setError(error);\n options.onError?.(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options]\n );\n\n const reset = useCallback(() => {\n setSubmission(null);\n setError(null);\n setLoading(false);\n }, []);\n\n return {\n submit,\n submission,\n loading,\n error,\n reset,\n };\n}\n\n// ============================================================================\n// useKycRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC requests\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC requests state and management methods\n *\n * @example\n * ```tsx\n * function KycDashboard() {\n * const {\n * requests,\n * total,\n * loading,\n * fetchRequests,\n * updateStatus\n * } = useKycRequests(client, {\n * autoFetch: true,\n * filters: { status: \"pending\" },\n * pagination: { page: 1, page_size: 20 }\n * });\n *\n * return (\n * <div>\n * <h2>{total} Pending KYC Requests</h2>\n * {requests.map(req => (\n * <KycCard\n * key={req.id}\n * request={req}\n * onApprove={() => updateStatus(req.reference, \"accepted\", \"Verified\")}\n * onReject={() => updateStatus(req.reference, \"declined\", \"Invalid document\")}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKycRequests(\n client: KycClient,\n options: UseKycRequestsOptions = {}\n): UseKycRequestsResult {\n const [requests, setRequests] = useState<KycRequest[]>([]);\n const [pagination, setPagination] = useState<{ total: number; page: number; limit: number; totalPages: number } | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchRequests = useCallback(\n async (filters?: KycRequestFilters, paginationParams?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listKycRequests(\n filters || options.filters,\n paginationParams || options.pagination\n );\n setRequests(result.data);\n setPagination(result.pagination);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC requests');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.filters, options.pagination]\n );\n\n const getRequest = useCallback(\n async (id: string): Promise<KycRequest> => {\n try {\n return await client.getKycRequest(id);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get KYC request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const updateStatus = useCallback(\n async (reference: string, status: KycStatus, reason?: string) => {\n try {\n await client.updateKycStatus({ reference, status, reason });\n setRequests((prev) =>\n prev.map((req) =>\n req.reference === reference\n ? {\n ...req,\n status,\n ...(status === 'accepted'\n ? { accepted_reason: reason }\n : { declined_reason: reason }),\n }\n : req\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update KYC status');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchRequests();\n }, [fetchRequests]);\n\n useAutoFetch(options.autoFetch, fetchRequests);\n usePolling(options.pollInterval, fetchRequests);\n\n return {\n requests,\n pagination,\n loading,\n error,\n fetchRequests,\n getRequest,\n updateStatus,\n refresh,\n };\n}\n\n// ============================================================================\n// useKycAlerts Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC alerts\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC alerts state and management methods\n *\n * @example\n * ```tsx\n * function AlertsPanel() {\n * const {\n * alerts,\n * total,\n * loading,\n * fetchAlerts,\n * updateAlert\n * } = useKycAlerts(client, {\n * autoFetch: true,\n * filters: { status: [\"pending\", \"in_progress\"], risk: \"critical\" },\n * pollInterval: 30000\n * });\n *\n * return (\n * <div>\n * <h2>{total} Critical Alerts</h2>\n * {alerts.map(alert => (\n * <AlertCard\n * key={alert.id}\n * alert={alert}\n * onAssign={(userId) => updateAlert(alert.id, { assigned_for: userId, status: \"in_progress\" })}\n * onResolve={() => updateAlert(alert.id, { status: \"resolved\", reason: \"Verified\" })}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKycAlerts(\n client: KycClient,\n options: UseKycAlertsOptions = {}\n): UseKycAlertsResult {\n const [alerts, setAlerts] = useState<KycAlert[]>([]);\n const [pagination, setPagination] = useState<{ total: number; page: number; limit: number; totalPages: number } | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAlerts = useCallback(\n async (filters?: KycAlertFilters, paginationParams?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listAlerts(\n filters || options.filters,\n paginationParams || options.pagination\n );\n setAlerts(result.alerts);\n setPagination(result.pagination);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC alerts');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.filters, options.pagination]\n );\n\n const getAlert = useCallback(\n async (id: string): Promise<KycAlert> => {\n try {\n return await client.getAlert(id);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get KYC alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const updateAlert = useCallback(\n async (id: string, update: UpdateKycAlertRequest) => {\n try {\n await client.updateAlert(id, update);\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === id ? { ...alert, ...update } : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update KYC alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchAlerts();\n }, [fetchAlerts]);\n\n useAutoFetch(options.autoFetch, fetchAlerts);\n usePolling(options.pollInterval, fetchAlerts);\n\n return {\n alerts,\n pagination,\n loading,\n error,\n fetchAlerts,\n getAlert,\n updateAlert,\n refresh,\n };\n}\n\n// ============================================================================\n// useKycOverview Hook\n// ============================================================================\n\n/**\n * React hook for KYC overview statistics\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC overview state\n *\n * @example\n * ```tsx\n * function KycStats() {\n * const { overview, loading, refresh } = useKycOverview(client, {\n * autoFetch: true,\n * fromDate: \"2024-01-01T00:00:00Z\",\n * toDate: \"2024-12-31T23:59:59Z\"\n * });\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * <StatCard label=\"Total\" value={overview?.total} />\n * <StatCard label=\"Pending\" value={overview?.pending} />\n * <StatCard label=\"Approved\" value={overview?.approved} />\n * <StatCard label=\"Rejected\" value={overview?.rejected} />\n * <StatCard label=\"High Risk\" value={overview?.high_risk} />\n * </div>\n * );\n * }\n * ```\n */\nexport function useKycOverview(\n client: KycClient,\n options: UseKycOverviewOptions = {}\n): UseKycOverviewResult {\n const [overview, setOverview] = useState<KycOverview | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchOverview = useCallback(\n async (fromDate?: string, toDate?: string) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getOverview(\n fromDate || options.fromDate,\n toDate || options.toDate\n );\n setOverview(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC overview');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.fromDate, options.toDate]\n );\n\n useAutoFetch(options.autoFetch, fetchOverview);\n\n return {\n overview,\n loading,\n error,\n refresh: fetchOverview,\n };\n}\n\n// ============================================================================\n// useKycPreferences Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC preferences\n *\n * @param client - KycClient instance\n * @param autoFetch - Auto-fetch preferences on mount (default: true)\n * @returns KYC preferences state and methods\n *\n * @example\n * ```tsx\n * function PreferencesForm() {\n * const { preferences, loading, updatePreferences, refresh } = useKycPreferences(client);\n *\n * const handleUpdate = async (e: FormEvent) => {\n * e.preventDefault();\n * await updatePreferences({\n * is_face_verification_required: true,\n * required_document_count: 2\n * });\n * };\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <form onSubmit={handleUpdate}>\n * <Checkbox\n * label=\"Require Face Verification\"\n * checked={preferences?.is_face_verification_required}\n * />\n * <NumberInput\n * label=\"Required Documents\"\n * value={preferences?.required_document_count}\n * />\n * <Button type=\"submit\">Save</Button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useKycPreferences(\n client: KycClient,\n autoFetch: boolean = true\n): UseKycPreferencesResult {\n const [preferences, setPreferences] = useState<KycPreferences | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPreferences = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getPreferences();\n setPreferences(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC preferences');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n const updatePreferences = useCallback(\n async (update: UpdateKycPreferencesRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.updatePreferences(update);\n setPreferences(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update KYC preferences');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n useAutoFetch(autoFetch, fetchPreferences);\n\n return {\n preferences,\n loading,\n error,\n updatePreferences,\n refresh: fetchPreferences,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert a File to base64 string for document upload\n *\n * @param file - File object from input or drag-drop\n * @returns Base64 encoded string\n *\n * @example\n * ```typescript\n * const handleFileSelect = async (e: ChangeEvent<HTMLInputElement>) => {\n * const file = e.target.files?.[0];\n * if (file) {\n * const base64 = await fileToBase64(file);\n * setDocumentProof(base64);\n * }\n * };\n * ```\n */\nexport function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Validate file type for document upload\n *\n * @param file - File object to validate\n * @param allowedTypes - Array of allowed MIME types\n * @returns boolean indicating if file type is valid\n *\n * @example\n * ```typescript\n * const validTypes = ['image/jpeg', 'image/png', 'application/pdf'];\n * if (!isValidFileType(file, validTypes)) {\n * alert('Invalid file type. Please upload a JPG, PNG, or PDF.');\n * }\n * ```\n */\nexport function isValidFileType(\n file: File,\n allowedTypes: string[] = ['image/jpeg', 'image/png', 'image/webp', 'application/pdf']\n): boolean {\n return allowedTypes.includes(file.type);\n}\n\n/**\n * Validate file size for document upload\n *\n * @param file - File object to validate\n * @param maxSizeBytes - Maximum file size in bytes (default: 10MB)\n * @returns boolean indicating if file size is valid\n *\n * @example\n * ```typescript\n * const maxSize = 5 * 1024 * 1024; // 5MB\n * if (!isValidFileSize(file, maxSize)) {\n * alert('File too large. Maximum size is 5MB.');\n * }\n * ```\n */\nexport function isValidFileSize(file: File, maxSizeBytes: number = 10 * 1024 * 1024): boolean {\n return file.size <= maxSizeBytes;\n}\n\n/**\n * Format KYC status for display\n *\n * @param status - KYC status\n * @returns Human-readable status string\n */\nexport function formatKycStatus(status: string): string {\n const statusMap: Record<string, string> = {\n pending: 'Pending Review',\n accepted: 'Approved',\n declined: 'Rejected',\n 'review.pending': 'Under Review',\n unknown: 'Unknown',\n };\n return statusMap[status] || status;\n}\n\n/**\n * Get status color for UI display\n *\n * @param status - KYC status\n * @returns CSS color class or hex color\n */\nexport function getStatusColor(status: string): string {\n const colorMap: Record<string, string> = {\n pending: '#f59e0b', // amber\n accepted: '#10b981', // green\n declined: '#ef4444', // red\n 'review.pending': '#3b82f6', // blue\n unknown: '#6b7280', // gray\n };\n return colorMap[status] || '#6b7280';\n}\n\n/**\n * Get risk level color for UI display\n *\n * @param risk - Risk level\n * @returns CSS color class or hex color\n */\nexport function getRiskColor(risk: string): string {\n const colorMap: Record<string, string> = {\n low: '#10b981', // green\n medium: '#f59e0b', // amber\n high: '#f97316', // orange\n critical: '#ef4444', // red\n };\n return colorMap[risk] || '#6b7280';\n}\n\n\n\n/**\n * Detect whether the current browser is a mobile device. The check is\n * deliberately conservative — anything that doesn't match the mobile\n * pattern is treated as desktop and gets the QR handoff flow.\n *\n * Server-side device detection is intentionally absent; the SDK is the\n * authority on UX selection.\n */\nexport function isMobileDevice(userAgent?: string): boolean {\n const ua = userAgent ?? (typeof navigator === 'undefined' ? '' : navigator.userAgent);\n return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);\n}\n\n/**\n * Build the opaque QR payload a desktop client renders for the mobile\n * device to scan. Format matches the normal-KYC mobile-handoff scheme so\n * a single mobile app can handle both flows.\n */\nexport function buildReuseKycQrPayload(token: string): string {\n return `vesant://reuse-kyc?token=${encodeURIComponent(token)}`;\n}\n\n/**\n * Hook for the Re-Use KYC face-capture flow.\n *\n * Returns helpers that cover both mobile (direct capture) and desktop\n * (QR + polling) modes. Device detection happens here on the client —\n * the server accepts submissions from any User-Agent.\n *\n * - `startSession(req)` — POST /face/session. Inspect `is_required` first;\n * skip the modal entirely when it's `false`.\n * - `verifyFace(session, opts?)` — mount FaceCaptureModal and resolve once\n * the user reaches a terminal state (accepted / declined-after-max /\n * cancelled). The modal handles the device picker, QR handoff,\n * selfie capture, retries within the configured `max_attempts`, and\n * surfacing of the decline reason — all without unmounting in between.\n * - `runFlow(req, opts?)` — convenience wrapper: `startSession` then\n * `verifyFace`, with a short-circuit when `is_required` is false.\n */\nexport function useReuseKYCSubmission(client: KycClient) {\n const startSession = useCallback(\n (request: CreateReuseKycSessionRequest) => client.createReuseKycSession(request),\n [client]\n );\n\n /**\n * Options for `verifyFace`. Mirrors `FaceCaptureModalProps`.\n *\n * - `defaultDevice` — `'ask'` (default on desktop) shows the device\n * picker; `'this'` skips straight to capture; `'mobile'` skips\n * straight to the QR handoff. Default on mobile is `'this'`.\n * - `renderQR` — bring-your-own QR renderer. Default uses\n * api.qrserver.com.\n */\n type VerifyFaceOptions = {\n defaultDevice?: 'ask' | 'this' | 'mobile';\n renderQR?: (payload: string) => React.ReactNode;\n };\n\n const verifyFace = useCallback(\n (session: CreateReuseKycSessionResponse, opts: VerifyFaceOptions = {}) =>\n new Promise<ReuseKycCallback | null>((resolve) => {\n const container = document.createElement('div')\n document.body.appendChild(container)\n const root = createRoot(container)\n\n const cleanup = () => {\n root.unmount()\n container.remove()\n }\n\n const modal = createElement(FaceCaptureModal, {\n client,\n session,\n defaultDevice: opts.defaultDevice,\n renderQR: opts.renderQR,\n onComplete: (result) => {\n cleanup()\n resolve(result)\n },\n })\n root.render(modal)\n }),\n [client]\n );\n\n type RunFlowResult =\n | { kind: 'not_required'; session: CreateReuseKycSessionResponse }\n | { kind: 'cancelled'; session: CreateReuseKycSessionResponse }\n | { kind: 'completed'; session: CreateReuseKycSessionResponse; result: ReuseKycCallback };\n\n const runFlow = useCallback(\n async (request: CreateReuseKycSessionRequest, opts: VerifyFaceOptions = {}): Promise<RunFlowResult> => {\n const session = await startSession(request);\n if (!session.is_required) {\n return { kind: 'not_required', session };\n }\n const result = await verifyFace(session, opts);\n if (result === null) {\n return { kind: 'cancelled', session };\n }\n return { kind: 'completed', session, result };\n },\n [startSession, verifyFace]\n );\n\n return { startSession, verifyFace, runFlow };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/version.ts","../src/core/errors.ts","../src/shared/browser-utils.ts","../src/geolocation/ciphertext.ts","../src/geolocation/hooks.ts","../src/compliance/hooks.ts","../src/risk-profile/hooks.ts","../src/kyc/images.ts","../src/kyc/FaceCaptureModal.tsx","../src/kyc/hooks.ts"],"names":["useState","useRef","useCallback","error","useEffect","React","err","client","createRoot","createElement"],"mappings":"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","file":"react.js","sourcesContent":["/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '2.0.0';\n","/**\n * Error hierarchy for Vesant SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class VesantError extends Error {\n public requestId?: string;\n\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'VesantError';\n Object.setPrototypeOf(this, VesantError.prototype);\n }\n}\n\n/** @deprecated Use VesantError instead */\nexport const CGSError = VesantError;\n/** @deprecated Use VesantError instead */\nexport type CGSError = VesantError;\n\nexport class NetworkError extends VesantError {\n constructor(message: string, public originalError?: unknown) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\nexport class ValidationError extends VesantError {\n constructor(message: string, fields?: string[]) {\n super(message, 'VALIDATION_ERROR', 400, { fields });\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class ServiceUnavailableError extends VesantError {\n constructor(message: string = 'Service unavailable') {\n super(message, 'SERVICE_UNAVAILABLE', 503);\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n\nexport class ComplianceBlockedError extends VesantError {\n constructor(reasons: import('./types').BlockReason[]) {\n super('Access blocked due to compliance rules', 'COMPLIANCE_BLOCKED', 403, { reasons });\n this.name = 'ComplianceBlockedError';\n Object.setPrototypeOf(this, ComplianceBlockedError.prototype);\n }\n}\n\nexport class AuthenticationError extends VesantError {\n constructor(message: string = 'Authentication failed') {\n super(message, 'AUTHENTICATION_ERROR', 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\nexport class RateLimitError extends VesantError {\n constructor(public retryAfter?: number) {\n super('Rate limit exceeded', 'RATE_LIMIT_EXCEEDED', 429, { retryAfter });\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\nexport class TimeoutError extends VesantError {\n constructor(public timeout: number) {\n super(`Request timeout after ${timeout}ms`, 'TIMEOUT', 408, { timeout });\n this.name = 'TimeoutError';\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nexport class ComplianceError extends VesantError {\n constructor(\n message: string,\n public originalError?: unknown,\n code: string = 'COMPLIANCE_ERROR'\n ) {\n super(message, code);\n this.name = 'ComplianceError';\n Object.setPrototypeOf(this, ComplianceError.prototype);\n }\n}\n\nexport class CircuitBreakerOpenError extends VesantError {\n constructor() {\n super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n this.name = 'CircuitBreakerOpenError';\n Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n }\n}\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return generateUUID();\n }\n\n const storageKey = 'vesant_device_id';\n let deviceId = localStorage.getItem(storageKey);\n\n if (!deviceId) {\n deviceId = generateUUID();\n localStorage.setItem(storageKey, deviceId);\n }\n\n return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n} {\n if (typeof navigator === 'undefined') {\n return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n }\n\n const ua = navigator.userAgent;\n let browser = 'unknown';\n let browserVersion = '';\n let os = 'unknown';\n let osVersion = '';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n browser = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Edg/')) {\n browser = 'Edge';\n browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Chrome/')) {\n browser = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n browser = 'Safari';\n browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n browser = 'Opera';\n browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n }\n\n // Detect OS\n if (ua.includes('Windows')) {\n os = 'Windows';\n if (ua.includes('Windows NT 10.0')) osVersion = '10';\n else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n } else if (ua.includes('Mac OS X')) {\n os = 'macOS';\n osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n } else if (ua.includes('Linux')) {\n os = 'Linux';\n } else if (ua.includes('Android')) {\n os = 'Android';\n osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n os = 'iOS';\n osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n }\n\n return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n CipherTextPayload,\n CipherTextOptions,\n CipherTextResult,\n CipherTextReason,\n GeolocationConfigResponse,\n} from './types';\nimport { SDK_VERSION } from '../core/version';\nimport { VesantError } from '../core/errors';\nimport { getBrowserInfo, generateDeviceId as getOrCreateDeviceId } from '../shared/browser-utils';\n\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Compute HMAC-SHA256 of a message using the given key.\n * Uses Web Crypto API (browser/modern Node) with node:crypto fallback.\n */\nasync function computeHMAC(key: string, message: string): Promise<string> {\n // Try Web Crypto API first (works in browsers and Node 18+)\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const msgData = encoder.encode(message);\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signature = await globalThis.crypto.subtle.sign('HMAC', cryptoKey, msgData);\n const bytes = new Uint8Array(signature);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // Fallback: Node.js crypto module\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createHmac } = await import('node:crypto');\n return createHmac('sha256', key).update(message).digest('hex');\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n if (typeof document === 'undefined') return null;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl) return null;\n\n const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return null;\n\n return {\n vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n if (typeof navigator === 'undefined') return undefined;\n\n const connection = (navigator as any).connection ||\n (navigator as any).mozConnection ||\n (navigator as any).webkitConnection;\n\n if (!connection) return undefined;\n\n return {\n effective_type: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n save_data: connection.saveData,\n };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n timeout: number = 10000,\n highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n if (typeof navigator === 'undefined' || !navigator.geolocation) {\n return null;\n }\n\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const { latitude, longitude, accuracy } = position.coords;\n\n // Validate coordinates\n if (latitude < -90 || latitude > 90) {\n resolve(null);\n return;\n }\n if (longitude < -180 || longitude > 180) {\n resolve(null);\n return;\n }\n if (accuracy !== null && accuracy !== undefined && accuracy <= 0) {\n resolve(null);\n return;\n }\n\n resolve({\n latitude,\n longitude,\n accuracy,\n altitude: position.coords.altitude ?? undefined,\n altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n heading: position.coords.heading ?? undefined,\n speed: position.coords.speed ?? undefined,\n timestamp: position.timestamp,\n });\n },\n () => {\n // Location denied or error - resolve with null (non-fatal)\n resolve(null);\n },\n {\n enableHighAccuracy: highAccuracy,\n timeout: timeout,\n maximumAge: 0,\n }\n );\n });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n const browserInfo = getBrowserInfo();\n const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n return {\n device_id: getOrCreateDeviceId(),\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n browser: browserInfo.browser,\n browser_version: browserInfo.browser_version,\n os: browserInfo.os,\n os_version: browserInfo.os_version,\n screen_resolution:\n typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n hardware_concurrency:\n typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n touch_support:\n typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n webgl_vendor: webglInfo?.vendor,\n webgl_renderer: webglInfo?.renderer,\n };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n const json = JSON.stringify(payload);\n\n if (typeof btoa !== 'undefined') {\n // Browser\n return btoa(unescape(encodeURIComponent(json)));\n } else if (typeof Buffer !== 'undefined') {\n // Node.js\n return Buffer.from(json, 'utf-8').toString('base64');\n }\n\n throw new VesantError('No base64 encoding method available', 'BASE64_UNAVAILABLE');\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n * reason: 'registration',\n * requestLocation: true,\n * locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n * console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(\n options: CipherTextOptions,\n config?: GeolocationConfigResponse\n): Promise<CipherTextResult> {\n const warnings: string[] = [];\n\n // Auto-enable GPS if tenant config requires it for this event type\n let requestLocation = options.requestLocation ?? false;\n let gpsRequiredByConfig = false;\n if (config?.require_gps) {\n const reason = options.reason;\n if (\n (reason === 'login' && config.require_gps.login) ||\n (reason === 'registration' && config.require_gps.registration) ||\n (reason === 'transaction' && config.require_gps.transaction)\n ) {\n if (!requestLocation) {\n gpsRequiredByConfig = true;\n }\n requestLocation = true;\n }\n }\n\n // Collect device data\n const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n // Optionally request GPS location\n let locationData: CipherTextPayload['location'] | undefined;\n if (requestLocation) {\n const location = await requestGPSLocation(\n options.locationTimeout || 10000,\n options.highAccuracy !== false\n );\n\n if (location) {\n locationData = location;\n } else if (gpsRequiredByConfig) {\n throw new VesantError(\n `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`,\n 'GPS_REQUIRED'\n );\n } else {\n warnings.push('GPS location not available or permission denied');\n }\n }\n\n // Collect network info\n let networkData: CipherTextPayload['network'] | undefined;\n if (options.includeNetworkInfo !== false) {\n networkData = getNetworkInfo();\n }\n\n // Build payload\n const now = new Date();\n const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n const payload: CipherTextPayload = {\n device: deviceData,\n location: locationData,\n network: networkData,\n metadata: {\n collected_at: now.toISOString(),\n sdk_version: SDK_VERSION,\n collection_reason: options.reason,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n },\n };\n\n // Encode payload (no obfuscation - HTTPS provides transport security)\n const encoded = encodePayload(payload);\n\n // Create final cipherText with version and timestamp prefix\n const timestamp = now.getTime().toString(36); // Base36 timestamp\n\n let cipherText: string;\n const hmacKey = options.signingKey || options.apiKey;\n if (hmacKey) {\n // v02: HMAC-signed — format: 02.{timestamp}.{base64}.{hmac}\n const message = `02.${timestamp}.${encoded}`;\n const hmac = await computeHMAC(hmacKey, message);\n cipherText = `${message}.${hmac}`;\n } else {\n // v01: unsigned (backwards compat)\n cipherText = `01.${timestamp}.${encoded}`;\n }\n\n return {\n cipherText,\n locationCaptured: !!locationData,\n warnings: warnings.length > 0 ? warnings : undefined,\n generatedAt: now.toISOString(),\n expiresAt: expiry.toISOString(),\n };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n try {\n const parts = cipherText.split('.');\n // v01: 3 parts, v02: 4 parts (4th is HMAC — ignored when decoding)\n if (parts.length !== 3 && parts.length !== 4) return null;\n\n const [version, , encodedB64] = parts;\n if (version !== '01' && version !== '02') return null;\n\n // Decode matches encode: just base64 decode (no obfuscation)\n const json = decodeURIComponent(escape(atob(encodedB64)));\n\n return JSON.parse(json) as CipherTextPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n try {\n const parts = cipherText.split('.');\n if (parts.length !== 3 && parts.length !== 4) return true;\n\n const timestampB36 = parts[1];\n const timestamp = parseInt(timestampB36, 36);\n const now = Date.now();\n const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n return now - timestamp > expiryMs;\n } catch {\n return true;\n }\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason, GeolocationConfigResponse };\n","/**\n * React Hooks for Vesant Geolocation SDK\n *\n * Provides convenient React hooks for using the geolocation service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GeolocationClient } from './client';\nimport { generateCipherText } from './ciphertext';\nimport { getBrowserInfo as getBrowserInfoShared, generateDeviceId } from '../shared/browser-utils';\nimport type {\n LocationVerification,\n VerifyIPRequest,\n ComplianceCheckResponse,\n PaginationParams,\n UseGeolocationOptions,\n UseGeolocationResult,\n DeviceFingerprintRequest,\n CipherTextOptions,\n CipherTextResult,\n GeolocationConfigResponse,\n // Location Request Types\n LocationRequest,\n LocationRequestFilters,\n CreateLocationRequestRequest,\n LocationRequestResult,\n LocationRequestStatus,\n LocationShareInfo,\n LocationCaptureRequest,\n LocationCaptureResponse,\n UseLocationRequestsOptions,\n UseLocationRequestsResult,\n UseLocationCaptureOptions,\n UseLocationCaptureResult,\n} from './types';\n\n// ============================================================================\n// useGeolocation Hook\n// ============================================================================\n\n/**\n * React hook for IP verification and compliance checking\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Geolocation verification state and methods\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { verification, loading, error, verifyIP } = useGeolocation(client, {\n * autoVerify: true,\n * eventType: \"login\",\n * includeDeviceFingerprint: true\n * });\n *\n * useEffect(() => {\n * if (verification?.is_blocked) {\n * alert(\"Access blocked: \" + verification.risk_reasons.join(\", \"));\n * }\n * }, [verification]);\n *\n * return <div>Risk Level: {verification?.risk_level}</div>;\n * }\n * ```\n */\nexport function useGeolocation(\n client: GeolocationClient,\n options: UseGeolocationOptions = {}\n): UseGeolocationResult {\n const [verification, setVerification] = useState<LocationVerification | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyIP = useCallback(\n async (request: VerifyIPRequest): Promise<LocationVerification> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyIP(request);\n setVerification(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Verification failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const checkCompliance = useCallback(\n async (countryISO: string): Promise<ComplianceCheckResponse> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.checkCompliance(countryISO);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Compliance check failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n if (verification) {\n await verifyIP({\n ip_address: verification.ip_address,\n user_id: optionsRef.current.userId || '',\n event_type: optionsRef.current.eventType || 'api_access',\n });\n }\n }, [verification, verifyIP]);\n\n // Auto-verify on mount if enabled\n useEffect(() => {\n if (optionsRef.current.autoVerify) {\n // Try to get user's IP from a service or use placeholder\n const detectAndVerify = async () => {\n try {\n // In production, you'd use a service like ipify.org or get from server\n const ipResponse = await fetch('https://api.ipify.org?format=json');\n const { ip } = await ipResponse.json();\n\n let deviceFingerprint: DeviceFingerprintRequest | undefined;\n\n if (optionsRef.current.includeDeviceFingerprint && typeof window !== 'undefined') {\n const deviceId = generateDeviceId();\n deviceFingerprint = {\n device_id: deviceId,\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n };\n }\n\n await verifyIP({\n ip_address: ip,\n user_id: optionsRef.current.userId || '',\n event_type: optionsRef.current.eventType || 'page_view',\n device_fingerprint: deviceFingerprint,\n });\n } catch (err) {\n console.error('[Vesant SDK] Auto-verification failed:', err instanceof Error ? err.message : 'Unknown error');\n }\n };\n\n detectAndVerify();\n }\n }, [verifyIP]);\n\n return {\n verification,\n loading,\n error,\n verifyIP,\n checkCompliance,\n refresh,\n };\n}\n\n// ============================================================================\n// Helper Functions (re-export shared utils for backwards compatibility)\n// ============================================================================\n\nexport { getBrowserInfoShared as getBrowserInfo };\n\n/**\n * Create a complete device fingerprint for the current browser.\n * Returns safe defaults when running server-side.\n */\nexport function createDeviceFingerprint(): DeviceFingerprintRequest {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return {\n device_id: generateDeviceId(),\n user_agent: '',\n platform: '',\n };\n }\n\n const browserInfo = getBrowserInfoShared();\n const deviceId = generateDeviceId();\n\n return {\n device_id: deviceId,\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n ...browserInfo,\n };\n}\n\n// ============================================================================\n// useCipherText Hook\n// ============================================================================\n\n/**\n * React hook for generating cipherText\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const { generate, configLoading, configError } = useCipherText(geoClient);\n *\n * const handleLogin = async () => {\n * const result = await generate({ reason: 'login' });\n * if (result) {\n * await loginMutation({ email, password, cipherText: result.cipherText });\n * }\n * };\n * }\n * ```\n */\nexport function useCipherText(client?: GeolocationClient): {\n generate: (options: CipherTextOptions) => Promise<CipherTextResult | null>;\n configLoading: boolean;\n configError: Error | null;\n} {\n const [configLoading, setConfigLoading] = useState<boolean>(!!client);\n const [configError, setConfigError] = useState<Error | null>(null);\n const configRef = useRef<GeolocationConfigResponse | undefined>(undefined);\n const configPromiseRef = useRef<Promise<GeolocationConfigResponse> | null>(null);\n\n // Fetch GPS config once on mount if client is provided\n useEffect(() => {\n if (!client) return;\n\n let cancelled = false;\n setConfigLoading(true);\n\n const promise = client.getGPSConfig();\n configPromiseRef.current = promise;\n\n promise.then((cfg: GeolocationConfigResponse) => {\n if (!cancelled) {\n configRef.current = cfg;\n setConfigLoading(false);\n }\n }).catch((err: Error) => {\n if (!cancelled) {\n setConfigError(err);\n setConfigLoading(false);\n }\n });\n\n return () => { cancelled = true; };\n }, [client]);\n\n const generate = useCallback(\n async (options: CipherTextOptions): Promise<CipherTextResult | null> => {\n try {\n // Ensure config is loaded before generating (avoids race condition)\n if (configPromiseRef.current) {\n try {\n const cfg = await configPromiseRef.current;\n configRef.current = cfg;\n } catch {\n // Config fetch error already tracked in configError state\n }\n }\n return await generateCipherText(options, configRef.current);\n } catch (error) {\n console.error('[Vesant SDK] Failed to generate cipherText:', error instanceof Error ? error.message : 'Unknown error');\n return null;\n }\n },\n []\n );\n\n return { generate, configLoading, configError };\n}\n\n// ============================================================================\n// useLocationRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing location requests (admin/compliance officer)\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Location request state and management methods\n */\nexport function useLocationRequests(\n client: GeolocationClient,\n options: UseLocationRequestsOptions = {}\n): UseLocationRequestsResult {\n const [requests, setRequests] = useState<LocationRequest[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const pollIntervalRef = useRef<ReturnType<typeof setInterval>>();\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const fetchRequests = useCallback(\n async (filters?: LocationRequestFilters, pagination?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listLocationRequests(\n filters || optionsRef.current.filters,\n pagination || optionsRef.current.pagination\n );\n setRequests(result.requests);\n setTotal(result.total);\n setPage(result.page);\n setTotalPages(result.total_pages);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch location requests');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const createRequest = useCallback(\n async (request: CreateLocationRequestRequest): Promise<LocationRequestResult> => {\n setError(null);\n\n try {\n const result = await client.createLocationRequest(request);\n // Add to local state\n setRequests((prev) => [result.request, ...prev]);\n setTotal((prev) => prev + 1);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const getRequest = useCallback(\n async (requestId: string): Promise<LocationRequest> => {\n try {\n return await client.getLocationRequest(requestId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const cancelRequest = useCallback(\n async (requestId: string): Promise<void> => {\n try {\n await client.cancelLocationRequest(requestId);\n // Update local state\n setRequests((prev) =>\n prev.map((req) =>\n req.id === requestId ? { ...req, status: 'cancelled' as LocationRequestStatus } : req\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to cancel location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const resendRequest = useCallback(\n async (requestId: string, contact: { email?: string; phone?: string }): Promise<void> => {\n try {\n await client.resendLocationRequest(requestId, contact);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to resend location request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchRequests();\n }, [fetchRequests]);\n\n // Auto-fetch on mount if enabled\n useEffect(() => {\n if (optionsRef.current.autoFetch) {\n fetchRequests();\n }\n }, [fetchRequests]);\n\n // Set up polling if enabled\n useEffect(() => {\n const pollInterval = optionsRef.current.pollInterval;\n if (pollInterval && pollInterval > 0) {\n pollIntervalRef.current = setInterval(() => {\n fetchRequests();\n }, pollInterval);\n\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n }\n };\n }\n return undefined;\n }, [fetchRequests]);\n\n return {\n requests,\n total,\n page,\n totalPages,\n loading,\n error,\n fetchRequests,\n createRequest,\n getRequest,\n cancelRequest,\n resendRequest,\n refresh,\n };\n}\n\n// ============================================================================\n// useLocationCapture Hook (Customer-facing)\n// ============================================================================\n\n/**\n * React hook for location capture (customer-facing)\n *\n * Use this hook in the customer's browser to capture and submit their location.\n * The token is obtained from the share link sent via SMS/email.\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options with token\n * @returns Location capture state and methods\n */\nexport function useLocationCapture(\n client: GeolocationClient,\n options: UseLocationCaptureOptions\n): UseLocationCaptureResult {\n const [shareInfo, setShareInfo] = useState<LocationShareInfo | null>(null);\n const [captureResponse, setCaptureResponse] = useState<LocationCaptureResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const isExpired = shareInfo?.is_expired ?? false;\n const isCompleted = shareInfo?.is_completed ?? false;\n\n const fetchShareInfo = useCallback(async (): Promise<LocationShareInfo> => {\n setLoading(true);\n setError(null);\n\n try {\n const info = await client.getLocationShareInfo(options.token);\n setShareInfo(info);\n return info;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch share info');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client, options.token]);\n\n const submitLocation = useCallback(\n async (capture: LocationCaptureRequest): Promise<LocationCaptureResponse> => {\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await client.captureLocation(options.token, capture);\n setCaptureResponse(response);\n\n // Update share info to reflect completion\n if (response.success) {\n setShareInfo((prev) =>\n prev ? { ...prev, is_completed: true, status: 'completed' } : prev\n );\n }\n\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to submit location');\n setError(error);\n throw error;\n } finally {\n setSubmitting(false);\n }\n },\n [client, options.token]\n );\n\n const captureAndSubmitGPS = useCallback(async (): Promise<LocationCaptureResponse> => {\n setSubmitting(true);\n setError(null);\n\n try {\n // Build device info (always available, regardless of GPS)\n const deviceInfo =\n typeof navigator !== 'undefined'\n ? {\n platform: navigator.platform,\n ...getBrowserInfoShared(),\n }\n : undefined;\n const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : undefined;\n\n // Try to get GPS position\n let position: GeolocationPosition | null = null;\n let gpsError: Error | null = null;\n\n try {\n position = await new Promise<GeolocationPosition>((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('Geolocation is not supported by this browser'));\n return;\n }\n\n navigator.geolocation.getCurrentPosition(resolve, reject, {\n enableHighAccuracy: true,\n timeout: 30000,\n maximumAge: 0,\n });\n });\n } catch (err) {\n // Capture the GPS error but don't throw yet — we'll fall back to IP-based capture\n if (err instanceof GeolocationPositionError) {\n switch (err.code) {\n case err.PERMISSION_DENIED:\n gpsError = new Error('Location permission denied. Submitting with IP-based location.');\n break;\n case err.POSITION_UNAVAILABLE:\n gpsError = new Error('GPS unavailable. Submitting with IP-based location.');\n break;\n case err.TIMEOUT:\n gpsError = new Error('GPS timed out. Submitting with IP-based location.');\n break;\n default:\n gpsError = new Error('GPS failed. Submitting with IP-based location.');\n }\n } else {\n gpsError = err instanceof Error ? err : new Error('GPS failed. Submitting with IP-based location.');\n }\n }\n\n // Build capture request\n const capture: LocationCaptureRequest = {\n user_agent: userAgent,\n device_info: deviceInfo,\n };\n\n // Add GPS coordinates if available and valid\n if (position) {\n const { latitude, longitude, accuracy } = position.coords;\n if (latitude >= -90 && latitude <= 90 && longitude >= -180 && longitude <= 180) {\n capture.latitude = latitude;\n capture.longitude = longitude;\n if (accuracy !== null && accuracy !== undefined && accuracy > 0) {\n capture.accuracy = accuracy;\n }\n }\n }\n\n // If GPS failed, set a non-fatal warning so the UI can show it\n if (gpsError) {\n setError(gpsError);\n }\n\n // Always submit — server handles GPS/WiFi/IP fallback chain\n return await submitLocation(capture);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to capture location');\n setError(error);\n throw error;\n } finally {\n setSubmitting(false);\n }\n }, [submitLocation]);\n\n // Auto-fetch share info on mount if enabled\n useEffect(() => {\n if (options.autoFetch && options.token) {\n fetchShareInfo();\n }\n }, [options.autoFetch, options.token, fetchShareInfo]);\n\n // Auto-request GPS if enabled and share info is loaded\n useEffect(() => {\n if (options.autoRequestGPS && shareInfo && !isExpired && !isCompleted) {\n captureAndSubmitGPS().catch(() => {\n // Error is already set in state, just catch to prevent unhandled rejection\n });\n }\n }, [options.autoRequestGPS, shareInfo, isExpired, isCompleted, captureAndSubmitGPS]);\n\n return {\n shareInfo,\n captureResponse,\n loading,\n submitting,\n error,\n isExpired,\n isCompleted,\n fetchShareInfo,\n submitLocation,\n captureAndSubmitGPS,\n };\n}\n","/**\n * React hooks for compliance verification workflows\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ComplianceClient } from './client';\nimport type {\n RegistrationVerificationRequest,\n RegistrationVerificationResponse,\n LoginVerificationRequest,\n LoginVerificationResponse,\n TransactionVerificationRequest,\n TransactionVerificationResponse,\n} from './types';\n\n// ============================================================================\n// useRegistration Hook\n// ============================================================================\n\nexport interface UseRegistrationOptions {\n onSuccess?: (result: RegistrationVerificationResponse) => void;\n onBlocked?: (result: RegistrationVerificationResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseRegistrationResult {\n verification: RegistrationVerificationResponse | null;\n loading: boolean;\n error: Error | null;\n verifyRegistration: (request: RegistrationVerificationRequest) => Promise<RegistrationVerificationResponse>;\n}\n\n/**\n * Hook for registration verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n *\n * @example\n * ```typescript\n * const { verifyRegistration, loading, error } = useRegistration(sdk, {\n * onSuccess: (result) => {\n * console.log('Registration approved!', result.profile);\n * navigate('/dashboard');\n * },\n * onBlocked: (result) => {\n * alert(`Registration blocked: ${result.blockReasons.join(', ')}`);\n * }\n * });\n *\n * const handleSubmit = async (formData) => {\n * await verifyRegistration({\n * customerId: formData.customerId,\n * fullName: formData.fullName,\n * emailAddress: formData.email,\n * ipAddress: await getClientIP(),\n * deviceFingerprint: getDeviceFingerprint()\n * });\n * };\n * ```\n */\nexport function useRegistration(\n client: ComplianceClient,\n options: UseRegistrationOptions = {}\n): UseRegistrationResult {\n const [verification, setVerification] = useState<RegistrationVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyRegistration = useCallback(\n async (request: RegistrationVerificationRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyAtRegistration(request);\n setVerification(result);\n\n if (result.allowed && optionsRef.current.onSuccess) {\n optionsRef.current.onSuccess(result);\n }\n\n if (!result.allowed && optionsRef.current.onBlocked) {\n optionsRef.current.onBlocked(result);\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Registration verification failed');\n setError(error);\n\n if (optionsRef.current.onError) {\n optionsRef.current.onError(error);\n }\n\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n verification,\n loading,\n error,\n verifyRegistration,\n };\n}\n\n// ============================================================================\n// useLoginVerification Hook\n// ============================================================================\n\nexport interface UseLoginVerificationOptions {\n onSuccess?: (result: LoginVerificationResponse) => void;\n onBlocked?: (result: LoginVerificationResponse) => void;\n onStepUpRequired?: (result: LoginVerificationResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseLoginVerificationResult {\n verification: LoginVerificationResponse | null;\n loading: boolean;\n error: Error | null;\n verifyLogin: (request: LoginVerificationRequest) => Promise<LoginVerificationResponse>;\n}\n\n/**\n * Hook for login verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n */\nexport function useLoginVerification(\n client: ComplianceClient,\n options: UseLoginVerificationOptions = {}\n): UseLoginVerificationResult {\n const [verification, setVerification] = useState<LoginVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyLogin = useCallback(\n async (request: LoginVerificationRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyAtLogin(request);\n setVerification(result);\n\n if (result.allowed) {\n if (result.requiresStepUp && optionsRef.current.onStepUpRequired) {\n optionsRef.current.onStepUpRequired(result);\n } else if (optionsRef.current.onSuccess) {\n optionsRef.current.onSuccess(result);\n }\n } else if (optionsRef.current.onBlocked) {\n optionsRef.current.onBlocked(result);\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Login verification failed');\n setError(error);\n\n if (optionsRef.current.onError) {\n optionsRef.current.onError(error);\n }\n\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n verification,\n loading,\n error,\n verifyLogin,\n };\n}\n\n// ============================================================================\n// useTransactionVerification Hook\n// ============================================================================\n\nexport interface UseTransactionVerificationOptions {\n onSuccess?: (result: TransactionVerificationResponse) => void;\n onBlocked?: (result: TransactionVerificationResponse) => void;\n onApprovalRequired?: (result: TransactionVerificationResponse) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseTransactionVerificationResult {\n verification: TransactionVerificationResponse | null;\n loading: boolean;\n error: Error | null;\n verifyTransaction: (request: TransactionVerificationRequest) => Promise<TransactionVerificationResponse>;\n}\n\n/**\n * Hook for transaction verification workflow\n *\n * @param client - ComplianceClient instance\n * @param options - Hook options with callbacks\n *\n * @example\n * ```typescript\n * const { verifyTransaction, loading } = useTransactionVerification(sdk, {\n * onSuccess: (result) => {\n * processTransaction(result);\n * },\n * onApprovalRequired: (result) => {\n * queueForReview(result);\n * },\n * onBlocked: (result) => {\n * alert(`Transaction blocked: ${result.blockReasons.join(', ')}`);\n * }\n * });\n * ```\n */\nexport function useTransactionVerification(\n client: ComplianceClient,\n options: UseTransactionVerificationOptions = {}\n): UseTransactionVerificationResult {\n const [verification, setVerification] = useState<TransactionVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const verifyTransaction = useCallback(\n async (request: TransactionVerificationRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyAtTransaction(request);\n setVerification(result);\n\n if (result.allowed && optionsRef.current.onSuccess) {\n optionsRef.current.onSuccess(result);\n } else if (result.requiresApproval && optionsRef.current.onApprovalRequired) {\n optionsRef.current.onApprovalRequired(result);\n } else if (!result.allowed && optionsRef.current.onBlocked) {\n optionsRef.current.onBlocked(result);\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Transaction verification failed');\n setError(error);\n\n if (optionsRef.current.onError) {\n optionsRef.current.onError(error);\n }\n\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n verification,\n loading,\n error,\n verifyTransaction,\n };\n}\n","/**\n * React hooks for customer risk profile management\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { VesantError } from '../core/errors';\nimport type { RiskProfileClient } from './client';\nimport type { CustomerProfile } from './types';\n\n// ============================================================================\n// useCustomerProfile Hook\n// ============================================================================\n\nexport interface UseCustomerProfileOptions {\n autoFetch?: boolean;\n}\n\nexport interface UseCustomerProfileResult {\n profile: CustomerProfile | null;\n loading: boolean;\n error: Error | null;\n fetchProfile: () => Promise<CustomerProfile>;\n updateProfile: (updates: Partial<CustomerProfile>) => Promise<CustomerProfile>;\n refresh: () => Promise<CustomerProfile>;\n}\n\n/**\n * Hook for managing customer risk profiles\n *\n * @param client - RiskProfileClient instance\n * @param customerId - Customer ID to fetch profile for\n * @param options - Hook options\n *\n * @example\n * ```typescript\n * const { profile, loading, error, updateProfile } = useCustomerProfile(\n * riskClient,\n * 'CUST-12345',\n * { autoFetch: true }\n * );\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n * if (!profile) return <NotFound />;\n *\n * return (\n * <div>\n * <h1>{profile.full_name}</h1>\n * <RiskScore score={profile.risk_score} category={profile.risk_category} />\n * </div>\n * );\n * ```\n */\nexport function useCustomerProfile(\n client: RiskProfileClient,\n customerId: string,\n options: UseCustomerProfileOptions = {}\n): UseCustomerProfileResult {\n const [profile, setProfile] = useState<CustomerProfile | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchProfile = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getProfile(customerId);\n setProfile(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch profile');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client, customerId]);\n\n const profileRef = useRef(profile);\n profileRef.current = profile;\n\n const updateProfile = useCallback(\n async (updates: Partial<CustomerProfile>) => {\n if (!profileRef.current) throw new VesantError('Profile not loaded', 'PROFILE_NOT_LOADED');\n\n setLoading(true);\n setError(null);\n\n try {\n const updated = await client.updateProfile(profileRef.current.id, updates);\n setProfile(updated);\n return updated;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update profile');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n useEffect(() => {\n if (options.autoFetch && customerId) {\n fetchProfile();\n }\n }, [options.autoFetch, customerId, fetchProfile]);\n\n return {\n profile,\n loading,\n error,\n fetchProfile,\n updateProfile,\n refresh: fetchProfile,\n };\n}\n\n","export const Camera = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPCEtLSBVcGxvYWRlZCB0bzogU1ZHIFJlcG8sIHd3dy5zdmdyZXBvLmNvbSwgR2VuZXJhdG9yOiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4NCjxzdmcgdmVyc2lvbj0iMS4wIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgDQoJIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDY0IDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA2NCA2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBmaWxsPSIjMjMxRjIwIiBkPSJNNjAsMTBINDkuNjU2bC02LjgyOC02LjgyOEM0Mi4wNzgsMi40MjIsNDEuMDYyLDIsNDAsMkgyNGMtMS4wNjIsMC0yLjA3OCwwLjQyMi0yLjgyOCwxLjE3MkwxNC4zNDQsMTBINA0KCQljLTIuMjExLDAtNCwxLjc4OS00LDR2NDRjMCwyLjIxMSwxLjc4OSw0LDQsNGg1NmMyLjIxMSwwLDQtMS43ODksNC00VjE0QzY0LDExLjc4OSw2Mi4yMTEsMTAsNjAsMTB6IE0zMiw1MA0KCQljLTguODM2LDAtMTYtNy4xNjQtMTYtMTZzNy4xNjQtMTYsMTYtMTZzMTYsNy4xNjQsMTYsMTZTNDAuODM2LDUwLDMyLDUweiIvPg0KCTxjaXJjbGUgZmlsbD0iIzIzMUYyMCIgY3g9IjMyIiBjeT0iMzQiIHI9IjgiLz4NCjwvZz4NCjwvc3ZnPg==\"\nexport const Done=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik04LjUgMTIuNUwxMC41IDE0LjVMMTUuNSA5LjUiIHN0cm9rZT0iIzFDMjc0QyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTcgMy4zMzc4MkM4LjQ3MDg3IDIuNDg2OTcgMTAuMTc4NiAyIDEyIDJDMTcuNTIyOCAyIDIyIDYuNDc3MTUgMjIgMTJDMjIgMTcuNTIyOCAxNy41MjI4IDIyIDEyIDIyQzYuNDc3MTUgMjIgMiAxNy41MjI4IDIgMTJDMiAxMC4xNzg2IDIuNDg2OTcgOC40NzA4NyAzLjMzNzgyIDciIHN0cm9rZT0iIzFDMjc0QyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPg0KPC9zdmc+\"\nexport const Close = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xNC41IDkuNTAwMDJMOS41IDE0LjVNOS40OTk5OCA5LjVMMTQuNSAxNC41IiBzdHJva2U9IiMxQzI3NEMiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCjxwYXRoIGQ9Ik03IDMuMzM3ODJDOC40NzA4NyAyLjQ4Njk3IDEwLjE3ODYgMiAxMiAyQzE3LjUyMjggMiAyMiA2LjQ3NzE1IDIyIDEyQzIyIDE3LjUyMjggMTcuNTIyOCAyMiAxMiAyMkM2LjQ3NzE1IDIyIDIgMTcuNTIyOCAyIDEyQzIgMTAuMTc4NiAyLjQ4Njk3IDguNDcwODcgMy4zMzc4MiA3IiBzdHJva2U9IiMxQzI3NEMiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCjwvc3ZnPg==\"\nexport const Upload=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xNyAxN0gxNy4wMU0xNS42IDE0SDE4QzE4LjkzMTkgMTQgMTkuMzk3OCAxNCAxOS43NjU0IDE0LjE1MjJDMjAuMjU1NCAxNC4zNTUyIDIwLjY0NDggMTQuNzQ0NiAyMC44NDc4IDE1LjIzNDZDMjEgMTUuNjAyMiAyMSAxNi4wNjgxIDIxIDE3QzIxIDE3LjkzMTkgMjEgMTguMzk3OCAyMC44NDc4IDE4Ljc2NTRDMjAuNjQ0OCAxOS4yNTU0IDIwLjI1NTQgMTkuNjQ0OCAxOS43NjU0IDE5Ljg0NzhDMTkuMzk3OCAyMCAxOC45MzE5IDIwIDE4IDIwSDZDNS4wNjgxMiAyMCA0LjYwMjE4IDIwIDQuMjM0NjMgMTkuODQ3OEMzLjc0NDU4IDE5LjY0NDggMy4zNTUyMyAxOS4yNTU0IDMuMTUyMjQgMTguNzY1NEMzIDE4LjM5NzggMyAxNy45MzE5IDMgMTdDMyAxNi4wNjgxIDMgMTUuNjAyMiAzLjE1MjI0IDE1LjIzNDZDMy4zNTUyMyAxNC43NDQ2IDMuNzQ0NTggMTQuMzU1MiA0LjIzNDYzIDE0LjE1MjJDNC42MDIxOCAxNCA1LjA2ODEyIDE0IDYgMTRIOC40TTEyIDE1VjRNMTIgNEwxNSA3TTEyIDRMOSA3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8L3N2Zz4=\"","import React, { useEffect, useRef, useState } from \"react\"\nimport { KycClient } from \"./client\"\nimport type {\n CreateReuseKycSessionResponse,\n ReuseKycCallback,\n} from \"./types\"\nimport { Camera, Close, Done, Upload } from \"./images\"\n\nexport interface FaceCaptureModalProps {\n client: KycClient\n session: CreateReuseKycSessionResponse\n onComplete: (result: ReuseKycCallback | null) => void\n\n /**\n * Initial UX. `'ask'` shows the device picker (default on desktop).\n * `'this'` skips straight to capture (default on mobile). `'mobile'`\n * skips straight to QR.\n */\n defaultDevice?: \"ask\" | \"this\" | \"mobile\"\n\n /**\n * Override the default QR renderer. Receives the payload string and\n * returns a React node to render inside the QR slot. Default uses a\n * public QR rendering service (api.qrserver.com).\n */\n renderQR?: (payload: string) => React.ReactNode\n}\n\ntype Stage =\n | { kind: \"choose\" }\n | { kind: \"qr\"; mobileConnected: boolean }\n | { kind: \"capture\"; declinedReason?: string }\n | { kind: \"submitting\" }\n | { kind: \"accepted\"; result: ReuseKycCallback }\n | { kind: \"declined\"; result: ReuseKycCallback }\n | { kind: \"max_attempts\"; result: ReuseKycCallback }\n | { kind: \"error\"; message: string }\n\n// The capture stage has three sub-modes: an idle landing screen with\n// instructions and an \"Open Camera\" CTA, the live camera view itself\n// (front camera via getUserMedia), and a preview where the user confirms\n// or retakes before submitting. Submission only fires from the preview\n// step so the user always reviews the selfie first — matching the\n// cgs-frontend ReuseKycSubmitForm flow.\ntype CaptureMode = \"idle\" | \"live\" | \"preview\"\n\nconst MOBILE_UA = /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i\n\n// Instructional hints rotated above the camera preview. The SDK does no\n// real face detection, so these stay purely advisory (always-true tips) —\n// no \"Processing liveness…\" message that would imply detection is running.\nconst LIVENESS_MESSAGES = [\n \"Position your face inside the circle\",\n \"Make sure your face is well lit\",\n \"Remove glasses or hats if possible\",\n \"Look straight at the camera, then tap Capture\",\n]\n\nfunction headerSubtitle(stageKind: Stage[\"kind\"]): string {\n switch (stageKind) {\n case \"qr\": return \"Use your phone to continue\"\n case \"accepted\": return \"All set\"\n case \"declined\": return \"Verification didn't match, try once more\"\n case \"max_attempts\": return \"We couldn't verify you\"\n default: return \"Please capture a clear photo of your face\"\n }\n}\n\nfunction defaultRenderQR(payload: string): React.ReactNode {\n // Free public QR service — no key required. Consumers can override\n // via the `renderQR` prop to use a self-hosted renderer.\n const url = `https://api.qrserver.com/v1/create-qr-code/?size=220x220&data=${encodeURIComponent(payload)}`\n return <img src={url} alt=\"QR code\" width={220} height={220} />\n}\n\nfunction FaceCaptureModal({\n client,\n session,\n onComplete,\n defaultDevice,\n renderQR,\n}: Readonly<FaceCaptureModalProps>): React.ReactElement {\n const isMobile = typeof navigator !== \"undefined\" && MOBILE_UA.test(navigator.userAgent)\n const initialStage: Stage = (() => {\n const choice = defaultDevice ?? (isMobile ? \"this\" : \"ask\")\n if (choice === \"this\") return { kind: \"capture\" }\n if (choice === \"mobile\") return { kind: \"qr\", mobileConnected: false }\n return { kind: \"choose\" }\n })()\n\n const [stage, setStage] = useState<Stage>(initialStage)\n const [attempts, setAttempts] = useState<number>(session.attempts)\n const maxAttempts = session.max_attempts || 1\n // Last declined reason observed while the user is still retrying on\n // mobile during the QR-handoff stage. Surfaced inline on the QR view so\n // the desktop watcher knows what happened without forcing the desktop\n // out of the handoff flow.\n const [qrDeclinedReason, setQrDeclinedReason] = useState<string | null>(null)\n // Capture sub-state. `idle` shows instructions + Open Camera; `live`\n // shows the in-modal getUserMedia preview; `preview` shows the captured\n // selfie with Submit / Retake — submission only fires from preview.\n const [captureMode, setCaptureMode] = useState<CaptureMode>(\"idle\")\n const [capturedPreview, setCapturedPreview] = useState<string | null>(null)\n const [capturedBase64, setCapturedBase64] = useState<string | null>(null)\n // Rotating placeholder hints shown above the camera preview while the\n // user is composing the selfie. Pure UX — no real liveness detection.\n const [livenessMessage, setLivenessMessage] = useState<string>(LIVENESS_MESSAGES[0])\n\n // Use the server-provided handoff URL as the QR payload. The kyc-service\n // builds it from BASE_URL_FRONTEND so it always points at a known-working\n // page (cgs-frontend's /reuse-kyc-submit). Fall back to the legacy\n // vesant:// scheme only when the server didn't populate `link` (env not\n // configured) — consumers should override `renderQR` in that case.\n const qrPayload = session.link || `vesant://reuse-kyc?token=${encodeURIComponent(session.token)}`\n\n const cancelledRef = useRef(false)\n // submittingRef guards against re-entry on `/face/submit`. A single click\n // must produce exactly one Shufti call even if the consumer somehow\n // double-mounts the modal (React StrictMode dev re-runs, double-click\n // handlers, etc.).\n const submittingRef = useRef(false)\n\n // Desktop QR poll — checks mobile_connected, then fetches the final status.\n useEffect(() => {\n if (stage.kind !== \"qr\") return\n let stopped = false\n const intervalMs = 2000\n const deadline = Date.now() + 15 * 60 * 1000 // matches the 15-min Redis TTL\n\n let mobileSeen = stage.mobileConnected\n\n const tick = async () => {\n if (stopped || cancelledRef.current) return\n try {\n if (mobileSeen) {\n const result = await client.getReuseKycSessionStatus(session.reference)\n if (result.status === \"accepted\") {\n setStage({ kind: \"accepted\", result })\n stopped = true\n return\n }\n if (result.status === \"declined\") {\n setAttempts(maxAttempts - (result.data?.retries_remaining ?? 0))\n if (result.data?.retry_limit_exceeded) {\n // Terminal — flip to max_attempts and stop polling.\n setStage({ kind: \"max_attempts\", result })\n stopped = true\n return\n }\n // Non-terminal decline: the user is still retrying on their\n // phone. Stay on the QR view and keep polling — surface the\n // last decline reason inline so the desktop watcher sees\n // what happened without yanking the modal into the capture\n // UI (which would defeat the whole QR handoff).\n if (result.declined_reason) {\n setQrDeclinedReason(result.declined_reason)\n }\n }\n } else {\n const handoff = await client.getHandoffSession(session.token)\n if (handoff.mobile_connected) {\n mobileSeen = true\n setStage({ kind: \"qr\", mobileConnected: true })\n }\n }\n } catch {\n // 404 (session expired in Redis) is fine — try again next tick.\n }\n if (Date.now() < deadline) {\n setTimeout(tick, intervalMs)\n }\n }\n tick()\n return () => {\n stopped = true\n }\n // Intentionally key only on the stage transition into 'qr' /\n // connection flip — `client` and `session` are stable for the modal's\n // lifetime and re-running this effect on them would restart the poll.\n }, [stage.kind, stage.kind === \"qr\" ? stage.mobileConnected : false])\n\n // applyResult routes a server response (synchronous submit response OR a\n // post-timeout poll) into the modal's terminal stage. Returns true when\n // the result was terminal (accepted / declined / max_attempts), false\n // when the server hasn't decided yet so we should keep waiting / error.\n const applyResult = (result: ReuseKycCallback): boolean => {\n if (result.status === \"accepted\") {\n setStage({ kind: \"accepted\", result })\n return true\n }\n if (result.status === \"declined\") {\n const nextAttempts = maxAttempts - (result.data?.retries_remaining ?? 0)\n setAttempts(nextAttempts)\n // Clear the captured preview so the rejected image never leaks\n // back into the next render — the declined screen only shows the\n // reason + Retake button, and any subsequent Retake → live →\n // preview cycle starts with a fresh frame.\n setCapturedPreview(null)\n setCapturedBase64(null)\n if (result.data?.retry_limit_exceeded) {\n setStage({ kind: \"max_attempts\", result })\n } else {\n setStage({ kind: \"declined\", result })\n }\n return true\n }\n return false\n }\n\n // runSubmit fires exactly one POST per capture and races it against a\n // delayed poll of /face/verify/{reference}. Whichever returns a\n // terminal status first wins. See ReuseKycSubmitForm for the same\n // pattern explained in detail.\n const runSubmit = async (proof: string) => {\n if (submittingRef.current) return\n submittingRef.current = true\n setStage({ kind: \"submitting\" })\n\n let settled = false\n const ref = session.reference\n\n // Server attempts count as of right now (the `attempts` state advances\n // after every decline). The recovery poll reads persisted session\n // state via /face/verify, which still holds the PREVIOUS attempt's\n // status while this Shufti call is in flight. Gating the poll on the\n // attempts counter advancing past this baseline guarantees it only\n // resolves with THIS attempt's result — never the stale prior one,\n // which would otherwise burn an extra attempt.\n const baselineAttempts = attempts\n const isFreshPollResult = (r: ReuseKycCallback): boolean => {\n // An \"accepted\" can only be the current attempt: any prior attempt\n // that was accepted would have ended the flow, so we'd never be here.\n if (r.status === \"accepted\") return true\n if (r.status === \"declined\") {\n const derivedAttempts = maxAttempts - (r.data?.retries_remaining ?? 0)\n return derivedAttempts > baselineAttempts\n }\n return false\n }\n\n try {\n const postPromise = (async () => {\n try {\n const data = await client.submitReuseKycSession({\n token: session.token,\n reference: ref,\n proof,\n })\n return { ok: true as const, data }\n } catch (err) {\n return { ok: false as const, error: err }\n }\n })()\n\n const pollPromise = (async (): Promise<ReuseKycCallback | null> => {\n await new Promise((r) => setTimeout(r, 12_000))\n const deadline = Date.now() + 120_000\n while (Date.now() < deadline) {\n if (settled || cancelledRef.current) return null\n try {\n const r = await client.getReuseKycSessionStatus(ref)\n if (isFreshPollResult(r)) return r\n } catch {\n // network blip — keep polling\n }\n if (settled || cancelledRef.current) return null\n await new Promise((r) => setTimeout(r, 3_000))\n }\n return null\n })()\n\n const winner = await Promise.race([\n postPromise.then((r) =>\n r.ok\n ? ({ from: \"post\" as const, data: r.data })\n : ({ from: \"post_err\" as const }),\n ),\n pollPromise.then((data) =>\n data\n ? ({ from: \"poll\" as const, data })\n : ({ from: \"poll_done\" as const }),\n ),\n ])\n settled = true\n\n if (winner.from === \"post\" && applyResult(winner.data)) return\n if (winner.from === \"poll\" && applyResult(winner.data)) return\n\n const [postResult, pollResult] = await Promise.all([postPromise, pollPromise])\n if (postResult.ok && applyResult(postResult.data)) return\n if (pollResult && applyResult(pollResult)) return\n\n const err = postResult.ok ? null : postResult.error\n setStage({\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Submission failed. Please try again.\",\n })\n } finally {\n settled = true\n submittingRef.current = false\n }\n }\n\n // LiveCamera returns a full data URL (data:image/jpeg;base64,…). Stash\n // both forms: the data URL drives the <img> preview tag; the raw\n // base64 is what /face/submit expects. No submission yet — the user\n // reviews on the preview screen first and then clicks Submit.\n const handleCameraCapture = (dataUrl: string) => {\n const raw = dataUrl.split(\",\")[1] ?? \"\"\n setCapturedPreview(dataUrl)\n setCapturedBase64(raw)\n setCaptureMode(\"preview\")\n }\n\n const handleCameraCancel = () => setCaptureMode(\"idle\")\n\n const handleRetake = () => {\n setCapturedPreview(null)\n setCapturedBase64(null)\n setCaptureMode(\"live\")\n }\n\n const handleConfirmSubmit = () => {\n if (!capturedBase64) return\n void runSubmit(capturedBase64)\n }\n\n const handleOpenCamera = () => {\n if (submittingRef.current) return\n setCaptureMode(\"live\")\n }\n\n // Retake from the declined screen — jumps the user straight back into\n // the camera with no stale image or reason hanging around. The\n // explicit setCaptureMode/setStage pair replaces the previous auto-\n // reset effect so the live transition wins.\n const handleRetakeAfterDecline = () => {\n setCapturedPreview(null)\n setCapturedBase64(null)\n setCaptureMode(\"live\")\n setStage({ kind: \"capture\" })\n }\n\n // Simulated liveness-message rotation while the camera is open.\n useEffect(() => {\n if (captureMode !== \"live\") return\n setLivenessMessage(LIVENESS_MESSAGES[0])\n let i = 0\n const interval = setInterval(() => {\n i = (i + 1) % LIVENESS_MESSAGES.length\n setLivenessMessage(LIVENESS_MESSAGES[i])\n }, 3000)\n return () => clearInterval(interval)\n }, [captureMode])\n\n const close = (result: ReuseKycCallback | null) => {\n cancelledRef.current = true\n onComplete(result)\n }\n\n // ──────────────────────────────────────────────────────────────────\n // Stage renderers\n // ──────────────────────────────────────────────────────────────────\n\n const renderChoose = () => (\n <div style={contentStyle}>\n <div style={visualGuideContainerStyle}>\n <div style={visualGuideStyle}>\n <div style={circleStyle}>\n <img src={Camera} alt=\"\" width={48} height={48} />\n </div>\n </div>\n </div>\n <p style={subtitleStyle}>How would you like to verify?</p>\n <div style={buttonsContainerStyle}>\n <button\n style={primaryButtonStyle}\n onClick={() => setStage({ kind: \"capture\" })}\n >\n <img src={isMobile ? Camera : Upload} alt=\"\" width={20} height={20} />\n <span>Continue on this device</span>\n </button>\n <button\n style={secondaryButtonStyle}\n onClick={() => setStage({ kind: \"qr\", mobileConnected: false })}\n >\n Continue on mobile (scan QR)\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n </div>\n )\n\n const renderQRStage = (mobileConnected: boolean) => (\n <div style={contentStyle}>\n <div style={qrBoxStyle}>{(renderQR ?? defaultRenderQR)(qrPayload)}</div>\n <p style={subtitleStyle}>\n {mobileConnected\n ? \"Phone connected. Complete the capture on your mobile device…\"\n : \"Scan this QR with your phone camera, then complete the face capture there.\"}\n </p>\n {mobileConnected && <div style={{ ...spinnerStyle, margin: \"12px auto\" }} />}\n {qrDeclinedReason && (\n <div style={alertBoxStyle}>\n <strong>Last attempt was declined.</strong>\n <p style={alertTextStyle}>{qrDeclinedReason}</p>\n <p style={{ ...alertTextStyle, marginTop: 4 }}>\n Try again on your phone. Attempt {Math.min(attempts + 1, maxAttempts)} of {maxAttempts}.\n </p>\n </div>\n )}\n <div style={buttonsContainerStyle}>\n <button\n style={secondaryButtonStyle}\n onClick={() => setStage({ kind: \"capture\" })}\n >\n Use this device instead\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n </div>\n )\n\n const renderCapture = (declinedReason?: string) => {\n if (captureMode === \"live\") {\n return (\n <div style={contentStyle}>\n <LiveCamera\n onCapture={handleCameraCapture}\n onCancel={handleCameraCancel}\n message={livenessMessage}\n />\n <p style={attemptsTextStyle}>\n Attempt {attempts + 1} of {maxAttempts}\n </p>\n </div>\n )\n }\n\n if (captureMode === \"preview\" && capturedPreview) {\n return (\n <div style={contentStyle}>\n {declinedReason && (\n <div style={alertBoxStyle}>\n <strong>Verification declined.</strong>\n <p style={alertTextStyle}>{declinedReason}</p>\n </div>\n )}\n <p style={subtitleStyle}>Looks good? Submit this selfie or retake it.</p>\n <div style={previewBoxStyle}>\n <img src={capturedPreview} alt=\"Captured selfie preview\" style={previewImgStyle} />\n </div>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={handleConfirmSubmit}>\n <img src={Done} alt=\"\" width={20} height={20} />\n <span>Submit</span>\n </button>\n <button style={secondaryButtonStyle} onClick={handleRetake}>\n Retake\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n <p style={attemptsTextStyle}>\n Attempt {attempts + 1} of {maxAttempts}\n </p>\n </div>\n )\n }\n\n return (\n <div style={contentStyle}>\n <div style={visualGuideContainerStyle}>\n <div style={visualGuideStyle}>\n <div style={circleStyle}>\n <img src={Camera} alt=\"\" width={48} height={48} />\n </div>\n <div style={badgeStyle}>\n <img src={Done} alt=\"\" width={16} height={16} />\n </div>\n </div>\n </div>\n {declinedReason && (\n <div style={alertBoxStyle}>\n <strong>Verification declined.</strong>\n <p style={alertTextStyle}>{declinedReason}</p>\n </div>\n )}\n <div style={instructionsBoxStyle}>\n <h3 style={instructionsTitleStyle}>Tips for best results:</h3>\n <ul style={instructionsListStyle}>\n <li style={instructionItemStyle}><span style={bulletStyle}>•</span><span>Ensure good lighting on your face</span></li>\n <li style={instructionItemStyle}><span style={bulletStyle}>•</span><span>Remove glasses or accessories if possible</span></li>\n <li style={instructionItemStyle}><span style={bulletStyle}>•</span><span>Look directly at the camera</span></li>\n </ul>\n </div>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={handleOpenCamera}>\n <img src={Camera} alt=\"\" width={20} height={20} />\n <span>{declinedReason ? \"Try again\" : \"Open Camera\"}</span>\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n <p style={attemptsTextStyle}>\n Attempt {attempts + 1} of {maxAttempts}\n </p>\n </div>\n )\n }\n\n const renderSubmitting = () => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={{ ...spinnerStyle, margin: \"24px auto\", width: 32, height: 32 }} />\n <p style={subtitleStyle}>Verifying your photo…</p>\n <p style={{ ...attemptsTextStyle, marginTop: 8 }}>This usually takes a few seconds.</p>\n </div>\n )\n\n const renderAccepted = (result: ReuseKycCallback) => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={successCircleStyle}>\n <img src={Done} alt=\"\" width={48} height={48} />\n </div>\n <h3 style={titleStyle}>Verified</h3>\n <p style={subtitleStyle}>Your identity has been confirmed. You can continue.</p>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={() => close(result)}>Continue</button>\n </div>\n </div>\n )\n\n // Dedicated declined screen — shows only the reason + Retake + Cancel.\n // No preview of the rejected image and no Submit button: a Retake\n // here always means \"open the camera fresh\", never \"resubmit the same\n // selfie\", which matches the cgs-frontend DeclinedState pattern.\n const renderDeclined = (result: ReuseKycCallback) => (\n <div style={contentStyle}>\n <div style={alertBoxStyle}>\n <strong>Verification declined.</strong>\n <p style={alertTextStyle}>\n {result.declined_reason ?? \"We couldn't match your selfie. Please take a new one.\"}\n </p>\n </div>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={handleRetakeAfterDecline}>\n <img src={Camera} alt=\"\" width={20} height={20} />\n <span>Retake</span>\n </button>\n <button style={cancelButtonStyle} onClick={() => close(result)}>Cancel</button>\n </div>\n <p style={attemptsTextStyle}>\n Attempt {Math.min(attempts + 1, maxAttempts)} of {maxAttempts}\n </p>\n </div>\n )\n\n const renderMaxAttempts = (result: ReuseKycCallback) => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={errorCircleStyle}>!</div>\n <h3 style={titleStyle}>Maximum attempts reached</h3>\n <p style={subtitleStyle}>\n {result.declined_reason ?? \"We couldn't verify your identity after several attempts.\"}\n </p>\n {result.data?.freeze_account && (\n <p style={alertTextStyle}>\n For your security, your account has been temporarily restricted\n {result.data.freeze_duration_minutes\n ? ` for ${result.data.freeze_duration_minutes} minutes`\n : \"\"}\n . Please contact support if you need immediate help.\n </p>\n )}\n {result.data?.enforce_logout && (\n <p style={alertTextStyle}>You will be signed out of your session.</p>\n )}\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={() => close(result)}>Close</button>\n </div>\n </div>\n )\n\n const renderError = (message: string) => (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\" }}>\n <div style={errorCircleStyle}>!</div>\n <h3 style={titleStyle}>Something went wrong</h3>\n <p style={alertTextStyle}>{message}</p>\n <div style={buttonsContainerStyle}>\n <button style={primaryButtonStyle} onClick={() => setStage({ kind: \"capture\" })}>\n Try again\n </button>\n <button style={cancelButtonStyle} onClick={() => close(null)}>Cancel</button>\n </div>\n </div>\n )\n\n const body = (() => {\n switch (stage.kind) {\n case \"choose\": return renderChoose()\n case \"qr\": return renderQRStage(stage.mobileConnected)\n case \"capture\": return renderCapture(stage.declinedReason)\n case \"submitting\": return renderSubmitting()\n case \"accepted\": return renderAccepted(stage.result)\n case \"declined\": return renderDeclined(stage.result)\n case \"max_attempts\": return renderMaxAttempts(stage.result)\n case \"error\": return renderError(stage.message)\n }\n })()\n\n return (\n <>\n <style>{keyframes}</style>\n <div style={overlayStyle}>\n <div style={modalStyle}>\n <div style={headerStyle}>\n <button\n onClick={() => close(null)}\n style={closeButtonStyle}\n aria-label=\"Close\"\n >\n <img src={Close} alt=\"\" width={16} height={16} />\n </button>\n <h2 style={titleStyle}>Face Verification</h2>\n <p style={subtitleStyle}>{headerSubtitle(stage.kind)}</p>\n </div>\n\n {body}\n\n <div style={footerStyle}>\n <p style={footerTextStyle}>\n Your photo is securely processed and used only for verification.\n </p>\n </div>\n </div>\n </div>\n </>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// Styles (inline)\n// ─────────────────────────────────────────────────────────────────────\n\nconst keyframes = `\n@keyframes fadeIn { from { opacity: 0 } to { opacity: 1 } }\n@keyframes zoomIn { from { transform: scale(.96); opacity: 0 } to { transform: scale(1); opacity: 1 } }\n@keyframes spin { to { transform: rotate(360deg) } }\n@keyframes pulse { 0%, 100% { opacity: 1 } 50% { opacity: .5 } }\n`\n\nconst overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,.6)\",\n backdropFilter: \"blur(4px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 999999,\n padding: 16,\n animation: \"fadeIn .2s ease-out\",\n}\n\nconst modalStyle: React.CSSProperties = {\n background: \"#fff\",\n borderRadius: 16,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,.25)\",\n width: \"100%\",\n maxWidth: 448,\n animation: \"zoomIn .2s ease-out\",\n}\n\nconst headerStyle: React.CSSProperties = {\n position: \"relative\",\n padding: \"24px 24px 16px\",\n borderBottom: \"1px solid #f3f4f6\",\n}\n\nconst closeButtonStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 16,\n right: 16,\n padding: 8,\n background: \"transparent\",\n border: \"none\",\n borderRadius: 8,\n cursor: \"pointer\",\n}\n\nconst titleStyle: React.CSSProperties = { margin: \"0 0 4px\", fontSize: 18, fontWeight: 600, color: \"#111827\" }\nconst subtitleStyle: React.CSSProperties = { margin: 0, fontSize: 14, color: \"#6b7280\" }\n\nconst contentStyle: React.CSSProperties = {\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n}\n\nconst visualGuideContainerStyle: React.CSSProperties = { display: \"flex\", justifyContent: \"center\" }\nconst visualGuideStyle: React.CSSProperties = { position: \"relative\" }\nconst circleStyle: React.CSSProperties = {\n width: 96,\n height: 96,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, rgba(0, 188, 125, 0.2) 0%, rgba(0, 188, 125, 0.05) 100%)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n}\nconst badgeStyle: React.CSSProperties = {\n position: \"absolute\",\n bottom: -4,\n right: -4,\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n background: \"#ffffff\",\n border: \"2px solid #00bc7d\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n}\n\nconst successCircleStyle: React.CSSProperties = {\n ...circleStyle,\n background: \"linear-gradient(135deg, rgba(0, 188, 125, 0.25) 0%, rgba(0, 188, 125, 0.1) 100%)\",\n margin: \"0 auto\",\n}\n\nconst errorCircleStyle: React.CSSProperties = {\n width: 64,\n height: 64,\n borderRadius: \"50%\",\n background: \"#fee2e2\",\n color: \"#b91c1c\",\n fontSize: 32,\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"0 auto\",\n}\n\nconst qrBoxStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"center\",\n padding: 12,\n background: \"linear-gradient(135deg, #f9fafb 0%, rgba(243, 244, 246, 0.5) 100%)\",\n borderRadius: 12,\n}\n\nconst alertBoxStyle: React.CSSProperties = {\n background: \"#fef3c7\",\n border: \"1px solid #fde68a\",\n color: \"#92400e\",\n borderRadius: 8,\n padding: 12,\n fontSize: 14,\n}\nconst alertTextStyle: React.CSSProperties = { margin: \"4px 0 0\", fontSize: 13, color: \"#92400e\" }\n\nconst instructionsBoxStyle: React.CSSProperties = {\n background: \"linear-gradient(135deg, #f9fafb 0%, rgba(243, 244, 246, 0.5) 100%)\",\n borderRadius: 8,\n padding: 16,\n}\nconst instructionsTitleStyle: React.CSSProperties = { margin: \"0 0 8px\", fontSize: 14, fontWeight: 600, color: \"#374151\" }\nconst instructionsListStyle: React.CSSProperties = { margin: 0, padding: 0, listStyle: \"none\" }\nconst instructionItemStyle: React.CSSProperties = { display: \"flex\", gap: 8, fontSize: 13, color: \"#4b5563\", lineHeight: 1.5 }\nconst bulletStyle: React.CSSProperties = { color: \"#00bc7d\" }\n\nconst previewBoxStyle: React.CSSProperties = {\n borderRadius: 12,\n overflow: \"hidden\",\n border: \"2px solid rgba(0, 188, 125, 0.4)\",\n background: \"#0f172a\",\n display: \"flex\",\n justifyContent: \"center\",\n}\nconst previewImgStyle: React.CSSProperties = {\n width: \"100%\",\n maxHeight: 320,\n objectFit: \"contain\",\n background: \"#0f172a\",\n}\n\nconst buttonsContainerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n}\n\nconst primaryButtonStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n padding: \"12px 16px\",\n background: \"#00bc7d\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: 8,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n}\n\nconst secondaryButtonStyle: React.CSSProperties = {\n ...primaryButtonStyle,\n background: \"#ffffff\",\n color: \"#374151\",\n border: \"2px solid #e5e7eb\",\n}\n\nconst cancelButtonStyle: React.CSSProperties = {\n ...primaryButtonStyle,\n background: \"transparent\",\n color: \"#6b7280\",\n border: \"none\",\n}\n\nconst spinnerStyle: React.CSSProperties = {\n width: 16,\n height: 16,\n border: \"2px solid rgba(0, 188, 125, 0.25)\",\n borderTopColor: \"#00bc7d\",\n borderRadius: \"50%\",\n animation: \"spin .8s linear infinite\",\n}\n\nconst attemptsTextStyle: React.CSSProperties = {\n margin: \"8px 0 0\",\n fontSize: 12,\n color: \"#9ca3af\",\n textAlign: \"center\",\n}\n\nconst footerStyle: React.CSSProperties = { padding: \"12px 24px 16px\", borderTop: \"1px solid #f3f4f6\" }\nconst footerTextStyle: React.CSSProperties = { margin: 0, fontSize: 12, color: \"#9ca3af\", textAlign: \"center\" }\n\n// ─────────────────────────────────────────────────────────────────────\n// LiveCamera — in-modal getUserMedia preview + capture button\n// ─────────────────────────────────────────────────────────────────────\n\ninterface LiveCameraProps {\n onCapture: (dataUrl: string) => void\n onCancel: () => void\n message?: string\n}\n\nfunction LiveCamera({ onCapture, onCancel, message }: Readonly<LiveCameraProps>): React.ReactElement {\n const videoRef = useRef<HTMLVideoElement>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const [ready, setReady] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n async function init() {\n try {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n throw new Error(\"Camera is not available in this browser\")\n }\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n facingMode: \"user\",\n width: { ideal: 1280 },\n height: { ideal: 1280 },\n },\n audio: false,\n })\n if (cancelled) {\n stream.getTracks().forEach((t) => t.stop())\n return\n }\n streamRef.current = stream\n const video = videoRef.current\n if (video) {\n video.srcObject = stream\n video.onloadedmetadata = () => {\n video.play().catch(() => { /* autoplay block — user gesture already happened */ })\n setReady(true)\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Unable to access camera\")\n }\n }\n init()\n return () => {\n cancelled = true\n streamRef.current?.getTracks().forEach((t) => t.stop())\n streamRef.current = null\n }\n }, [])\n\n const capture = () => {\n const video = videoRef.current\n if (!video || !video.videoWidth) return\n // Center-crop to a square so the selfie matches the on-screen face\n // oval. Mirror horizontally because the front-camera preview is\n // mirrored for the user but the raw video frame is not.\n const size = Math.min(video.videoWidth, video.videoHeight)\n const sx = (video.videoWidth - size) / 2\n const sy = (video.videoHeight - size) / 2\n const canvas = document.createElement(\"canvas\")\n canvas.width = size\n canvas.height = size\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n ctx.translate(size, 0)\n ctx.scale(-1, 1)\n ctx.drawImage(video, sx, sy, size, size, 0, 0, size, size)\n // Stop the stream as soon as we have the frame — frees the camera\n // hardware while the user reviews the preview.\n streamRef.current?.getTracks().forEach((t) => t.stop())\n streamRef.current = null\n onCapture(canvas.toDataURL(\"image/jpeg\", 0.9))\n }\n\n if (error) {\n return (\n <div style={{ ...contentStyle, alignItems: \"center\", textAlign: \"center\", padding: 0 }}>\n <div style={errorCircleStyle}>!</div>\n <h3 style={titleStyle}>Camera unavailable</h3>\n <p style={alertTextStyle}>{error}</p>\n <div style={buttonsContainerStyle}>\n <button style={secondaryButtonStyle} onClick={onCancel}>Back</button>\n </div>\n </div>\n )\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <div style={videoFrameStyle}>\n <video\n ref={videoRef}\n playsInline\n muted\n autoPlay\n style={videoStyle}\n />\n {/* Face guide: dashed spinning outer ring + solid inner ring with\n a box-shadow mask that darkens everything outside the circle —\n matches the cgs-frontend LivenessCamera \"face\" overlay. */}\n <div style={faceOverlayContainerStyle} aria-hidden=\"true\">\n <div style={faceRingWrapStyle}>\n <div style={faceDashedRingStyle} />\n <div style={faceCircleStyle} />\n </div>\n </div>\n {message && (\n <div style={liveMessagePillContainerStyle}>\n <div style={liveMessagePillStyle}>\n <span style={liveMessagePillTextStyle}>{message}</span>\n </div>\n </div>\n )}\n {!ready && <div style={videoLoadingStyle}>Starting camera…</div>}\n </div>\n <div style={buttonsContainerStyle}>\n <button\n style={ready ? primaryButtonStyle : { ...primaryButtonStyle, opacity: 0.5, cursor: \"not-allowed\" }}\n onClick={capture}\n disabled={!ready}\n >\n <img src={Camera} alt=\"\" width={20} height={20} />\n <span>Capture</span>\n </button>\n <button style={secondaryButtonStyle} onClick={onCancel}>Cancel</button>\n </div>\n </div>\n )\n}\n\nconst videoFrameStyle: React.CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n aspectRatio: \"1 / 1\",\n borderRadius: 12,\n overflow: \"hidden\",\n background: \"#0f172a\",\n}\n\nconst videoStyle: React.CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n transform: \"scaleX(-1)\", // mirror so the preview matches the user's POV\n}\n\nconst faceOverlayContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n}\n\n// Wrapper sized to the circle so both rings can overlap via inset.\nconst faceRingWrapStyle: React.CSSProperties = {\n position: \"relative\",\n width: \"72%\",\n aspectRatio: \"1 / 1\",\n}\n\n// Dashed white outer ring that slowly spins — matches the FE LivenessCamera.\nconst faceDashedRingStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: -6,\n borderRadius: \"50%\",\n border: \"6px dashed rgba(255, 255, 255, 0.4)\",\n animation: \"spin 10s linear infinite\",\n}\n\n// Solid inner ring with a large box-shadow that darkens everything outside\n// the circle (clipped by the frame's overflow:hidden).\nconst faceCircleStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: \"4px solid #00bc7d\",\n boxShadow: \"0 0 0 1000px rgba(0, 0, 0, 0.5)\",\n}\n\nconst videoLoadingStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#e5e7eb\",\n fontSize: 14,\n fontWeight: 500,\n}\n\n// Liveness hint pill overlaid at the top of the video, matching the FE.\nconst liveMessagePillContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 12,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n maxWidth: \"84%\",\n pointerEvents: \"none\",\n}\n\nconst liveMessagePillStyle: React.CSSProperties = {\n background: \"rgba(0, 0, 0, 0.7)\",\n backdropFilter: \"blur(6px)\",\n border: \"1px solid rgba(255, 255, 255, 0.2)\",\n borderRadius: 999,\n padding: \"6px 12px\",\n textAlign: \"center\",\n boxShadow: \"0 10px 25px -5px rgba(0,0,0,.3)\",\n}\n\nconst liveMessagePillTextStyle: React.CSSProperties = {\n margin: 0,\n fontSize: 12,\n fontWeight: 500,\n color: \"#ffffff\",\n animation: \"pulse 2s ease-in-out infinite\",\n}\n\nexport default FaceCaptureModal\n","/**\n * React Hooks for Vesant KYC SDK\n *\n * Provides convenient React hooks for using the KYC service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef, createElement } from 'react';\nimport { createRoot } from \"react-dom/client\"\nimport FaceCaptureModal from \"./FaceCaptureModal\"\nimport { KycClient } from './client';\nimport type {\n KycRequest,\n KycRequestFilters,\n DocumentVerificationRequest,\n DocumentVerificationResponse,\n KycStatus,\n KycAlert,\n KycAlertFilters,\n UpdateKycAlertRequest,\n KycOverview,\n KycPreferences,\n UpdateKycPreferencesRequest,\n PaginationParams,\n UseKycSubmissionOptions,\n UseKycSubmissionResult,\n UseKycRequestsOptions,\n UseKycRequestsResult,\n UseKycAlertsOptions,\n UseKycAlertsResult,\n UseKycOverviewOptions,\n UseKycOverviewResult,\n UseKycPreferencesResult,\n CreateReuseKycSessionRequest,\n CreateReuseKycSessionResponse,\n ReuseKycCallback,\n} from './types';\n\n// ============================================================================\n// Shared Hooks for Auto-fetch and Polling\n// ============================================================================\n\n/** Hook for auto-fetching on mount */\nfunction useAutoFetch(autoFetch: boolean | undefined, fetchFn: () => void): void {\n useEffect(() => {\n if (autoFetch) {\n fetchFn();\n }\n }, [autoFetch, fetchFn]);\n}\n\n/** Hook for setting up polling intervals */\nfunction usePolling(pollInterval: number | undefined, fetchFn: () => void): void {\n const pollIntervalRef = useRef<ReturnType<typeof setInterval>>();\n\n useEffect(() => {\n if (pollInterval && pollInterval > 0) {\n pollIntervalRef.current = setInterval(fetchFn, pollInterval);\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n }\n };\n }\n return undefined;\n }, [pollInterval, fetchFn]);\n}\n\n// ============================================================================\n// useKycSubmission Hook\n// ============================================================================\n\n/**\n * React hook for submitting KYC document verification\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC submission state and methods\n *\n * @example\n * ```tsx\n * function KycForm() {\n * const { submit, submission, loading, error, reset } = useKycSubmission(client, {\n * onComplete: (result) => {\n * console.log(\"Verification submitted:\", result.reference);\n * },\n * onError: (err) => {\n * console.error(\"Submission failed:\", err.message);\n * }\n * });\n *\n * const handleSubmit = async (formData: FormData) => {\n * await submit({\n * reference: formData.get(\"customerId\"),\n * email: formData.get(\"email\"),\n * document: {\n * proof: formData.get(\"documentImage\"),\n * selected_type: [\"id_card\", \"passport\"]\n * }\n * });\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * {loading && <Spinner />}\n * {error && <ErrorMessage>{error.message}</ErrorMessage>}\n * {submission && <SuccessMessage>Submitted: {submission.reference}</SuccessMessage>}\n * </form>\n * );\n * }\n * ```\n */\nexport function useKycSubmission(\n client: KycClient,\n options: UseKycSubmissionOptions = {}\n): UseKycSubmissionResult {\n const [submission, setSubmission] = useState<DocumentVerificationResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const submit = useCallback(\n async (request: DocumentVerificationRequest): Promise<DocumentVerificationResponse> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.submitVerification(request);\n setSubmission(result);\n options.onComplete?.(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Verification submission failed');\n setError(error);\n options.onError?.(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options]\n );\n\n const reset = useCallback(() => {\n setSubmission(null);\n setError(null);\n setLoading(false);\n }, []);\n\n return {\n submit,\n submission,\n loading,\n error,\n reset,\n };\n}\n\n// ============================================================================\n// useKycRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC requests\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC requests state and management methods\n *\n * @example\n * ```tsx\n * function KycDashboard() {\n * const {\n * requests,\n * total,\n * loading,\n * fetchRequests,\n * updateStatus\n * } = useKycRequests(client, {\n * autoFetch: true,\n * filters: { status: \"pending\" },\n * pagination: { page: 1, page_size: 20 }\n * });\n *\n * return (\n * <div>\n * <h2>{total} Pending KYC Requests</h2>\n * {requests.map(req => (\n * <KycCard\n * key={req.id}\n * request={req}\n * onApprove={() => updateStatus(req.reference, \"accepted\", \"Verified\")}\n * onReject={() => updateStatus(req.reference, \"declined\", \"Invalid document\")}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKycRequests(\n client: KycClient,\n options: UseKycRequestsOptions = {}\n): UseKycRequestsResult {\n const [requests, setRequests] = useState<KycRequest[]>([]);\n const [pagination, setPagination] = useState<{ total: number; page: number; limit: number; totalPages: number } | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchRequests = useCallback(\n async (filters?: KycRequestFilters, paginationParams?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listKycRequests(\n filters || options.filters,\n paginationParams || options.pagination\n );\n setRequests(result.data);\n setPagination(result.pagination);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC requests');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.filters, options.pagination]\n );\n\n const getRequest = useCallback(\n async (id: string): Promise<KycRequest> => {\n try {\n return await client.getKycRequest(id);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get KYC request');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const updateStatus = useCallback(\n async (reference: string, status: KycStatus, reason?: string) => {\n try {\n await client.updateKycStatus({ reference, status, reason });\n setRequests((prev) =>\n prev.map((req) =>\n req.reference === reference\n ? {\n ...req,\n status,\n ...(status === 'accepted'\n ? { accepted_reason: reason }\n : { declined_reason: reason }),\n }\n : req\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update KYC status');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchRequests();\n }, [fetchRequests]);\n\n useAutoFetch(options.autoFetch, fetchRequests);\n usePolling(options.pollInterval, fetchRequests);\n\n return {\n requests,\n pagination,\n loading,\n error,\n fetchRequests,\n getRequest,\n updateStatus,\n refresh,\n };\n}\n\n// ============================================================================\n// useKycAlerts Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC alerts\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC alerts state and management methods\n *\n * @example\n * ```tsx\n * function AlertsPanel() {\n * const {\n * alerts,\n * total,\n * loading,\n * fetchAlerts,\n * updateAlert\n * } = useKycAlerts(client, {\n * autoFetch: true,\n * filters: { status: [\"pending\", \"in_progress\"], risk: \"critical\" },\n * pollInterval: 30000\n * });\n *\n * return (\n * <div>\n * <h2>{total} Critical Alerts</h2>\n * {alerts.map(alert => (\n * <AlertCard\n * key={alert.id}\n * alert={alert}\n * onAssign={(userId) => updateAlert(alert.id, { assigned_for: userId, status: \"in_progress\" })}\n * onResolve={() => updateAlert(alert.id, { status: \"resolved\", reason: \"Verified\" })}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKycAlerts(\n client: KycClient,\n options: UseKycAlertsOptions = {}\n): UseKycAlertsResult {\n const [alerts, setAlerts] = useState<KycAlert[]>([]);\n const [pagination, setPagination] = useState<{ total: number; page: number; limit: number; totalPages: number } | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAlerts = useCallback(\n async (filters?: KycAlertFilters, paginationParams?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listAlerts(\n filters || options.filters,\n paginationParams || options.pagination\n );\n setAlerts(result.alerts);\n setPagination(result.pagination);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC alerts');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.filters, options.pagination]\n );\n\n const getAlert = useCallback(\n async (id: string): Promise<KycAlert> => {\n try {\n return await client.getAlert(id);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get KYC alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const updateAlert = useCallback(\n async (id: string, update: UpdateKycAlertRequest) => {\n try {\n await client.updateAlert(id, update);\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === id ? { ...alert, ...update } : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update KYC alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchAlerts();\n }, [fetchAlerts]);\n\n useAutoFetch(options.autoFetch, fetchAlerts);\n usePolling(options.pollInterval, fetchAlerts);\n\n return {\n alerts,\n pagination,\n loading,\n error,\n fetchAlerts,\n getAlert,\n updateAlert,\n refresh,\n };\n}\n\n// ============================================================================\n// useKycOverview Hook\n// ============================================================================\n\n/**\n * React hook for KYC overview statistics\n *\n * @param client - KycClient instance\n * @param options - Hook options\n * @returns KYC overview state\n *\n * @example\n * ```tsx\n * function KycStats() {\n * const { overview, loading, refresh } = useKycOverview(client, {\n * autoFetch: true,\n * fromDate: \"2024-01-01T00:00:00Z\",\n * toDate: \"2024-12-31T23:59:59Z\"\n * });\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * <StatCard label=\"Total\" value={overview?.total} />\n * <StatCard label=\"Pending\" value={overview?.pending} />\n * <StatCard label=\"Approved\" value={overview?.approved} />\n * <StatCard label=\"Rejected\" value={overview?.rejected} />\n * <StatCard label=\"High Risk\" value={overview?.high_risk} />\n * </div>\n * );\n * }\n * ```\n */\nexport function useKycOverview(\n client: KycClient,\n options: UseKycOverviewOptions = {}\n): UseKycOverviewResult {\n const [overview, setOverview] = useState<KycOverview | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchOverview = useCallback(\n async (fromDate?: string, toDate?: string) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getOverview(\n fromDate || options.fromDate,\n toDate || options.toDate\n );\n setOverview(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC overview');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.fromDate, options.toDate]\n );\n\n useAutoFetch(options.autoFetch, fetchOverview);\n\n return {\n overview,\n loading,\n error,\n refresh: fetchOverview,\n };\n}\n\n// ============================================================================\n// useKycPreferences Hook\n// ============================================================================\n\n/**\n * React hook for managing KYC preferences\n *\n * @param client - KycClient instance\n * @param autoFetch - Auto-fetch preferences on mount (default: true)\n * @returns KYC preferences state and methods\n *\n * @example\n * ```tsx\n * function PreferencesForm() {\n * const { preferences, loading, updatePreferences, refresh } = useKycPreferences(client);\n *\n * const handleUpdate = async (e: FormEvent) => {\n * e.preventDefault();\n * await updatePreferences({\n * is_face_verification_required: true,\n * required_document_count: 2\n * });\n * };\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <form onSubmit={handleUpdate}>\n * <Checkbox\n * label=\"Require Face Verification\"\n * checked={preferences?.is_face_verification_required}\n * />\n * <NumberInput\n * label=\"Required Documents\"\n * value={preferences?.required_document_count}\n * />\n * <Button type=\"submit\">Save</Button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useKycPreferences(\n client: KycClient,\n autoFetch: boolean = true\n): UseKycPreferencesResult {\n const [preferences, setPreferences] = useState<KycPreferences | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPreferences = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getPreferences();\n setPreferences(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch KYC preferences');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n const updatePreferences = useCallback(\n async (update: UpdateKycPreferencesRequest) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.updatePreferences(update);\n setPreferences(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update KYC preferences');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n useAutoFetch(autoFetch, fetchPreferences);\n\n return {\n preferences,\n loading,\n error,\n updatePreferences,\n refresh: fetchPreferences,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert a File to base64 string for document upload\n *\n * @param file - File object from input or drag-drop\n * @returns Base64 encoded string\n *\n * @example\n * ```typescript\n * const handleFileSelect = async (e: ChangeEvent<HTMLInputElement>) => {\n * const file = e.target.files?.[0];\n * if (file) {\n * const base64 = await fileToBase64(file);\n * setDocumentProof(base64);\n * }\n * };\n * ```\n */\nexport function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Validate file type for document upload\n *\n * @param file - File object to validate\n * @param allowedTypes - Array of allowed MIME types\n * @returns boolean indicating if file type is valid\n *\n * @example\n * ```typescript\n * const validTypes = ['image/jpeg', 'image/png', 'application/pdf'];\n * if (!isValidFileType(file, validTypes)) {\n * alert('Invalid file type. Please upload a JPG, PNG, or PDF.');\n * }\n * ```\n */\nexport function isValidFileType(\n file: File,\n allowedTypes: string[] = ['image/jpeg', 'image/png', 'image/webp', 'application/pdf']\n): boolean {\n return allowedTypes.includes(file.type);\n}\n\n/**\n * Validate file size for document upload\n *\n * @param file - File object to validate\n * @param maxSizeBytes - Maximum file size in bytes (default: 10MB)\n * @returns boolean indicating if file size is valid\n *\n * @example\n * ```typescript\n * const maxSize = 5 * 1024 * 1024; // 5MB\n * if (!isValidFileSize(file, maxSize)) {\n * alert('File too large. Maximum size is 5MB.');\n * }\n * ```\n */\nexport function isValidFileSize(file: File, maxSizeBytes: number = 10 * 1024 * 1024): boolean {\n return file.size <= maxSizeBytes;\n}\n\n/**\n * Format KYC status for display\n *\n * @param status - KYC status\n * @returns Human-readable status string\n */\nexport function formatKycStatus(status: string): string {\n const statusMap: Record<string, string> = {\n pending: 'Pending Review',\n accepted: 'Approved',\n declined: 'Rejected',\n 'review.pending': 'Under Review',\n unknown: 'Unknown',\n };\n return statusMap[status] || status;\n}\n\n/**\n * Get status color for UI display\n *\n * @param status - KYC status\n * @returns CSS color class or hex color\n */\nexport function getStatusColor(status: string): string {\n const colorMap: Record<string, string> = {\n pending: '#f59e0b', // amber\n accepted: '#10b981', // green\n declined: '#ef4444', // red\n 'review.pending': '#3b82f6', // blue\n unknown: '#6b7280', // gray\n };\n return colorMap[status] || '#6b7280';\n}\n\n/**\n * Get risk level color for UI display\n *\n * @param risk - Risk level\n * @returns CSS color class or hex color\n */\nexport function getRiskColor(risk: string): string {\n const colorMap: Record<string, string> = {\n low: '#10b981', // green\n medium: '#f59e0b', // amber\n high: '#f97316', // orange\n critical: '#ef4444', // red\n };\n return colorMap[risk] || '#6b7280';\n}\n\n\n\n/**\n * Detect whether the current browser is a mobile device. The check is\n * deliberately conservative — anything that doesn't match the mobile\n * pattern is treated as desktop and gets the QR handoff flow.\n *\n * Server-side device detection is intentionally absent; the SDK is the\n * authority on UX selection.\n */\nexport function isMobileDevice(userAgent?: string): boolean {\n const ua = userAgent ?? (typeof navigator === 'undefined' ? '' : navigator.userAgent);\n return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);\n}\n\n/**\n * Build the opaque QR payload a desktop client renders for the mobile\n * device to scan. Format matches the normal-KYC mobile-handoff scheme so\n * a single mobile app can handle both flows.\n */\nexport function buildReuseKycQrPayload(token: string): string {\n return `vesant://reuse-kyc?token=${encodeURIComponent(token)}`;\n}\n\n/**\n * Hook for the Re-Use KYC face-capture flow.\n *\n * Returns helpers that cover both mobile (direct capture) and desktop\n * (QR + polling) modes. Device detection happens here on the client —\n * the server accepts submissions from any User-Agent.\n *\n * - `startSession(req)` — POST /face/session. Inspect `is_required` first;\n * skip the modal entirely when it's `false`.\n * - `verifyFace(session, opts?)` — mount FaceCaptureModal and resolve once\n * the user reaches a terminal state (accepted / declined-after-max /\n * cancelled). The modal handles the device picker, QR handoff,\n * selfie capture, retries within the configured `max_attempts`, and\n * surfacing of the decline reason — all without unmounting in between.\n * - `runFlow(req, opts?)` — convenience wrapper: `startSession` then\n * `verifyFace`, with a short-circuit when `is_required` is false.\n */\nexport function useReuseKYCSubmission(client: KycClient) {\n const startSession = useCallback(\n (request: CreateReuseKycSessionRequest) => client.createReuseKycSession(request),\n [client]\n );\n\n /**\n * Options for `verifyFace`. Mirrors `FaceCaptureModalProps`.\n *\n * - `defaultDevice` — `'ask'` (default on desktop) shows the device\n * picker; `'this'` skips straight to capture; `'mobile'` skips\n * straight to the QR handoff. Default on mobile is `'this'`.\n * - `renderQR` — bring-your-own QR renderer. Default uses\n * api.qrserver.com.\n */\n type VerifyFaceOptions = {\n defaultDevice?: 'ask' | 'this' | 'mobile';\n renderQR?: (payload: string) => React.ReactNode;\n };\n\n const verifyFace = useCallback(\n (session: CreateReuseKycSessionResponse, opts: VerifyFaceOptions = {}) =>\n new Promise<ReuseKycCallback | null>((resolve) => {\n const container = document.createElement('div')\n document.body.appendChild(container)\n const root = createRoot(container)\n\n const cleanup = () => {\n root.unmount()\n container.remove()\n }\n\n const modal = createElement(FaceCaptureModal, {\n client,\n session,\n defaultDevice: opts.defaultDevice,\n renderQR: opts.renderQR,\n onComplete: (result) => {\n cleanup()\n resolve(result)\n },\n })\n root.render(modal)\n }),\n [client]\n );\n\n type RunFlowResult =\n | { kind: 'not_required'; session: CreateReuseKycSessionResponse }\n | { kind: 'cancelled'; session: CreateReuseKycSessionResponse }\n | { kind: 'completed'; session: CreateReuseKycSessionResponse; result: ReuseKycCallback };\n\n const runFlow = useCallback(\n async (request: CreateReuseKycSessionRequest, opts: VerifyFaceOptions = {}): Promise<RunFlowResult> => {\n const session = await startSession(request);\n if (!session.is_required) {\n return { kind: 'not_required', session };\n }\n const result = await verifyFace(session, opts);\n if (result === null) {\n return { kind: 'cancelled', session };\n }\n return { kind: 'completed', session, result };\n },\n [startSession, verifyFace]\n );\n\n return { startSession, verifyFace, runFlow };\n}\n"]}