astra-sdk-web 1.1.16 → 1.1.18

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/types/index.ts","../src/sdk/utils/http.ts","../src/sdk/client/index.ts","../src/sdk/config/index.ts","../src/services/kycApiService.ts","../src/contexts/KycContext.tsx","../src/utils/deviceDetection.ts","../src/features/documentUpload/hooks/useDocumentUpload.ts","../src/pages/DocumentUploadModal.tsx","../src/features/faceScan/hooks/useCamera.ts","../src/services/faceMeshService.ts","../src/features/faceScan/hooks/useFaceScan.ts","../src/components/Toast.tsx","../src/pages/FaceScanModal.tsx","../src/pages/MobileRoute.tsx","../src/pages/QRCodePage.tsx","../src/components/KycFlow.tsx","../src/sdk/index.ts"],"names":["blob","useState","useEffect","jsx","useRef","drawMPLandmarks","jsxs","useNavigate"],"mappings":"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","file":"astra-sdk.es.js","sourcesContent":["\r\nexport interface AstraSDKConfig {\r\n apiKey: string;\r\n baseURL?: string;\r\n timeout?: number;\r\n headers?: Record<string, string>;\r\n retries?: number;\r\n retryDelay?: number;\r\n}\r\n\r\nexport interface RequestOptions {\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n headers?: Record<string, string>;\r\n body?: unknown;\r\n params?: Record<string, string | number | boolean>;\r\n timeout?: number;\r\n}\r\n\r\nexport interface ApiResponse<T = unknown> {\r\n data: T;\r\n status: number;\r\n statusText: string;\r\n headers: Record<string, string>;\r\n}\r\n\r\nexport interface ApiError {\r\n message: string;\r\n status?: number;\r\n code?: string;\r\n details?: unknown;\r\n}\r\n\r\nexport class AstraSDKError extends Error {\r\n status?: number;\r\n code?: string;\r\n details?: unknown;\r\n\r\n constructor(message: string, status?: number, code?: string, details?: unknown) {\r\n super(message);\r\n this.name = 'AstraSDKError';\r\n this.status = status;\r\n this.code = code;\r\n this.details = details;\r\n Object.setPrototypeOf(this, AstraSDKError.prototype);\r\n }\r\n}\r\n\r\n","/**\r\n * HTTP utility functions\r\n */\r\n\r\nimport type { RequestOptions, ApiResponse, ApiError } from '../types';\r\nimport { AstraSDKError } from '../types';\r\n\r\nexport async function makeRequest<T = unknown>(\r\n url: string,\r\n options: RequestOptions = {},\r\n config: {\r\n apiKey: string;\r\n baseURL: string;\r\n timeout: number;\r\n headers: Record<string, string>;\r\n }\r\n): Promise<ApiResponse<T>> {\r\n const {\r\n method = 'GET',\r\n headers: customHeaders = {},\r\n body,\r\n params,\r\n timeout = config.timeout,\r\n } = options;\r\n\r\n // Build URL with query parameters\r\n const urlObj = new URL(url, config.baseURL);\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n urlObj.searchParams.append(key, String(value));\r\n });\r\n }\r\n\r\n // Prepare headers\r\n const headers = new Headers({\r\n ...config.headers,\r\n ...customHeaders,\r\n Authorization: `Bearer ${config.apiKey}`,\r\n });\r\n\r\n // Prepare request options\r\n const requestOptions: RequestInit = {\r\n method,\r\n headers,\r\n signal: AbortSignal.timeout(timeout),\r\n };\r\n\r\n if (body && method !== 'GET') {\r\n requestOptions.body = JSON.stringify(body);\r\n }\r\n\r\n try {\r\n const response = await fetch(urlObj.toString(), requestOptions);\r\n const responseHeaders: Record<string, string> = {};\r\n response.headers.forEach((value, key) => {\r\n responseHeaders[key] = value;\r\n });\r\n\r\n let data: T;\r\n const contentType = response.headers.get('content-type');\r\n if (contentType?.includes('application/json')) {\r\n data = await response.json();\r\n } else {\r\n data = (await response.text()) as unknown as T;\r\n }\r\n\r\n if (!response.ok) {\r\n const error: ApiError = {\r\n message: `Request failed with status ${response.status}`,\r\n status: response.status,\r\n code: response.statusText,\r\n details: data,\r\n };\r\n throw new AstraSDKError(\r\n error.message,\r\n error.status,\r\n error.code,\r\n error.details\r\n );\r\n }\r\n\r\n return {\r\n data,\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: responseHeaders,\r\n };\r\n } catch (error) {\r\n if (error instanceof AstraSDKError) {\r\n throw error;\r\n }\r\n if (error instanceof Error) {\r\n if (error.name === 'AbortError') {\r\n throw new AstraSDKError('Request timeout', 408, 'TIMEOUT');\r\n }\r\n throw new AstraSDKError(error.message, undefined, 'NETWORK_ERROR');\r\n }\r\n throw new AstraSDKError('Unknown error occurred', undefined, 'UNKNOWN_ERROR');\r\n }\r\n}\r\n\r\nexport async function retryRequest<T>(\r\n fn: () => Promise<T>,\r\n retries: number,\r\n delay: number\r\n): Promise<T> {\r\n let lastError: Error;\r\n \r\n for (let i = 0; i <= retries; i++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n \r\n // Don't retry on client errors (4xx) except 429 (rate limit)\r\n if (error instanceof AstraSDKError && error.status) {\r\n if (error.status >= 400 && error.status < 500 && error.status !== 429) {\r\n throw error;\r\n }\r\n }\r\n \r\n if (i < retries) {\r\n await new Promise((resolve) => setTimeout(resolve, delay * (i + 1)));\r\n }\r\n }\r\n }\r\n \r\n throw lastError!;\r\n}\r\n\r\n","/**\r\n * API Client for Astra SDK\r\n */\r\n\r\nimport type { RequestOptions, ApiResponse } from '../types';\r\nimport { makeRequest, retryRequest } from '../utils/http';\r\nimport type { AstraSDKConfig } from '../types';\r\n\r\nexport class ApiClient {\r\n private config: Required<AstraSDKConfig>;\r\n\r\n constructor(config: Required<AstraSDKConfig>) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Make a GET request\r\n */\r\n async get<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'GET' });\r\n }\r\n\r\n /**\r\n * Make a POST request\r\n */\r\n async post<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'POST', body });\r\n }\r\n\r\n /**\r\n * Make a PUT request\r\n */\r\n async put<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'PUT', body });\r\n }\r\n\r\n /**\r\n * Make a PATCH request\r\n */\r\n async patch<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'PATCH', body });\r\n }\r\n\r\n /**\r\n * Make a DELETE request\r\n */\r\n async delete<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\r\n }\r\n\r\n /**\r\n * Make a generic request\r\n */\r\n async request<T = unknown>(\r\n endpoint: string,\r\n options: RequestOptions = {}\r\n ): Promise<ApiResponse<T>> {\r\n const requestFn = () =>\r\n makeRequest<T>(endpoint, options, {\r\n apiKey: this.config.apiKey,\r\n baseURL: this.config.baseURL,\r\n timeout: this.config.timeout,\r\n headers: this.config.headers,\r\n });\r\n\r\n if (this.config.retries > 0) {\r\n return retryRequest(requestFn, this.config.retries, this.config.retryDelay);\r\n }\r\n\r\n return requestFn();\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<AstraSDKConfig>): void {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n headers: {\r\n ...this.config.headers,\r\n ...config.headers,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): Required<AstraSDKConfig> {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n","/**\r\n * Configuration management for Astra SDK\r\n */\r\n\r\nimport type { AstraSDKConfig } from '../types';\r\n\r\nexport const DEFAULT_CONFIG: Required<Omit<AstraSDKConfig, 'apiKey'>> = {\r\n baseURL: 'https://api.astra.com',\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n retries: 3,\r\n retryDelay: 1000,\r\n};\r\n\r\nexport function mergeConfig(userConfig: AstraSDKConfig): Required<AstraSDKConfig> {\r\n return {\r\n apiKey: userConfig.apiKey,\r\n baseURL: userConfig.baseURL ?? DEFAULT_CONFIG.baseURL,\r\n timeout: userConfig.timeout ?? DEFAULT_CONFIG.timeout,\r\n headers: {\r\n ...DEFAULT_CONFIG.headers,\r\n ...userConfig.headers,\r\n },\r\n retries: userConfig.retries ?? DEFAULT_CONFIG.retries,\r\n retryDelay: userConfig.retryDelay ?? DEFAULT_CONFIG.retryDelay,\r\n };\r\n}\r\n\r\n","/**\r\n * KYC API Service\r\n * Handles all KYC-related API calls (face scan, document upload, status check)\r\n */\r\n\r\nexport const COMPLETED_STEPS = {\r\n INITIATED: \"initiated\",\r\n FACE: \"face_scan\",\r\n DOCS: \"document_upload\",\r\n COMPLETED: \"completed\",\r\n} as const;\r\n\r\nexport interface KycApiConfig {\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n deviceType?: string;\r\n}\r\n\r\nexport interface SessionStatusResponse {\r\n status: string;\r\n message: string;\r\n data: {\r\n session_id: string;\r\n status: 'ACTIVE' | 'INACTIVE' | 'EXPIRED' | 'COMPLETED';\r\n completed_steps: string[];\r\n next_step: string;\r\n };\r\n}\r\n\r\nexport interface FaceScanResponse {\r\n status: string;\r\n message: string;\r\n data?: unknown;\r\n}\r\n\r\nexport interface DocumentUploadResponse {\r\n status: string;\r\n message: string;\r\n data?: unknown;\r\n}\r\n\r\nexport class KycApiService {\r\n private config: KycApiConfig;\r\n\r\n constructor(config: KycApiConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Detect device type\r\n */\r\n private detectDeviceType(): string {\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera;\r\n if (/android/i.test(userAgent)) return 'android';\r\n if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) return 'ios';\r\n if (/Mac|Windows|Linux/.test(userAgent)) return 'desktop';\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Get session status\r\n */\r\n async getSessionStatus(): Promise<SessionStatusResponse> {\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n \r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/status`,\r\n {\r\n method: 'GET',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include',\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Status fetch failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Status fetch failed';\r\n throw new Error(`Status fetch failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Upload face scan image\r\n */\r\n async uploadFaceScan(faceBlob: Blob | File): Promise<FaceScanResponse> {\r\n // Check session status first\r\n await this.checkSessionActive();\r\n\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n const formData = new FormData();\r\n const faceFileName = (faceBlob as File)?.name || `face-${Date.now()}.jpg`;\r\n formData.append('face_scan_img', faceBlob, faceFileName);\r\n\r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/face`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n },\r\n credentials: 'include',\r\n body: formData,\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || errorData?.errorData?.message || `Face upload failed with status ${response.status}`;\r\n // Preserve the original error message for better error handling\r\n const error = new Error(message);\r\n (error as any).statusCode = response.status;\r\n (error as any).errorData = errorData;\r\n // Also preserve the full error response structure\r\n if (errorData.statusCode) {\r\n (error as any).statusCode = errorData.statusCode;\r\n }\r\n throw error;\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n // If error already has a message from the response, preserve it\r\n if (error.message && !error.message.includes('Face upload failed')) {\r\n throw error;\r\n }\r\n const message = error?.message || 'Face upload failed';\r\n throw new Error(`Face upload failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Upload document scan image\r\n */\r\n async uploadDocument(docBlob: Blob | File, docType: string): Promise<DocumentUploadResponse> {\r\n // Check session status first\r\n await this.checkSessionActive();\r\n\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n const formData = new FormData();\r\n const docFileName = (docBlob as File)?.name || `document-${Date.now()}.jpg`;\r\n formData.append('docs_scan_img', docBlob, docFileName);\r\n formData.append('docType', docType);\r\n\r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/docs`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n },\r\n credentials: 'include',\r\n body: formData,\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Document upload failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Document upload failed';\r\n throw new Error(`Document upload failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Retry session - resets the session to allow face registration again\r\n */\r\n async retrySession(): Promise<any> {\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n \r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/retry`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include',\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Retry failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Retry failed';\r\n throw new Error(`Retry failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Check if session is active, throw error if not\r\n */\r\n async checkSessionActive(): Promise<void> {\r\n const status = await this.getSessionStatus();\r\n \r\n if (status.data.status !== 'ACTIVE') {\r\n throw new Error('Session expired or inactive. Please start a new session.');\r\n }\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<KycApiConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): KycApiConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n","import React, { createContext, useContext, ReactNode } from 'react';\r\nimport { KycApiService, type KycApiConfig } from '../services/kycApiService';\r\n\r\ninterface KycContextValue {\r\n apiService: KycApiService | null;\r\n setApiConfig: (config: KycApiConfig) => void;\r\n}\r\n\r\nconst KycContext = createContext<KycContextValue>({\r\n apiService: null,\r\n setApiConfig: () => {},\r\n});\r\n\r\nexport const useKycContext = () => {\r\n const context = useContext(KycContext);\r\n if (!context) {\r\n throw new Error('useKycContext must be used within KycProvider');\r\n }\r\n return context;\r\n};\r\n\r\ninterface KycProviderProps {\r\n children: ReactNode;\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n deviceType?: string;\r\n}\r\n\r\nexport const KycProvider: React.FC<KycProviderProps> = ({\r\n children,\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n deviceType,\r\n}) => {\r\n const [apiService, setApiService] = React.useState<KycApiService | null>(null);\r\n\r\n React.useEffect(() => {\r\n if (apiBaseUrl && sessionId && serverKey) {\r\n const service = new KycApiService({\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n deviceType,\r\n });\r\n setApiService(service);\r\n }\r\n }, [apiBaseUrl, sessionId, serverKey, deviceType]);\r\n\r\n const setApiConfig = React.useCallback((config: KycApiConfig) => {\r\n if (apiService) {\r\n apiService.updateConfig(config);\r\n } else {\r\n const service = new KycApiService(config);\r\n setApiService(service);\r\n }\r\n }, [apiService]);\r\n\r\n return (\r\n <KycContext.Provider value={{ apiService, setApiConfig }}>\r\n {children}\r\n </KycContext.Provider>\r\n );\r\n};\r\n\r\n","/**\r\n * Utility functions for device detection\r\n */\r\n\r\nexport function isMobileDevice(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n // Check user agent\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera;\r\n \r\n // Common mobile device patterns\r\n const mobileRegex = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i;\r\n \r\n // Check screen width (mobile devices typically have smaller screens)\r\n const isSmallScreen = window.innerWidth <= 768;\r\n \r\n // Check for touch support\r\n const hasTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n \r\n return mobileRegex.test(userAgent) || (isSmallScreen && hasTouchScreen);\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'desktop' {\r\n return isMobileDevice() ? 'mobile' : 'desktop';\r\n}\r\n\r\n","import { useState, useRef, useEffect } from 'react';\r\nimport type { DocumentUploadCallbacks } from '../types';\r\nimport type { DocumentUploadState } from '../types';\r\n\r\nexport interface DocumentUploadHookCallbacks extends DocumentUploadCallbacks {\r\n onDocumentUpload?: (blob: Blob, docType: string) => Promise<void>;\r\n}\r\n\r\nexport function useDocumentUpload(callbacks?: DocumentUploadHookCallbacks) {\r\n const [state, setState] = useState<DocumentUploadState>({\r\n docType: 'CNIC',\r\n isDocScanMode: false,\r\n docPreviewUrl: null,\r\n docFileName: '',\r\n loading: false,\r\n });\r\n\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const docVideoRef = useRef<HTMLVideoElement>(null);\r\n const docStreamRef = useRef<MediaStream | null>(null);\r\n const docPendingBlobRef = useRef<Blob | null>(null);\r\n\r\n const getRearStream = async (): Promise<MediaStream> => {\r\n const attempts: MediaStreamConstraints[] = [\r\n { video: { facingMode: { exact: 'environment' }, width: { ideal: 1280 }, height: { ideal: 1920 } }, audio: false } as MediaStreamConstraints,\r\n { video: { facingMode: 'environment', width: { ideal: 1280 }, height: { ideal: 1920 } }, audio: false } as unknown as MediaStreamConstraints,\r\n { video: { facingMode: { exact: 'environment' }, width: { ideal: 720 }, height: { ideal: 1280 } }, audio: false } as MediaStreamConstraints,\r\n { video: { facingMode: 'environment', width: { ideal: 720 }, height: { ideal: 1280 } }, audio: false } as unknown as MediaStreamConstraints,\r\n ];\r\n\r\n for (const c of attempts) {\r\n try { return await navigator.mediaDevices.getUserMedia(c); } catch { /* continue */ }\r\n }\r\n\r\n let temp: MediaStream | null = null;\r\n try {\r\n temp = await navigator.mediaDevices.getUserMedia({ video: true, audio: false });\r\n } catch (e) {\r\n throw e;\r\n } finally {\r\n try { temp?.getTracks().forEach(t => t.stop()); } catch {}\r\n }\r\n\r\n const devices = await navigator.mediaDevices.enumerateDevices();\r\n const videoInputs = devices.filter(d => d.kind === 'videoinput');\r\n const rear = videoInputs.find(d => /back|rear|environment/i.test(d.label));\r\n const chosen = rear || videoInputs.find(d => !/front|user|face/i.test(d.label)) || videoInputs[0];\r\n if (!chosen) throw new Error('No video input devices found');\r\n\r\n const byDeviceAttempts: MediaStreamConstraints[] = [\r\n { video: { deviceId: { exact: chosen.deviceId }, width: { ideal: 1280 }, height: { ideal: 1920 } }, audio: false },\r\n { video: { deviceId: { exact: chosen.deviceId }, width: { ideal: 720 }, height: { ideal: 1280 } }, audio: false },\r\n { video: { deviceId: { exact: chosen.deviceId } }, audio: false } as MediaStreamConstraints,\r\n ];\r\n for (const c of byDeviceAttempts) {\r\n try { return await navigator.mediaDevices.getUserMedia(c); } catch { /* continue */ }\r\n }\r\n\r\n return await navigator.mediaDevices.getUserMedia({ video: true, audio: false });\r\n };\r\n\r\n const startDocCamera = async () => {\r\n try {\r\n if (docStreamRef.current) {\r\n try { docStreamRef.current.getTracks().forEach(t => t.stop()); } catch {}\r\n docStreamRef.current = null;\r\n }\r\n const stream = await getRearStream();\r\n if (docVideoRef.current) {\r\n docVideoRef.current.srcObject = stream;\r\n await docVideoRef.current.play().catch(() => {});\r\n }\r\n docStreamRef.current = stream;\r\n } catch (e: any) {\r\n console.error('Could not start document camera:', e);\r\n setState(prev => ({ ...prev, isDocScanMode: false }));\r\n if (callbacks?.onError) {\r\n callbacks.onError(e);\r\n }\r\n }\r\n };\r\n\r\n const handleDocumentUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (state.loading) return;\r\n const file = event.target.files?.[0];\r\n if (!file) return;\r\n setState(prev => ({ ...prev, docFileName: file.name || '' }));\r\n try {\r\n const objectUrl = URL.createObjectURL(file);\r\n setState(prev => ({ ...prev, docPreviewUrl: objectUrl }));\r\n docPendingBlobRef.current = file;\r\n } catch (err: any) {\r\n console.error('Could not preview document:', err);\r\n if (callbacks?.onError) {\r\n callbacks.onError(err);\r\n }\r\n }\r\n };\r\n\r\n const handleConfirmDocumentUpload = async () => {\r\n if (state.loading || !docPendingBlobRef.current) return;\r\n setState(prev => ({ ...prev, loading: true }));\r\n try {\r\n const file = docPendingBlobRef.current as File;\r\n \r\n // Upload document if callback provided\r\n if (callbacks?.onDocumentUpload) {\r\n try {\r\n await callbacks.onDocumentUpload(file, state.docType);\r\n } catch (uploadError: any) {\r\n throw new Error(uploadError.message || 'Failed to upload document');\r\n }\r\n }\r\n \r\n if (callbacks?.onUpload) {\r\n callbacks.onUpload(file, state.docType);\r\n }\r\n \r\n setState(prev => ({\r\n ...prev,\r\n docPreviewUrl: null,\r\n docFileName: '',\r\n loading: false,\r\n }));\r\n docPendingBlobRef.current = null;\r\n } catch (err: any) {\r\n console.error('Document upload failed:', err);\r\n setState(prev => ({ ...prev, loading: false }));\r\n if (callbacks?.onError) {\r\n callbacks.onError(err);\r\n }\r\n }\r\n };\r\n\r\n const handleManualCapture = async () => {\r\n if (!docVideoRef.current || state.loading) return;\r\n \r\n setState(prev => ({ ...prev, loading: true }));\r\n try {\r\n const video = docVideoRef.current;\r\n \r\n // Create canvas and capture current frame\r\n const canvas = document.createElement('canvas');\r\n const width = video.videoWidth || 1280;\r\n const height = video.videoHeight || 720;\r\n canvas.width = width;\r\n canvas.height = height;\r\n \r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) throw new Error('Canvas not supported');\r\n \r\n // Draw video frame to canvas\r\n ctx.drawImage(video, 0, 0, width, height);\r\n \r\n // Convert to blob\r\n const blob = await new Promise<Blob>((resolve) => {\r\n canvas.toBlob((blob: Blob | null) => {\r\n resolve(blob || new Blob());\r\n }, 'image/jpeg', 0.92);\r\n });\r\n \r\n const file = new File([blob], 'document.jpg', { type: 'image/jpeg' });\r\n \r\n // Upload document if callback provided\r\n if (callbacks?.onDocumentUpload) {\r\n try {\r\n await callbacks.onDocumentUpload(file, state.docType);\r\n } catch (uploadError: any) {\r\n throw new Error(uploadError.message || 'Failed to upload document');\r\n }\r\n }\r\n \r\n // Create preview URL\r\n const objectUrl = URL.createObjectURL(file);\r\n setState(prev => ({\r\n ...prev,\r\n docPreviewUrl: objectUrl,\r\n isDocScanMode: false,\r\n loading: false,\r\n }));\r\n \r\n docPendingBlobRef.current = file;\r\n \r\n // Stop camera\r\n if (docStreamRef.current) {\r\n docStreamRef.current.getTracks().forEach((t) => t.stop());\r\n docStreamRef.current = null;\r\n }\r\n \r\n if (callbacks?.onScan) {\r\n callbacks.onScan(file, state.docType);\r\n }\r\n } catch (err: any) {\r\n console.error('Capture failed:', err);\r\n setState(prev => ({ ...prev, loading: false }));\r\n if (callbacks?.onError) {\r\n callbacks.onError(err);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (state.isDocScanMode) {\r\n startDocCamera();\r\n }\r\n \r\n return () => {\r\n if (docStreamRef.current) {\r\n docStreamRef.current.getTracks().forEach((t) => t.stop());\r\n docStreamRef.current = null;\r\n }\r\n };\r\n }, [state.isDocScanMode]);\r\n\r\n return {\r\n state,\r\n setState,\r\n fileInputRef,\r\n docVideoRef,\r\n handleDocumentUpload,\r\n handleConfirmDocumentUpload,\r\n handleManualCapture,\r\n startDocCamera,\r\n };\r\n}\r\n\r\n","import { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useDocumentUpload } from '../features/documentUpload/hooks/useDocumentUpload';\r\nimport { useKycContext } from '../contexts/KycContext';\r\nimport { COMPLETED_STEPS } from '../services/kycApiService';\r\nimport type { DocumentType } from '../features/documentUpload/types';\r\n\r\ninterface DocumentUploadModalProps {\r\n onComplete?: (file: File, docType: string) => void;\r\n}\r\n\r\nfunction DocumentUploadModal({ onComplete }: DocumentUploadModalProps) {\r\n const navigate = useNavigate();\r\n const { apiService } = useKycContext();\r\n const [sessionError, setSessionError] = useState<string | null>(null);\r\n const [kycCompleted, setKycCompleted] = useState(false);\r\n \r\n const {\r\n state,\r\n setState,\r\n fileInputRef,\r\n docVideoRef,\r\n handleDocumentUpload,\r\n handleConfirmDocumentUpload,\r\n handleManualCapture,\r\n startDocCamera,\r\n } = useDocumentUpload({\r\n onDocumentUpload: async (blob: Blob, docType: string) => {\r\n if (!apiService) {\r\n throw new Error('API service not initialized');\r\n }\r\n await apiService.uploadDocument(blob, docType);\r\n // Check if KYC is completed after document upload\r\n try {\r\n const statusResponse = await apiService.getSessionStatus();\r\n const { completed_steps, next_step } = statusResponse.data;\r\n if (next_step === 'completed' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {\r\n setKycCompleted(true);\r\n }\r\n } catch (error) {\r\n console.error('Error checking completion status:', error);\r\n }\r\n },\r\n onUpload: (file, docType) => {\r\n if (onComplete) {\r\n onComplete(file, docType);\r\n }\r\n },\r\n onScan: (file, docType) => {\r\n if (onComplete) {\r\n onComplete(file, docType);\r\n }\r\n },\r\n });\r\n \r\n // Check session status on mount\r\n useEffect(() => {\r\n const checkSession = async () => {\r\n if (!apiService) return;\r\n \r\n try {\r\n const statusResponse = await apiService.getSessionStatus();\r\n const { completed_steps, next_step, status } = statusResponse.data;\r\n \r\n // Check if KYC is completed\r\n if (status === 'COMPLETED' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {\r\n setKycCompleted(true);\r\n return;\r\n }\r\n \r\n // Check if session is active\r\n if (status !== 'ACTIVE') {\r\n throw new Error('Session expired or inactive');\r\n }\r\n \r\n // If document_upload is already completed, show completion message\r\n if (completed_steps.includes(COMPLETED_STEPS.DOCS)) {\r\n // Check if all steps are completed\r\n if (completed_steps.includes(COMPLETED_STEPS.FACE) && completed_steps.includes(COMPLETED_STEPS.DOCS)) {\r\n setKycCompleted(true);\r\n return;\r\n }\r\n }\r\n \r\n // If next_step is not document_upload and face_scan is not completed, redirect to face scan\r\n if (next_step === COMPLETED_STEPS.FACE && !completed_steps.includes(COMPLETED_STEPS.FACE)) {\r\n // Should not happen if we're in document upload modal, but handle it\r\n console.warn('Face scan not completed, but in document upload modal');\r\n }\r\n \r\n setSessionError(null);\r\n } catch (error: any) {\r\n const message = error.message || 'Session expired or inactive';\r\n setSessionError(message);\r\n // Redirect to QR page after showing error\r\n setTimeout(() => {\r\n navigate('/qr', { replace: true });\r\n }, 2000);\r\n }\r\n };\r\n \r\n checkSession();\r\n }, [apiService, navigate]);\r\n\r\n\r\n if (kycCompleted) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <div className=\"mb-4 text-6xl\">✅</div>\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-green-500\">\r\n KYC Completed\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4 text-lg\">\r\n All steps have been completed successfully.\r\n </p>\r\n <p className=\"text-[#9ca3af] text-sm mb-6\">\r\n Please return to your desktop to continue.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Show session error if present\r\n if (sessionError) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-4 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-red-500\">\r\n Session Expired\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4\">{sessionError}</p>\r\n <p className=\"text-[#9ca3af] text-sm\">Redirecting to QR code page...</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div \r\n className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\"\r\n style={{\r\n marginTop: state.docPreviewUrl && !state.isDocScanMode ? '192px' : '0'\r\n }}\r\n >\r\n <div className=\"relative mb-4\">\r\n <h2 className=\"m-0 mb-4 text-xl font-bold text-white\">\r\n Document\r\n </h2>\r\n </div>\r\n\r\n {!state.isDocScanMode && (\r\n <div className=\"grid gap-2 mb-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => fileInputRef.current?.click()}\r\n className=\"w-full py-3 px-4 rounded-lg border-2 border-dashed border-[#374151] bg-[#0f172a] text-[#e5e7eb] text-base cursor-pointer hover:border-[#4b5563] transition-colors\"\r\n >\r\n Upload Document\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setState(prev => ({ ...prev, isDocScanMode: true }));\r\n startDocCamera();\r\n }}\r\n className=\"w-full py-3 px-4 rounded-lg text-white border-none text-base cursor-pointer transition-opacity hover:opacity-90\"\r\n style={{\r\n background: \"linear-gradient(90deg, #FF8A00 0%, #FF3D77 100%)\"\r\n }}\r\n >\r\n Scan Document (Back Camera)\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex gap-3 mb-4\">\r\n <label className=\"flex items-center gap-1.5 text-[#e5e7eb] cursor-pointer\">\r\n <input\r\n type=\"radio\"\r\n name=\"doc-type\"\r\n value=\"CNIC\"\r\n checked={state.docType === \"CNIC\"}\r\n defaultChecked\r\n onChange={() => setState(prev => ({ ...prev, docType: \"CNIC\" as DocumentType }))}\r\n className=\"cursor-pointer w-4 h-4\"\r\n style={{\r\n accentColor: state.docType === \"CNIC\" ? \"#ef4444\" : \"#6b7280\"\r\n }}\r\n />\r\n NIC\r\n </label>\r\n <label className=\"flex items-center gap-1.5 text-[#e5e7eb] cursor-pointer\">\r\n <input\r\n type=\"radio\"\r\n name=\"doc-type\"\r\n value=\"Passport\"\r\n checked={state.docType === \"Passport\"}\r\n onChange={() => setState(prev => ({ ...prev, docType: \"Passport\" as DocumentType }))}\r\n className=\"cursor-pointer w-4 h-4\"\r\n style={{\r\n accentColor: state.docType === \"Passport\" ? \"#ef4444\" : \"#6b7280\"\r\n }}\r\n />\r\n Passport\r\n </label>\r\n </div>\r\n\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/*,.pdf\"\r\n onChange={handleDocumentUpload}\r\n className=\"hidden\"\r\n />\r\n\r\n {state.isDocScanMode && (\r\n <div className=\"grid gap-3 mt-2\">\r\n <div className=\"relative w-full aspect-[3/4] rounded-lg overflow-hidden bg-black\">\r\n <video\r\n ref={docVideoRef}\r\n playsInline\r\n muted\r\n autoPlay\r\n className=\"w-full h-full object-cover\"\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleManualCapture}\r\n disabled={state.loading}\r\n className=\"flex-1 py-3 px-4 rounded-lg text-white border-none text-base cursor-pointer transition-opacity disabled:opacity-50 disabled:cursor-not-allowed hover:opacity-90\"\r\n style={{\r\n background: \"linear-gradient(90deg, #FF8A00 0%, #FF3D77 100%)\"\r\n }}\r\n >\r\n {state.loading ? \"Capturing...\" : \"Capture Document\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setState(prev => ({ ...prev, isDocScanMode: false }));\r\n }}\r\n disabled={state.loading}\r\n className=\"py-3 px-4 rounded-lg bg-[#111827] text-[#e5e7eb] border-none text-base cursor-pointer hover:bg-[#1f2937] transition-colors disabled:opacity-50\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n <p className=\"m-0 text-[#9ca3af] text-xs text-center\">\r\n {state.loading \r\n ? \"Processing document...\" \r\n : \"Position your document in the frame and tap 'Capture Document' when ready.\"}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {state.docFileName && !state.isDocScanMode && (\r\n <div className=\"inline-flex items-center gap-2 py-2 px-3 rounded-full bg-[#1f2937] text-[#e5e7eb] text-sm mb-3\">\r\n <span>✔</span>\r\n <span>File selected</span>\r\n </div>\r\n )}\r\n\r\n {state.loading && !state.isDocScanMode && (\r\n <p className=\"m-3 mt-0 text-[#60a5fa] text-center\">\r\n Processing...\r\n </p>\r\n )}\r\n\r\n {!state.isDocScanMode && state.docPreviewUrl && (\r\n <div className=\"mt-3\">\r\n <div className=\"font-semibold mb-1.5 text-[#e5e7eb]\">Preview</div>\r\n <img src={state.docPreviewUrl} alt=\"Document preview\" className=\"w-full rounded-lg border border-[#374151]\" />\r\n <div className=\"grid gap-2 grid-cols-2 mt-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleConfirmDocumentUpload}\r\n disabled={state.loading}\r\n className=\"py-3 px-4 rounded-lg text-white border-none text-base cursor-pointer w-full transition-opacity disabled:opacity-50 disabled:cursor-not-allowed hover:opacity-90\"\r\n style={{\r\n background: \"linear-gradient(90deg, #10b981 0%, #059669 100%)\"\r\n }}\r\n >\r\n {state.loading ? \"Uploading...\" : \"Looks good, continue\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setState(prev => ({\r\n ...prev,\r\n docPreviewUrl: null,\r\n docFileName: \"\",\r\n }));\r\n }}\r\n disabled={state.loading}\r\n className=\"py-3 px-4 rounded-lg bg-[#111827] text-[#e5e7eb] border-none text-base cursor-pointer w-full hover:bg-[#1f2937] transition-colors disabled:opacity-50\"\r\n >\r\n Retake / Choose again\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!state.isDocScanMode && !state.docFileName && !state.docPreviewUrl && (\r\n <p className=\"m-0 text-[#9ca3af] text-xs text-center\">\r\n After uploading or scanning, return to your desktop to check status.\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DocumentUploadModal;\r\n\r\n","import { useRef, useState, useEffect } from 'react';\r\n\r\nexport function useCamera() {\r\n const videoRef = useRef<HTMLVideoElement>(null);\r\n const streamRef = useRef<MediaStream | null>(null);\r\n const [cameraReady, setCameraReady] = useState(false);\r\n\r\n const startCamera = async () => {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({ \r\n video: { \r\n facingMode: \"user\",\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 }\r\n }, \r\n audio: false \r\n });\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = stream;\r\n await videoRef.current.play().catch(() => { });\r\n requestAnimationFrame(() => {\r\n try {\r\n const v = videoRef.current!;\r\n // Canvas will be synced separately\r\n } catch { }\r\n });\r\n }\r\n streamRef.current = stream;\r\n setCameraReady(true);\r\n } catch (e: any) {\r\n console.error('Camera access error:', e);\r\n setCameraReady(false);\r\n throw e;\r\n }\r\n };\r\n\r\n const stopCamera = () => {\r\n if (streamRef.current) {\r\n streamRef.current.getTracks().forEach((t) => t.stop());\r\n streamRef.current = null;\r\n }\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = null;\r\n }\r\n setCameraReady(false);\r\n };\r\n\r\n useEffect(() => {\r\n startCamera();\r\n return () => {\r\n stopCamera();\r\n };\r\n }, []);\r\n\r\n return {\r\n videoRef,\r\n cameraReady,\r\n startCamera,\r\n stopCamera,\r\n };\r\n}\r\n\r\n","import { FaceMesh, FACEMESH_TESSELATION, FACEMESH_FACE_OVAL, FACEMESH_LEFT_EYE, FACEMESH_RIGHT_EYE, FACEMESH_LIPS } from '@mediapipe/face_mesh';\r\nimport { drawConnectors, drawLandmarks as drawMPLandmarks } from '@mediapipe/drawing_utils';\r\n\r\nexport type LivenessStage = 'CENTER' | 'LEFT' | 'RIGHT' | 'SNAP' | 'DONE';\r\n\r\nexport interface FaceMeshServiceCallbacks {\r\n onFaceDetected?: (faceOnCanvas: Array<{ x: number; y: number }>) => void;\r\n onLivenessUpdate?: (stage: LivenessStage, instruction: string) => void;\r\n onModelLoaded?: () => void;\r\n onModelFailed?: (error: Error) => void;\r\n onCaptureTrigger?: () => void;\r\n}\r\n\r\nexport interface LivenessState {\r\n centerHold: number;\r\n leftHold: number;\r\n rightHold: number;\r\n snapTriggered: boolean;\r\n lastResultsAt: number;\r\n stage: LivenessStage;\r\n livenessReady: boolean;\r\n currentYaw: number | null;\r\n currentAbsYaw: number | null;\r\n livenessCompleted: boolean;\r\n}\r\n\r\nexport class FaceMeshService {\r\n private faceMesh: FaceMesh | null = null;\r\n private videoRef: React.RefObject<HTMLVideoElement | null>;\r\n private canvasRef: React.RefObject<HTMLCanvasElement | null>;\r\n private callbacks: FaceMeshServiceCallbacks;\r\n private cameraDriverRef: React.MutableRefObject<number | null>;\r\n private livenessStateRef: React.MutableRefObject<LivenessState>;\r\n private cancelled = false;\r\n\r\n constructor(\r\n videoRef: React.RefObject<HTMLVideoElement | null>,\r\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\r\n cameraDriverRef: React.MutableRefObject<number | null>,\r\n livenessStateRef: React.MutableRefObject<LivenessState>,\r\n callbacks: FaceMeshServiceCallbacks\r\n ) {\r\n this.videoRef = videoRef;\r\n this.canvasRef = canvasRef;\r\n this.cameraDriverRef = cameraDriverRef;\r\n this.livenessStateRef = livenessStateRef;\r\n this.callbacks = callbacks;\r\n }\r\n\r\n private drawOverlays(ctx: CanvasRenderingContext2D, normalized: Array<{ x: number; y: number }>) {\r\n drawConnectors(ctx, normalized as any, FACEMESH_TESSELATION, { color: \"#60a5fa\", lineWidth: 0.5 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_FACE_OVAL, { color: \"#f59e0b\", lineWidth: 2 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_LEFT_EYE, { color: \"#10b981\", lineWidth: 1.5 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_RIGHT_EYE, { color: \"#ef4444\", lineWidth: 1.5 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_LIPS, { color: \"#a855f7\", lineWidth: 1.5 });\r\n drawMPLandmarks(ctx, normalized as any, { color: \"#2563eb\", lineWidth: 0, radius: 1.5 });\r\n }\r\n\r\n private processResults(results: any) {\r\n const canvas = this.canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n \r\n const dpr = Math.max(1, Math.min(3, window.devicePixelRatio || 1));\r\n const displayW = (canvas.parentElement as HTMLElement)?.clientWidth || canvas.width;\r\n const displayH = (canvas.parentElement as HTMLElement)?.clientHeight || canvas.height;\r\n if (canvas.width !== Math.round(displayW * dpr) || canvas.height !== Math.round(displayH * dpr)) {\r\n canvas.width = Math.round(displayW * dpr);\r\n canvas.height = Math.round(displayH * dpr);\r\n }\r\n const w = canvas.width, h = canvas.height;\r\n \r\n ctx.fillStyle = 'rgb(0, 0, 0)';\r\n ctx.fillRect(0, 0, w, h);\r\n \r\n const faces = results.multiFaceLandmarks as Array<Array<{ x: number; y: number }>> | undefined;\r\n const face = faces && faces[0];\r\n \r\n if (face) {\r\n const vid = this.videoRef.current as HTMLVideoElement | null;\r\n const vidW = Math.max(1, vid?.videoWidth || displayW);\r\n const vidH = Math.max(1, vid?.videoHeight || displayH);\r\n const scale = Math.max(w / vidW, h / vidH);\r\n const offsetX = (w - vidW * scale) / 2;\r\n const offsetY = (h - vidH * scale) / 2;\r\n \r\n const faceOnCanvas = face.map(p => {\r\n const mappedX = (p.x * vidW * scale + offsetX) / w;\r\n return {\r\n x: 1 - mappedX,\r\n y: (p.y * vidH * scale + offsetY) / h,\r\n };\r\n });\r\n\r\n const guideCX = w / 2;\r\n const guideCY = h / 2;\r\n const guideR = Math.min(w, h) * 0.45;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.arc(guideCX, guideCY, guideR, 0, Math.PI * 2);\r\n ctx.clip();\r\n ctx.drawImage(vid!, offsetX, offsetY, vidW * scale, vidH * scale);\r\n ctx.restore();\r\n\r\n this.drawOverlays(ctx, faceOnCanvas as any);\r\n \r\n this.livenessStateRef.current.lastResultsAt = Date.now();\r\n \r\n if (this.callbacks.onFaceDetected) {\r\n this.callbacks.onFaceDetected(faceOnCanvas);\r\n }\r\n\r\n this.processLiveness(faceOnCanvas, w, h);\r\n } else {\r\n // Reset face orientation when no face is detected\r\n this.livenessStateRef.current.currentYaw = null;\r\n this.livenessStateRef.current.currentAbsYaw = null;\r\n \r\n const vid = this.videoRef.current as HTMLVideoElement | null;\r\n if (vid) {\r\n const vidW = Math.max(1, vid?.videoWidth || displayW);\r\n const vidH = Math.max(1, vid?.videoHeight || displayH);\r\n const scale = Math.max(w / vidW, h / vidH);\r\n const offsetX = (w - vidW * scale) / 2;\r\n const offsetY = (h - vidH * scale) / 2;\r\n \r\n const guideCX = w / 2;\r\n const guideCY = h / 2;\r\n const guideR = Math.min(w, h) * 0.45;\r\n \r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.arc(guideCX, guideCY, guideR, 0, Math.PI * 2);\r\n ctx.clip();\r\n ctx.drawImage(vid, offsetX, offsetY, vidW * scale, vidH * scale);\r\n ctx.restore();\r\n }\r\n \r\n if (Date.now() - this.livenessStateRef.current.lastResultsAt > 2000) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(\r\n this.livenessStateRef.current.stage,\r\n \"No face detected. Center your face in frame with good lighting.\"\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private processLiveness(faceOnCanvas: Array<{ x: number; y: number }>, w: number, h: number) {\r\n const eyeA = faceOnCanvas[33];\r\n const eyeB = faceOnCanvas[263];\r\n const flipX = (p: any) => ({ x: 1 - p.x, y: p.y });\r\n const eA = flipX(eyeA);\r\n const eB = flipX(eyeB);\r\n const n1 = faceOnCanvas[1];\r\n const n4 = faceOnCanvas[4];\r\n const nT = flipX(n1 && n4 ? { x: (n1.x + n4.x) / 2, y: (n1.y + n4.y) / 2 } : (n1 || n4 || faceOnCanvas[197]));\r\n const leftEyeOuter = eA.x < eB.x ? eA : eB;\r\n const rightEyeOuter = eA.x < eB.x ? eB : eA;\r\n \r\n if (leftEyeOuter && rightEyeOuter && nT) {\r\n const faceWidth = Math.abs(rightEyeOuter.x - leftEyeOuter.x);\r\n const midX = (leftEyeOuter.x + rightEyeOuter.x) / 2;\r\n const yaw = (nT.x - midX) / Math.max(1e-6, faceWidth);\r\n const absYaw = Math.abs(yaw);\r\n \r\n // Store current face orientation for capture validation\r\n this.livenessStateRef.current.currentYaw = yaw;\r\n this.livenessStateRef.current.currentAbsYaw = absYaw;\r\n \r\n const xs = faceOnCanvas.map(p => p.x), ys = faceOnCanvas.map(p => p.y);\r\n const minX = Math.min(...xs) * w, maxX = Math.max(...xs) * w;\r\n const minY = Math.min(...ys) * h, maxY = Math.max(...ys) * h;\r\n const boxCX = (minX + maxX) / 2, boxCY = (minY + maxY) / 2;\r\n const guideCX = w / 2;\r\n const guideCY = h / 2;\r\n const guideR = Math.min(w, h) * 0.45;\r\n const dx = boxCX - guideCX;\r\n const dy = boxCY - guideCY;\r\n const insideGuide = (dx * dx + dy * dy) <= (guideR * guideR)\r\n && (maxX - minX) <= guideR * 2 * 1.05 && (maxY - minY) <= guideR * 2 * 1.05;\r\n \r\n if (!this.livenessStateRef.current.livenessReady) {\r\n this.livenessStateRef.current.livenessReady = true;\r\n }\r\n \r\n const centerThreshold = 0.05;\r\n const leftThreshold = 0.08;\r\n const rightThreshold = 0.08;\r\n const holdFramesCenter = 12;\r\n const holdFramesTurn = 12;\r\n \r\n const state = this.livenessStateRef.current;\r\n \r\n if (state.stage === \"CENTER\") {\r\n if (!insideGuide) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Center your face inside the circle\");\r\n }\r\n } else if (absYaw < centerThreshold) {\r\n state.centerHold += 1;\r\n if (state.centerHold >= holdFramesCenter) {\r\n // Only transition to LEFT if liveness check hasn't been completed yet\r\n if (!state.livenessCompleted) {\r\n const newStage: LivenessStage = \"LEFT\";\r\n state.stage = newStage;\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(newStage, \"Turn your face LEFT\");\r\n }\r\n }\r\n }\r\n } else {\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, yaw > 0 ? \"Move your face slightly LEFT\" : \"Move your face slightly RIGHT\");\r\n }\r\n }\r\n } else if (state.stage === \"LEFT\") {\r\n if (faceWidth < 0.08) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Move closer to the camera\");\r\n }\r\n } else if (yaw < -leftThreshold) {\r\n state.leftHold += 1;\r\n if (state.leftHold >= holdFramesTurn) {\r\n const newStage: LivenessStage = \"RIGHT\";\r\n state.stage = newStage;\r\n state.leftHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(newStage, \"Great! Now turn your face RIGHT\");\r\n }\r\n }\r\n } else {\r\n state.leftHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, yaw > rightThreshold ? \"You're facing right. Turn LEFT\" : \"Turn a bit more LEFT\");\r\n }\r\n }\r\n } else if (state.stage === \"RIGHT\") {\r\n if (faceWidth < 0.08) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Move closer to the camera\");\r\n }\r\n } else if (yaw > rightThreshold) {\r\n state.rightHold += 1;\r\n if (state.rightHold >= holdFramesTurn) {\r\n state.rightHold = 0;\r\n // Mark liveness as completed and transition to DONE stage\r\n state.livenessCompleted = true;\r\n const newStage: LivenessStage = \"DONE\";\r\n state.stage = newStage;\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(newStage, \"Great! Now look straight at the camera\");\r\n }\r\n }\r\n } else {\r\n state.rightHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, yaw < -leftThreshold ? \"You're facing left. Turn RIGHT\" : \"Turn a bit more RIGHT\");\r\n }\r\n }\r\n } else if (state.stage === \"DONE\") {\r\n // In DONE stage, wait for face to be straight before capturing (no center check needed)\r\n // Reduced threshold for easier capture when face is straight\r\n const reducedThreshold = 0.08; // More lenient threshold\r\n if (absYaw < reducedThreshold) {\r\n state.centerHold += 1;\r\n if (state.centerHold >= holdFramesCenter && !state.snapTriggered) {\r\n state.snapTriggered = true;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Capturing...\");\r\n }\r\n if (this.callbacks.onCaptureTrigger) {\r\n this.callbacks.onCaptureTrigger();\r\n }\r\n }\r\n } else {\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Please look straight at the camera\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private waitForVideoReady(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let attempts = 0;\r\n const maxAttempts = 100;\r\n \r\n const checkReady = () => {\r\n if (this.cancelled) {\r\n reject(new Error('Cancelled'));\r\n return;\r\n }\r\n \r\n const video = this.videoRef.current;\r\n if (\r\n video &&\r\n video.readyState >= 2 &&\r\n video.videoWidth > 0 &&\r\n video.videoHeight > 0 &&\r\n !isNaN(video.videoWidth) &&\r\n !isNaN(video.videoHeight)\r\n ) {\r\n resolve();\r\n } else if (attempts >= maxAttempts) {\r\n if (video) {\r\n resolve();\r\n } else {\r\n reject(new Error('Video not ready'));\r\n }\r\n } else {\r\n attempts++;\r\n requestAnimationFrame(checkReady);\r\n }\r\n };\r\n checkReady();\r\n });\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n try {\r\n const fm = new FaceMesh({ \r\n locateFile: (file: string) => `https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh@0.4.1633559619/${file}` \r\n });\r\n fm.setOptions({\r\n selfieMode: true,\r\n maxNumFaces: 1,\r\n refineLandmarks: true,\r\n minDetectionConfidence: 0.5,\r\n minTrackingConfidence: 0.5\r\n } as any);\r\n \r\n this.faceMesh = fm;\r\n \r\n if (this.cancelled) return;\r\n \r\n if (this.callbacks.onModelLoaded) {\r\n this.callbacks.onModelLoaded();\r\n }\r\n \r\n fm.onResults((results) => {\r\n if (!this.cancelled) {\r\n this.processResults(results);\r\n }\r\n });\r\n \r\n if (this.videoRef.current) {\r\n try {\r\n await this.waitForVideoReady();\r\n } catch (error) {\r\n if (!this.cancelled) {\r\n console.debug('Video ready check failed, continuing anyway:', error);\r\n }\r\n }\r\n \r\n const tick = async () => {\r\n if (this.cancelled) return;\r\n if (!this.videoRef.current || !this.faceMesh) return;\r\n \r\n const video = this.videoRef.current;\r\n if (\r\n video.readyState >= 2 &&\r\n video.videoWidth > 0 &&\r\n video.videoHeight > 0 &&\r\n !isNaN(video.videoWidth) &&\r\n !isNaN(video.videoHeight)\r\n ) {\r\n try {\r\n await this.faceMesh.send({ image: video as HTMLVideoElement });\r\n } catch (error) {\r\n if (!this.cancelled) {\r\n console.debug('MediaPipe send error (non-critical):', error);\r\n }\r\n }\r\n }\r\n \r\n if (!this.cancelled) {\r\n this.cameraDriverRef.current = requestAnimationFrame(tick);\r\n }\r\n };\r\n \r\n this.cameraDriverRef.current = requestAnimationFrame(tick);\r\n }\r\n } catch (e) {\r\n if (!this.cancelled && this.callbacks.onModelFailed) {\r\n this.callbacks.onModelFailed(e as Error);\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n cleanup(): void {\r\n this.cancelled = true;\r\n if (this.cameraDriverRef.current) {\r\n cancelAnimationFrame(this.cameraDriverRef.current);\r\n this.cameraDriverRef.current = null;\r\n }\r\n if (this.faceMesh) {\r\n try {\r\n (this.faceMesh as any).close?.();\r\n } catch {}\r\n this.faceMesh = null;\r\n }\r\n }\r\n}\r\n\r\n","import { useRef, useState, useEffect, useCallback } from 'react';\r\nimport { FaceMeshService } from '../../../services/faceMeshService';\r\nimport type { LivenessStage } from '../../../services/faceMeshService';\r\nimport type { FaceScanState, LivenessRefs } from '../types';\r\n\r\nexport interface FaceScanCallbacks {\r\n onFaceCaptureComplete?: (imageData: string) => void;\r\n onLivenessFailedCallback?: (failed: boolean) => void;\r\n onFaceUpload?: (blob: Blob) => Promise<void>;\r\n}\r\n\r\nexport function useFaceScan(\r\n videoRef: React.RefObject<HTMLVideoElement | null>,\r\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\r\n callbacks?: FaceScanCallbacks\r\n) {\r\n const [state, setState] = useState<FaceScanState>({\r\n cameraReady: false,\r\n livenessStage: 'CENTER',\r\n livenessReady: false,\r\n livenessFailed: false,\r\n modelLoading: true,\r\n modelLoaded: false,\r\n livenessInstruction: 'Look straight at the camera',\r\n loading: false,\r\n allStepsCompleted: false,\r\n capturedImage: null,\r\n showDocumentUpload: false,\r\n });\r\n\r\n const refs: LivenessRefs = {\r\n centerHold: useRef<number>(0),\r\n leftHold: useRef<number>(0),\r\n rightHold: useRef<number>(0),\r\n snapTriggered: useRef<boolean>(false),\r\n lastResultsAt: useRef<number>(0),\r\n livenessStage: useRef<LivenessStage>('CENTER'),\r\n cameraDriver: useRef<number | null>(null),\r\n modelLoaded: useRef<boolean>(false),\r\n livenessFailed: useRef<boolean>(false),\r\n handleFaceCapture: useRef<(() => void) | null>(null),\r\n };\r\n\r\n const livenessStateRef = useRef({\r\n centerHold: 0,\r\n leftHold: 0,\r\n rightHold: 0,\r\n snapTriggered: false,\r\n lastResultsAt: 0,\r\n stage: 'CENTER' as LivenessStage,\r\n livenessReady: false,\r\n currentYaw: null as number | null,\r\n currentAbsYaw: null as number | null,\r\n livenessCompleted: false,\r\n });\r\n\r\n // Sync refs with state\r\n useEffect(() => {\r\n livenessStateRef.current.centerHold = refs.centerHold.current;\r\n livenessStateRef.current.leftHold = refs.leftHold.current;\r\n livenessStateRef.current.rightHold = refs.rightHold.current;\r\n livenessStateRef.current.snapTriggered = refs.snapTriggered.current;\r\n livenessStateRef.current.lastResultsAt = refs.lastResultsAt.current;\r\n livenessStateRef.current.stage = state.livenessStage;\r\n livenessStateRef.current.livenessReady = state.livenessReady;\r\n }, [state.livenessStage, state.livenessReady]);\r\n\r\n useEffect(() => {\r\n refs.livenessStage.current = state.livenessStage;\r\n }, [state.livenessStage]);\r\n\r\n const setStage = useCallback((next: LivenessStage) => {\r\n refs.livenessStage.current = next;\r\n livenessStateRef.current.stage = next;\r\n setState(prev => ({ ...prev, livenessStage: next }));\r\n }, []);\r\n\r\n const handleFaceCapture = useCallback(async () => {\r\n if (!videoRef.current) return;\r\n \r\n // Check if face is straight before capturing (reduced threshold, no center check)\r\n const reducedThreshold = 0.08; // More lenient threshold - only check if face is straight\r\n const currentAbsYaw = livenessStateRef.current.currentAbsYaw;\r\n \r\n if (currentAbsYaw === null || currentAbsYaw === undefined) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: \"Please position your face in front of the camera\",\r\n }));\r\n return;\r\n }\r\n \r\n if (currentAbsYaw >= reducedThreshold) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: \"Please look straight at the camera before capturing\",\r\n }));\r\n return;\r\n }\r\n \r\n setState(prev => ({ ...prev, loading: true }));\r\n try {\r\n const video = videoRef.current;\r\n const canvas = document.createElement(\"canvas\");\r\n const width = video.videoWidth || 640;\r\n const height = video.videoHeight || 480;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) throw new Error(\"Canvas not supported\");\r\n ctx.drawImage(video, 0, 0, width, height);\r\n const dataUrl = canvas.toDataURL(\"image/jpeg\", 0.92);\r\n \r\n // Convert data URL to blob\r\n const blob = await (await fetch(dataUrl)).blob();\r\n \r\n // Upload face scan if callback provided\r\n if (callbacks?.onFaceUpload) {\r\n try {\r\n await callbacks.onFaceUpload(blob);\r\n // Only proceed if upload was successful (not face already registered)\r\n setState(prev => ({\r\n ...prev,\r\n capturedImage: dataUrl,\r\n allStepsCompleted: true,\r\n livenessInstruction: \"Face captured and uploaded successfully!\",\r\n loading: false,\r\n }));\r\n \r\n // Call completion callback\r\n if (callbacks?.onFaceCaptureComplete) {\r\n callbacks.onFaceCaptureComplete(dataUrl);\r\n }\r\n \r\n setTimeout(() => {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n }, 500);\r\n } catch (uploadError: any) {\r\n // If it's the face already registered error, don't show document upload\r\n if (uploadError.message === 'FACE_ALREADY_REGISTERED' || (uploadError as any).isFaceAlreadyRegistered) {\r\n setState(prev => ({\r\n ...prev,\r\n loading: false,\r\n allStepsCompleted: false,\r\n showDocumentUpload: false,\r\n livenessInstruction: \"Face already registered. Please click Retry to register again.\",\r\n }));\r\n return; // Don't proceed to document upload\r\n }\r\n // For other errors, show error message\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: uploadError.message || 'Error capturing image. Please try again.',\r\n loading: false,\r\n }));\r\n throw uploadError;\r\n }\r\n } else {\r\n setState(prev => ({\r\n ...prev,\r\n capturedImage: dataUrl,\r\n allStepsCompleted: true,\r\n livenessInstruction: \"Face captured successfully!\",\r\n loading: false,\r\n }));\r\n \r\n // Call completion callback\r\n if (callbacks?.onFaceCaptureComplete) {\r\n callbacks.onFaceCaptureComplete(dataUrl);\r\n }\r\n \r\n setTimeout(() => {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n }, 500);\r\n }\r\n } catch (err: any) {\r\n console.error('Error capturing image:', err);\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: err.message || 'Error capturing image. Please try again.',\r\n loading: false,\r\n }));\r\n }\r\n }, [callbacks]);\r\n\r\n useEffect(() => {\r\n refs.handleFaceCapture.current = handleFaceCapture;\r\n }, [handleFaceCapture]);\r\n\r\n useEffect(() => {\r\n if (!state.cameraReady) return;\r\n \r\n let service: FaceMeshService | null = null;\r\n let initTimeoutId: number | null = null;\r\n let cancelled = false;\r\n\r\n const start = async () => {\r\n try {\r\n service = new FaceMeshService(\r\n videoRef,\r\n canvasRef,\r\n refs.cameraDriver,\r\n livenessStateRef,\r\n {\r\n onModelLoaded: () => {\r\n if (cancelled) return;\r\n setState(prev => ({\r\n ...prev,\r\n modelLoaded: true,\r\n modelLoading: false,\r\n }));\r\n refs.modelLoaded.current = true;\r\n },\r\n onModelFailed: (error) => {\r\n if (cancelled) return;\r\n setState(prev => ({\r\n ...prev,\r\n livenessFailed: true,\r\n modelLoading: false,\r\n modelLoaded: false,\r\n }));\r\n refs.livenessFailed.current = true;\r\n console.error(\"mediapipe facemesh init error\", error);\r\n },\r\n onLivenessUpdate: (stage, instruction) => {\r\n if (cancelled) return;\r\n setState(prev => ({\r\n ...prev,\r\n livenessStage: stage,\r\n livenessInstruction: instruction,\r\n livenessReady: true,\r\n }));\r\n livenessStateRef.current.stage = stage;\r\n refs.livenessStage.current = stage;\r\n // Sync hold counts from service state\r\n refs.centerHold.current = livenessStateRef.current.centerHold;\r\n refs.leftHold.current = livenessStateRef.current.leftHold;\r\n refs.rightHold.current = livenessStateRef.current.rightHold;\r\n refs.snapTriggered.current = livenessStateRef.current.snapTriggered;\r\n },\r\n onCaptureTrigger: () => {\r\n if (cancelled) return;\r\n if (refs.handleFaceCapture.current) {\r\n refs.handleFaceCapture.current();\r\n }\r\n },\r\n }\r\n );\r\n\r\n await service.initialize();\r\n } catch (e) {\r\n if (!cancelled && refs.livenessFailed.current === false) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessFailed: true,\r\n modelLoading: false,\r\n modelLoaded: false,\r\n }));\r\n refs.livenessFailed.current = true;\r\n }\r\n }\r\n };\r\n\r\n initTimeoutId = window.setTimeout(() => {\r\n if (!cancelled && !refs.modelLoaded.current && !refs.livenessFailed.current) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessFailed: true,\r\n modelLoading: false,\r\n }));\r\n refs.livenessFailed.current = true;\r\n }\r\n }, 8000);\r\n\r\n start();\r\n\r\n // Cleanup function - must return a function, not a Promise\r\n return () => {\r\n cancelled = true;\r\n if (initTimeoutId) {\r\n window.clearTimeout(initTimeoutId);\r\n initTimeoutId = null;\r\n }\r\n if (service) {\r\n service.cleanup();\r\n service = null;\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [state.cameraReady]);\r\n\r\n return {\r\n state,\r\n setState,\r\n refs,\r\n setStage,\r\n handleFaceCapture,\r\n };\r\n}\r\n\r\n","import { useEffect, useState } from 'react';\r\n\r\ninterface ToastProps {\r\n message: string;\r\n type?: 'success' | 'error' | 'info' | 'warning';\r\n duration?: number;\r\n onClose?: () => void;\r\n}\r\n\r\nexport function Toast({ message, type = 'info', duration = 5000, onClose }: ToastProps) {\r\n const [isVisible, setIsVisible] = useState(true);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n setIsVisible(false);\r\n setTimeout(() => {\r\n if (onClose) onClose();\r\n }, 300); // Wait for fade out animation\r\n }, duration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [duration, onClose]);\r\n\r\n const bgColor = {\r\n success: 'bg-green-600',\r\n error: 'bg-red-600',\r\n info: 'bg-blue-600',\r\n warning: 'bg-yellow-600',\r\n }[type];\r\n\r\n return (\r\n <div\r\n className={`fixed top-4 right-4 z-[10000] transition-all duration-300 ${\r\n isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-2'\r\n }`}\r\n >\r\n <div\r\n className={`${bgColor} text-white px-6 py-4 rounded-lg shadow-lg flex items-center gap-3 min-w-[300px] max-w-[500px]`}\r\n >\r\n <div className=\"flex-1\">\r\n <p className=\"m-0 text-sm font-medium\">{message}</p>\r\n </div>\r\n <button\r\n onClick={() => {\r\n setIsVisible(false);\r\n setTimeout(() => {\r\n if (onClose) onClose();\r\n }, 300);\r\n }}\r\n className=\"text-white hover:text-gray-200 transition-colors\"\r\n aria-label=\"Close\"\r\n >\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ToastContainerProps {\r\n toasts: Array<{ id: string; message: string; type?: 'success' | 'error' | 'info' | 'warning' }>;\r\n onRemove: (id: string) => void;\r\n}\r\n\r\nexport function ToastContainer({ toasts, onRemove }: ToastContainerProps) {\r\n return (\r\n <div className=\"fixed top-4 right-4 z-[10000] flex flex-col gap-2\">\r\n {toasts.map((toast) => (\r\n <Toast\r\n key={toast.id}\r\n message={toast.message}\r\n type={toast.type}\r\n onClose={() => onRemove(toast.id)}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n","import { useRef, useEffect, useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport DocumentUploadModal from './DocumentUploadModal';\r\nimport { useCamera } from '../features/faceScan/hooks/useCamera';\r\nimport { useFaceScan } from '../features/faceScan/hooks/useFaceScan';\r\nimport { useKycContext } from '../contexts/KycContext';\r\nimport { Toast } from '../components/Toast';\r\nimport { COMPLETED_STEPS } from '../services/kycApiService';\r\nimport '../index.css';\r\n\r\ninterface FaceScanModalProps {\r\n onClose: () => void;\r\n onComplete?: (capturedImage: string) => void;\r\n}\r\n\r\nfunction FaceScanModal({ onComplete }: FaceScanModalProps) {\r\n const faceCanvasRef = useRef<HTMLCanvasElement>(null);\r\n const navigate = useNavigate();\r\n const { apiService } = useKycContext();\r\n const [sessionError, setSessionError] = useState<string | null>(null);\r\n const [toast, setToast] = useState<{ message: string; type: 'success' | 'error' | 'info' | 'warning' } | null>(null);\r\n const [showRetryButton, setShowRetryButton] = useState(false);\r\n const [isRetrying, setIsRetrying] = useState(false);\r\n const [kycCompleted, setKycCompleted] = useState(false);\r\n \r\n const { videoRef, cameraReady, stopCamera } = useCamera();\r\n const { state, setState, refs, handleFaceCapture } = useFaceScan(videoRef, faceCanvasRef, {\r\n onFaceUpload: async (blob: Blob) => {\r\n if (!apiService) {\r\n throw new Error('API service not initialized');\r\n }\r\n try {\r\n await apiService.uploadFaceScan(blob);\r\n } catch (error: any) {\r\n const errorMessage = error?.message || '';\r\n const errorData = (error as any)?.errorData || {};\r\n const statusCode = (error as any)?.statusCode;\r\n \r\n // Check for \"Face already registered\" error in various formats\r\n // The API returns: { success: false, statusCode: 500, message: \"Face already registered\", errorData: {...} }\r\n const isFaceAlreadyRegistered = \r\n errorMessage.includes('Face already registered') || \r\n errorMessage.includes('already registered') ||\r\n errorData?.message?.includes('Face already registered') ||\r\n (statusCode === 500 && errorMessage.includes('Face already registered'));\r\n \r\n if (isFaceAlreadyRegistered) {\r\n setShowRetryButton(true);\r\n setToast({\r\n message: 'Face already registered. Click Retry to register again.',\r\n type: 'warning',\r\n });\r\n setState(prev => ({ ...prev, loading: false, allStepsCompleted: false, showDocumentUpload: false }));\r\n // Throw a special error to prevent continuing to document upload\r\n const faceRegisteredError = new Error('FACE_ALREADY_REGISTERED');\r\n (faceRegisteredError as any).isFaceAlreadyRegistered = true;\r\n throw faceRegisteredError;\r\n }\r\n throw error;\r\n }\r\n },\r\n onFaceCaptureComplete: (imageData: string) => {\r\n if (onComplete) {\r\n onComplete(imageData);\r\n }\r\n },\r\n });\r\n \r\n useEffect(() => {\r\n const checkSession = async () => {\r\n if (!apiService) return;\r\n \r\n try {\r\n const statusResponse = await apiService.getSessionStatus();\r\n const { completed_steps, next_step, status } = statusResponse.data;\r\n \r\n // Check if session is active\r\n if (status !== 'ACTIVE') {\r\n throw new Error('Session expired or inactive');\r\n }\r\n \r\n // Check if KYC is completed\r\n if (status === 'COMPLETED' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {\r\n setKycCompleted(true);\r\n return;\r\n }\r\n \r\n // If face_scan is already completed, skip to document upload\r\n if (completed_steps.includes(COMPLETED_STEPS.FACE)) {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n return;\r\n }\r\n \r\n // If next_step is not face_scan, redirect accordingly\r\n if (next_step !== COMPLETED_STEPS.FACE && next_step !== COMPLETED_STEPS.INITIATED) {\r\n if (next_step === COMPLETED_STEPS.DOCS) {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n return;\r\n }\r\n }\r\n \r\n setSessionError(null);\r\n } catch (error: any) {\r\n const message = error.message || 'Session expired or inactive';\r\n setSessionError(message);\r\n setTimeout(() => {\r\n navigate('/qr', { replace: true });\r\n }, 2000);\r\n }\r\n };\r\n \r\n checkSession();\r\n }, [apiService, navigate, setState]);\r\n\r\n useEffect(() => {\r\n setState(prev => ({ ...prev, cameraReady }));\r\n }, [cameraReady, setState]);\r\n\r\n useEffect(() => {\r\n if (cameraReady && apiService) {\r\n const config = apiService.getConfig();\r\n if (config) {\r\n console.log('=== Camera Opened ===');\r\n console.log('Session ID:', config.sessionId);\r\n console.log('Server Key:', config.serverKey);\r\n console.log('API Base URL:', config.apiBaseUrl);\r\n console.log('Device Type:', config.deviceType || 'auto-detected');\r\n \r\n apiService.getSessionStatus()\r\n .then((statusResponse) => {\r\n console.log('=== Session Status API Response ===');\r\n console.log('Full Response:', statusResponse);\r\n console.log('Session Status:', statusResponse.data?.status);\r\n console.log('Session ID:', statusResponse.data?.session_id);\r\n console.log('Completed Steps:', statusResponse.data?.completed_steps);\r\n console.log('Next Step:', statusResponse.data?.next_step);\r\n })\r\n .catch((error) => {\r\n console.error('=== Session Status API Error ===');\r\n console.error('Error fetching session status:', error);\r\n });\r\n }\r\n }\r\n }, [cameraReady, apiService]);\r\n\r\n const handleRetry = async () => {\r\n if (!apiService || isRetrying) return;\r\n \r\n setIsRetrying(true);\r\n setShowRetryButton(false);\r\n setToast(null);\r\n \r\n try {\r\n await apiService.retrySession();\r\n \r\n // Reset face scan state\r\n stopCamera();\r\n setState({\r\n cameraReady: false,\r\n livenessStage: 'CENTER',\r\n livenessReady: false,\r\n livenessFailed: false,\r\n modelLoading: true,\r\n modelLoaded: false,\r\n livenessInstruction: 'Look straight at the camera',\r\n loading: false,\r\n allStepsCompleted: false,\r\n capturedImage: null,\r\n showDocumentUpload: false,\r\n });\r\n \r\n refs.centerHold.current = 0;\r\n refs.leftHold.current = 0;\r\n refs.rightHold.current = 0;\r\n refs.snapTriggered.current = false;\r\n refs.lastResultsAt.current = 0;\r\n refs.modelLoaded.current = false;\r\n refs.livenessFailed.current = false;\r\n \r\n // Reload to restart face scan\r\n setTimeout(() => {\r\n window.location.reload();\r\n }, 500);\r\n } catch (error: any) {\r\n setIsRetrying(false);\r\n setShowRetryButton(true);\r\n setToast({\r\n message: error?.message || 'Retry failed. Please try again.',\r\n type: 'error',\r\n });\r\n }\r\n };\r\n\r\n const handleRestart = () => {\r\n stopCamera();\r\n setState({\r\n cameraReady: false,\r\n livenessStage: 'CENTER',\r\n livenessReady: false,\r\n livenessFailed: false,\r\n modelLoading: true,\r\n modelLoaded: false,\r\n livenessInstruction: 'Look straight at the camera',\r\n loading: false,\r\n allStepsCompleted: false,\r\n capturedImage: null,\r\n showDocumentUpload: false,\r\n });\r\n \r\n refs.centerHold.current = 0;\r\n refs.leftHold.current = 0;\r\n refs.rightHold.current = 0;\r\n refs.snapTriggered.current = false;\r\n refs.lastResultsAt.current = 0;\r\n refs.modelLoaded.current = false;\r\n refs.livenessFailed.current = false;\r\n \r\n setTimeout(() => {\r\n window.location.reload();\r\n }, 100);\r\n };\r\n\r\n // Show KYC completion message\r\n if (kycCompleted) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <div className=\"mb-4 text-6xl\">✅</div>\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-green-500\">\r\n KYC Completed\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4 text-lg\">\r\n All steps have been completed successfully.\r\n </p>\r\n <p className=\"text-[#9ca3af] text-sm mb-6\">\r\n Please return to your desktop to continue.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (state.showDocumentUpload) {\r\n return (\r\n <DocumentUploadModal\r\n onComplete={(_file, _docType) => {\r\n if (onComplete && state.capturedImage) {\r\n onComplete(state.capturedImage);\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n \r\n if (sessionError) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-red-500\">\r\n Session Expired\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4\">{sessionError}</p>\r\n <p className=\"text-[#9ca3af] text-sm\">Redirecting to QR code page...</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {toast && (\r\n <Toast\r\n message={toast.message}\r\n type={toast.type}\r\n onClose={() => setToast(null)}\r\n duration={6000}\r\n />\r\n )}\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl mt-48\">\r\n <div className=\"relative mb-4\">\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-white text-center\">\r\n Capture Face\r\n </h2>\r\n </div>\r\n \r\n <div className=\"grid gap-4\">\r\n {!state.modelLoading && state.modelLoaded && !state.livenessFailed && (\r\n <div className=\"bg-[#0a2315] text-[#34d399] py-3.5 px-4 rounded-xl text-sm border border-[#155e3b] text-left\">\r\n Face detection model loaded.\r\n </div>\r\n )}\r\n {state.modelLoading && !state.livenessFailed && (\r\n <div className=\"bg-[#1f2937] text-[#e5e7eb] py-3.5 px-4 rounded-xl text-sm border border-[#374151] text-left\">\r\n Loading face detection model...\r\n </div>\r\n )}\r\n \r\n <div className=\"relative w-full aspect-square rounded-full overflow-hidden bg-black\">\r\n <video \r\n ref={videoRef} \r\n playsInline \r\n muted \r\n className=\"w-full h-full block bg-black object-cover -scale-x-100 origin-center\"\r\n />\r\n <canvas\r\n ref={faceCanvasRef}\r\n className=\"absolute top-0 left-0 w-full h-full pointer-events-none z-[2]\"\r\n />\r\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" className=\"absolute inset-0 pointer-events-none z-[3]\">\r\n <circle cx=\"50\" cy=\"50\" r=\"44\" fill=\"none\" stroke=\"#22c55e\" strokeWidth=\"2\" strokeDasharray=\"1 3\" />\r\n </svg>\r\n </div>\r\n \r\n {!state.livenessFailed && (\r\n <div className=\"bg-gradient-to-b from-[rgba(17,24,39,0.9)] to-[rgba(17,24,39,0.6)] text-[#e5e7eb] p-4 rounded-2xl text-base border border-[#30363d]\">\r\n <div className=\"font-bold mb-2.5 text-[22px] text-white\">Liveness Check</div>\r\n <div className=\"mb-2.5 text-base\">{state.livenessInstruction}</div>\r\n <div className=\"grid gap-2.5 text-lg\">\r\n <div className={state.livenessStage === \"CENTER\" || state.livenessStage === \"LEFT\" || state.livenessStage === \"RIGHT\" || state.livenessStage === \"DONE\" ? \"opacity-100\" : \"opacity-40\"}>\r\n 1. Look Straight\r\n </div>\r\n <div className={state.livenessStage === \"RIGHT\" || state.livenessStage === \"DONE\" ? \"opacity-100\" : \"opacity-40\"}>\r\n 2. Turn your face right\r\n </div>\r\n <div className={state.livenessStage === \"DONE\" ? \"opacity-100\" : \"opacity-30\"}>\r\n 3. Turn your face left\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n \r\n {showRetryButton && (\r\n <button\r\n type=\"button\"\r\n onClick={handleRetry}\r\n disabled={isRetrying || state.loading}\r\n className=\"py-3.5 px-4 rounded-xl text-base font-bold border-none transition-colors bg-[#f59e0b] text-[#0b0f17] cursor-pointer hover:bg-[#d97706] disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {isRetrying ? \"Retrying...\" : \"Retry Face Registration\"}\r\n </button>\r\n )}\r\n \r\n <button\r\n type=\"button\"\r\n disabled={!state.cameraReady || state.loading || (!state.livenessFailed && state.livenessStage !== \"DONE\") || showRetryButton}\r\n onClick={handleFaceCapture}\r\n className={`py-3.5 px-4 rounded-xl text-base font-bold border-none transition-colors ${\r\n state.cameraReady && !state.loading && (state.livenessFailed || state.livenessStage === \"DONE\") && !showRetryButton\r\n ? \"bg-[#22c55e] text-[#0b0f17] cursor-pointer hover:bg-[#16a34a]\"\r\n : \"bg-[#374151] text-[#e5e7eb] cursor-not-allowed\"\r\n }`}\r\n >\r\n {state.loading\r\n ? \"Capturing...\"\r\n : (state.livenessFailed || state.livenessStage === \"DONE\")\r\n ? \"Capture & Continue\"\r\n : \"Complete steps to continue\"}\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n onClick={handleRestart}\r\n disabled={state.loading || isRetrying}\r\n className={`py-3 px-4 rounded-[10px] text-[15px] font-semibold border-none w-full transition-colors ${\r\n (state.loading || isRetrying) ? \"bg-[#374151] text-[#e5e7eb] cursor-not-allowed opacity-50\" : \"bg-[#374151] text-[#e5e7eb] cursor-pointer hover:bg-[#4b5563]\"\r\n }`}\r\n >\r\n Restart\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default FaceScanModal;\r\n","import { useEffect, useState } from 'react';\r\nimport { isMobileDevice } from '../utils/deviceDetection';\r\nimport FaceScanModal from './FaceScanModal';\r\nimport { KycProvider } from '../contexts/KycContext';\r\nimport '../index.css';\r\n\r\ninterface MobileRouteProps {\r\n onClose?: () => void;\r\n onNavigate?: (view: 'qr' | 'mobileroute') => void;\r\n}\r\n\r\n// Inner component that uses the context\r\nfunction MobileRouteContent({ onClose, onComplete }: { onClose?: () => void; onComplete?: (image: string) => void }) {\r\n return <FaceScanModal onClose={onClose} onComplete={onComplete} />;\r\n}\r\n\r\nfunction MobileRoute({ onClose, onNavigate }: MobileRouteProps = {}) {\r\n const [config, setConfig] = useState<{\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!isMobileDevice() && onNavigate) {\r\n onNavigate('qr');\r\n return;\r\n }\r\n\r\n // If accessed standalone (via URL), get config from URL params\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const sessionId = searchParams.get('sessionId');\r\n const apiBaseUrl = searchParams.get('apiBaseUrl') || searchParams.get('apiUrl') || '';\r\n const serverKey = searchParams.get('serverKey') || '';\r\n\r\n if (sessionId && apiBaseUrl && serverKey) {\r\n setConfig({\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n });\r\n } else if (sessionId) {\r\n // Try to get from localStorage or use defaults\r\n // For now, we'll need these to be passed via URL\r\n console.error('Missing required parameters: apiBaseUrl and serverKey must be in URL');\r\n }\r\n }, [onNavigate]);\r\n\r\n const handleClose = () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const handleComplete = (capturedImage: string) => {\r\n // Handle completion - send captured image to backend or parent\r\n console.log('Face capture completed with image:', capturedImage.substring(0, 50) + '...');\r\n // You can emit an event, call a callback, or navigate here\r\n };\r\n\r\n if (!isMobileDevice()) {\r\n return null;\r\n }\r\n\r\n // If we have config from URL (standalone mode), wrap in provider\r\n if (config) {\r\n return (\r\n <KycProvider\r\n apiBaseUrl={config.apiBaseUrl}\r\n sessionId={config.sessionId}\r\n serverKey={config.serverKey}\r\n deviceType=\"mobile\"\r\n >\r\n <MobileRouteContent onClose={handleClose} onComplete={handleComplete} />\r\n </KycProvider>\r\n );\r\n }\r\n\r\n // If used within SDK (has onNavigate), it should already be wrapped in provider\r\n // But we'll still wrap it to be safe\r\n if (onNavigate) {\r\n // This means it's being used within the SDK component\r\n // The provider should already be there, but we'll render the content directly\r\n return <MobileRouteContent onClose={handleClose} onComplete={handleComplete} />;\r\n }\r\n\r\n // Fallback: show error if no config\r\n return (\r\n <div className=\"fixed inset-0 flex items-center justify-center bg-black/50 z-[1000]\">\r\n <div className=\"bg-white p-6 rounded-lg text-center max-w-md mx-4\">\r\n <p className=\"text-red-600 mb-2\">Missing Configuration</p>\r\n <p className=\"text-sm text-gray-600\">\r\n Please ensure the URL includes sessionId, apiBaseUrl, and serverKey parameters.\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MobileRoute;\r\n","import { useState, useEffect } from 'react';\r\nimport { QRCodeSVG } from 'qrcode.react';\r\nimport '../index.css';\r\n\r\ninterface QRCodePageProps {\r\n onClose?: () => void;\r\n onNavigate?: (view: 'qr' | 'mobileroute') => void;\r\n mobileBaseUrl?: string;\r\n sessionId?: string;\r\n apiBaseUrl?: string;\r\n serverKey?: string;\r\n}\r\n\r\nfunction QRCodePage({ onClose, onNavigate, mobileBaseUrl = 'https://kyc-sdk-stage.astraprotocol.com', sessionId, apiBaseUrl, serverKey }: QRCodePageProps = {}) {\r\n const [qrUrl, setQrUrl] = useState<string>('');\r\n const [copied, setCopied] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n // Get search params from current URL\r\n const searchParams = new URLSearchParams(window.location.search);\r\n \r\n // Add required params to query string for mobile route\r\n if (sessionId) {\r\n searchParams.set('sessionId', sessionId);\r\n }\r\n if (apiBaseUrl) {\r\n searchParams.set('apiBaseUrl', apiBaseUrl);\r\n }\r\n if (serverKey) {\r\n searchParams.set('serverKey', serverKey);\r\n }\r\n \r\n const mobileRoute = '/mobileroute';\r\n const queryString = searchParams.toString();\r\n const fullUrl = `${mobileBaseUrl}${mobileRoute}${queryString ? `?${queryString}` : ''}`;\r\n \r\n setQrUrl(fullUrl);\r\n }, [mobileBaseUrl, sessionId, apiBaseUrl, serverKey]);\r\n\r\n const handleCopyUrl = async () => {\r\n if (qrUrl) {\r\n try {\r\n await navigator.clipboard.writeText(qrUrl);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const handleRefresh = () => {\r\n window.location.reload();\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 flex items-center justify-center bg-gradient-to-br from-gray-900 via-gray-800 to-black p-4 sm:p-6 md:p-8 z-[1000]\">\r\n {/* Background pattern overlay */}\r\n <div className=\"absolute inset-0 opacity-10\" style={{\r\n backgroundImage: `radial-gradient(circle at 2px 2px, rgba(255,255,255,0.15) 1px, transparent 0)`,\r\n backgroundSize: '40px 40px'\r\n }}></div>\r\n \r\n <div className=\"relative bg-[rgba(20,20,20,0.95)] backdrop-blur-sm rounded-2xl p-5 sm:p-6 md:p-7 max-w-[450px] w-full h-[80vh] flex flex-col text-center shadow-[0_8px_32px_rgba(0,0,0,0.5)] border border-white/10\">\r\n <button \r\n className=\"absolute top-5 right-5 bg-transparent border-none text-white cursor-pointer p-2 flex items-center justify-center rounded transition-colors hover:bg-white/10 active:bg-white/20\" \r\n onClick={handleClose} \r\n aria-label=\"Close\"\r\n >\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n\r\n <div className=\"flex flex-col items-center gap-3 sm:gap-4 flex-1 overflow-y-auto custom__scrollbar\">\r\n <h1 className=\"m-0 text-white text-xl sm:text-2xl font-semibold leading-tight\">Continue on Mobile</h1>\r\n <p className=\"m-0 text-white text-sm sm:text-base opacity-90 leading-relaxed\">\r\n Scan this QR on your phone to capture your face and document\r\n </p>\r\n \r\n {qrUrl && (\r\n <div className=\"flex justify-center items-center p-3 sm:p-4 bg-black rounded-xl border-2 border-white shadow-lg\">\r\n <QRCodeSVG\r\n value={qrUrl}\r\n size={180}\r\n level=\"H\"\r\n includeMargin={true}\r\n bgColor=\"#000000\"\r\n fgColor=\"#FFFFFF\"\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"w-full text-left mt-auto\">\r\n <p className=\"m-0 mb-2 text-white text-xs sm:text-sm opacity-80\">Or open:</p>\r\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 p-2 sm:p-3 bg-white/10 rounded-lg border border-white/20\">\r\n <code className=\"flex-1 text-white text-xs sm:text-sm break-all text-left m-0 font-mono\">{qrUrl}</code>\r\n <button \r\n className=\"bg-transparent border-none text-white cursor-pointer p-1.5 flex items-center justify-center rounded transition-colors flex-shrink-0 hover:bg-white/10 active:bg-white/20 self-end sm:self-auto\" \r\n onClick={handleCopyUrl}\r\n aria-label=\"Copy URL\"\r\n title={copied ? 'Copied!' : 'Copy URL'}\r\n >\r\n {copied ? (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n ) : (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button \r\n className=\"w-full py-3 sm:py-4 px-6 bg-gradient-to-r from-[#FF842D] to-[#FF2D55] border-none rounded-lg text-white text-sm sm:text-base font-semibold cursor-pointer transition-all hover:-translate-y-0.5 hover:shadow-[0_4px_12px_rgba(255,107,53,0.4)] active:translate-y-0\" \r\n onClick={handleRefresh}\r\n >\r\n I've completed on mobile - Refresh\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default QRCodePage;\r\n\r\n","import React, { useState } from 'react';\r\nimport { KycProvider } from '../contexts/KycContext';\r\nimport MobileRoute from '../pages/MobileRoute';\r\nimport QRCodePage from '../pages/QRCodePage';\r\n\r\nexport interface KycFlowProps {\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n deviceType?: string;\r\n startAtQr?: boolean;\r\n onClose?: () => void;\r\n mobileBaseUrl?: string;\r\n}\r\n\r\ntype KycFlowView = 'qr' | 'mobileroute';\r\n\r\nexport const KycFlow: React.FC<KycFlowProps> = ({\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n deviceType,\r\n startAtQr = true,\r\n onClose,\r\n mobileBaseUrl = 'https://kyc-sdk-stage.astraprotocol.com',\r\n}) => {\r\n const [currentView, setCurrentView] = useState<KycFlowView>(startAtQr ? 'qr' : 'mobileroute');\r\n\r\n const handleNavigate = (view: KycFlowView) => {\r\n setCurrentView(view);\r\n };\r\n\r\n const handleClose = () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <KycProvider\r\n apiBaseUrl={apiBaseUrl}\r\n sessionId={sessionId}\r\n serverKey={serverKey}\r\n deviceType={deviceType}\r\n >\r\n {currentView === 'qr' ? (\r\n <QRCodePage \r\n onClose={handleClose} \r\n onNavigate={handleNavigate}\r\n mobileBaseUrl={mobileBaseUrl}\r\n sessionId={sessionId}\r\n apiBaseUrl={apiBaseUrl}\r\n serverKey={serverKey}\r\n />\r\n ) : (\r\n <MobileRoute onClose={handleClose} onNavigate={handleNavigate} />\r\n )}\r\n </KycProvider>\r\n );\r\n};\r\n\r\n","\r\nimport { ApiClient } from './client';\r\nimport { mergeConfig } from './config';\r\nimport type { AstraSDKConfig, ApiResponse, RequestOptions } from './types';\r\nimport { AstraSDKError } from './types';\r\n\r\nexport class AstraSDK {\r\n private client: ApiClient;\r\n\r\n constructor(config: AstraSDKConfig) {\r\n if (!config.apiKey) {\r\n throw new AstraSDKError('API key is required', 400, 'MISSING_API_KEY');\r\n }\r\n\r\n const mergedConfig = mergeConfig(config);\r\n this.client = new ApiClient(mergedConfig);\r\n }\r\n\r\n \r\n getClient(): ApiClient {\r\n return this.client;\r\n }\r\n\r\n \r\n updateConfig(config: Partial<AstraSDKConfig>): void {\r\n this.client.updateConfig(config);\r\n }\r\n\r\n \r\n async get<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.get<T>(endpoint, options);\r\n }\r\n\r\n\r\n async post<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.post<T>(endpoint, body, options);\r\n }\r\n\r\n async put<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.put<T>(endpoint, body, options);\r\n }\r\n\r\n async patch<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.patch<T>(endpoint, body, options);\r\n }\r\n\r\n async delete<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.delete<T>(endpoint, options);\r\n }\r\n\r\n \r\n async request<T = unknown>(\r\n endpoint: string,\r\n options?: RequestOptions\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.request<T>(endpoint, options);\r\n }\r\n}\r\n\r\nexport type { AstraSDKConfig, ApiResponse, RequestOptions, ApiError } from './types';\r\nexport { AstraSDKError } from './types';\r\n\r\nexport { ApiClient } from './client';\r\n\r\n// Export KYC components\r\nexport { KycFlow } from '../components/KycFlow';\r\nexport type { KycFlowProps } from '../components/KycFlow';\r\n\r\n// Export KYC API service\r\nexport { KycApiService } from '../services/kycApiService';\r\nexport type { \r\n KycApiConfig, \r\n SessionStatusResponse, \r\n FaceScanResponse, \r\n DocumentUploadResponse \r\n} from '../services/kycApiService';\r\n\r\nexport default AstraSDK;\r\n\r\n"]}
1
+ {"version":3,"sources":["../src/sdk/types/index.ts","../src/sdk/utils/http.ts","../src/sdk/client/index.ts","../src/sdk/config/index.ts","../src/services/kycApiService.ts","../src/contexts/KycContext.tsx","../src/utils/deviceDetection.ts","../src/features/documentUpload/hooks/useDocumentUpload.ts","../src/pages/DocumentUploadModal.tsx","../src/features/faceScan/hooks/useCamera.ts","../src/services/faceMeshService.ts","../src/features/faceScan/hooks/useFaceScan.ts","../src/components/Toast.tsx","../src/pages/FaceScanModal.tsx","../src/pages/MobileRoute.tsx","../src/pages/QRCodePage.tsx","../src/components/KycFlow.tsx","../src/sdk/index.ts"],"names":["blob","useState","useEffect","jsx","useRef","drawMPLandmarks","jsxs","useNavigate"],"mappings":"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","file":"astra-sdk.es.js","sourcesContent":["\r\nexport interface AstraSDKConfig {\r\n apiKey: string;\r\n baseURL?: string;\r\n timeout?: number;\r\n headers?: Record<string, string>;\r\n retries?: number;\r\n retryDelay?: number;\r\n}\r\n\r\nexport interface RequestOptions {\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n headers?: Record<string, string>;\r\n body?: unknown;\r\n params?: Record<string, string | number | boolean>;\r\n timeout?: number;\r\n}\r\n\r\nexport interface ApiResponse<T = unknown> {\r\n data: T;\r\n status: number;\r\n statusText: string;\r\n headers: Record<string, string>;\r\n}\r\n\r\nexport interface ApiError {\r\n message: string;\r\n status?: number;\r\n code?: string;\r\n details?: unknown;\r\n}\r\n\r\nexport class AstraSDKError extends Error {\r\n status?: number;\r\n code?: string;\r\n details?: unknown;\r\n\r\n constructor(message: string, status?: number, code?: string, details?: unknown) {\r\n super(message);\r\n this.name = 'AstraSDKError';\r\n this.status = status;\r\n this.code = code;\r\n this.details = details;\r\n Object.setPrototypeOf(this, AstraSDKError.prototype);\r\n }\r\n}\r\n\r\n","/**\r\n * HTTP utility functions\r\n */\r\n\r\nimport type { RequestOptions, ApiResponse, ApiError } from '../types';\r\nimport { AstraSDKError } from '../types';\r\n\r\nexport async function makeRequest<T = unknown>(\r\n url: string,\r\n options: RequestOptions = {},\r\n config: {\r\n apiKey: string;\r\n baseURL: string;\r\n timeout: number;\r\n headers: Record<string, string>;\r\n }\r\n): Promise<ApiResponse<T>> {\r\n const {\r\n method = 'GET',\r\n headers: customHeaders = {},\r\n body,\r\n params,\r\n timeout = config.timeout,\r\n } = options;\r\n\r\n // Build URL with query parameters\r\n const urlObj = new URL(url, config.baseURL);\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n urlObj.searchParams.append(key, String(value));\r\n });\r\n }\r\n\r\n // Prepare headers\r\n const headers = new Headers({\r\n ...config.headers,\r\n ...customHeaders,\r\n Authorization: `Bearer ${config.apiKey}`,\r\n });\r\n\r\n // Prepare request options\r\n const requestOptions: RequestInit = {\r\n method,\r\n headers,\r\n signal: AbortSignal.timeout(timeout),\r\n };\r\n\r\n if (body && method !== 'GET') {\r\n requestOptions.body = JSON.stringify(body);\r\n }\r\n\r\n try {\r\n const response = await fetch(urlObj.toString(), requestOptions);\r\n const responseHeaders: Record<string, string> = {};\r\n response.headers.forEach((value, key) => {\r\n responseHeaders[key] = value;\r\n });\r\n\r\n let data: T;\r\n const contentType = response.headers.get('content-type');\r\n if (contentType?.includes('application/json')) {\r\n data = await response.json();\r\n } else {\r\n data = (await response.text()) as unknown as T;\r\n }\r\n\r\n if (!response.ok) {\r\n const error: ApiError = {\r\n message: `Request failed with status ${response.status}`,\r\n status: response.status,\r\n code: response.statusText,\r\n details: data,\r\n };\r\n throw new AstraSDKError(\r\n error.message,\r\n error.status,\r\n error.code,\r\n error.details\r\n );\r\n }\r\n\r\n return {\r\n data,\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: responseHeaders,\r\n };\r\n } catch (error) {\r\n if (error instanceof AstraSDKError) {\r\n throw error;\r\n }\r\n if (error instanceof Error) {\r\n if (error.name === 'AbortError') {\r\n throw new AstraSDKError('Request timeout', 408, 'TIMEOUT');\r\n }\r\n throw new AstraSDKError(error.message, undefined, 'NETWORK_ERROR');\r\n }\r\n throw new AstraSDKError('Unknown error occurred', undefined, 'UNKNOWN_ERROR');\r\n }\r\n}\r\n\r\nexport async function retryRequest<T>(\r\n fn: () => Promise<T>,\r\n retries: number,\r\n delay: number\r\n): Promise<T> {\r\n let lastError: Error;\r\n \r\n for (let i = 0; i <= retries; i++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n \r\n // Don't retry on client errors (4xx) except 429 (rate limit)\r\n if (error instanceof AstraSDKError && error.status) {\r\n if (error.status >= 400 && error.status < 500 && error.status !== 429) {\r\n throw error;\r\n }\r\n }\r\n \r\n if (i < retries) {\r\n await new Promise((resolve) => setTimeout(resolve, delay * (i + 1)));\r\n }\r\n }\r\n }\r\n \r\n throw lastError!;\r\n}\r\n\r\n","/**\r\n * API Client for Astra SDK\r\n */\r\n\r\nimport type { RequestOptions, ApiResponse } from '../types';\r\nimport { makeRequest, retryRequest } from '../utils/http';\r\nimport type { AstraSDKConfig } from '../types';\r\n\r\nexport class ApiClient {\r\n private config: Required<AstraSDKConfig>;\r\n\r\n constructor(config: Required<AstraSDKConfig>) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Make a GET request\r\n */\r\n async get<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'GET' });\r\n }\r\n\r\n /**\r\n * Make a POST request\r\n */\r\n async post<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'POST', body });\r\n }\r\n\r\n /**\r\n * Make a PUT request\r\n */\r\n async put<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'PUT', body });\r\n }\r\n\r\n /**\r\n * Make a PATCH request\r\n */\r\n async patch<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'PATCH', body });\r\n }\r\n\r\n /**\r\n * Make a DELETE request\r\n */\r\n async delete<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\r\n }\r\n\r\n /**\r\n * Make a generic request\r\n */\r\n async request<T = unknown>(\r\n endpoint: string,\r\n options: RequestOptions = {}\r\n ): Promise<ApiResponse<T>> {\r\n const requestFn = () =>\r\n makeRequest<T>(endpoint, options, {\r\n apiKey: this.config.apiKey,\r\n baseURL: this.config.baseURL,\r\n timeout: this.config.timeout,\r\n headers: this.config.headers,\r\n });\r\n\r\n if (this.config.retries > 0) {\r\n return retryRequest(requestFn, this.config.retries, this.config.retryDelay);\r\n }\r\n\r\n return requestFn();\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<AstraSDKConfig>): void {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n headers: {\r\n ...this.config.headers,\r\n ...config.headers,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): Required<AstraSDKConfig> {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n","/**\r\n * Configuration management for Astra SDK\r\n */\r\n\r\nimport type { AstraSDKConfig } from '../types';\r\n\r\nexport const DEFAULT_CONFIG: Required<Omit<AstraSDKConfig, 'apiKey'>> = {\r\n baseURL: 'https://api.astra.com',\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n retries: 3,\r\n retryDelay: 1000,\r\n};\r\n\r\nexport function mergeConfig(userConfig: AstraSDKConfig): Required<AstraSDKConfig> {\r\n return {\r\n apiKey: userConfig.apiKey,\r\n baseURL: userConfig.baseURL ?? DEFAULT_CONFIG.baseURL,\r\n timeout: userConfig.timeout ?? DEFAULT_CONFIG.timeout,\r\n headers: {\r\n ...DEFAULT_CONFIG.headers,\r\n ...userConfig.headers,\r\n },\r\n retries: userConfig.retries ?? DEFAULT_CONFIG.retries,\r\n retryDelay: userConfig.retryDelay ?? DEFAULT_CONFIG.retryDelay,\r\n };\r\n}\r\n\r\n","/**\r\n * KYC API Service\r\n * Handles all KYC-related API calls (face scan, document upload, status check)\r\n */\r\n\r\nexport const COMPLETED_STEPS = {\r\n INITIATED: \"initiated\",\r\n FACE: \"face_scan\",\r\n DOCS: \"document_upload\",\r\n COMPLETED: \"completed\",\r\n} as const;\r\n\r\nexport interface KycApiConfig {\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n deviceType?: string;\r\n}\r\n\r\nexport interface SessionStatusResponse {\r\n status: string;\r\n message: string;\r\n data: {\r\n session_id: string;\r\n status: 'ACTIVE' | 'INACTIVE' | 'EXPIRED' | 'COMPLETED';\r\n completed_steps: string[];\r\n next_step: string;\r\n };\r\n}\r\n\r\nexport interface FaceScanResponse {\r\n status: string;\r\n message: string;\r\n data?: unknown;\r\n}\r\n\r\nexport interface DocumentUploadResponse {\r\n status: string;\r\n message: string;\r\n data?: unknown;\r\n}\r\n\r\nexport class KycApiService {\r\n private config: KycApiConfig;\r\n\r\n constructor(config: KycApiConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Detect device type\r\n */\r\n private detectDeviceType(): string {\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera;\r\n if (/android/i.test(userAgent)) return 'android';\r\n if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) return 'ios';\r\n if (/Mac|Windows|Linux/.test(userAgent)) return 'desktop';\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Get session status\r\n */\r\n async getSessionStatus(): Promise<SessionStatusResponse> {\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n \r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/status`,\r\n {\r\n method: 'GET',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include',\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Status fetch failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Status fetch failed';\r\n throw new Error(`Status fetch failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Get session result (kyc result)\r\n */\r\n async getResult(): Promise<any> {\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n\r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/result`,\r\n {\r\n method: 'GET',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include',\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Result fetch failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Result fetch failed';\r\n throw new Error(`Result fetch failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Upload face scan image\r\n */\r\n async uploadFaceScan(faceBlob: Blob | File): Promise<FaceScanResponse> {\r\n // Check session status first\r\n await this.checkSessionActive();\r\n\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n const formData = new FormData();\r\n const faceFileName = (faceBlob as File)?.name || `face-${Date.now()}.jpg`;\r\n formData.append('face_scan_img', faceBlob, faceFileName);\r\n\r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/face`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n },\r\n credentials: 'include',\r\n body: formData,\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || errorData?.errorData?.message || `Face upload failed with status ${response.status}`;\r\n // Preserve the original error message for better error handling\r\n const error = new Error(message);\r\n (error as any).statusCode = response.status;\r\n (error as any).errorData = errorData;\r\n // Also preserve the full error response structure\r\n if (errorData.statusCode) {\r\n (error as any).statusCode = errorData.statusCode;\r\n }\r\n throw error;\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n // If error already has a message from the response, preserve it\r\n if (error.message && !error.message.includes('Face upload failed')) {\r\n throw error;\r\n }\r\n const message = error?.message || 'Face upload failed';\r\n throw new Error(`Face upload failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Upload document scan image\r\n */\r\n async uploadDocument(docBlob: Blob | File, docType: string): Promise<DocumentUploadResponse> {\r\n // Check session status first\r\n await this.checkSessionActive();\r\n\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n const formData = new FormData();\r\n const docFileName = (docBlob as File)?.name || `document-${Date.now()}.jpg`;\r\n formData.append('docs_scan_img', docBlob, docFileName);\r\n formData.append('docType', docType);\r\n\r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/docs`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n },\r\n credentials: 'include',\r\n body: formData,\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Document upload failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Document upload failed';\r\n throw new Error(`Document upload failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Retry session - resets the session to allow face registration again\r\n */\r\n async retrySession(): Promise<any> {\r\n const deviceType = this.config.deviceType || this.detectDeviceType();\r\n \r\n try {\r\n const response = await fetch(\r\n `${this.config.apiBaseUrl}/api/v2/dashboard/merchant/onsite/session/${this.config.sessionId}/retry`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-server-key': this.config.serverKey,\r\n 'device-type': deviceType,\r\n 'Content-Type': 'application/json',\r\n },\r\n credentials: 'include',\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message = errorData?.message || `Retry failed with status ${response.status}`;\r\n throw new Error(message);\r\n }\r\n\r\n const data = await response.json();\r\n return data;\r\n } catch (error: any) {\r\n const message = error?.message || 'Retry failed';\r\n throw new Error(`Retry failed: ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Check if session is active, throw error if not\r\n */\r\n async checkSessionActive(): Promise<void> {\r\n const status = await this.getSessionStatus();\r\n \r\n if (status.data.status !== 'ACTIVE') {\r\n throw new Error('Session expired or inactive. Please start a new session.');\r\n }\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<KycApiConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): KycApiConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n","import React, { createContext, useContext, ReactNode } from 'react';\r\nimport { KycApiService, type KycApiConfig } from '../services/kycApiService';\r\n\r\ninterface KycContextValue {\r\n apiService: KycApiService | null;\r\n setApiConfig: (config: KycApiConfig) => void;\r\n}\r\n\r\nconst KycContext = createContext<KycContextValue>({\r\n apiService: null,\r\n setApiConfig: () => {},\r\n});\r\n\r\nexport const useKycContext = () => {\r\n const context = useContext(KycContext);\r\n if (!context) {\r\n throw new Error('useKycContext must be used within KycProvider');\r\n }\r\n return context;\r\n};\r\n\r\ninterface KycProviderProps {\r\n children: ReactNode;\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n deviceType?: string;\r\n}\r\n\r\nexport const KycProvider: React.FC<KycProviderProps> = ({\r\n children,\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n deviceType,\r\n}) => {\r\n const [apiService, setApiService] = React.useState<KycApiService | null>(null);\r\n\r\n React.useEffect(() => {\r\n if (apiBaseUrl && sessionId && serverKey) {\r\n const service = new KycApiService({\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n deviceType,\r\n });\r\n setApiService(service);\r\n }\r\n }, [apiBaseUrl, sessionId, serverKey, deviceType]);\r\n\r\n const setApiConfig = React.useCallback((config: KycApiConfig) => {\r\n if (apiService) {\r\n apiService.updateConfig(config);\r\n } else {\r\n const service = new KycApiService(config);\r\n setApiService(service);\r\n }\r\n }, [apiService]);\r\n\r\n return (\r\n <KycContext.Provider value={{ apiService, setApiConfig }}>\r\n {children}\r\n </KycContext.Provider>\r\n );\r\n};\r\n\r\n","/**\r\n * Utility functions for device detection\r\n */\r\n\r\nexport function isMobileDevice(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n // Check user agent\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera;\r\n \r\n // Common mobile device patterns\r\n const mobileRegex = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i;\r\n \r\n // Check screen width (mobile devices typically have smaller screens)\r\n const isSmallScreen = window.innerWidth <= 768;\r\n \r\n // Check for touch support\r\n const hasTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n \r\n return mobileRegex.test(userAgent) || (isSmallScreen && hasTouchScreen);\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'desktop' {\r\n return isMobileDevice() ? 'mobile' : 'desktop';\r\n}\r\n\r\n","import { useState, useRef, useEffect } from 'react';\r\nimport type { DocumentUploadCallbacks } from '../types';\r\nimport type { DocumentUploadState } from '../types';\r\n\r\nexport interface DocumentUploadHookCallbacks extends DocumentUploadCallbacks {\r\n onDocumentUpload?: (blob: Blob, docType: string) => Promise<void>;\r\n}\r\n\r\nexport function useDocumentUpload(callbacks?: DocumentUploadHookCallbacks) {\r\n const [state, setState] = useState<DocumentUploadState>({\r\n docType: 'CNIC',\r\n isDocScanMode: false,\r\n docPreviewUrl: null,\r\n docFileName: '',\r\n loading: false,\r\n });\r\n\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const docVideoRef = useRef<HTMLVideoElement>(null);\r\n const docStreamRef = useRef<MediaStream | null>(null);\r\n const docPendingBlobRef = useRef<Blob | null>(null);\r\n\r\n const getRearStream = async (): Promise<MediaStream> => {\r\n const attempts: MediaStreamConstraints[] = [\r\n { video: { facingMode: { exact: 'environment' }, width: { ideal: 1280 }, height: { ideal: 1920 } }, audio: false } as MediaStreamConstraints,\r\n { video: { facingMode: 'environment', width: { ideal: 1280 }, height: { ideal: 1920 } }, audio: false } as unknown as MediaStreamConstraints,\r\n { video: { facingMode: { exact: 'environment' }, width: { ideal: 720 }, height: { ideal: 1280 } }, audio: false } as MediaStreamConstraints,\r\n { video: { facingMode: 'environment', width: { ideal: 720 }, height: { ideal: 1280 } }, audio: false } as unknown as MediaStreamConstraints,\r\n ];\r\n\r\n for (const c of attempts) {\r\n try { return await navigator.mediaDevices.getUserMedia(c); } catch { /* continue */ }\r\n }\r\n\r\n let temp: MediaStream | null = null;\r\n try {\r\n temp = await navigator.mediaDevices.getUserMedia({ video: true, audio: false });\r\n } catch (e) {\r\n throw e;\r\n } finally {\r\n try { temp?.getTracks().forEach(t => t.stop()); } catch {}\r\n }\r\n\r\n const devices = await navigator.mediaDevices.enumerateDevices();\r\n const videoInputs = devices.filter(d => d.kind === 'videoinput');\r\n const rear = videoInputs.find(d => /back|rear|environment/i.test(d.label));\r\n const chosen = rear || videoInputs.find(d => !/front|user|face/i.test(d.label)) || videoInputs[0];\r\n if (!chosen) throw new Error('No video input devices found');\r\n\r\n const byDeviceAttempts: MediaStreamConstraints[] = [\r\n { video: { deviceId: { exact: chosen.deviceId }, width: { ideal: 1280 }, height: { ideal: 1920 } }, audio: false },\r\n { video: { deviceId: { exact: chosen.deviceId }, width: { ideal: 720 }, height: { ideal: 1280 } }, audio: false },\r\n { video: { deviceId: { exact: chosen.deviceId } }, audio: false } as MediaStreamConstraints,\r\n ];\r\n for (const c of byDeviceAttempts) {\r\n try { return await navigator.mediaDevices.getUserMedia(c); } catch { /* continue */ }\r\n }\r\n\r\n return await navigator.mediaDevices.getUserMedia({ video: true, audio: false });\r\n };\r\n\r\n const startDocCamera = async () => {\r\n try {\r\n if (docStreamRef.current) {\r\n try { docStreamRef.current.getTracks().forEach(t => t.stop()); } catch {}\r\n docStreamRef.current = null;\r\n }\r\n const stream = await getRearStream();\r\n if (docVideoRef.current) {\r\n docVideoRef.current.srcObject = stream;\r\n await docVideoRef.current.play().catch(() => {});\r\n }\r\n docStreamRef.current = stream;\r\n } catch (e: any) {\r\n console.error('Could not start document camera:', e);\r\n setState(prev => ({ ...prev, isDocScanMode: false }));\r\n if (callbacks?.onError) {\r\n callbacks.onError(e);\r\n }\r\n }\r\n };\r\n\r\n const handleDocumentUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (state.loading) return;\r\n const file = event.target.files?.[0];\r\n if (!file) return;\r\n setState(prev => ({ ...prev, docFileName: file.name || '' }));\r\n try {\r\n const objectUrl = URL.createObjectURL(file);\r\n setState(prev => ({ ...prev, docPreviewUrl: objectUrl }));\r\n docPendingBlobRef.current = file;\r\n } catch (err: any) {\r\n console.error('Could not preview document:', err);\r\n if (callbacks?.onError) {\r\n callbacks.onError(err);\r\n }\r\n }\r\n };\r\n\r\n const handleConfirmDocumentUpload = async () => {\r\n if (state.loading || !docPendingBlobRef.current) return;\r\n setState(prev => ({ ...prev, loading: true }));\r\n try {\r\n const file = docPendingBlobRef.current as File;\r\n \r\n // Upload document if callback provided\r\n if (callbacks?.onDocumentUpload) {\r\n try {\r\n await callbacks.onDocumentUpload(file, state.docType);\r\n } catch (uploadError: any) {\r\n throw new Error(uploadError.message || 'Failed to upload document');\r\n }\r\n }\r\n \r\n if (callbacks?.onUpload) {\r\n callbacks.onUpload(file, state.docType);\r\n }\r\n \r\n setState(prev => ({\r\n ...prev,\r\n docPreviewUrl: null,\r\n docFileName: '',\r\n loading: false,\r\n }));\r\n docPendingBlobRef.current = null;\r\n } catch (err: any) {\r\n console.error('Document upload failed:', err);\r\n setState(prev => ({ ...prev, loading: false }));\r\n if (callbacks?.onError) {\r\n callbacks.onError(err);\r\n }\r\n }\r\n };\r\n\r\n const handleManualCapture = async () => {\r\n if (!docVideoRef.current || state.loading) return;\r\n \r\n setState(prev => ({ ...prev, loading: true }));\r\n try {\r\n const video = docVideoRef.current;\r\n \r\n // Create canvas and capture current frame\r\n const canvas = document.createElement('canvas');\r\n const width = video.videoWidth || 1280;\r\n const height = video.videoHeight || 720;\r\n canvas.width = width;\r\n canvas.height = height;\r\n \r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) throw new Error('Canvas not supported');\r\n \r\n // Draw video frame to canvas\r\n ctx.drawImage(video, 0, 0, width, height);\r\n \r\n // Convert to blob\r\n const blob = await new Promise<Blob>((resolve) => {\r\n canvas.toBlob((blob: Blob | null) => {\r\n resolve(blob || new Blob());\r\n }, 'image/jpeg', 0.92);\r\n });\r\n \r\n const file = new File([blob], 'document.jpg', { type: 'image/jpeg' });\r\n \r\n // Upload document if callback provided\r\n if (callbacks?.onDocumentUpload) {\r\n try {\r\n await callbacks.onDocumentUpload(file, state.docType);\r\n } catch (uploadError: any) {\r\n throw new Error(uploadError.message || 'Failed to upload document');\r\n }\r\n }\r\n \r\n // Create preview URL\r\n const objectUrl = URL.createObjectURL(file);\r\n setState(prev => ({\r\n ...prev,\r\n docPreviewUrl: objectUrl,\r\n isDocScanMode: false,\r\n loading: false,\r\n }));\r\n \r\n docPendingBlobRef.current = file;\r\n \r\n // Stop camera\r\n if (docStreamRef.current) {\r\n docStreamRef.current.getTracks().forEach((t) => t.stop());\r\n docStreamRef.current = null;\r\n }\r\n \r\n if (callbacks?.onScan) {\r\n callbacks.onScan(file, state.docType);\r\n }\r\n } catch (err: any) {\r\n console.error('Capture failed:', err);\r\n setState(prev => ({ ...prev, loading: false }));\r\n if (callbacks?.onError) {\r\n callbacks.onError(err);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (state.isDocScanMode) {\r\n startDocCamera();\r\n }\r\n \r\n return () => {\r\n if (docStreamRef.current) {\r\n docStreamRef.current.getTracks().forEach((t) => t.stop());\r\n docStreamRef.current = null;\r\n }\r\n };\r\n }, [state.isDocScanMode]);\r\n\r\n return {\r\n state,\r\n setState,\r\n fileInputRef,\r\n docVideoRef,\r\n handleDocumentUpload,\r\n handleConfirmDocumentUpload,\r\n handleManualCapture,\r\n startDocCamera,\r\n };\r\n}\r\n\r\n","import { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useDocumentUpload } from '../features/documentUpload/hooks/useDocumentUpload';\r\nimport { useKycContext } from '../contexts/KycContext';\r\nimport { COMPLETED_STEPS } from '../services/kycApiService';\r\nimport type { DocumentType } from '../features/documentUpload/types';\r\n\r\ninterface DocumentUploadModalProps {\r\n onComplete?: (file: File, docType: string) => void;\r\n}\r\n\r\nfunction DocumentUploadModal({ onComplete }: DocumentUploadModalProps) {\r\n const navigate = useNavigate();\r\n const { apiService } = useKycContext();\r\n const [sessionError, setSessionError] = useState<string | null>(null);\r\n const [kycCompleted, setKycCompleted] = useState(false);\r\n \r\n const {\r\n state,\r\n setState,\r\n fileInputRef,\r\n docVideoRef,\r\n handleDocumentUpload,\r\n handleConfirmDocumentUpload,\r\n handleManualCapture,\r\n startDocCamera,\r\n } = useDocumentUpload({\r\n onDocumentUpload: async (blob: Blob, docType: string) => {\r\n if (!apiService) {\r\n throw new Error('API service not initialized');\r\n }\r\n await apiService.uploadDocument(blob, docType);\r\n // Check if KYC is completed after document upload\r\n try {\r\n const statusResponse = await apiService.getSessionStatus();\r\n const { completed_steps, next_step } = statusResponse.data;\r\n if (next_step === 'completed' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {\r\n setKycCompleted(true);\r\n }\r\n } catch (error) {\r\n console.error('Error checking completion status:', error);\r\n }\r\n },\r\n onUpload: (file, docType) => {\r\n if (onComplete) {\r\n onComplete(file, docType);\r\n }\r\n },\r\n onScan: (file, docType) => {\r\n if (onComplete) {\r\n onComplete(file, docType);\r\n }\r\n },\r\n });\r\n \r\n // Check session status on mount\r\n useEffect(() => {\r\n const checkSession = async () => {\r\n if (!apiService) return;\r\n \r\n try {\r\n const statusResponse = await apiService.getSessionStatus();\r\n const { completed_steps, next_step, status } = statusResponse.data;\r\n \r\n // Check if KYC is completed\r\n if (status === 'COMPLETED' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {\r\n setKycCompleted(true);\r\n return;\r\n }\r\n \r\n // Check if session is active\r\n if (status !== 'ACTIVE') {\r\n throw new Error('Session expired or inactive');\r\n }\r\n \r\n // If document_upload is already completed, show completion message\r\n if (completed_steps.includes(COMPLETED_STEPS.DOCS)) {\r\n // Check if all steps are completed\r\n if (completed_steps.includes(COMPLETED_STEPS.FACE) && completed_steps.includes(COMPLETED_STEPS.DOCS)) {\r\n setKycCompleted(true);\r\n return;\r\n }\r\n }\r\n \r\n // If next_step is not document_upload and face_scan is not completed, redirect to face scan\r\n if (next_step === COMPLETED_STEPS.FACE && !completed_steps.includes(COMPLETED_STEPS.FACE)) {\r\n // Should not happen if we're in document upload modal, but handle it\r\n console.warn('Face scan not completed, but in document upload modal');\r\n }\r\n \r\n setSessionError(null);\r\n } catch (error: any) {\r\n const message = error.message || 'Session expired or inactive';\r\n setSessionError(message);\r\n // Redirect to QR page after showing error\r\n setTimeout(() => {\r\n navigate('/qr', { replace: true });\r\n }, 2000);\r\n }\r\n };\r\n \r\n checkSession();\r\n }, [apiService, navigate]);\r\n\r\n\r\n if (kycCompleted) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <div className=\"mb-4 text-6xl\">✅</div>\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-green-500\">\r\n KYC Completed\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4 text-lg\">\r\n All steps have been completed successfully.\r\n </p>\r\n <p className=\"text-[#9ca3af] text-sm mb-6\">\r\n Please return to your desktop to continue.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Show session error if present\r\n if (sessionError) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-4 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-red-500\">\r\n Session Expired\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4\">{sessionError}</p>\r\n <p className=\"text-[#9ca3af] text-sm\">Redirecting to QR code page...</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div \r\n className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\"\r\n style={{\r\n marginTop: state.docPreviewUrl && !state.isDocScanMode ? '192px' : '0'\r\n }}\r\n >\r\n <div className=\"relative mb-4\">\r\n <h2 className=\"m-0 mb-4 text-xl font-bold text-white\">\r\n Document\r\n </h2>\r\n </div>\r\n\r\n {!state.isDocScanMode && (\r\n <div className=\"grid gap-2 mb-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => fileInputRef.current?.click()}\r\n className=\"w-full py-3 px-4 rounded-lg border-2 border-dashed border-[#374151] bg-[#0f172a] text-[#e5e7eb] text-base cursor-pointer hover:border-[#4b5563] transition-colors\"\r\n >\r\n Upload Document\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setState(prev => ({ ...prev, isDocScanMode: true }));\r\n startDocCamera();\r\n }}\r\n className=\"w-full py-3 px-4 rounded-lg text-white border-none text-base cursor-pointer transition-opacity hover:opacity-90\"\r\n style={{\r\n background: \"linear-gradient(90deg, #FF8A00 0%, #FF3D77 100%)\"\r\n }}\r\n >\r\n Scan Document (Back Camera)\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex gap-3 mb-4\">\r\n <label className=\"flex items-center gap-1.5 text-[#e5e7eb] cursor-pointer\">\r\n <input\r\n type=\"radio\"\r\n name=\"doc-type\"\r\n value=\"CNIC\"\r\n checked={state.docType === \"CNIC\"}\r\n defaultChecked\r\n onChange={() => setState(prev => ({ ...prev, docType: \"CNIC\" as DocumentType }))}\r\n className=\"cursor-pointer w-4 h-4\"\r\n style={{\r\n accentColor: state.docType === \"CNIC\" ? \"#ef4444\" : \"#6b7280\"\r\n }}\r\n />\r\n NIC\r\n </label>\r\n <label className=\"flex items-center gap-1.5 text-[#e5e7eb] cursor-pointer\">\r\n <input\r\n type=\"radio\"\r\n name=\"doc-type\"\r\n value=\"Passport\"\r\n checked={state.docType === \"Passport\"}\r\n onChange={() => setState(prev => ({ ...prev, docType: \"Passport\" as DocumentType }))}\r\n className=\"cursor-pointer w-4 h-4\"\r\n style={{\r\n accentColor: state.docType === \"Passport\" ? \"#ef4444\" : \"#6b7280\"\r\n }}\r\n />\r\n Passport\r\n </label>\r\n </div>\r\n\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/*,.pdf\"\r\n onChange={handleDocumentUpload}\r\n className=\"hidden\"\r\n />\r\n\r\n {state.isDocScanMode && (\r\n <div className=\"grid gap-3 mt-2\">\r\n <div className=\"relative w-full aspect-[3/4] rounded-lg overflow-hidden bg-black\">\r\n <video\r\n ref={docVideoRef}\r\n playsInline\r\n muted\r\n autoPlay\r\n className=\"w-full h-full object-cover\"\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleManualCapture}\r\n disabled={state.loading}\r\n className=\"flex-1 py-3 px-4 rounded-lg text-white border-none text-base cursor-pointer transition-opacity disabled:opacity-50 disabled:cursor-not-allowed hover:opacity-90\"\r\n style={{\r\n background: \"linear-gradient(90deg, #FF8A00 0%, #FF3D77 100%)\"\r\n }}\r\n >\r\n {state.loading ? \"Capturing...\" : \"Capture Document\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setState(prev => ({ ...prev, isDocScanMode: false }));\r\n }}\r\n disabled={state.loading}\r\n className=\"py-3 px-4 rounded-lg bg-[#111827] text-[#e5e7eb] border-none text-base cursor-pointer hover:bg-[#1f2937] transition-colors disabled:opacity-50\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n <p className=\"m-0 text-[#9ca3af] text-xs text-center\">\r\n {state.loading \r\n ? \"Processing document...\" \r\n : \"Position your document in the frame and tap 'Capture Document' when ready.\"}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {state.docFileName && !state.isDocScanMode && (\r\n <div className=\"inline-flex items-center gap-2 py-2 px-3 rounded-full bg-[#1f2937] text-[#e5e7eb] text-sm mb-3\">\r\n <span>✔</span>\r\n <span>File selected</span>\r\n </div>\r\n )}\r\n\r\n {state.loading && !state.isDocScanMode && (\r\n <p className=\"m-3 mt-0 text-[#60a5fa] text-center\">\r\n Processing...\r\n </p>\r\n )}\r\n\r\n {!state.isDocScanMode && state.docPreviewUrl && (\r\n <div className=\"mt-3\">\r\n <div className=\"font-semibold mb-1.5 text-[#e5e7eb]\">Preview</div>\r\n <img src={state.docPreviewUrl} alt=\"Document preview\" className=\"w-full rounded-lg border border-[#374151]\" />\r\n <div className=\"grid gap-2 grid-cols-2 mt-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleConfirmDocumentUpload}\r\n disabled={state.loading}\r\n className=\"py-3 px-4 rounded-lg text-white border-none text-base cursor-pointer w-full transition-opacity disabled:opacity-50 disabled:cursor-not-allowed hover:opacity-90\"\r\n style={{\r\n background: \"linear-gradient(90deg, #10b981 0%, #059669 100%)\"\r\n }}\r\n >\r\n {state.loading ? \"Uploading...\" : \"Looks good, continue\"}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setState(prev => ({\r\n ...prev,\r\n docPreviewUrl: null,\r\n docFileName: \"\",\r\n }));\r\n }}\r\n disabled={state.loading}\r\n className=\"py-3 px-4 rounded-lg bg-[#111827] text-[#e5e7eb] border-none text-base cursor-pointer w-full hover:bg-[#1f2937] transition-colors disabled:opacity-50\"\r\n >\r\n Retake / Choose again\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!state.isDocScanMode && !state.docFileName && !state.docPreviewUrl && (\r\n <p className=\"m-0 text-[#9ca3af] text-xs text-center\">\r\n After uploading or scanning, return to your desktop to check status.\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DocumentUploadModal;\r\n\r\n","import { useRef, useState, useEffect } from 'react';\r\n\r\nexport function useCamera() {\r\n const videoRef = useRef<HTMLVideoElement>(null);\r\n const streamRef = useRef<MediaStream | null>(null);\r\n const [cameraReady, setCameraReady] = useState(false);\r\n\r\n const startCamera = async () => {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({ \r\n video: { \r\n facingMode: \"user\",\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 }\r\n }, \r\n audio: false \r\n });\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = stream;\r\n await videoRef.current.play().catch(() => { });\r\n requestAnimationFrame(() => {\r\n try {\r\n const v = videoRef.current!;\r\n // Canvas will be synced separately\r\n } catch { }\r\n });\r\n }\r\n streamRef.current = stream;\r\n setCameraReady(true);\r\n } catch (e: any) {\r\n console.error('Camera access error:', e);\r\n setCameraReady(false);\r\n throw e;\r\n }\r\n };\r\n\r\n const stopCamera = () => {\r\n if (streamRef.current) {\r\n streamRef.current.getTracks().forEach((t) => t.stop());\r\n streamRef.current = null;\r\n }\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = null;\r\n }\r\n setCameraReady(false);\r\n };\r\n\r\n useEffect(() => {\r\n startCamera();\r\n return () => {\r\n stopCamera();\r\n };\r\n }, []);\r\n\r\n return {\r\n videoRef,\r\n cameraReady,\r\n startCamera,\r\n stopCamera,\r\n };\r\n}\r\n\r\n","import { FaceMesh, FACEMESH_TESSELATION, FACEMESH_FACE_OVAL, FACEMESH_LEFT_EYE, FACEMESH_RIGHT_EYE, FACEMESH_LIPS } from '@mediapipe/face_mesh';\r\nimport { drawConnectors, drawLandmarks as drawMPLandmarks } from '@mediapipe/drawing_utils';\r\n\r\nexport type LivenessStage = 'CENTER' | 'LEFT' | 'RIGHT' | 'SNAP' | 'DONE';\r\n\r\nexport interface FaceMeshServiceCallbacks {\r\n onFaceDetected?: (faceOnCanvas: Array<{ x: number; y: number }>) => void;\r\n onLivenessUpdate?: (stage: LivenessStage, instruction: string) => void;\r\n onModelLoaded?: () => void;\r\n onModelFailed?: (error: Error) => void;\r\n onCaptureTrigger?: () => void;\r\n}\r\n\r\nexport interface LivenessState {\r\n centerHold: number;\r\n leftHold: number;\r\n rightHold: number;\r\n snapTriggered: boolean;\r\n lastResultsAt: number;\r\n stage: LivenessStage;\r\n livenessReady: boolean;\r\n currentYaw: number | null;\r\n currentAbsYaw: number | null;\r\n livenessCompleted: boolean;\r\n}\r\n\r\nexport class FaceMeshService {\r\n private faceMesh: FaceMesh | null = null;\r\n private videoRef: React.RefObject<HTMLVideoElement | null>;\r\n private canvasRef: React.RefObject<HTMLCanvasElement | null>;\r\n private callbacks: FaceMeshServiceCallbacks;\r\n private cameraDriverRef: React.MutableRefObject<number | null>;\r\n private livenessStateRef: React.MutableRefObject<LivenessState>;\r\n private cancelled = false;\r\n\r\n constructor(\r\n videoRef: React.RefObject<HTMLVideoElement | null>,\r\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\r\n cameraDriverRef: React.MutableRefObject<number | null>,\r\n livenessStateRef: React.MutableRefObject<LivenessState>,\r\n callbacks: FaceMeshServiceCallbacks\r\n ) {\r\n this.videoRef = videoRef;\r\n this.canvasRef = canvasRef;\r\n this.cameraDriverRef = cameraDriverRef;\r\n this.livenessStateRef = livenessStateRef;\r\n this.callbacks = callbacks;\r\n }\r\n\r\n private drawOverlays(ctx: CanvasRenderingContext2D, normalized: Array<{ x: number; y: number }>) {\r\n drawConnectors(ctx, normalized as any, FACEMESH_TESSELATION, { color: \"#60a5fa\", lineWidth: 0.5 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_FACE_OVAL, { color: \"#f59e0b\", lineWidth: 2 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_LEFT_EYE, { color: \"#10b981\", lineWidth: 1.5 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_RIGHT_EYE, { color: \"#ef4444\", lineWidth: 1.5 });\r\n drawConnectors(ctx, normalized as any, FACEMESH_LIPS, { color: \"#a855f7\", lineWidth: 1.5 });\r\n drawMPLandmarks(ctx, normalized as any, { color: \"#2563eb\", lineWidth: 0, radius: 1.5 });\r\n }\r\n\r\n private processResults(results: any) {\r\n const canvas = this.canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n \r\n const dpr = Math.max(1, Math.min(3, window.devicePixelRatio || 1));\r\n const displayW = (canvas.parentElement as HTMLElement)?.clientWidth || canvas.width;\r\n const displayH = (canvas.parentElement as HTMLElement)?.clientHeight || canvas.height;\r\n if (canvas.width !== Math.round(displayW * dpr) || canvas.height !== Math.round(displayH * dpr)) {\r\n canvas.width = Math.round(displayW * dpr);\r\n canvas.height = Math.round(displayH * dpr);\r\n }\r\n const w = canvas.width, h = canvas.height;\r\n \r\n ctx.fillStyle = 'rgb(0, 0, 0)';\r\n ctx.fillRect(0, 0, w, h);\r\n \r\n const faces = results.multiFaceLandmarks as Array<Array<{ x: number; y: number }>> | undefined;\r\n const face = faces && faces[0];\r\n \r\n if (face) {\r\n const vid = this.videoRef.current as HTMLVideoElement | null;\r\n const vidW = Math.max(1, vid?.videoWidth || displayW);\r\n const vidH = Math.max(1, vid?.videoHeight || displayH);\r\n const scale = Math.max(w / vidW, h / vidH);\r\n const offsetX = (w - vidW * scale) / 2;\r\n const offsetY = (h - vidH * scale) / 2;\r\n \r\n const faceOnCanvas = face.map(p => {\r\n const mappedX = (p.x * vidW * scale + offsetX) / w;\r\n return {\r\n x: 1 - mappedX,\r\n y: (p.y * vidH * scale + offsetY) / h,\r\n };\r\n });\r\n\r\n const guideCX = w / 2;\r\n const guideCY = h / 2;\r\n const guideR = Math.min(w, h) * 0.45;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.arc(guideCX, guideCY, guideR, 0, Math.PI * 2);\r\n ctx.clip();\r\n ctx.drawImage(vid!, offsetX, offsetY, vidW * scale, vidH * scale);\r\n ctx.restore();\r\n\r\n this.drawOverlays(ctx, faceOnCanvas as any);\r\n \r\n this.livenessStateRef.current.lastResultsAt = Date.now();\r\n \r\n if (this.callbacks.onFaceDetected) {\r\n this.callbacks.onFaceDetected(faceOnCanvas);\r\n }\r\n\r\n this.processLiveness(faceOnCanvas, w, h);\r\n } else {\r\n // Reset face orientation when no face is detected\r\n this.livenessStateRef.current.currentYaw = null;\r\n this.livenessStateRef.current.currentAbsYaw = null;\r\n \r\n const vid = this.videoRef.current as HTMLVideoElement | null;\r\n if (vid) {\r\n const vidW = Math.max(1, vid?.videoWidth || displayW);\r\n const vidH = Math.max(1, vid?.videoHeight || displayH);\r\n const scale = Math.max(w / vidW, h / vidH);\r\n const offsetX = (w - vidW * scale) / 2;\r\n const offsetY = (h - vidH * scale) / 2;\r\n \r\n const guideCX = w / 2;\r\n const guideCY = h / 2;\r\n const guideR = Math.min(w, h) * 0.45;\r\n \r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.arc(guideCX, guideCY, guideR, 0, Math.PI * 2);\r\n ctx.clip();\r\n ctx.drawImage(vid, offsetX, offsetY, vidW * scale, vidH * scale);\r\n ctx.restore();\r\n }\r\n \r\n if (Date.now() - this.livenessStateRef.current.lastResultsAt > 2000) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(\r\n this.livenessStateRef.current.stage,\r\n \"No face detected. Center your face in frame with good lighting.\"\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private processLiveness(faceOnCanvas: Array<{ x: number; y: number }>, w: number, h: number) {\r\n const eyeA = faceOnCanvas[33];\r\n const eyeB = faceOnCanvas[263];\r\n const flipX = (p: any) => ({ x: 1 - p.x, y: p.y });\r\n const eA = flipX(eyeA);\r\n const eB = flipX(eyeB);\r\n const n1 = faceOnCanvas[1];\r\n const n4 = faceOnCanvas[4];\r\n const nT = flipX(n1 && n4 ? { x: (n1.x + n4.x) / 2, y: (n1.y + n4.y) / 2 } : (n1 || n4 || faceOnCanvas[197]));\r\n const leftEyeOuter = eA.x < eB.x ? eA : eB;\r\n const rightEyeOuter = eA.x < eB.x ? eB : eA;\r\n \r\n if (leftEyeOuter && rightEyeOuter && nT) {\r\n const faceWidth = Math.abs(rightEyeOuter.x - leftEyeOuter.x);\r\n const midX = (leftEyeOuter.x + rightEyeOuter.x) / 2;\r\n const yaw = (nT.x - midX) / Math.max(1e-6, faceWidth);\r\n const absYaw = Math.abs(yaw);\r\n \r\n // Store current face orientation for capture validation\r\n this.livenessStateRef.current.currentYaw = yaw;\r\n this.livenessStateRef.current.currentAbsYaw = absYaw;\r\n \r\n const xs = faceOnCanvas.map(p => p.x), ys = faceOnCanvas.map(p => p.y);\r\n const minX = Math.min(...xs) * w, maxX = Math.max(...xs) * w;\r\n const minY = Math.min(...ys) * h, maxY = Math.max(...ys) * h;\r\n const boxCX = (minX + maxX) / 2, boxCY = (minY + maxY) / 2;\r\n const guideCX = w / 2;\r\n const guideCY = h / 2;\r\n const guideR = Math.min(w, h) * 0.45;\r\n const dx = boxCX - guideCX;\r\n const dy = boxCY - guideCY;\r\n const insideGuide = (dx * dx + dy * dy) <= (guideR * guideR)\r\n && (maxX - minX) <= guideR * 2 * 1.05 && (maxY - minY) <= guideR * 2 * 1.05;\r\n \r\n if (!this.livenessStateRef.current.livenessReady) {\r\n this.livenessStateRef.current.livenessReady = true;\r\n }\r\n \r\n const centerThreshold = 0.05;\r\n const leftThreshold = 0.08;\r\n const rightThreshold = 0.08;\r\n const holdFramesCenter = 12;\r\n const holdFramesTurn = 12;\r\n \r\n const state = this.livenessStateRef.current;\r\n \r\n if (state.stage === \"CENTER\") {\r\n if (!insideGuide) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Center your face inside the circle\");\r\n }\r\n } else if (absYaw < centerThreshold) {\r\n state.centerHold += 1;\r\n if (state.centerHold >= holdFramesCenter) {\r\n // Only transition to LEFT if liveness check hasn't been completed yet\r\n if (!state.livenessCompleted) {\r\n const newStage: LivenessStage = \"LEFT\";\r\n state.stage = newStage;\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(newStage, \"Turn your face LEFT\");\r\n }\r\n }\r\n }\r\n } else {\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, yaw > 0 ? \"Move your face slightly LEFT\" : \"Move your face slightly RIGHT\");\r\n }\r\n }\r\n } else if (state.stage === \"LEFT\") {\r\n if (faceWidth < 0.08) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Move closer to the camera\");\r\n }\r\n } else if (yaw < -leftThreshold) {\r\n state.leftHold += 1;\r\n if (state.leftHold >= holdFramesTurn) {\r\n const newStage: LivenessStage = \"RIGHT\";\r\n state.stage = newStage;\r\n state.leftHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(newStage, \"Great! Now turn your face RIGHT\");\r\n }\r\n }\r\n } else {\r\n state.leftHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, yaw > rightThreshold ? \"You're facing right. Turn LEFT\" : \"Turn a bit more LEFT\");\r\n }\r\n }\r\n } else if (state.stage === \"RIGHT\") {\r\n if (faceWidth < 0.08) {\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Move closer to the camera\");\r\n }\r\n } else if (yaw > rightThreshold) {\r\n state.rightHold += 1;\r\n if (state.rightHold >= holdFramesTurn) {\r\n state.rightHold = 0;\r\n // Mark liveness as completed and transition to DONE stage\r\n state.livenessCompleted = true;\r\n const newStage: LivenessStage = \"DONE\";\r\n state.stage = newStage;\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(newStage, \"Great! Now look straight at the camera\");\r\n }\r\n }\r\n } else {\r\n state.rightHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, yaw < -leftThreshold ? \"You're facing left. Turn RIGHT\" : \"Turn a bit more RIGHT\");\r\n }\r\n }\r\n } else if (state.stage === \"DONE\") {\r\n // In DONE stage, wait for face to be straight before capturing (no center check needed)\r\n // Reduced threshold for easier capture when face is straight\r\n const reducedThreshold = 0.08; // More lenient threshold\r\n if (absYaw < reducedThreshold) {\r\n state.centerHold += 1;\r\n if (state.centerHold >= holdFramesCenter && !state.snapTriggered) {\r\n state.snapTriggered = true;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Capturing...\");\r\n }\r\n if (this.callbacks.onCaptureTrigger) {\r\n this.callbacks.onCaptureTrigger();\r\n }\r\n }\r\n } else {\r\n state.centerHold = 0;\r\n if (this.callbacks.onLivenessUpdate) {\r\n this.callbacks.onLivenessUpdate(state.stage, \"Please look straight at the camera\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private waitForVideoReady(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let attempts = 0;\r\n const maxAttempts = 100;\r\n \r\n const checkReady = () => {\r\n if (this.cancelled) {\r\n reject(new Error('Cancelled'));\r\n return;\r\n }\r\n \r\n const video = this.videoRef.current;\r\n if (\r\n video &&\r\n video.readyState >= 2 &&\r\n video.videoWidth > 0 &&\r\n video.videoHeight > 0 &&\r\n !isNaN(video.videoWidth) &&\r\n !isNaN(video.videoHeight)\r\n ) {\r\n resolve();\r\n } else if (attempts >= maxAttempts) {\r\n if (video) {\r\n resolve();\r\n } else {\r\n reject(new Error('Video not ready'));\r\n }\r\n } else {\r\n attempts++;\r\n requestAnimationFrame(checkReady);\r\n }\r\n };\r\n checkReady();\r\n });\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n try {\r\n const fm = new FaceMesh({ \r\n locateFile: (file: string) => `https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh@0.4.1633559619/${file}` \r\n });\r\n fm.setOptions({\r\n selfieMode: true,\r\n maxNumFaces: 1,\r\n refineLandmarks: true,\r\n minDetectionConfidence: 0.5,\r\n minTrackingConfidence: 0.5\r\n } as any);\r\n \r\n this.faceMesh = fm;\r\n \r\n if (this.cancelled) return;\r\n \r\n if (this.callbacks.onModelLoaded) {\r\n this.callbacks.onModelLoaded();\r\n }\r\n \r\n fm.onResults((results) => {\r\n if (!this.cancelled) {\r\n this.processResults(results);\r\n }\r\n });\r\n \r\n if (this.videoRef.current) {\r\n try {\r\n await this.waitForVideoReady();\r\n } catch (error) {\r\n if (!this.cancelled) {\r\n console.debug('Video ready check failed, continuing anyway:', error);\r\n }\r\n }\r\n \r\n const tick = async () => {\r\n if (this.cancelled) return;\r\n if (!this.videoRef.current || !this.faceMesh) return;\r\n \r\n const video = this.videoRef.current;\r\n if (\r\n video.readyState >= 2 &&\r\n video.videoWidth > 0 &&\r\n video.videoHeight > 0 &&\r\n !isNaN(video.videoWidth) &&\r\n !isNaN(video.videoHeight)\r\n ) {\r\n try {\r\n await this.faceMesh.send({ image: video as HTMLVideoElement });\r\n } catch (error) {\r\n if (!this.cancelled) {\r\n console.debug('MediaPipe send error (non-critical):', error);\r\n }\r\n }\r\n }\r\n \r\n if (!this.cancelled) {\r\n this.cameraDriverRef.current = requestAnimationFrame(tick);\r\n }\r\n };\r\n \r\n this.cameraDriverRef.current = requestAnimationFrame(tick);\r\n }\r\n } catch (e) {\r\n if (!this.cancelled && this.callbacks.onModelFailed) {\r\n this.callbacks.onModelFailed(e as Error);\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n cleanup(): void {\r\n this.cancelled = true;\r\n if (this.cameraDriverRef.current) {\r\n cancelAnimationFrame(this.cameraDriverRef.current);\r\n this.cameraDriverRef.current = null;\r\n }\r\n if (this.faceMesh) {\r\n try {\r\n (this.faceMesh as any).close?.();\r\n } catch {}\r\n this.faceMesh = null;\r\n }\r\n }\r\n}\r\n\r\n","import { useRef, useState, useEffect, useCallback } from 'react';\r\nimport { FaceMeshService } from '../../../services/faceMeshService';\r\nimport type { LivenessStage } from '../../../services/faceMeshService';\r\nimport type { FaceScanState, LivenessRefs } from '../types';\r\n\r\nexport interface FaceScanCallbacks {\r\n onFaceCaptureComplete?: (imageData: string) => void;\r\n onLivenessFailedCallback?: (failed: boolean) => void;\r\n onFaceUpload?: (blob: Blob) => Promise<void>;\r\n}\r\n\r\nexport function useFaceScan(\r\n videoRef: React.RefObject<HTMLVideoElement | null>,\r\n canvasRef: React.RefObject<HTMLCanvasElement | null>,\r\n callbacks?: FaceScanCallbacks\r\n) {\r\n const [state, setState] = useState<FaceScanState>({\r\n cameraReady: false,\r\n livenessStage: 'CENTER',\r\n livenessReady: false,\r\n livenessFailed: false,\r\n modelLoading: true,\r\n modelLoaded: false,\r\n livenessInstruction: 'Look straight at the camera',\r\n loading: false,\r\n allStepsCompleted: false,\r\n capturedImage: null,\r\n showDocumentUpload: false,\r\n });\r\n\r\n const refs: LivenessRefs = {\r\n centerHold: useRef<number>(0),\r\n leftHold: useRef<number>(0),\r\n rightHold: useRef<number>(0),\r\n snapTriggered: useRef<boolean>(false),\r\n lastResultsAt: useRef<number>(0),\r\n livenessStage: useRef<LivenessStage>('CENTER'),\r\n cameraDriver: useRef<number | null>(null),\r\n modelLoaded: useRef<boolean>(false),\r\n livenessFailed: useRef<boolean>(false),\r\n handleFaceCapture: useRef<(() => void) | null>(null),\r\n };\r\n\r\n const livenessStateRef = useRef({\r\n centerHold: 0,\r\n leftHold: 0,\r\n rightHold: 0,\r\n snapTriggered: false,\r\n lastResultsAt: 0,\r\n stage: 'CENTER' as LivenessStage,\r\n livenessReady: false,\r\n currentYaw: null as number | null,\r\n currentAbsYaw: null as number | null,\r\n livenessCompleted: false,\r\n });\r\n\r\n // Sync refs with state\r\n useEffect(() => {\r\n livenessStateRef.current.centerHold = refs.centerHold.current;\r\n livenessStateRef.current.leftHold = refs.leftHold.current;\r\n livenessStateRef.current.rightHold = refs.rightHold.current;\r\n livenessStateRef.current.snapTriggered = refs.snapTriggered.current;\r\n livenessStateRef.current.lastResultsAt = refs.lastResultsAt.current;\r\n livenessStateRef.current.stage = state.livenessStage;\r\n livenessStateRef.current.livenessReady = state.livenessReady;\r\n }, [state.livenessStage, state.livenessReady]);\r\n\r\n useEffect(() => {\r\n refs.livenessStage.current = state.livenessStage;\r\n }, [state.livenessStage]);\r\n\r\n const setStage = useCallback((next: LivenessStage) => {\r\n refs.livenessStage.current = next;\r\n livenessStateRef.current.stage = next;\r\n setState(prev => ({ ...prev, livenessStage: next }));\r\n }, []);\r\n\r\n const handleFaceCapture = useCallback(async () => {\r\n if (!videoRef.current) return;\r\n \r\n // Check if face is straight before capturing (reduced threshold, no center check)\r\n const reducedThreshold = 0.08; // More lenient threshold - only check if face is straight\r\n const currentAbsYaw = livenessStateRef.current.currentAbsYaw;\r\n \r\n if (currentAbsYaw === null || currentAbsYaw === undefined) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: \"Please position your face in front of the camera\",\r\n }));\r\n return;\r\n }\r\n \r\n if (currentAbsYaw >= reducedThreshold) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: \"Please look straight at the camera before capturing\",\r\n }));\r\n return;\r\n }\r\n \r\n setState(prev => ({ ...prev, loading: true }));\r\n try {\r\n const video = videoRef.current;\r\n const canvas = document.createElement(\"canvas\");\r\n const width = video.videoWidth || 640;\r\n const height = video.videoHeight || 480;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) throw new Error(\"Canvas not supported\");\r\n ctx.drawImage(video, 0, 0, width, height);\r\n const dataUrl = canvas.toDataURL(\"image/jpeg\", 0.92);\r\n \r\n // Convert data URL to blob\r\n const blob = await (await fetch(dataUrl)).blob();\r\n \r\n // Upload face scan if callback provided\r\n if (callbacks?.onFaceUpload) {\r\n try {\r\n await callbacks.onFaceUpload(blob);\r\n // Only proceed if upload was successful (not face already registered)\r\n setState(prev => ({\r\n ...prev,\r\n capturedImage: dataUrl,\r\n allStepsCompleted: true,\r\n livenessInstruction: \"Face captured and uploaded successfully!\",\r\n loading: false,\r\n }));\r\n \r\n // Call completion callback\r\n if (callbacks?.onFaceCaptureComplete) {\r\n callbacks.onFaceCaptureComplete(dataUrl);\r\n }\r\n \r\n setTimeout(() => {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n }, 500);\r\n } catch (uploadError: any) {\r\n // If it's the face already registered error, don't show document upload\r\n if (uploadError.message === 'FACE_ALREADY_REGISTERED' || (uploadError as any).isFaceAlreadyRegistered) {\r\n setState(prev => ({\r\n ...prev,\r\n loading: false,\r\n allStepsCompleted: false,\r\n showDocumentUpload: false,\r\n livenessInstruction: \"Face already registered. Please click Retry to register again.\",\r\n }));\r\n return; // Don't proceed to document upload\r\n }\r\n // For other errors, show error message\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: uploadError.message || 'Error capturing image. Please try again.',\r\n loading: false,\r\n }));\r\n throw uploadError;\r\n }\r\n } else {\r\n setState(prev => ({\r\n ...prev,\r\n capturedImage: dataUrl,\r\n allStepsCompleted: true,\r\n livenessInstruction: \"Face captured successfully!\",\r\n loading: false,\r\n }));\r\n \r\n // Call completion callback\r\n if (callbacks?.onFaceCaptureComplete) {\r\n callbacks.onFaceCaptureComplete(dataUrl);\r\n }\r\n \r\n setTimeout(() => {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n }, 500);\r\n }\r\n } catch (err: any) {\r\n console.error('Error capturing image:', err);\r\n setState(prev => ({\r\n ...prev,\r\n livenessInstruction: err.message || 'Error capturing image. Please try again.',\r\n loading: false,\r\n }));\r\n }\r\n }, [callbacks]);\r\n\r\n useEffect(() => {\r\n refs.handleFaceCapture.current = handleFaceCapture;\r\n }, [handleFaceCapture]);\r\n\r\n useEffect(() => {\r\n if (!state.cameraReady) return;\r\n \r\n let service: FaceMeshService | null = null;\r\n let initTimeoutId: number | null = null;\r\n let cancelled = false;\r\n\r\n const start = async () => {\r\n try {\r\n service = new FaceMeshService(\r\n videoRef,\r\n canvasRef,\r\n refs.cameraDriver,\r\n livenessStateRef,\r\n {\r\n onModelLoaded: () => {\r\n if (cancelled) return;\r\n setState(prev => ({\r\n ...prev,\r\n modelLoaded: true,\r\n modelLoading: false,\r\n }));\r\n refs.modelLoaded.current = true;\r\n },\r\n onModelFailed: (error) => {\r\n if (cancelled) return;\r\n setState(prev => ({\r\n ...prev,\r\n livenessFailed: true,\r\n modelLoading: false,\r\n modelLoaded: false,\r\n }));\r\n refs.livenessFailed.current = true;\r\n console.error(\"mediapipe facemesh init error\", error);\r\n },\r\n onLivenessUpdate: (stage, instruction) => {\r\n if (cancelled) return;\r\n setState(prev => ({\r\n ...prev,\r\n livenessStage: stage,\r\n livenessInstruction: instruction,\r\n livenessReady: true,\r\n }));\r\n livenessStateRef.current.stage = stage;\r\n refs.livenessStage.current = stage;\r\n // Sync hold counts from service state\r\n refs.centerHold.current = livenessStateRef.current.centerHold;\r\n refs.leftHold.current = livenessStateRef.current.leftHold;\r\n refs.rightHold.current = livenessStateRef.current.rightHold;\r\n refs.snapTriggered.current = livenessStateRef.current.snapTriggered;\r\n },\r\n onCaptureTrigger: () => {\r\n if (cancelled) return;\r\n if (refs.handleFaceCapture.current) {\r\n refs.handleFaceCapture.current();\r\n }\r\n },\r\n }\r\n );\r\n\r\n await service.initialize();\r\n } catch (e) {\r\n if (!cancelled && refs.livenessFailed.current === false) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessFailed: true,\r\n modelLoading: false,\r\n modelLoaded: false,\r\n }));\r\n refs.livenessFailed.current = true;\r\n }\r\n }\r\n };\r\n\r\n initTimeoutId = window.setTimeout(() => {\r\n if (!cancelled && !refs.modelLoaded.current && !refs.livenessFailed.current) {\r\n setState(prev => ({\r\n ...prev,\r\n livenessFailed: true,\r\n modelLoading: false,\r\n }));\r\n refs.livenessFailed.current = true;\r\n }\r\n }, 8000);\r\n\r\n start();\r\n\r\n // Cleanup function - must return a function, not a Promise\r\n return () => {\r\n cancelled = true;\r\n if (initTimeoutId) {\r\n window.clearTimeout(initTimeoutId);\r\n initTimeoutId = null;\r\n }\r\n if (service) {\r\n service.cleanup();\r\n service = null;\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [state.cameraReady]);\r\n\r\n return {\r\n state,\r\n setState,\r\n refs,\r\n setStage,\r\n handleFaceCapture,\r\n };\r\n}\r\n\r\n","import { useEffect, useState } from 'react';\r\n\r\ninterface ToastProps {\r\n message: string;\r\n type?: 'success' | 'error' | 'info' | 'warning';\r\n duration?: number;\r\n onClose?: () => void;\r\n}\r\n\r\nexport function Toast({ message, type = 'info', duration = 5000, onClose }: ToastProps) {\r\n const [isVisible, setIsVisible] = useState(true);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n setIsVisible(false);\r\n setTimeout(() => {\r\n if (onClose) onClose();\r\n }, 300); // Wait for fade out animation\r\n }, duration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [duration, onClose]);\r\n\r\n const bgColor = {\r\n success: 'bg-green-600',\r\n error: 'bg-red-600',\r\n info: 'bg-blue-600',\r\n warning: 'bg-yellow-600',\r\n }[type];\r\n\r\n return (\r\n <div\r\n className={`fixed top-4 right-4 z-[10000] transition-all duration-300 ${\r\n isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-2'\r\n }`}\r\n >\r\n <div\r\n className={`${bgColor} text-white px-6 py-4 rounded-lg shadow-lg flex items-center gap-3 min-w-[300px] max-w-[500px]`}\r\n >\r\n <div className=\"flex-1\">\r\n <p className=\"m-0 text-sm font-medium\">{message}</p>\r\n </div>\r\n <button\r\n onClick={() => {\r\n setIsVisible(false);\r\n setTimeout(() => {\r\n if (onClose) onClose();\r\n }, 300);\r\n }}\r\n className=\"text-white hover:text-gray-200 transition-colors\"\r\n aria-label=\"Close\"\r\n >\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ToastContainerProps {\r\n toasts: Array<{ id: string; message: string; type?: 'success' | 'error' | 'info' | 'warning' }>;\r\n onRemove: (id: string) => void;\r\n}\r\n\r\nexport function ToastContainer({ toasts, onRemove }: ToastContainerProps) {\r\n return (\r\n <div className=\"fixed top-4 right-4 z-[10000] flex flex-col gap-2\">\r\n {toasts.map((toast) => (\r\n <Toast\r\n key={toast.id}\r\n message={toast.message}\r\n type={toast.type}\r\n onClose={() => onRemove(toast.id)}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n","import { useRef, useEffect, useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport DocumentUploadModal from './DocumentUploadModal';\r\nimport { useCamera } from '../features/faceScan/hooks/useCamera';\r\nimport { useFaceScan } from '../features/faceScan/hooks/useFaceScan';\r\nimport { useKycContext } from '../contexts/KycContext';\r\nimport { Toast } from '../components/Toast';\r\nimport { COMPLETED_STEPS } from '../services/kycApiService';\r\nimport '../index.css';\r\n\r\ninterface FaceScanModalProps {\r\n onClose: () => void;\r\n onComplete?: (capturedImage: string) => void;\r\n}\r\n\r\nfunction FaceScanModal({ onComplete }: FaceScanModalProps) {\r\n const faceCanvasRef = useRef<HTMLCanvasElement>(null);\r\n const navigate = useNavigate();\r\n const { apiService } = useKycContext();\r\n const [sessionError, setSessionError] = useState<string | null>(null);\r\n const [toast, setToast] = useState<{ message: string; type: 'success' | 'error' | 'info' | 'warning' } | null>(null);\r\n const [showRetryButton, setShowRetryButton] = useState(false);\r\n const [isRetrying, setIsRetrying] = useState(false);\r\n const [kycCompleted, setKycCompleted] = useState(false);\r\n \r\n const { videoRef, cameraReady, stopCamera } = useCamera();\r\n const { state, setState, refs, handleFaceCapture } = useFaceScan(videoRef, faceCanvasRef, {\r\n onFaceUpload: async (blob: Blob) => {\r\n if (!apiService) {\r\n throw new Error('API service not initialized');\r\n }\r\n try {\r\n await apiService.uploadFaceScan(blob);\r\n } catch (error: any) {\r\n const errorMessage = error?.message || '';\r\n const errorData = (error as any)?.errorData || {};\r\n const statusCode = (error as any)?.statusCode;\r\n \r\n // Check for \"Face already registered\" error in various formats\r\n // The API returns: { success: false, statusCode: 500, message: \"Face already registered\", errorData: {...} }\r\n const isFaceAlreadyRegistered = \r\n errorMessage.includes('Face already registered') || \r\n errorMessage.includes('already registered') ||\r\n errorData?.message?.includes('Face already registered') ||\r\n (statusCode === 500 && errorMessage.includes('Face already registered'));\r\n \r\n if (isFaceAlreadyRegistered) {\r\n setShowRetryButton(true);\r\n setToast({\r\n message: 'Face already registered. Click Retry to register again.',\r\n type: 'warning',\r\n });\r\n setState(prev => ({ ...prev, loading: false, allStepsCompleted: false, showDocumentUpload: false }));\r\n // Throw a special error to prevent continuing to document upload\r\n const faceRegisteredError = new Error('FACE_ALREADY_REGISTERED');\r\n (faceRegisteredError as any).isFaceAlreadyRegistered = true;\r\n throw faceRegisteredError;\r\n }\r\n throw error;\r\n }\r\n },\r\n onFaceCaptureComplete: (imageData: string) => {\r\n if (onComplete) {\r\n onComplete(imageData);\r\n }\r\n },\r\n });\r\n \r\n useEffect(() => {\r\n const checkSession = async () => {\r\n if (!apiService) return;\r\n \r\n try {\r\n const statusResponse = await apiService.getSessionStatus();\r\n const { completed_steps, next_step, status } = statusResponse.data;\r\n \r\n // Check if session is active\r\n if (status !== 'ACTIVE') {\r\n throw new Error('Session expired or inactive');\r\n }\r\n \r\n // Check if KYC is completed\r\n if (status === 'COMPLETED' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {\r\n setKycCompleted(true);\r\n return;\r\n }\r\n \r\n // If face_scan is already completed, skip to document upload\r\n if (completed_steps.includes(COMPLETED_STEPS.FACE)) {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n return;\r\n }\r\n \r\n // If next_step is not face_scan, redirect accordingly\r\n if (next_step !== COMPLETED_STEPS.FACE && next_step !== COMPLETED_STEPS.INITIATED) {\r\n if (next_step === COMPLETED_STEPS.DOCS) {\r\n setState(prev => ({ ...prev, showDocumentUpload: true }));\r\n return;\r\n }\r\n }\r\n \r\n setSessionError(null);\r\n } catch (error: any) {\r\n const message = error.message || 'Session expired or inactive';\r\n setSessionError(message);\r\n setTimeout(() => {\r\n navigate('/qr', { replace: true });\r\n }, 2000);\r\n }\r\n };\r\n \r\n checkSession();\r\n }, [apiService, navigate, setState]);\r\n\r\n useEffect(() => {\r\n setState(prev => ({ ...prev, cameraReady }));\r\n }, [cameraReady, setState]);\r\n\r\n useEffect(() => {\r\n if (cameraReady && apiService) {\r\n const config = apiService.getConfig();\r\n if (config) {\r\n console.log('=== Camera Opened ===');\r\n console.log('Session ID:', config.sessionId);\r\n console.log('Server Key:', config.serverKey);\r\n console.log('API Base URL:', config.apiBaseUrl);\r\n console.log('Device Type:', config.deviceType || 'auto-detected');\r\n \r\n apiService.getSessionStatus()\r\n .then((statusResponse) => {\r\n console.log('=== Session Status API Response ===');\r\n console.log('Full Response:', statusResponse);\r\n console.log('Session Status:', statusResponse.data?.status);\r\n console.log('Session ID:', statusResponse.data?.session_id);\r\n console.log('Completed Steps:', statusResponse.data?.completed_steps);\r\n console.log('Next Step:', statusResponse.data?.next_step);\r\n })\r\n .catch((error) => {\r\n console.error('=== Session Status API Error ===');\r\n console.error('Error fetching session status:', error);\r\n });\r\n }\r\n }\r\n }, [cameraReady, apiService]);\r\n\r\n const handleRetry = async () => {\r\n if (!apiService || isRetrying) return;\r\n \r\n setIsRetrying(true);\r\n setShowRetryButton(false);\r\n setToast(null);\r\n \r\n try {\r\n await apiService.retrySession();\r\n \r\n // Reset face scan state\r\n stopCamera();\r\n setState({\r\n cameraReady: false,\r\n livenessStage: 'CENTER',\r\n livenessReady: false,\r\n livenessFailed: false,\r\n modelLoading: true,\r\n modelLoaded: false,\r\n livenessInstruction: 'Look straight at the camera',\r\n loading: false,\r\n allStepsCompleted: false,\r\n capturedImage: null,\r\n showDocumentUpload: false,\r\n });\r\n \r\n refs.centerHold.current = 0;\r\n refs.leftHold.current = 0;\r\n refs.rightHold.current = 0;\r\n refs.snapTriggered.current = false;\r\n refs.lastResultsAt.current = 0;\r\n refs.modelLoaded.current = false;\r\n refs.livenessFailed.current = false;\r\n \r\n // Reload to restart face scan\r\n setTimeout(() => {\r\n window.location.reload();\r\n }, 500);\r\n } catch (error: any) {\r\n setIsRetrying(false);\r\n setShowRetryButton(true);\r\n setToast({\r\n message: error?.message || 'Retry failed. Please try again.',\r\n type: 'error',\r\n });\r\n }\r\n };\r\n\r\n const handleRestart = () => {\r\n stopCamera();\r\n setState({\r\n cameraReady: false,\r\n livenessStage: 'CENTER',\r\n livenessReady: false,\r\n livenessFailed: false,\r\n modelLoading: true,\r\n modelLoaded: false,\r\n livenessInstruction: 'Look straight at the camera',\r\n loading: false,\r\n allStepsCompleted: false,\r\n capturedImage: null,\r\n showDocumentUpload: false,\r\n });\r\n \r\n refs.centerHold.current = 0;\r\n refs.leftHold.current = 0;\r\n refs.rightHold.current = 0;\r\n refs.snapTriggered.current = false;\r\n refs.lastResultsAt.current = 0;\r\n refs.modelLoaded.current = false;\r\n refs.livenessFailed.current = false;\r\n \r\n setTimeout(() => {\r\n window.location.reload();\r\n }, 100);\r\n };\r\n\r\n // Show KYC completion message\r\n if (kycCompleted) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <div className=\"mb-4 text-6xl\">✅</div>\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-green-500\">\r\n KYC Completed\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4 text-lg\">\r\n All steps have been completed successfully.\r\n </p>\r\n <p className=\"text-[#9ca3af] text-sm mb-6\">\r\n Please return to your desktop to continue.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (state.showDocumentUpload) {\r\n return (\r\n <DocumentUploadModal\r\n onComplete={(_file, _docType) => {\r\n if (onComplete && state.capturedImage) {\r\n onComplete(state.capturedImage);\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n \r\n if (sessionError) {\r\n return (\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl\">\r\n <div className=\"text-center\">\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-red-500\">\r\n Session Expired\r\n </h2>\r\n <p className=\"text-[#e5e7eb] mb-4\">{sessionError}</p>\r\n <p className=\"text-[#9ca3af] text-sm\">Redirecting to QR code page...</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {toast && (\r\n <Toast\r\n message={toast.message}\r\n type={toast.type}\r\n onClose={() => setToast(null)}\r\n duration={6000}\r\n />\r\n )}\r\n <div className=\"fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar\">\r\n <div className=\"max-w-[400px] w-full mx-auto bg-[#0b0f17] rounded-2xl p-6 shadow-xl mt-48\">\r\n <div className=\"relative mb-4\">\r\n <h2 className=\"m-0 mb-4 text-[26px] font-bold text-white text-center\">\r\n Capture Face\r\n </h2>\r\n </div>\r\n \r\n <div className=\"grid gap-4\">\r\n {!state.modelLoading && state.modelLoaded && !state.livenessFailed && (\r\n <div className=\"bg-[#0a2315] text-[#34d399] py-3.5 px-4 rounded-xl text-sm border border-[#155e3b] text-left\">\r\n Face detection model loaded.\r\n </div>\r\n )}\r\n {state.modelLoading && !state.livenessFailed && (\r\n <div className=\"bg-[#1f2937] text-[#e5e7eb] py-3.5 px-4 rounded-xl text-sm border border-[#374151] text-left\">\r\n Loading face detection model...\r\n </div>\r\n )}\r\n \r\n <div className=\"relative w-full aspect-square rounded-full overflow-hidden bg-black\">\r\n <video \r\n ref={videoRef} \r\n playsInline \r\n muted \r\n className=\"w-full h-full block bg-black object-cover -scale-x-100 origin-center\"\r\n />\r\n <canvas\r\n ref={faceCanvasRef}\r\n className=\"absolute top-0 left-0 w-full h-full pointer-events-none z-[2]\"\r\n />\r\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" className=\"absolute inset-0 pointer-events-none z-[3]\">\r\n <circle cx=\"50\" cy=\"50\" r=\"44\" fill=\"none\" stroke=\"#22c55e\" strokeWidth=\"2\" strokeDasharray=\"1 3\" />\r\n </svg>\r\n </div>\r\n \r\n {!state.livenessFailed && (\r\n <div className=\"bg-gradient-to-b from-[rgba(17,24,39,0.9)] to-[rgba(17,24,39,0.6)] text-[#e5e7eb] p-4 rounded-2xl text-base border border-[#30363d]\">\r\n <div className=\"font-bold mb-2.5 text-[22px] text-white\">Liveness Check</div>\r\n <div className=\"mb-2.5 text-base\">{state.livenessInstruction}</div>\r\n <div className=\"grid gap-2.5 text-lg\">\r\n <div className={state.livenessStage === \"CENTER\" || state.livenessStage === \"LEFT\" || state.livenessStage === \"RIGHT\" || state.livenessStage === \"DONE\" ? \"opacity-100\" : \"opacity-40\"}>\r\n 1. Look Straight\r\n </div>\r\n <div className={state.livenessStage === \"RIGHT\" || state.livenessStage === \"DONE\" ? \"opacity-100\" : \"opacity-40\"}>\r\n 2. Turn your face right\r\n </div>\r\n <div className={state.livenessStage === \"DONE\" ? \"opacity-100\" : \"opacity-30\"}>\r\n 3. Turn your face left\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n \r\n {showRetryButton && (\r\n <button\r\n type=\"button\"\r\n onClick={handleRetry}\r\n disabled={isRetrying || state.loading}\r\n className=\"py-3.5 px-4 rounded-xl text-base font-bold border-none transition-colors bg-[#f59e0b] text-[#0b0f17] cursor-pointer hover:bg-[#d97706] disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {isRetrying ? \"Retrying...\" : \"Retry Face Registration\"}\r\n </button>\r\n )}\r\n \r\n <button\r\n type=\"button\"\r\n disabled={!state.cameraReady || state.loading || (!state.livenessFailed && state.livenessStage !== \"DONE\") || showRetryButton}\r\n onClick={handleFaceCapture}\r\n className={`py-3.5 px-4 rounded-xl text-base font-bold border-none transition-colors ${\r\n state.cameraReady && !state.loading && (state.livenessFailed || state.livenessStage === \"DONE\") && !showRetryButton\r\n ? \"bg-[#22c55e] text-[#0b0f17] cursor-pointer hover:bg-[#16a34a]\"\r\n : \"bg-[#374151] text-[#e5e7eb] cursor-not-allowed\"\r\n }`}\r\n >\r\n {state.loading\r\n ? \"Capturing...\"\r\n : (state.livenessFailed || state.livenessStage === \"DONE\")\r\n ? \"Capture & Continue\"\r\n : \"Complete steps to continue\"}\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n onClick={handleRestart}\r\n disabled={state.loading || isRetrying}\r\n className={`py-3 px-4 rounded-[10px] text-[15px] font-semibold border-none w-full transition-colors ${\r\n (state.loading || isRetrying) ? \"bg-[#374151] text-[#e5e7eb] cursor-not-allowed opacity-50\" : \"bg-[#374151] text-[#e5e7eb] cursor-pointer hover:bg-[#4b5563]\"\r\n }`}\r\n >\r\n Restart\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default FaceScanModal;\r\n","import { useEffect, useState } from 'react';\r\nimport { isMobileDevice } from '../utils/deviceDetection';\r\nimport FaceScanModal from './FaceScanModal';\r\nimport { KycProvider } from '../contexts/KycContext';\r\nimport '../index.css';\r\n\r\ninterface MobileRouteProps {\r\n onClose?: () => void;\r\n onNavigate?: (view: 'qr' | 'mobileroute') => void;\r\n}\r\n\r\n// Inner component that uses the context\r\nfunction MobileRouteContent({ onClose, onComplete }: { onClose?: () => void; onComplete?: (image: string) => void }) {\r\n return <FaceScanModal onClose={onClose} onComplete={onComplete} />;\r\n}\r\n\r\nfunction MobileRoute({ onClose, onNavigate }: MobileRouteProps = {}) {\r\n const [config, setConfig] = useState<{\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n if (!isMobileDevice() && onNavigate) {\r\n onNavigate('qr');\r\n return;\r\n }\r\n\r\n // If accessed standalone (via URL), get config from URL params\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const sessionId = searchParams.get('sessionId');\r\n const apiBaseUrl = searchParams.get('apiBaseUrl') || searchParams.get('apiUrl') || '';\r\n const serverKey = searchParams.get('serverKey') || '';\r\n\r\n if (sessionId && apiBaseUrl && serverKey) {\r\n setConfig({\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n });\r\n } else if (sessionId) {\r\n // Try to get from localStorage or use defaults\r\n // For now, we'll need these to be passed via URL\r\n console.error('Missing required parameters: apiBaseUrl and serverKey must be in URL');\r\n }\r\n }, [onNavigate]);\r\n\r\n const handleClose = () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const handleComplete = (capturedImage: string) => {\r\n // Handle completion - send captured image to backend or parent\r\n console.log('Face capture completed with image:', capturedImage.substring(0, 50) + '...');\r\n // You can emit an event, call a callback, or navigate here\r\n };\r\n\r\n if (!isMobileDevice()) {\r\n return null;\r\n }\r\n\r\n // If we have config from URL (standalone mode), wrap in provider\r\n if (config) {\r\n return (\r\n <KycProvider\r\n apiBaseUrl={config.apiBaseUrl}\r\n sessionId={config.sessionId}\r\n serverKey={config.serverKey}\r\n deviceType=\"mobile\"\r\n >\r\n <MobileRouteContent onClose={handleClose} onComplete={handleComplete} />\r\n </KycProvider>\r\n );\r\n }\r\n\r\n // If used within SDK (has onNavigate), it should already be wrapped in provider\r\n // But we'll still wrap it to be safe\r\n if (onNavigate) {\r\n // This means it's being used within the SDK component\r\n // The provider should already be there, but we'll render the content directly\r\n return <MobileRouteContent onClose={handleClose} onComplete={handleComplete} />;\r\n }\r\n\r\n // Fallback: show error if no config\r\n return (\r\n <div className=\"fixed inset-0 flex items-center justify-center bg-black/50 z-[1000]\">\r\n <div className=\"bg-white p-6 rounded-lg text-center max-w-md mx-4\">\r\n <p className=\"text-red-600 mb-2\">Missing Configuration</p>\r\n <p className=\"text-sm text-gray-600\">\r\n Please ensure the URL includes sessionId, apiBaseUrl, and serverKey parameters.\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MobileRoute;\r\n","import { useState, useEffect } from 'react';\r\nimport { QRCodeSVG } from 'qrcode.react';\r\nimport { KycApiService } from '../services/kycApiService';\r\nimport '../index.css';\r\n\r\ninterface QRCodePageProps {\r\n onClose?: () => void;\r\n onNavigate?: (view: 'qr' | 'mobileroute') => void;\r\n mobileBaseUrl?: string;\r\n sessionId?: string;\r\n apiBaseUrl?: string;\r\n serverKey?: string;\r\n}\r\n\r\nfunction QRCodePage({ onClose, mobileBaseUrl = 'https://kyc-sdk-stage.astraprotocol.com', sessionId, apiBaseUrl, serverKey }: QRCodePageProps = {}) {\r\n const [qrUrl, setQrUrl] = useState<string>('');\r\n const [copied, setCopied] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n // Get search params from current URL\r\n const searchParams = new URLSearchParams(window.location.search);\r\n \r\n // Add required params to query string for mobile route\r\n if (sessionId) {\r\n searchParams.set('sessionId', sessionId);\r\n }\r\n if (apiBaseUrl) {\r\n searchParams.set('apiBaseUrl', apiBaseUrl);\r\n }\r\n if (serverKey) {\r\n searchParams.set('serverKey', serverKey);\r\n }\r\n \r\n const mobileRoute = '/mobileroute';\r\n const queryString = searchParams.toString();\r\n const fullUrl = `${mobileBaseUrl}${mobileRoute}${queryString ? `?${queryString}` : ''}`;\r\n \r\n setQrUrl(fullUrl);\r\n }, [mobileBaseUrl, sessionId, apiBaseUrl, serverKey]);\r\n\r\n const handleCopyUrl = async () => {\r\n if (qrUrl) {\r\n try {\r\n await navigator.clipboard.writeText(qrUrl);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const handleCheckResult = async () => {\r\n if (!apiBaseUrl || !sessionId || !serverKey) {\r\n alert('Missing configuration to check KYC result.');\r\n return;\r\n }\r\n\r\n try {\r\n const svc = new KycApiService({ apiBaseUrl, sessionId, serverKey });\r\n const payload = await svc.getResult();\r\n\r\n const first = Array.isArray(payload?.data) && payload.data.length > 0 ? payload.data[0] : null;\r\n\r\n if (first && first.kyc_status === 'success' && first.redirectUrl) {\r\n window.location.href = first.redirectUrl;\r\n return;\r\n }\r\n\r\n alert('Please complete your KYC first.');\r\n } catch (error: any) {\r\n const msg = error?.message || 'Result fetch failed';\r\n console.error('getResult:error', msg);\r\n alert(`Result fetch failed: ${msg}`);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 flex items-center justify-center bg-gradient-to-br from-gray-900 via-gray-800 to-black p-4 sm:p-6 md:p-8 z-[1000]\">\r\n {/* Background pattern overlay */}\r\n <div className=\"absolute inset-0 opacity-10\" style={{\r\n backgroundImage: `radial-gradient(circle at 2px 2px, rgba(255,255,255,0.15) 1px, transparent 0)`,\r\n backgroundSize: '40px 40px'\r\n }}></div>\r\n \r\n <div className=\"relative bg-[rgba(20,20,20,0.95)] backdrop-blur-sm rounded-2xl p-5 sm:p-6 md:p-7 max-w-[450px] w-full h-[80vh] flex flex-col text-center shadow-[0_8px_32px_rgba(0,0,0,0.5)] border border-white/10\">\r\n <button \r\n className=\"absolute top-5 right-5 bg-transparent border-none text-white cursor-pointer p-2 flex items-center justify-center rounded transition-colors hover:bg-white/10 active:bg-white/20\" \r\n onClick={handleClose} \r\n aria-label=\"Close\"\r\n >\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n\r\n <div className=\"flex flex-col items-center gap-3 sm:gap-4 flex-1 overflow-y-auto custom__scrollbar\">\r\n <h1 className=\"m-0 text-white text-xl sm:text-2xl font-semibold leading-tight\">Continue on Mobile</h1>\r\n <p className=\"m-0 text-white text-sm sm:text-base opacity-90 leading-relaxed\">\r\n Scan this QR on your phone to capture your face and document\r\n </p>\r\n \r\n {qrUrl && (\r\n <div className=\"flex justify-center items-center p-3 sm:p-4 bg-black rounded-xl border-2 border-white shadow-lg\">\r\n <QRCodeSVG\r\n value={qrUrl}\r\n size={180}\r\n level=\"H\"\r\n includeMargin={true}\r\n bgColor=\"#000000\"\r\n fgColor=\"#FFFFFF\"\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"w-full text-left mt-auto\">\r\n <p className=\"m-0 mb-2 text-white text-xs sm:text-sm opacity-80\">Or open:</p>\r\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 p-2 sm:p-3 bg-white/10 rounded-lg border border-white/20\">\r\n <code className=\"flex-1 text-white text-xs sm:text-sm break-all text-left m-0 font-mono\">{qrUrl}</code>\r\n <button \r\n className=\"bg-transparent border-none text-white cursor-pointer p-1.5 flex items-center justify-center rounded transition-colors flex-shrink-0 hover:bg-white/10 active:bg-white/20 self-end sm:self-auto\" \r\n onClick={handleCopyUrl}\r\n aria-label=\"Copy URL\"\r\n title={copied ? 'Copied!' : 'Copy URL'}\r\n >\r\n {copied ? (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n ) : (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button \r\n className=\"w-full py-3 sm:py-4 px-6 bg-gradient-to-r from-[#FF842D] to-[#FF2D55] border-none rounded-lg text-white text-sm sm:text-base font-semibold cursor-pointer transition-all hover:-translate-y-0.5 hover:shadow-[0_4px_12px_rgba(255,107,53,0.4)] active:translate-y-0\" \r\n onClick={handleCheckResult}\r\n >\r\n I've completed on mobile - Move to next step\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default QRCodePage;\r\n\r\n","import React, { useState } from 'react';\r\nimport { KycProvider } from '../contexts/KycContext';\r\nimport MobileRoute from '../pages/MobileRoute';\r\nimport QRCodePage from '../pages/QRCodePage';\r\n\r\nexport interface KycFlowProps {\r\n apiBaseUrl: string;\r\n sessionId: string;\r\n serverKey: string;\r\n deviceType?: string;\r\n startAtQr?: boolean;\r\n onClose?: () => void;\r\n mobileBaseUrl?: string;\r\n}\r\n\r\ntype KycFlowView = 'qr' | 'mobileroute';\r\n\r\nexport const KycFlow: React.FC<KycFlowProps> = ({\r\n apiBaseUrl,\r\n sessionId,\r\n serverKey,\r\n deviceType,\r\n startAtQr = true,\r\n onClose,\r\n mobileBaseUrl = 'https://kyc-sdk-stage.astraprotocol.com',\r\n}) => {\r\n const [currentView, setCurrentView] = useState<KycFlowView>(startAtQr ? 'qr' : 'mobileroute');\r\n\r\n const handleNavigate = (view: KycFlowView) => {\r\n setCurrentView(view);\r\n };\r\n\r\n const handleClose = () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <KycProvider\r\n apiBaseUrl={apiBaseUrl}\r\n sessionId={sessionId}\r\n serverKey={serverKey}\r\n deviceType={deviceType}\r\n >\r\n {currentView === 'qr' ? (\r\n <QRCodePage \r\n onClose={handleClose} \r\n onNavigate={handleNavigate}\r\n mobileBaseUrl={mobileBaseUrl}\r\n sessionId={sessionId}\r\n apiBaseUrl={apiBaseUrl}\r\n serverKey={serverKey}\r\n />\r\n ) : (\r\n <MobileRoute onClose={handleClose} onNavigate={handleNavigate} />\r\n )}\r\n </KycProvider>\r\n );\r\n};\r\n\r\n","\r\nimport { ApiClient } from './client';\r\nimport { mergeConfig } from './config';\r\nimport type { AstraSDKConfig, ApiResponse, RequestOptions } from './types';\r\nimport { AstraSDKError } from './types';\r\n\r\nexport class AstraSDK {\r\n private client: ApiClient;\r\n\r\n constructor(config: AstraSDKConfig) {\r\n if (!config.apiKey) {\r\n throw new AstraSDKError('API key is required', 400, 'MISSING_API_KEY');\r\n }\r\n\r\n const mergedConfig = mergeConfig(config);\r\n this.client = new ApiClient(mergedConfig);\r\n }\r\n\r\n \r\n getClient(): ApiClient {\r\n return this.client;\r\n }\r\n\r\n \r\n updateConfig(config: Partial<AstraSDKConfig>): void {\r\n this.client.updateConfig(config);\r\n }\r\n\r\n \r\n async get<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.get<T>(endpoint, options);\r\n }\r\n\r\n\r\n async post<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.post<T>(endpoint, body, options);\r\n }\r\n\r\n async put<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.put<T>(endpoint, body, options);\r\n }\r\n\r\n async patch<T = unknown>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.patch<T>(endpoint, body, options);\r\n }\r\n\r\n async delete<T = unknown>(\r\n endpoint: string,\r\n options?: Omit<RequestOptions, 'method' | 'body'>\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.delete<T>(endpoint, options);\r\n }\r\n\r\n \r\n async request<T = unknown>(\r\n endpoint: string,\r\n options?: RequestOptions\r\n ): Promise<ApiResponse<T>> {\r\n return this.client.request<T>(endpoint, options);\r\n }\r\n}\r\n\r\nexport type { AstraSDKConfig, ApiResponse, RequestOptions, ApiError } from './types';\r\nexport { AstraSDKError } from './types';\r\n\r\nexport { ApiClient } from './client';\r\n\r\n// Export KYC components\r\nexport { KycFlow } from '../components/KycFlow';\r\nexport type { KycFlowProps } from '../components/KycFlow';\r\n\r\n// Export KYC API service\r\nexport { KycApiService } from '../services/kycApiService';\r\nexport type { \r\n KycApiConfig, \r\n SessionStatusResponse, \r\n FaceScanResponse, \r\n DocumentUploadResponse \r\n} from '../services/kycApiService';\r\n\r\nexport default AstraSDK;\r\n\r\n"]}