vesant-sdk 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/{client-BWp5FI3x.d.ts → client-B6fUFAUM.d.mts} +2 -1
  2. package/dist/{client-BIfLMfuC.d.mts → client-DoczGA6L.d.ts} +2 -1
  3. package/dist/client-DzElM7u-.d.mts +238 -0
  4. package/dist/client-DzElM7u-.d.ts +238 -0
  5. package/dist/compliance/index.d.mts +5 -4
  6. package/dist/compliance/index.d.ts +5 -4
  7. package/dist/compliance/index.js +306 -98
  8. package/dist/compliance/index.js.map +1 -1
  9. package/dist/compliance/index.mjs +306 -98
  10. package/dist/compliance/index.mjs.map +1 -1
  11. package/dist/decisions/index.d.mts +100 -0
  12. package/dist/decisions/index.d.ts +100 -0
  13. package/dist/decisions/index.js +607 -0
  14. package/dist/decisions/index.js.map +1 -0
  15. package/dist/decisions/index.mjs +605 -0
  16. package/dist/decisions/index.mjs.map +1 -0
  17. package/dist/geolocation/index.d.mts +4 -3
  18. package/dist/geolocation/index.d.ts +4 -3
  19. package/dist/geolocation/index.js +306 -98
  20. package/dist/geolocation/index.js.map +1 -1
  21. package/dist/geolocation/index.mjs +306 -98
  22. package/dist/geolocation/index.mjs.map +1 -1
  23. package/dist/index.d.mts +15 -7
  24. package/dist/index.d.ts +15 -7
  25. package/dist/index.js +676 -90
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +667 -91
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/kyc/core.d.mts +4 -3
  30. package/dist/kyc/core.d.ts +4 -3
  31. package/dist/kyc/core.js +284 -29
  32. package/dist/kyc/core.js.map +1 -1
  33. package/dist/kyc/core.mjs +284 -29
  34. package/dist/kyc/core.mjs.map +1 -1
  35. package/dist/kyc/index.d.mts +46 -3
  36. package/dist/kyc/index.d.ts +46 -3
  37. package/dist/kyc/index.js +284 -29
  38. package/dist/kyc/index.js.map +1 -1
  39. package/dist/kyc/index.mjs +284 -29
  40. package/dist/kyc/index.mjs.map +1 -1
  41. package/dist/react.d.mts +9 -5
  42. package/dist/react.d.ts +9 -5
  43. package/dist/react.js +422 -99
  44. package/dist/react.js.map +1 -1
  45. package/dist/react.mjs +322 -4
  46. package/dist/react.mjs.map +1 -1
  47. package/dist/risk-profile/index.d.mts +4 -4
  48. package/dist/risk-profile/index.d.ts +4 -4
  49. package/dist/risk-profile/index.js +249 -29
  50. package/dist/risk-profile/index.js.map +1 -1
  51. package/dist/risk-profile/index.mjs +249 -29
  52. package/dist/risk-profile/index.mjs.map +1 -1
  53. package/dist/scores/index.d.mts +96 -0
  54. package/dist/scores/index.d.ts +96 -0
  55. package/dist/scores/index.js +594 -0
  56. package/dist/scores/index.js.map +1 -0
  57. package/dist/scores/index.mjs +591 -0
  58. package/dist/scores/index.mjs.map +1 -0
  59. package/dist/{types-DfHLp_tz.d.ts → types-DLC7Sfy5.d.ts} +1 -1
  60. package/dist/types-DZHongaK.d.mts +61 -0
  61. package/dist/types-DZHongaK.d.ts +61 -0
  62. package/dist/{types-DKCQN4C5.d.mts → types-jaLuzruy.d.mts} +1 -1
  63. package/dist/webhooks/index.d.mts +176 -0
  64. package/dist/webhooks/index.d.ts +176 -0
  65. package/dist/webhooks/index.js +193 -0
  66. package/dist/webhooks/index.js.map +1 -0
  67. package/dist/webhooks/index.mjs +188 -0
  68. package/dist/webhooks/index.mjs.map +1 -0
  69. package/package.json +25 -2
  70. package/dist/types-BpKxSXGF.d.mts +0 -177
  71. package/dist/types-BpKxSXGF.d.ts +0 -177
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/version.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/hooks.ts"],"names":["error","useState","useRef","useCallback","useEffect"],"mappings":"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","file":"react.mjs","sourcesContent":["/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.2.0';\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 = 'cgs_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 { 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 Error('No base64 encoding method available');\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 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 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 {\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 CGS 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('Auto-verification failed:', err);\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 [config, setConfig] = useState<GeolocationConfigResponse | undefined>(undefined);\n const [configLoading, setConfigLoading] = useState<boolean>(!!client);\n const [configError, setConfigError] = useState<Error | null>(null);\n const configRef = useRef<GeolocationConfigResponse | undefined>(undefined);\n\n // Keep ref in sync with state for use in callback\n configRef.current = config;\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 client.getGPSConfig().then((cfg: GeolocationConfigResponse) => {\n if (!cancelled) {\n setConfig(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 return await generateCipherText(options, configRef.current);\n } catch (error) {\n console.error('[CGS SDK] Failed to generate cipherText:', 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 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 Error('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","/**\n * React Hooks for CGS KYC SDK\n *\n * Provides convenient React hooks for using the KYC service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\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} 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<NodeJS.Timeout>();\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"]}
1
+ {"version":3,"sources":["../src/core/version.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":["error","useState","useRef","useCallback","useEffect","fileToBase64"],"mappings":"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","file":"react.mjs","sourcesContent":["/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.3.0';\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 = 'cgs_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 { 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 Error('No base64 encoding method available');\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 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 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 {\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 CGS 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('Auto-verification failed:', err);\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 [config, setConfig] = useState<GeolocationConfigResponse | undefined>(undefined);\n const [configLoading, setConfigLoading] = useState<boolean>(!!client);\n const [configError, setConfigError] = useState<Error | null>(null);\n const configRef = useRef<GeolocationConfigResponse | undefined>(undefined);\n\n // Keep ref in sync with state for use in callback\n configRef.current = config;\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 client.getGPSConfig().then((cfg: GeolocationConfigResponse) => {\n if (!cancelled) {\n setConfig(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 return await generateCipherText(options, configRef.current);\n } catch (error) {\n console.error('[CGS SDK] Failed to generate cipherText:', 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 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 Error('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, { useRef, useState } from \"react\"\nimport { Camera, Close, Done, Upload } from \"./images\"\n\ninterface FaceCaptureModalProps {\n onCapture: (base64: string) => void\n onCancel: () => void\n}\n\nconst fileToBase64 = (file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.readAsDataURL(file)\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = error => reject(error)\n })\n}\n\nfunction FaceCaptureModal({\n onCapture,\n onCancel\n}: FaceCaptureModalProps): React.ReactNode {\n const inputRef = useRef<HTMLInputElement>(null)\n const [isProcessing, setIsProcessing] = useState(false)\n const [isHoveringPrimary, setIsHoveringPrimary] = useState(false)\n const [isHoveringCancel, setIsHoveringCancel] = useState(false)\n const [isHoveringClose, setIsHoveringClose] = useState(false)\n\n const isMobile = /Mobi|Android/i.test(navigator.userAgent)\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n \n setIsProcessing(true)\n try {\n const base64 = await fileToBase64(file)\n setTimeout(() => {\n onCapture(base64)\n }, 300)\n } catch (error) {\n console.error(\"Error processing image:\", error)\n setIsProcessing(false)\n }\n }\n\n // Styles\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.6)\",\n backdropFilter: \"blur(4px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 999999,\n padding: \"16px\",\n animation: \"fadeIn 0.2s ease-out\"\n }\n\n const modalStyle: React.CSSProperties = {\n background: \"#ffffff\",\n borderRadius: \"16px\",\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\",\n width: \"100%\",\n maxWidth: \"448px\",\n animation: \"zoomIn 0.2s ease-out\"\n }\n\n const headerStyle: React.CSSProperties = {\n position: \"relative\",\n padding: \"24px 24px 16px\",\n borderBottom: \"1px solid #f3f4f6\"\n }\n\n const closeButtonStyle: React.CSSProperties = {\n position: \"absolute\",\n top: \"16px\",\n right: \"16px\",\n padding: \"8px\",\n background: isHoveringClose ? \"#f3f4f6\" : \"transparent\",\n border: \"none\",\n borderRadius: \"9999px\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\"\n }\n\n const titleStyle: React.CSSProperties = {\n fontSize: \"24px\",\n fontWeight: 600,\n color: \"#111827\",\n margin: 0\n }\n\n const subtitleStyle: React.CSSProperties = {\n fontSize: \"14px\",\n color: \"#6b7280\",\n marginTop: \"4px\"\n }\n\n const contentStyle: React.CSSProperties = {\n padding: \"32px 24px\"\n }\n\n const visualGuideContainerStyle: React.CSSProperties = {\n marginBottom: \"32px\",\n display: \"flex\",\n justifyContent: \"center\"\n }\n\n const visualGuideStyle: React.CSSProperties = {\n position: \"relative\"\n }\n\n const circleStyle: React.CSSProperties = {\n width: \"128px\",\n height: \"128px\",\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 }\n\n const badgeStyle: React.CSSProperties = {\n position: \"absolute\",\n top: \"-4px\",\n right: \"-4px\",\n width: \"32px\",\n height: \"32px\",\n background: \"#ffffff\",\n borderRadius: \"50%\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\"\n }\n\n const instructionsBoxStyle: React.CSSProperties = {\n background: \"linear-gradient(135deg, #f9fafb 0%, rgba(243, 244, 246, 0.5) 100%)\",\n borderRadius: \"12px\",\n padding: \"16px\",\n marginBottom: \"24px\"\n }\n\n const instructionsTitleStyle: React.CSSProperties = {\n fontSize: \"14px\",\n fontWeight: 500,\n color: \"#111827\",\n marginBottom: \"8px\"\n }\n\n const instructionsListStyle: React.CSSProperties = {\n fontSize: \"12px\",\n color: \"#6b7280\",\n listStyle: \"none\",\n padding: 0,\n margin: 0\n }\n\n const instructionItemStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n marginBottom: \"6px\"\n }\n\n const bulletStyle: React.CSSProperties = {\n color: \"#00bc7d\",\n marginRight: \"8px\",\n flexShrink: 0\n }\n\n const buttonsContainerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\"\n }\n\n const primaryButtonStyle: React.CSSProperties = {\n width: \"100%\",\n background: isProcessing ? \"#d1d5db\" : (isHoveringPrimary ? \"#00a86d\" : \"#00bc7d\"),\n color: \"#ffffff\",\n fontWeight: 500,\n padding: \"14px 24px\",\n borderRadius: \"12px\",\n border: \"none\",\n cursor: isProcessing ? \"not-allowed\" : \"pointer\",\n transition: \"all 0.2s\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"12px\",\n boxShadow: isProcessing ? \"none\" : (isHoveringPrimary ? \"0 20px 25px -5px rgba(0, 188, 125, 0.3)\" : \"0 10px 15px -3px rgba(0, 188, 125, 0.2)\"),\n fontSize: \"16px\"\n }\n\n const cancelButtonStyle: React.CSSProperties = {\n width: \"100%\",\n background: isProcessing ? \"#f3f4f6\" : (isHoveringCancel ? \"#f9fafb\" : \"#ffffff\"),\n color: \"#374151\",\n fontWeight: 500,\n padding: \"14px 24px\",\n borderRadius: \"12px\",\n border: \"2px solid #e5e7eb\",\n cursor: isProcessing ? \"not-allowed\" : \"pointer\",\n transition: \"all 0.2s\",\n fontSize: \"16px\"\n }\n\n const footerStyle: React.CSSProperties = {\n padding: \"0 24px 24px\"\n }\n\n const footerTextStyle: React.CSSProperties = {\n fontSize: \"12px\",\n textAlign: \"center\",\n color: \"#9ca3af\",\n margin: 0\n }\n\n const spinnerStyle: React.CSSProperties = {\n width: \"20px\",\n height: \"20px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"#ffffff\",\n borderRadius: \"50%\",\n animation: \"spin 0.6s linear infinite\"\n }\n\n const hiddenInputStyle: React.CSSProperties = {\n display: \"none\"\n }\n\n // Add keyframe animations via style tag\n const styleTag = (\n <style>\n {`\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n \n @keyframes zoomIn {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n \n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n )\n\n return (\n <>\n {styleTag}\n <div style={overlayStyle}>\n <div style={modalStyle}>\n {/* Header */}\n <div style={headerStyle}>\n <button\n onClick={onCancel}\n onMouseEnter={() => setIsHoveringClose(true)}\n onMouseLeave={() => setIsHoveringClose(false)}\n style={closeButtonStyle}\n aria-label=\"Close\"\n >\n <img src={Close} alt=\"Close Icon\" width={16} height={16} />\n </button>\n <h2 style={titleStyle}>Face Verification</h2>\n <p style={subtitleStyle}>Please capture or upload a clear photo of your face</p>\n </div>\n\n {/* Content */}\n <div style={contentStyle}>\n {/* Visual Guide */}\n <div style={visualGuideContainerStyle}>\n <div style={visualGuideStyle}>\n <div style={circleStyle}>\n <img src={Camera} alt=\"Camera Icon\" width={48} height={48} />\n </div>\n <div style={badgeStyle}>\n <img src={Done} alt=\"Check Icon\" width={16} height={16} />\n </div>\n </div>\n </div>\n\n {/* Instructions */}\n <div style={instructionsBoxStyle}>\n <h3 style={instructionsTitleStyle}>Tips for best results:</h3>\n <ul style={instructionsListStyle}>\n <li style={instructionItemStyle}>\n <span style={bulletStyle}>•</span>\n <span>Ensure good lighting on your face</span>\n </li>\n <li style={instructionItemStyle}>\n <span style={bulletStyle}>•</span>\n <span>Remove glasses or accessories if possible</span>\n </li>\n <li style={instructionItemStyle}>\n <span style={bulletStyle}>•</span>\n <span>Look directly at the camera</span>\n </li>\n </ul>\n </div>\n\n {/* Hidden file input */}\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n capture={isMobile ? \"user\" : undefined}\n style={hiddenInputStyle}\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n\n {/* Action Buttons */}\n <div style={buttonsContainerStyle}>\n <button\n onClick={() => inputRef.current?.click()}\n onMouseEnter={() => setIsHoveringPrimary(true)}\n onMouseLeave={() => setIsHoveringPrimary(false)}\n disabled={isProcessing}\n style={primaryButtonStyle}\n >\n {isProcessing ? (\n <>\n <div style={spinnerStyle} />\n <span>Processing...</span>\n </>\n ) : (\n <>\n {isMobile ? (\n <img src={Camera} alt=\"Camera Icon\" width={20} height={20} />\n ) : (\n <img src={Upload} alt=\"Upload Icon\" width={20} height={20} />\n )}\n <span>{isMobile ? \"Capture Photo\" : \"Upload Photo\"}</span>\n </>\n )}\n </button>\n\n <button\n onClick={onCancel}\n onMouseEnter={() => setIsHoveringCancel(true)}\n onMouseLeave={() => setIsHoveringCancel(false)}\n disabled={isProcessing}\n style={cancelButtonStyle}\n >\n Cancel\n </button>\n </div>\n </div>\n\n {/* Footer Note */}\n <div style={footerStyle}>\n <p style={footerTextStyle}>\n Your photo will be securely processed and used only for verification purposes\n </p>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nexport default FaceCaptureModal","/**\n * React Hooks for CGS 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 CheckKycStatusResponse,\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<NodeJS.Timeout>();\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\nexport function useReuseKYCSubmission(client: KycClient) {\n const verifyFace = (reference: string, token: string) => {\n return new Promise<CheckKycStatusResponse | null>((resolve, reject) => {\n const container = document.createElement(\"div\")\n document.body.appendChild(container)\n const root = createRoot(container)\n\n const cleanup = () => {\n root.unmount()\n document.body.removeChild(container)\n }\n\n const modal = createElement(FaceCaptureModal, {\n onCapture: async (base64: string) => {\n try {\n const resp = await client.submitReuseKycSession({\n proof: base64,\n reference,\n token,\n })\n resolve(resp)\n } catch (error) {\n reject(error instanceof Error ? error : new Error('Face verification failed'))\n }\n finally {\n cleanup()\n }\n },\n onCancel: () => {\n cleanup()\n resolve(null)\n },\n })\n root.render(modal)\n })\n }\n\n return { verifyFace }\n}"]}
@@ -1,7 +1,7 @@
1
- import { B as BaseClient, d as BaseClientConfig, R as RequestOptions } from '../types-BpKxSXGF.mjs';
2
- export { E as EntityType } from '../types-BpKxSXGF.mjs';
3
- import { d as CreateProfileRequest, C as CustomerProfile, U as UpdateProfileRequest } from '../types-DKCQN4C5.mjs';
4
- export { E as EmploymentType, L as LegalForm, P as ProfileDetailsResponse, e as ProfileFilters, f as ProfileListResponse, R as RiskCategory, h as RiskConfiguration, g as RiskDashboardMetrics, a as RiskFactor, b as RiskFactorType, c as RiskHistory, S as ScreeningStatus } from '../types-DKCQN4C5.mjs';
1
+ import { B as BaseClient, b as BaseClientConfig, R as RequestOptions } from '../client-DzElM7u-.mjs';
2
+ import { d as CreateProfileRequest, C as CustomerProfile, U as UpdateProfileRequest } from '../types-jaLuzruy.mjs';
3
+ export { E as EmploymentType, L as LegalForm, P as ProfileDetailsResponse, e as ProfileFilters, f as ProfileListResponse, R as RiskCategory, h as RiskConfiguration, g as RiskDashboardMetrics, a as RiskFactor, b as RiskFactorType, c as RiskHistory, S as ScreeningStatus } from '../types-jaLuzruy.mjs';
4
+ export { E as EntityType } from '../types-DZHongaK.mjs';
5
5
 
6
6
  /**
7
7
  * RiskProfileClient - Customer Risk Profile Management