{"version":3,"sources":["../src/geolocation/hooks.ts","../src/geolocation/ciphertext.ts"],"names":["error","getBrowserInfo"],"mappings":"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","file":"react.mjs","sourcesContent":["/**\n * React Hooks for CGS Geolocation SDK\n *\n * Provides convenient React hooks for using the geolocation service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GeolocationClient } from './client';\nimport type {\n  LocationVerification,\n  VerifyIPRequest,\n  ComplianceCheckResponse,\n  GeolocationAlert,\n  AlertFilters,\n  PaginationParams,\n  DashboardMetrics,\n  UseGeolocationOptions,\n  UseGeolocationResult,\n  UseAlertsOptions,\n  UseAlertsResult,\n  AlertStatus,\n  DeviceFingerprintRequest,\n  // Location Request Types\n  LocationRequest,\n  LocationRequestFilters,\n  CreateLocationRequestRequest,\n  LocationRequestResult,\n  LocationRequestStatus,\n  LocationShareInfo,\n  LocationCaptureRequest,\n  LocationCaptureResponse,\n  UseLocationRequestsOptions,\n  UseLocationRequestsResult,\n  UseLocationCaptureOptions,\n  UseLocationCaptureResult,\n} from './types';\n\n// ============================================================================\n// useGeolocation Hook\n// ============================================================================\n\n/**\n * React hook for IP verification and compliance checking\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Geolocation verification state and methods\n *\n * @example\n * ```tsx\n * function LoginPage() {\n *   const { verification, loading, error, verifyIP } = useGeolocation(client, {\n *     autoVerify: true,\n *     eventType: \"login\",\n *     includeDeviceFingerprint: true\n *   });\n *\n *   useEffect(() => {\n *     if (verification?.is_blocked) {\n *       alert(\"Access blocked: \" + verification.risk_reasons.join(\", \"));\n *     }\n *   }, [verification]);\n *\n *   return <div>Risk Level: {verification?.risk_level}</div>;\n * }\n * ```\n */\nexport function useGeolocation(\n  client: GeolocationClient,\n  options: UseGeolocationOptions = {}\n): UseGeolocationResult {\n  const [verification, setVerification] = useState<LocationVerification | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const verifyIP = useCallback(\n    async (request: VerifyIPRequest): Promise<LocationVerification> => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.verifyIP(request);\n        setVerification(result);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Verification failed');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  const checkCompliance = useCallback(\n    async (countryISO: string): Promise<ComplianceCheckResponse> => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.checkCompliance(countryISO);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Compliance check failed');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    if (verification) {\n      await verifyIP({\n        ip_address: verification.ip_address,\n        user_id: '', // Will need to be provided\n        event_type: options.eventType || 'api_access',\n      });\n    }\n  }, [verification, verifyIP, options.eventType]);\n\n  // Auto-verify on mount if enabled\n  useEffect(() => {\n    if (options.autoVerify) {\n      // Try to get user's IP from a service or use placeholder\n      const detectAndVerify = async () => {\n        try {\n          // In production, you'd use a service like ipify.org or get from server\n          const ipResponse = await fetch('https://api.ipify.org?format=json');\n          const { ip } = await ipResponse.json();\n\n          let deviceFingerprint: DeviceFingerprintRequest | undefined;\n\n          if (options.includeDeviceFingerprint && typeof window !== 'undefined') {\n            deviceFingerprint = {\n              device_id: localStorage.getItem('device_id') || generateDeviceId(),\n              user_agent: navigator.userAgent,\n              platform: navigator.platform,\n              language: navigator.language,\n              timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n              screen_resolution: `${window.screen.width}x${window.screen.height}`,\n            };\n\n            // Store device ID\n            if (!localStorage.getItem('device_id')) {\n              localStorage.setItem('device_id', deviceFingerprint.device_id);\n            }\n          }\n\n          await verifyIP({\n            ip_address: ip,\n            user_id: '', // Should be provided by auth context\n            event_type: options.eventType || 'page_view',\n            device_fingerprint: deviceFingerprint,\n          });\n        } catch (err) {\n          console.error('Auto-verification failed:', err);\n        }\n      };\n\n      detectAndVerify();\n    }\n  }, [options.autoVerify, options.includeDeviceFingerprint, options.eventType, verifyIP]);\n\n  return {\n    verification,\n    loading,\n    error,\n    verifyIP,\n    checkCompliance,\n    refresh,\n  };\n}\n\n// ============================================================================\n// useAlerts Hook\n// ============================================================================\n\n/**\n * React hook for alert management\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Alert state and management methods\n *\n * @example\n * ```tsx\n * function AlertDashboard() {\n *   const {\n *     alerts,\n *     total,\n *     loading,\n *     fetchAlerts,\n *     updateStatus,\n *     resolveAlert\n *   } = useAlerts(client, {\n *     autoFetch: true,\n *     filters: { status: \"active\", severity: \"critical\" },\n *     pollInterval: 30000 // Poll every 30 seconds\n *   });\n *\n *   return (\n *     <div>\n *       <h2>{total} Alerts</h2>\n *       {alerts.map(alert => (\n *         <AlertCard\n *           key={alert.id}\n *           alert={alert}\n *           onResolve={() => resolveAlert(alert.id, \"resolved\", \"Fixed\")}\n *         />\n *       ))}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useAlerts(\n  client: GeolocationClient,\n  options: UseAlertsOptions = {}\n): UseAlertsResult {\n  const [alerts, setAlerts] = useState<GeolocationAlert[]>([]);\n  const [total, setTotal] = useState(0);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const pollIntervalRef = useRef<NodeJS.Timeout>();\n\n  const fetchAlerts = useCallback(\n    async (filters?: AlertFilters, pagination?: PaginationParams) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.listAlerts(\n          filters || options.filters,\n          pagination || options.pagination\n        );\n        setAlerts(result.alerts);\n        setTotal(result.total);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to fetch alerts');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, options.filters, options.pagination]\n  );\n\n  const updateStatus = useCallback(\n    async (alertId: string, status: AlertStatus) => {\n      try {\n        await client.updateAlertStatus(alertId, status);\n        // Update local state\n        setAlerts((prev) =>\n          prev.map((alert) =>\n            alert.id === alertId ? { ...alert, status } : alert\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to update status');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const assignAlert = useCallback(\n    async (alertId: string, assignedTo: string) => {\n      try {\n        await client.assignAlert(alertId, assignedTo);\n        // Update local state\n        setAlerts((prev) =>\n          prev.map((alert) =>\n            alert.id === alertId ? { ...alert, assigned_to: assignedTo, status: 'under_review' } : alert\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to assign alert');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const resolveAlert = useCallback(\n    async (alertId: string, resolution: string, notes?: string) => {\n      try {\n        await client.resolveAlert(alertId, resolution, notes);\n        // Update local state\n        setAlerts((prev) =>\n          prev.map((alert) =>\n            alert.id === alertId\n              ? { ...alert, status: 'resolved', resolution, notes }\n              : alert\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to resolve alert');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const dismissAlert = useCallback(\n    async (alertId: string, notes?: string) => {\n      try {\n        await client.dismissAlert(alertId, notes);\n        // Update local state\n        setAlerts((prev) =>\n          prev.map((alert) =>\n            alert.id === alertId\n              ? { ...alert, status: 'false_positive', resolution: 'false_positive', notes }\n              : alert\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to dismiss alert');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    await fetchAlerts();\n  }, [fetchAlerts]);\n\n  // Auto-fetch on mount if enabled\n  useEffect(() => {\n    if (options.autoFetch) {\n      fetchAlerts();\n    }\n  }, [options.autoFetch, fetchAlerts]);\n\n  // Set up polling if enabled\n  useEffect(() => {\n    if (options.pollInterval && options.pollInterval > 0) {\n      pollIntervalRef.current = setInterval(() => {\n        fetchAlerts();\n      }, options.pollInterval);\n\n      return () => {\n        if (pollIntervalRef.current) {\n          clearInterval(pollIntervalRef.current);\n        }\n      };\n    }\n    return undefined;\n  }, [options.pollInterval, fetchAlerts]);\n\n  return {\n    alerts,\n    total,\n    loading,\n    error,\n    fetchAlerts,\n    updateStatus,\n    assignAlert,\n    resolveAlert,\n    dismissAlert,\n    refresh,\n  };\n}\n\n// ============================================================================\n// useDashboardMetrics Hook\n// ============================================================================\n\n/**\n * React hook for dashboard metrics\n *\n * @param client - GeolocationClient instance\n * @param timeRangeHours - Time range in hours (default: 24)\n * @param autoFetch - Auto-fetch metrics on mount (default: true)\n * @returns Dashboard metrics state\n *\n * @example\n * ```tsx\n * function Dashboard() {\n *   const { metrics, loading, refresh } = useDashboardMetrics(client, 168); // Last 7 days\n *\n *   if (loading) return <Spinner />;\n *\n *   return (\n *     <div>\n *       <h2>Dashboard</h2>\n *       <MetricCard label=\"Total Alerts\" value={metrics.total_alerts} />\n *       <MetricCard label=\"Critical\" value={metrics.critical_alerts} />\n *       <MetricCard label=\"Active\" value={metrics.active_alerts} />\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useDashboardMetrics(\n  client: GeolocationClient,\n  timeRangeHours: number = 24,\n  autoFetch: boolean = true\n) {\n  const [metrics, setMetrics] = useState<DashboardMetrics | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const fetchMetrics = useCallback(async () => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const result = await client.getDashboardMetrics(timeRangeHours);\n      setMetrics(result);\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error('Failed to fetch metrics');\n      setError(error);\n      throw error;\n    } finally {\n      setLoading(false);\n    }\n  }, [client, timeRangeHours]);\n\n  useEffect(() => {\n    if (autoFetch) {\n      fetchMetrics();\n    }\n  }, [autoFetch, fetchMetrics]);\n\n  return {\n    metrics,\n    loading,\n    error,\n    refresh: fetchMetrics,\n  };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a unique device ID\n */\nfunction generateDeviceId(): string {\n  return `device_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\n/**\n * Get browser information\n */\nexport function getBrowserInfo(): {\n  browser?: string;\n  browser_version?: string;\n  os?: string;\n} {\n  if (typeof window === 'undefined') return {};\n\n  const userAgent = navigator.userAgent;\n  let browser: string | undefined;\n  let browserVersion: string | undefined;\n  let os: string | undefined;\n\n  // Detect browser\n  if (userAgent.indexOf('Firefox') > -1) {\n    browser = 'Firefox';\n    browserVersion = userAgent.match(/Firefox\\/([0-9.]+)/)?.[1];\n  } else if (userAgent.indexOf('Chrome') > -1) {\n    browser = 'Chrome';\n    browserVersion = userAgent.match(/Chrome\\/([0-9.]+)/)?.[1];\n  } else if (userAgent.indexOf('Safari') > -1) {\n    browser = 'Safari';\n    browserVersion = userAgent.match(/Version\\/([0-9.]+)/)?.[1];\n  } else if (userAgent.indexOf('Edge') > -1) {\n    browser = 'Edge';\n    browserVersion = userAgent.match(/Edge\\/([0-9.]+)/)?.[1];\n  }\n\n  // Detect OS\n  if (userAgent.indexOf('Win') > -1) os = 'Windows';\n  else if (userAgent.indexOf('Mac') > -1) os = 'macOS';\n  else if (userAgent.indexOf('Linux') > -1) os = 'Linux';\n  else if (userAgent.indexOf('Android') > -1) os = 'Android';\n  else if (userAgent.indexOf('iOS') > -1) os = 'iOS';\n\n  return {\n    browser,\n    browser_version: browserVersion,\n    os,\n  };\n}\n\n/**\n * Create a complete device fingerprint for the current browser\n */\nexport function createDeviceFingerprint(): DeviceFingerprintRequest {\n  const browserInfo = getBrowserInfo();\n  const deviceId = localStorage.getItem('device_id') || generateDeviceId();\n\n  if (!localStorage.getItem('device_id')) {\n    localStorage.setItem('device_id', deviceId);\n  }\n\n  return {\n    device_id: deviceId,\n    user_agent: navigator.userAgent,\n    platform: navigator.platform,\n    language: navigator.language,\n    timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n    screen_resolution: `${window.screen.width}x${window.screen.height}`,\n    ...browserInfo,\n  };\n}\n\n// ============================================================================\n// useLocationRequests Hook\n// ============================================================================\n\n/**\n * React hook for managing location requests (admin/compliance officer)\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Location request state and management methods\n *\n * @example\n * ```tsx\n * function LocationRequestDashboard() {\n *   const {\n *     requests,\n *     total,\n *     loading,\n *     createRequest,\n *     cancelRequest,\n *     refresh\n *   } = useLocationRequests(client, {\n *     autoFetch: true,\n *     filters: { status: 'pending' },\n *     pollInterval: 30000\n *   });\n *\n *   const handleCreate = async () => {\n *     const result = await createRequest({\n *       user_id: 'customer_123',\n *       channel: 'sms',\n *       phone: '+1234567890',\n *       reason: 'Transaction verification'\n *     });\n *     console.log('Share link:', result.share_link);\n *   };\n *\n *   return (\n *     <div>\n *       <h2>{total} Location Requests</h2>\n *       <button onClick={handleCreate}>Create Request</button>\n *       {requests.map(req => (\n *         <LocationRequestCard\n *           key={req.id}\n *           request={req}\n *           onCancel={() => cancelRequest(req.id)}\n *         />\n *       ))}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useLocationRequests(\n  client: GeolocationClient,\n  options: UseLocationRequestsOptions = {}\n): UseLocationRequestsResult {\n  const [requests, setRequests] = useState<LocationRequest[]>([]);\n  const [total, setTotal] = useState(0);\n  const [page, setPage] = useState(1);\n  const [totalPages, setTotalPages] = useState(0);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const pollIntervalRef = useRef<NodeJS.Timeout>();\n\n  const fetchRequests = useCallback(\n    async (filters?: LocationRequestFilters, pagination?: PaginationParams) => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await client.listLocationRequests(\n          filters || options.filters,\n          pagination || options.pagination\n        );\n        setRequests(result.requests);\n        setTotal(result.total);\n        setPage(result.page);\n        setTotalPages(result.total_pages);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to fetch location requests');\n        setError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [client, options.filters, options.pagination]\n  );\n\n  const createRequest = useCallback(\n    async (request: CreateLocationRequestRequest): Promise<LocationRequestResult> => {\n      setError(null);\n\n      try {\n        const result = await client.createLocationRequest(request);\n        // Add to local state\n        setRequests((prev) => [result.request, ...prev]);\n        setTotal((prev) => prev + 1);\n        return result;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to create location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const getRequest = useCallback(\n    async (requestId: string): Promise<LocationRequest> => {\n      try {\n        return await client.getLocationRequest(requestId);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to get location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const cancelRequest = useCallback(\n    async (requestId: string): Promise<void> => {\n      try {\n        await client.cancelLocationRequest(requestId);\n        // Update local state\n        setRequests((prev) =>\n          prev.map((req) =>\n            req.id === requestId ? { ...req, status: 'cancelled' as LocationRequestStatus } : req\n          )\n        );\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to cancel location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const resendRequest = useCallback(\n    async (requestId: string, contact: { email?: string; phone?: string }): Promise<void> => {\n      try {\n        await client.resendLocationRequest(requestId, contact);\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to resend location request');\n        setError(error);\n        throw error;\n      }\n    },\n    [client]\n  );\n\n  const refresh = useCallback(async () => {\n    await fetchRequests();\n  }, [fetchRequests]);\n\n  // Auto-fetch on mount if enabled\n  useEffect(() => {\n    if (options.autoFetch) {\n      fetchRequests();\n    }\n  }, [options.autoFetch, fetchRequests]);\n\n  // Set up polling if enabled\n  useEffect(() => {\n    if (options.pollInterval && options.pollInterval > 0) {\n      pollIntervalRef.current = setInterval(() => {\n        fetchRequests();\n      }, options.pollInterval);\n\n      return () => {\n        if (pollIntervalRef.current) {\n          clearInterval(pollIntervalRef.current);\n        }\n      };\n    }\n    return undefined;\n  }, [options.pollInterval, fetchRequests]);\n\n  return {\n    requests,\n    total,\n    page,\n    totalPages,\n    loading,\n    error,\n    fetchRequests,\n    createRequest,\n    getRequest,\n    cancelRequest,\n    resendRequest,\n    refresh,\n  };\n}\n\n// ============================================================================\n// useLocationCapture Hook (Customer-facing)\n// ============================================================================\n\n/**\n * React hook for location capture (customer-facing)\n *\n * Use this hook in the customer's browser to capture and submit their location.\n * The token is obtained from the share link sent via SMS/email.\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options with token\n * @returns Location capture state and methods\n *\n * @example\n * ```tsx\n * function LocationSharePage({ token }: { token: string }) {\n *   const {\n *     shareInfo,\n *     loading,\n *     submitting,\n *     error,\n *     isExpired,\n *     isCompleted,\n *     captureAndSubmitGPS\n *   } = useLocationCapture(client, {\n *     token,\n *     autoFetch: true\n *   });\n *\n *   if (loading) return <Spinner />;\n *   if (isExpired) return <ExpiredMessage />;\n *   if (isCompleted) return <ThankYouMessage />;\n *\n *   return (\n *     <div>\n *       <p>Reason: {shareInfo?.reason}</p>\n *       <button\n *         onClick={captureAndSubmitGPS}\n *         disabled={submitting}\n *       >\n *         {submitting ? 'Submitting...' : 'Share My Location'}\n *       </button>\n *       {error && <ErrorMessage error={error} />}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useLocationCapture(\n  client: GeolocationClient,\n  options: UseLocationCaptureOptions\n): UseLocationCaptureResult {\n  const [shareInfo, setShareInfo] = useState<LocationShareInfo | null>(null);\n  const [captureResponse, setCaptureResponse] = useState<LocationCaptureResponse | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [submitting, setSubmitting] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const isExpired = shareInfo?.is_expired ?? false;\n  const isCompleted = shareInfo?.is_completed ?? false;\n\n  const fetchShareInfo = useCallback(async (): Promise<LocationShareInfo> => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const info = await client.getLocationShareInfo(options.token);\n      setShareInfo(info);\n      return info;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error('Failed to fetch share info');\n      setError(error);\n      throw error;\n    } finally {\n      setLoading(false);\n    }\n  }, [client, options.token]);\n\n  const submitLocation = useCallback(\n    async (capture: LocationCaptureRequest): Promise<LocationCaptureResponse> => {\n      setSubmitting(true);\n      setError(null);\n\n      try {\n        const response = await client.captureLocation(options.token, capture);\n        setCaptureResponse(response);\n\n        // Update share info to reflect completion\n        if (response.success) {\n          setShareInfo((prev) =>\n            prev ? { ...prev, is_completed: true, status: 'completed' } : prev\n          );\n        }\n\n        return response;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error('Failed to submit location');\n        setError(error);\n        throw error;\n      } finally {\n        setSubmitting(false);\n      }\n    },\n    [client, options.token]\n  );\n\n  const captureAndSubmitGPS = useCallback(async (): Promise<LocationCaptureResponse> => {\n    setSubmitting(true);\n    setError(null);\n\n    try {\n      // Request GPS permission and get position\n      const position = await new Promise<GeolocationPosition>((resolve, reject) => {\n        if (!navigator.geolocation) {\n          reject(new Error('Geolocation is not supported by this browser'));\n          return;\n        }\n\n        navigator.geolocation.getCurrentPosition(resolve, reject, {\n          enableHighAccuracy: true,\n          timeout: 30000,\n          maximumAge: 0,\n        });\n      });\n\n      // Build capture request\n      const capture: LocationCaptureRequest = {\n        latitude: position.coords.latitude,\n        longitude: position.coords.longitude,\n        accuracy: position.coords.accuracy,\n        user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n        device_info:\n          typeof navigator !== 'undefined'\n            ? {\n                platform: navigator.platform,\n                ...getBrowserInfo(),\n              }\n            : undefined,\n      };\n\n      // Submit the location\n      return await submitLocation(capture);\n    } catch (err) {\n      let error: Error;\n\n      if (err instanceof GeolocationPositionError) {\n        switch (err.code) {\n          case err.PERMISSION_DENIED:\n            error = new Error('Location permission denied. Please enable location access.');\n            break;\n          case err.POSITION_UNAVAILABLE:\n            error = new Error('Location information is unavailable.');\n            break;\n          case err.TIMEOUT:\n            error = new Error('Location request timed out. Please try again.');\n            break;\n          default:\n            error = new Error('Failed to get location');\n        }\n      } else {\n        error = err instanceof Error ? err : new Error('Failed to capture location');\n      }\n\n      setError(error);\n      throw error;\n    } finally {\n      setSubmitting(false);\n    }\n  }, [submitLocation]);\n\n  // Auto-fetch share info on mount if enabled\n  useEffect(() => {\n    if (options.autoFetch && options.token) {\n      fetchShareInfo();\n    }\n  }, [options.autoFetch, options.token, fetchShareInfo]);\n\n  // Auto-request GPS if enabled and share info is loaded\n  useEffect(() => {\n    if (options.autoRequestGPS && shareInfo && !isExpired && !isCompleted) {\n      captureAndSubmitGPS().catch(() => {\n        // Error is already set in state, just catch to prevent unhandled rejection\n      });\n    }\n  }, [options.autoRequestGPS, shareInfo, isExpired, isCompleted, captureAndSubmitGPS]);\n\n  return {\n    shareInfo,\n    captureResponse,\n    loading,\n    submitting,\n    error,\n    isExpired,\n    isCompleted,\n    fetchShareInfo,\n    submitLocation,\n    captureAndSubmitGPS,\n  };\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n  CipherTextPayload,\n  CipherTextOptions,\n  CipherTextResult,\n  CipherTextReason,\n} from './types';\n\nconst SDK_VERSION = '2.0.8';\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Generate a unique device ID that persists across sessions\n */\nfunction getOrCreateDeviceId(): string {\n  if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n    return generateUUID();\n  }\n\n  const storageKey = 'cgs_device_id';\n  let deviceId = localStorage.getItem(storageKey);\n\n  if (!deviceId) {\n    deviceId = generateUUID();\n    localStorage.setItem(storageKey, deviceId);\n  }\n\n  return deviceId;\n}\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n  if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n    return crypto.randomUUID();\n  }\n\n  // Fallback for older browsers\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\n/**\n * Detect browser information from user agent\n */\nfunction getBrowserInfo(): { browser: string; browser_version: string; os: string; os_version: string } {\n  if (typeof navigator === 'undefined') {\n    return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n  }\n\n  const ua = navigator.userAgent;\n  let browser = 'unknown';\n  let browserVersion = '';\n  let os = 'unknown';\n  let osVersion = '';\n\n  // Detect browser\n  if (ua.includes('Firefox/')) {\n    browser = 'Firefox';\n    browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Edg/')) {\n    browser = 'Edge';\n    browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Chrome/')) {\n    browser = 'Chrome';\n    browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n    browser = 'Safari';\n    browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n    browser = 'Opera';\n    browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n  }\n\n  // Detect OS\n  if (ua.includes('Windows')) {\n    os = 'Windows';\n    if (ua.includes('Windows NT 10.0')) osVersion = '10';\n    else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n    else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n    else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n  } else if (ua.includes('Mac OS X')) {\n    os = 'macOS';\n    osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n  } else if (ua.includes('Linux')) {\n    os = 'Linux';\n  } else if (ua.includes('Android')) {\n    os = 'Android';\n    osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n    os = 'iOS';\n    osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n  }\n\n  return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n  if (typeof document === 'undefined') return null;\n\n  try {\n    const canvas = document.createElement('canvas');\n    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n    if (!gl) return null;\n\n    const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n    if (!debugInfo) return null;\n\n    return {\n      vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n      renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n    };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n  if (typeof navigator === 'undefined') return undefined;\n\n  const connection = (navigator as any).connection ||\n    (navigator as any).mozConnection ||\n    (navigator as any).webkitConnection;\n\n  if (!connection) return undefined;\n\n  return {\n    effective_type: connection.effectiveType,\n    downlink: connection.downlink,\n    rtt: connection.rtt,\n    save_data: connection.saveData,\n  };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n  timeout: number = 10000,\n  highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n  if (typeof navigator === 'undefined' || !navigator.geolocation) {\n    return null;\n  }\n\n  return new Promise((resolve) => {\n    navigator.geolocation.getCurrentPosition(\n      (position) => {\n        resolve({\n          latitude: position.coords.latitude,\n          longitude: position.coords.longitude,\n          accuracy: position.coords.accuracy,\n          altitude: position.coords.altitude ?? undefined,\n          altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n          heading: position.coords.heading ?? undefined,\n          speed: position.coords.speed ?? undefined,\n          timestamp: position.timestamp,\n        });\n      },\n      () => {\n        // Location denied or error - resolve with null (non-fatal)\n        resolve(null);\n      },\n      {\n        enableHighAccuracy: highAccuracy,\n        timeout: timeout,\n        maximumAge: 0,\n      }\n    );\n  });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n  const browserInfo = getBrowserInfo();\n  const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n  return {\n    device_id: getOrCreateDeviceId(),\n    user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n    platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n    browser: browserInfo.browser,\n    browser_version: browserInfo.browser_version,\n    os: browserInfo.os,\n    os_version: browserInfo.os_version,\n    screen_resolution:\n      typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n    language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n    timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n    color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n    hardware_concurrency:\n      typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n    device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n    touch_support:\n      typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n    webgl_vendor: webglInfo?.vendor,\n    webgl_renderer: webglInfo?.renderer,\n  };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n  const json = JSON.stringify(payload);\n\n  if (typeof btoa !== 'undefined') {\n    // Browser\n    return btoa(unescape(encodeURIComponent(json)));\n  } else if (typeof Buffer !== 'undefined') {\n    // Node.js\n    return Buffer.from(json, 'utf-8').toString('base64');\n  }\n\n  throw new Error('No base64 encoding method available');\n}\n\n/**\n * Simple XOR cipher for obfuscation (not cryptographic security)\n * The actual security comes from HTTPS and server-side validation\n */\nfunction obfuscate(data: string, key: string): string {\n  let result = '';\n  for (let i = 0; i < data.length; i++) {\n    result += String.fromCharCode(data.charCodeAt(i) ^ key.charCodeAt(i % key.length));\n  }\n  return result;\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n *   reason: 'registration',\n *   requestLocation: true,\n *   locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n *   console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(options: CipherTextOptions): Promise<CipherTextResult> {\n  const warnings: string[] = [];\n\n  // Collect device data\n  const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n  // Optionally request GPS location\n  let locationData: CipherTextPayload['location'] | undefined;\n  if (options.requestLocation) {\n    const location = await requestGPSLocation(\n      options.locationTimeout || 10000,\n      options.highAccuracy !== false\n    );\n\n    if (location) {\n      locationData = location;\n    } else {\n      warnings.push('GPS location not available or permission denied');\n    }\n  }\n\n  // Collect network info\n  let networkData: CipherTextPayload['network'] | undefined;\n  if (options.includeNetworkInfo !== false) {\n    networkData = getNetworkInfo();\n  }\n\n  // Build payload\n  const now = new Date();\n  const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n  const payload: CipherTextPayload = {\n    device: deviceData,\n    location: locationData,\n    network: networkData,\n    metadata: {\n      collected_at: now.toISOString(),\n      sdk_version: SDK_VERSION,\n      collection_reason: options.reason,\n      page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n      referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n    },\n  };\n\n  // Encode payload (no obfuscation - HTTPS provides transport security)\n  const encoded = encodePayload(payload);\n\n  // Create final cipherText with version and timestamp prefix\n  // Format: version.timestamp.base64(json)\n  const version = '01'; // CipherText format version\n  const timestamp = now.getTime().toString(36); // Base36 timestamp\n  const cipherText = `${version}.${timestamp}.${encoded}`;\n\n  return {\n    cipherText,\n    locationCaptured: !!locationData,\n    warnings: warnings.length > 0 ? warnings : undefined,\n    generatedAt: now.toISOString(),\n    expiresAt: expiry.toISOString(),\n  };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n  try {\n    const parts = cipherText.split('.');\n    if (parts.length !== 3) return null;\n\n    const [version, timestampB36, obfuscatedB64] = parts;\n    if (version !== '01') return null;\n\n    const timestamp = parseInt(timestampB36, 36);\n    const obfuscated = atob(obfuscatedB64);\n\n    // We need the device_id to reconstruct the key, which we can get from localStorage\n    const deviceId = getOrCreateDeviceId();\n    const obfuscationKey = `cgs_${timestamp}_${deviceId.slice(0, 8)}`;\n\n    const encoded = obfuscate(obfuscated, obfuscationKey); // XOR is symmetric\n    const json = decodeURIComponent(escape(atob(encoded)));\n\n    return JSON.parse(json) as CipherTextPayload;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n  try {\n    const parts = cipherText.split('.');\n    if (parts.length !== 3) return true;\n\n    const timestampB36 = parts[1];\n    const timestamp = parseInt(timestampB36, 36);\n    const now = Date.now();\n    const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n    return now - timestamp > expiryMs;\n  } catch {\n    return true;\n  }\n}\n\n/**\n * React hook for generating cipherText\n *\n * @example\n * ```tsx\n * function LoginForm() {\n *   const { generate, isGenerating, error } = useCipherText();\n *\n *   const handleLogin = async () => {\n *     const result = await generate({ reason: 'login' });\n *     if (result) {\n *       await loginMutation({ email, password, cipherText: result.cipherText });\n *     }\n *   };\n * }\n * ```\n */\nexport function useCipherText() {\n  // This is a simple wrapper that can be used in React components\n  // Import useState and useCallback from React when using\n\n  const generate = async (options: CipherTextOptions): Promise<CipherTextResult | null> => {\n    try {\n      return await generateCipherText(options);\n    } catch (error) {\n      console.error('[CGS SDK] Failed to generate cipherText:', error);\n      return null;\n    }\n  };\n\n  return { generate };\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason };\n"]}