@fileflow/sdk 0.1.30 → 0.1.32

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,6 +1,6 @@
1
1
  import { jsxs as s, jsx as e, Fragment as ie } from "react/jsx-runtime";
2
2
  import de, { useCallback as E, useState as me, useEffect as ue } from "react";
3
- import { h as w, j as pe, D as V, k as he, X as G, m as D, U as ve, n as ye, o as B, T as K, L as F, p as L, g as z, S as ge, q as xe } from "./index-Dn3cI9sZ.mjs";
3
+ import { h as w, j as pe, D as V, k as he, X as G, m as D, U as ve, n as ye, o as B, T as K, L as F, p as L, g as z, S as ge, q as xe } from "./index-B_sBDXNZ.mjs";
4
4
  /**
5
5
  * @license lucide-react v0.563.0 - ISC
6
6
  *
@@ -777,4 +777,4 @@ export {
777
777
  je as a,
778
778
  I as u
779
779
  };
780
- //# sourceMappingURL=KYCWizard-D9W8V70o.mjs.map
780
+ //# sourceMappingURL=KYCWizard-BbVeACaA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"KYCWizard-D9W8V70o.mjs","sources":["../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/car.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/clock.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file-text.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/house.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/shield-check.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/shield.js","../src/store/kyc-store.ts","../src/kyc/components/DocumentUploader.tsx","../src/kyc/components/DocumentStatus.tsx","../src/kyc/components/KYCWizard.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\",\n key: \"5owen\"\n }\n ],\n [\"circle\", { cx: \"7\", cy: \"17\", r: \"2\", key: \"u2ysq9\" }],\n [\"path\", { d: \"M9 17h6\", key: \"r8uit2\" }],\n [\"circle\", { cx: \"17\", cy: \"17\", r: \"2\", key: \"axvx0g\" }]\n];\nconst Car = createLucideIcon(\"car\", __iconNode);\n\nexport { __iconNode, Car as default };\n//# sourceMappingURL=car.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\", key: \"5wwlr5\" }],\n [\n \"path\",\n {\n d: \"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\n key: \"r6nss1\"\n }\n ]\n];\nconst House = createLucideIcon(\"house\", __iconNode);\n\nexport { __iconNode, House as default };\n//# sourceMappingURL=house.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n];\nconst ShieldCheck = createLucideIcon(\"shield-check\", __iconNode);\n\nexport { __iconNode, ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n];\nconst Shield = createLucideIcon(\"shield\", __iconNode);\n\nexport { __iconNode, Shield as default };\n//# sourceMappingURL=shield.js.map\n","import { create } from 'zustand';\nimport type { \n DocumentType, \n KYCDocument, \n DocumentStatus,\n FraudFlag,\n ExtractedData,\n} from '@fileflow/shared';\n\nexport type KYCStep = 'select' | 'upload' | 'processing' | 'review' | 'complete';\n\nexport interface DocumentState {\n id: string | null;\n type: DocumentType;\n status: DocumentStatus;\n file: File | null;\n previewUrl: string | null;\n extractedData: ExtractedData | null;\n confidence: number;\n fraudFlags: FraudFlag[];\n error: string | null;\n}\n\nexport interface KYCState {\n // Session\n sessionId: string | null;\n status: string;\n step: KYCStep;\n \n // Required documents\n requiredDocuments: DocumentType[];\n currentDocumentType: DocumentType | null;\n \n // Document states\n documents: Map<DocumentType, DocumentState>;\n \n // Verification\n isVerified: boolean;\n verificationStatus: object | null;\n \n // UI state\n isLoading: boolean;\n error: string | null;\n}\n\nexport interface KYCActions {\n // Initialize\n setSessionId: (sessionId: string) => void;\n setRequiredDocuments: (documents: DocumentType[]) => void;\n \n // Document management\n setCurrentDocumentType: (type: DocumentType) => void;\n setDocumentFile: (type: DocumentType, file: File) => void;\n setDocumentStatus: (type: DocumentType, status: DocumentStatus) => void;\n setDocumentData: (type: DocumentType, data: Partial<DocumentState>) => void;\n clearDocumentPreview: (type: DocumentType) => void;\n \n // Navigation\n setStep: (step: KYCStep) => void;\n nextDocument: () => void;\n \n // Verification\n setVerificationStatus: (status: object) => void;\n setVerified: (verified: boolean) => void;\n \n // Status\n setStatus: (status: string) => void;\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n \n // Helpers\n getNextRequiredDocument: () => DocumentType | null;\n areAllDocumentsUploaded: () => boolean;\n areAllDocumentsProcessed: () => boolean;\n \n // Reset\n reset: () => void;\n}\n\nconst createEmptyDocumentState = (type: DocumentType): DocumentState => ({\n id: null,\n type,\n status: 'uploaded',\n file: null,\n previewUrl: null,\n extractedData: null,\n confidence: 0,\n fraudFlags: [],\n error: null,\n});\n\nconst initialState: KYCState = {\n sessionId: null,\n status: 'idle',\n step: 'select',\n requiredDocuments: [],\n currentDocumentType: null,\n documents: new Map(),\n isVerified: false,\n verificationStatus: null,\n isLoading: false,\n error: null,\n};\n\nexport const useKYCStore = create<KYCState & KYCActions>((set, get) => ({\n ...initialState,\n\n setSessionId: (sessionId) => set({ sessionId }),\n\n setRequiredDocuments: (documents) => {\n const docsMap = new Map<DocumentType, DocumentState>();\n for (const type of documents) {\n docsMap.set(type, createEmptyDocumentState(type));\n }\n set({ \n requiredDocuments: documents, \n documents: docsMap,\n currentDocumentType: documents[0] || null,\n });\n },\n\n setCurrentDocumentType: (type) => set({ currentDocumentType: type }),\n\n setDocumentFile: (type, file) => {\n const { documents } = get();\n const doc = documents.get(type) || createEmptyDocumentState(type);\n \n // Create preview URL\n const previewUrl = URL.createObjectURL(file);\n \n const updated = new Map(documents);\n updated.set(type, {\n ...doc,\n file,\n previewUrl,\n status: 'uploaded',\n error: null,\n });\n \n set({ documents: updated });\n },\n\n setDocumentStatus: (type, status) => {\n const { documents } = get();\n const doc = documents.get(type);\n if (doc) {\n const updated = new Map(documents);\n updated.set(type, { ...doc, status });\n set({ documents: updated });\n }\n },\n\n setDocumentData: (type, data) => {\n const { documents } = get();\n const doc = documents.get(type);\n if (doc) {\n const updated = new Map(documents);\n updated.set(type, { ...doc, ...data });\n set({ documents: updated });\n }\n },\n\n clearDocumentPreview: (type) => {\n const { documents } = get();\n const doc = documents.get(type);\n if (doc?.previewUrl) {\n URL.revokeObjectURL(doc.previewUrl);\n }\n },\n\n setStep: (step) => set({ step }),\n\n nextDocument: () => {\n const { requiredDocuments, currentDocumentType, documents } = get();\n const currentIndex = currentDocumentType \n ? requiredDocuments.indexOf(currentDocumentType) \n : -1;\n \n // Find next document that needs upload\n for (let i = currentIndex + 1; i < requiredDocuments.length; i++) {\n const type = requiredDocuments[i];\n const doc = documents.get(type);\n if (!doc?.file) {\n set({ currentDocumentType: type });\n return;\n }\n }\n \n // All documents uploaded, move to processing/review\n set({ \n currentDocumentType: null,\n step: 'processing',\n });\n },\n\n setVerificationStatus: (status) => set({ verificationStatus: status }),\n \n setVerified: (verified) => set({ isVerified: verified }),\n\n setStatus: (status) => set({ status }),\n \n setLoading: (isLoading) => set({ isLoading }),\n \n setError: (error) => set({ error }),\n\n getNextRequiredDocument: () => {\n const { requiredDocuments, documents } = get();\n for (const type of requiredDocuments) {\n const doc = documents.get(type);\n if (!doc?.file) {\n return type;\n }\n }\n return null;\n },\n\n areAllDocumentsUploaded: () => {\n const { requiredDocuments, documents } = get();\n return requiredDocuments.every((type) => {\n const doc = documents.get(type);\n return doc?.file !== null;\n });\n },\n\n areAllDocumentsProcessed: () => {\n const { requiredDocuments, documents } = get();\n return requiredDocuments.every((type) => {\n const doc = documents.get(type);\n return doc?.status === 'completed' || doc?.status === 'requires_review';\n });\n },\n\n reset: () => {\n // Clean up preview URLs\n const { documents } = get();\n for (const doc of documents.values()) {\n if (doc.previewUrl) {\n URL.revokeObjectURL(doc.previewUrl);\n }\n }\n set(initialState);\n },\n}));\n","import React, { useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { Upload, FileText, Image, AlertCircle, X } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useKYCStore } from '../../store/kyc-store';\nimport type { DocumentType } from '@fileflow/shared';\nimport { DOCUMENT_TYPES } from '@fileflow/shared';\n\ninterface DocumentUploaderProps {\n documentType: DocumentType;\n onFileSelect?: (file: File) => void;\n}\n\nexport const DocumentUploader: React.FC<DocumentUploaderProps> = ({\n documentType,\n onFileSelect,\n}) => {\n const { documents, setDocumentFile, isLoading } = useKYCStore();\n const documentState = documents.get(documentType);\n const documentInfo = DOCUMENT_TYPES[documentType];\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: unknown[]) => {\n if (rejectedFiles.length > 0) {\n return;\n }\n\n if (acceptedFiles.length > 0) {\n const file = acceptedFiles[0];\n setDocumentFile(documentType, file);\n onFileSelect?.(file);\n }\n },\n [documentType, onFileSelect, setDocumentFile]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: {\n 'application/pdf': ['.pdf'],\n 'image/jpeg': ['.jpg', '.jpeg'],\n 'image/png': ['.png'],\n },\n maxSize: documentInfo.maxFileSize,\n multiple: false,\n disabled: isLoading,\n });\n\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n const getFileIcon = () => {\n if (documentState?.file?.type === 'application/pdf') {\n return <FileText className=\"ff-w-6 ff-h-6\" />;\n }\n return <Image className=\"ff-w-6 ff-h-6\" />;\n };\n\n const clearFile = (e: React.MouseEvent) => {\n e.stopPropagation();\n useKYCStore.getState().clearDocumentPreview(documentType);\n setDocumentFile(documentType, null as unknown as File);\n };\n\n // Show preview if file is selected\n if (documentState?.file && documentState.previewUrl) {\n return (\n <div className=\"ff-space-y-4\">\n {/* Document Info */}\n <div className=\"ff-p-4 ff-rounded-xl\" style={{ backgroundColor: 'var(--ff-primary-20)', border: '1px solid var(--ff-primary-50)' }}>\n <div className=\"ff-flex ff-items-center ff-gap-3\">\n <div className=\"ff-p-2 ff-rounded-lg\" style={{ backgroundColor: 'var(--ff-primary-30)' }}>\n <span style={{ color: 'var(--ff-primary-90)' }}>{getFileIcon()}</span>\n </div>\n <div className=\"ff-flex-1 ff-min-w-0\">\n <p className=\"ff-font-medium ff-truncate\" style={{ color: 'var(--ff-primary-110)' }}>\n {documentState.file.name}\n </p>\n <p className=\"ff-text-sm\" style={{ color: 'var(--ff-primary-90)' }}>\n {formatFileSize(documentState.file.size)}\n </p>\n </div>\n <button\n onClick={clearFile}\n className=\"ff-p-1.5 ff-rounded-full ff-transition-colors\"\n style={{ color: 'var(--ff-primary-90)' }}\n aria-label=\"Remove file\"\n >\n <X className=\"ff-w-5 ff-h-5\" />\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"ff-document-preview ff-aspect-[3/4] ff-max-h-96\">\n {documentState.file.type === 'application/pdf' ? (\n <iframe\n src={documentState.previewUrl}\n className=\"ff-w-full ff-h-full ff-rounded-xl\"\n title=\"Document preview\"\n />\n ) : (\n <img\n src={documentState.previewUrl}\n alt=\"Document preview\"\n className=\"ff-w-full ff-h-full ff-object-contain ff-rounded-xl\"\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ff-space-y-6\">\n {/* Document Type Info */}\n <div className=\"ff-text-center ff-mb-4\">\n <h3 className=\"ff-text-lg ff-font-semibold\" style={{ color: 'var(--ff-text-primary)' }}>{documentInfo.label}</h3>\n <p className=\"ff-text-sm ff-mt-1\" style={{ color: 'var(--ff-text-muted)' }}>{documentInfo.description}</p>\n </div>\n\n {/* Dropzone - Demo style */}\n <div\n {...getRootProps()}\n className={clsx(\n 'ff-dropzone',\n isDragActive && 'ff-dropzone-active',\n isLoading && 'ff-opacity-50 ff-cursor-not-allowed'\n )}\n >\n <input {...getInputProps()} />\n <div className=\"ff-dropzone-icon-wrapper\">\n <Upload className=\"ff-dropzone-icon\" />\n </div>\n <h3 className=\"ff-dropzone-text\">\n {isDragActive ? 'Drop your document here' : 'Upload your document'}\n </h3>\n <p className=\"ff-dropzone-hint\">Drag and drop or click to select</p>\n <label className=\"ff-inline-block\">\n <span className={clsx(\n 'ff-btn ff-btn-primary',\n isLoading && 'ff-opacity-50 ff-cursor-wait'\n )}>\n {isLoading ? 'Processing...' : 'Choose file'}\n </span>\n </label>\n <div className=\"ff-flex ff-flex-wrap ff-justify-center ff-gap-2 ff-mt-3\">\n {documentInfo.acceptedFormats.map((format) => (\n <span \n key={format} \n className=\"ff-px-2 ff-py-1 ff-rounded ff-text-xs\"\n style={{ backgroundColor: 'var(--ff-bg-tertiary)', color: 'var(--ff-text-muted)' }}\n >\n {format.toUpperCase()}\n </span>\n ))}\n <span className=\"ff-px-2 ff-py-1 ff-text-xs\" style={{ color: 'var(--ff-text-muted)' }}>\n Max {formatFileSize(documentInfo.maxFileSize)}\n </span>\n </div>\n </div>\n\n {/* Error */}\n {documentState?.error && (\n <div className=\"ff-flex ff-items-center ff-gap-2 ff-p-4 ff-rounded-lg ff-text-sm\" style={{ backgroundColor: 'var(--ff-error-light)', color: 'var(--ff-error)' }}>\n <AlertCircle className=\"ff-w-4 ff-h-4 ff-flex-shrink-0\" />\n <p>{documentState.error}</p>\n </div>\n )}\n\n {/* Tips */}\n <div className=\"ff-rounded-xl ff-p-4\" style={{ backgroundColor: 'var(--ff-bg-secondary)' }}>\n <h4 className=\"ff-text-sm ff-font-medium ff-mb-2\" style={{ color: 'var(--ff-text-secondary)' }}>Tips for best results:</h4>\n <ul className=\"ff-text-sm ff-space-y-1 ff-list-disc ff-list-inside\" style={{ color: 'var(--ff-text-muted)' }}>\n <li>Ensure all text is clearly visible and readable</li>\n <li>Avoid glare, shadows, or blurry images</li>\n <li>Include all four corners of the document</li>\n <li>Use good lighting when taking photos</li>\n </ul>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { CheckCircle, XCircle, AlertTriangle, Loader2, Clock } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useKYCStore } from '../../store/kyc-store';\nimport type { DocumentType, DocumentStatus as DocStatus } from '@fileflow/shared';\nimport { DOCUMENT_TYPES } from '@fileflow/shared';\n\ninterface DocumentStatusProps {\n documentType: DocumentType;\n showDetails?: boolean;\n}\n\nexport const DocumentStatus: React.FC<DocumentStatusProps> = ({\n documentType,\n showDetails = true,\n}) => {\n const { documents } = useKYCStore();\n const documentState = documents.get(documentType);\n const documentInfo = DOCUMENT_TYPES[documentType];\n\n const getStatusConfig = (status?: DocStatus) => {\n switch (status) {\n case 'completed':\n return {\n icon: CheckCircle,\n iconColor: 'var(--ff-success)',\n bgColor: 'var(--ff-success-light)',\n label: 'Verified',\n labelColor: 'var(--ff-success)',\n description: 'Document successfully processed',\n };\n case 'requires_review':\n return {\n icon: AlertTriangle,\n iconColor: 'var(--ff-warning)',\n bgColor: 'var(--ff-warning-light)',\n label: 'Review Required',\n labelColor: 'var(--ff-warning)',\n description: 'Manual verification may be needed',\n };\n case 'failed':\n return {\n icon: XCircle,\n iconColor: 'var(--ff-error)',\n bgColor: 'var(--ff-error-light)',\n label: 'Failed',\n labelColor: 'var(--ff-error)',\n description: 'Unable to process document',\n };\n case 'processing':\n return {\n icon: Loader2,\n iconColor: 'var(--ff-primary-90)',\n bgColor: 'var(--ff-primary-20)',\n label: 'Processing',\n labelColor: 'var(--ff-primary-90)',\n description: 'Analyzing document...',\n };\n case 'uploaded':\n return {\n icon: Clock,\n iconColor: 'var(--ff-text-secondary)',\n bgColor: 'var(--ff-bg-tertiary)',\n label: 'Pending',\n labelColor: 'var(--ff-text-secondary)',\n description: 'Waiting to be processed',\n };\n default:\n return {\n icon: Clock,\n iconColor: 'var(--ff-text-muted)',\n bgColor: 'var(--ff-bg-tertiary)',\n label: 'Not Uploaded',\n labelColor: 'var(--ff-text-muted)',\n description: 'Upload document to continue',\n };\n }\n };\n\n const statusConfig = getStatusConfig(documentState?.status);\n const Icon = statusConfig.icon;\n\n const getConfidenceColor = (confidence: number) => {\n if (confidence >= 0.8) return 'var(--ff-success)';\n if (confidence >= 0.6) return 'var(--ff-warning)';\n return 'var(--ff-error)';\n };\n\n return (\n <div className=\"ff-space-y-3\">\n {/* Status Header */}\n <div className=\"ff-flex ff-items-center ff-gap-3\">\n <div className=\"ff-p-2 ff-rounded-xl\" style={{ backgroundColor: statusConfig.bgColor }}>\n <Icon\n className={clsx(\n 'ff-w-5 ff-h-5',\n documentState?.status === 'processing' && 'ff-animate-spin'\n )}\n style={{ color: statusConfig.iconColor }}\n />\n </div>\n <div>\n <p className=\"ff-font-medium\" style={{ color: 'var(--ff-text-primary)' }}>{documentInfo.label}</p>\n <p className=\"ff-text-sm\" style={{ color: statusConfig.labelColor }}>{statusConfig.label}</p>\n </div>\n </div>\n\n {/* Confidence Score */}\n {documentState?.confidence !== undefined && documentState.confidence > 0 && (\n <div className=\"ff-space-y-1\">\n <div className=\"ff-flex ff-items-center ff-justify-between ff-text-sm\">\n <span style={{ color: 'var(--ff-text-secondary)' }}>Confidence</span>\n <span className=\"ff-font-medium\" style={{ color: getConfidenceColor(documentState.confidence) }}>\n {Math.round(documentState.confidence * 100)}%\n </span>\n </div>\n <div className=\"ff-progress\">\n <div\n className=\"ff-progress-bar\"\n style={{ \n width: `${documentState.confidence * 100}%`,\n backgroundColor: getConfidenceColor(documentState.confidence)\n }}\n />\n </div>\n </div>\n )}\n\n {/* Fraud Flags */}\n {showDetails && documentState?.fraudFlags && documentState.fraudFlags.length > 0 && (\n <div className=\"ff-space-y-2\">\n <p className=\"ff-text-sm ff-font-medium\" style={{ color: 'var(--ff-text-secondary)' }}>Issues Detected</p>\n <div className=\"ff-space-y-1\">\n {documentState.fraudFlags.map((flag, index) => (\n <div\n key={index}\n className=\"ff-flex ff-items-start ff-gap-2 ff-p-2 ff-rounded-lg ff-text-sm\"\n style={{\n backgroundColor: flag.severity === 'high' ? 'var(--ff-error-light)' : flag.severity === 'medium' ? 'var(--ff-warning-light)' : 'var(--ff-bg-tertiary)',\n color: flag.severity === 'high' ? 'var(--ff-error)' : flag.severity === 'medium' ? 'var(--ff-warning)' : 'var(--ff-text-secondary)',\n }}\n >\n {flag.severity === 'high' ? (\n <XCircle className=\"ff-w-4 ff-h-4 ff-flex-shrink-0 ff-mt-0.5\" />\n ) : (\n <AlertTriangle className=\"ff-w-4 ff-h-4 ff-flex-shrink-0 ff-mt-0.5\" />\n )}\n <span>{flag.message}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Extracted Data Preview */}\n {showDetails &&\n documentState?.extractedData &&\n documentState.status === 'completed' && (\n <div className=\"ff-rounded-xl ff-p-3\" style={{ backgroundColor: 'var(--ff-bg-tertiary)' }}>\n <p className=\"ff-text-sm ff-font-medium ff-mb-2\" style={{ color: 'var(--ff-text-secondary)' }}>\n Extracted Information\n </p>\n <dl className=\"ff-space-y-1 ff-text-sm\">\n {'fullName' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Name</dt>\n <dd className=\"ff-font-medium\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.fullName}\n </dd>\n </div>\n )}\n {'dateOfBirth' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Date of Birth</dt>\n <dd style={{ color: 'var(--ff-text-primary)' }}>{documentState.extractedData.dateOfBirth}</dd>\n </div>\n )}\n {documentState.extractedData.documentType === 'passport' &&\n 'passportNumber' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Passport #</dt>\n <dd className=\"ff-font-mono\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.passportNumber}\n </dd>\n </div>\n )}\n {documentState.extractedData.documentType === 'drivers_license' &&\n 'licenseNumber' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>License #</dt>\n <dd className=\"ff-font-mono\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.licenseNumber}\n </dd>\n </div>\n )}\n {'address' in documentState.extractedData && documentState.extractedData.address && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Address</dt>\n <dd className=\"ff-text-right\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.address.city},{' '}\n {documentState.extractedData.address.province}\n </dd>\n </div>\n )}\n </dl>\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport {\n FileText,\n Car,\n Home,\n CheckCircle,\n X,\n Loader2,\n ChevronRight,\n ShieldCheck,\n Shield,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useKYCStore, type KYCStep } from '../../store/kyc-store';\nimport { getClient } from '../../api/client';\nimport { DocumentUploader } from './DocumentUploader';\nimport { DocumentStatus } from './DocumentStatus';\nimport { StyleProvider } from '../../styles/StyleProvider';\nimport type { DocumentType, KYCSession, KYCDocument } from '@fileflow/shared';\nimport { DOCUMENT_TYPES } from '@fileflow/shared';\n\n// KYC steps for the step indicator\nconst KYC_STEP_LABELS = ['select', 'upload', 'review', 'complete'] as const;\n\ninterface KYCWizardProps {\n requiredDocuments: DocumentType[];\n onComplete?: (session: KYCSession) => void;\n onCancel?: () => void;\n onError?: (error: Error) => void;\n}\n\nconst DOCUMENT_ICONS: Record<DocumentType, React.ElementType> = {\n passport: FileText,\n drivers_license: Car,\n proof_of_address: Home,\n};\n\nexport const KYCWizard: React.FC<KYCWizardProps> = ({\n requiredDocuments,\n onComplete,\n onCancel,\n onError,\n}) => {\n const {\n sessionId,\n step,\n currentDocumentType,\n documents,\n isVerified,\n verificationStatus,\n isLoading,\n error,\n setSessionId,\n setRequiredDocuments,\n setCurrentDocumentType,\n setDocumentStatus,\n setDocumentData,\n setStep,\n nextDocument,\n setVerificationStatus,\n setVerified,\n setLoading,\n setError,\n areAllDocumentsUploaded,\n areAllDocumentsProcessed,\n reset,\n } = useKYCStore();\n\n const [pollingDocument, setPollingDocument] = useState<string | null>(null);\n\n // Initialize\n useEffect(() => {\n setRequiredDocuments(requiredDocuments);\n initializeSession();\n\n return () => {\n // Cleanup polling on unmount\n setPollingDocument(null);\n };\n }, [requiredDocuments]);\n\n const initializeSession = async () => {\n try {\n setLoading(true);\n const client = getClient();\n const result = await client.createKYCSession(requiredDocuments);\n setSessionId(result.sessionId);\n setStep('upload');\n } catch (err) {\n const error = err as Error;\n setError(error.message);\n onError?.(error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleFileSelect = useCallback(\n async (file: File) => {\n if (!sessionId || !currentDocumentType) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const client = getClient();\n const result = await client.uploadKYCDocument(sessionId, currentDocumentType, file);\n\n setDocumentData(currentDocumentType, {\n id: result.documentId,\n status: 'processing',\n });\n\n // Start polling for document status\n setPollingDocument(result.documentId);\n pollDocumentStatus(result.documentId);\n } catch (err) {\n const error = err as Error;\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: error.message,\n });\n onError?.(error);\n } finally {\n setLoading(false);\n }\n },\n [sessionId, currentDocumentType]\n );\n\n const pollDocumentStatus = async (documentId: string) => {\n const maxAttempts = 30;\n const maxConsecutiveErrors = 3; // Stop after 3 consecutive errors\n let attempts = 0;\n let consecutiveErrors = 0;\n\n const poll = async () => {\n if (attempts >= maxAttempts) {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: 'Processing timed out. Please try again.',\n });\n }\n return;\n }\n\n // Stop polling if we've had too many consecutive errors\n if (consecutiveErrors >= maxConsecutiveErrors) {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: 'Failed to check document status. Please refresh and try again.',\n });\n }\n return;\n }\n\n try {\n const client = getClient();\n const result = await client.getKYCDocument(documentId);\n const doc = result.document as KYCDocument;\n\n // Reset consecutive errors on success\n consecutiveErrors = 0;\n\n const docType = doc.type as DocumentType;\n setDocumentData(docType, {\n id: doc.id,\n status: doc.status,\n extractedData: doc.extractedData,\n confidence: doc.confidence,\n fraudFlags: doc.fraudFlags,\n error: null, // Clear any previous errors\n });\n\n if (doc.status === 'completed' || doc.status === 'requires_review' || doc.status === 'failed') {\n setPollingDocument(null);\n\n // Check if all documents are processed\n if (areAllDocumentsUploaded()) {\n const allProcessed = areAllDocumentsProcessed();\n if (allProcessed) {\n setStep('review');\n }\n } else {\n // Move to next document\n nextDocument();\n }\n return;\n }\n\n // Continue polling\n attempts++;\n setTimeout(poll, 2000);\n } catch (err) {\n const error = err as Error & { status?: number };\n consecutiveErrors++;\n attempts++;\n \n // On 404, stop immediately - the document doesn't exist\n if (error.status === 404 || error.message?.includes('not found')) {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: 'Session not found or invalid state',\n });\n }\n return;\n }\n\n // On other errors, retry with backoff (up to maxConsecutiveErrors times)\n if (consecutiveErrors < maxConsecutiveErrors) {\n setTimeout(poll, 3000 * consecutiveErrors); // Exponential backoff\n } else {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: error.message || 'Failed to process document',\n });\n }\n }\n }\n };\n\n poll();\n };\n\n const handleVerify = async () => {\n if (!sessionId) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const client = getClient();\n const result = await client.verifyKYCSession(sessionId, true);\n\n setVerificationStatus(result.verificationStatus);\n const status = result.verificationStatus as { isVerified: boolean };\n setVerified(status.isVerified);\n setStep('complete');\n\n onComplete?.(result as unknown as KYCSession);\n } catch (err) {\n const error = err as Error;\n setError(error.message);\n onError?.(error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCancel = () => {\n reset();\n onCancel?.();\n };\n\n const selectDocument = (type: DocumentType) => {\n setCurrentDocumentType(type);\n setStep('upload');\n };\n\n const isDocumentComplete = (type: DocumentType) => {\n const doc = documents.get(type);\n return doc?.status === 'completed' || doc?.status === 'requires_review';\n };\n\n // Get step index for the step indicator\n const getDisplayStepIndex = () => {\n const currentStep = step === 'processing' ? 'upload' : step;\n return KYC_STEP_LABELS.indexOf(currentStep as typeof KYC_STEP_LABELS[number]);\n };\n\n return (\n <StyleProvider>\n <div className=\"ff-container ff-modal\">\n {/* Modal Header - Demo style */}\n <div className=\"ff-modal-header\">\n <div className=\"ff-modal-header-left\">\n <div className=\"ff-flex ff-items-center ff-gap-3\">\n <div className=\"ff-modal-icon\">\n <Shield />\n </div>\n <h2 className=\"ff-modal-title\">Identity Verification</h2>\n </div>\n {/* Step Indicator - Demo style */}\n <div className=\"ff-steps ff-ml-4\">\n {KYC_STEP_LABELS.map((s, i) => (\n <React.Fragment key={s}>\n <div\n className={clsx(\n 'ff-step',\n getDisplayStepIndex() === i && 'ff-step-active',\n getDisplayStepIndex() > i && 'ff-step-complete',\n getDisplayStepIndex() < i && 'ff-step-pending'\n )}\n >\n {getDisplayStepIndex() > i ? '✓' : i + 1}\n </div>\n {i < KYC_STEP_LABELS.length - 1 && (\n <div className={clsx(\n 'ff-step-connector',\n getDisplayStepIndex() > i && 'ff-step-connector-complete'\n )} />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n <button\n onClick={handleCancel}\n className=\"ff-modal-close\"\n >\n <X className=\"ff-w-5 ff-h-5\" />\n </button>\n </div>\n\n {/* Modal Body */}\n <div className=\"ff-modal-body\">\n {error && (\n <div className=\"ff-mb-4 ff-p-4 ff-rounded-lg ff-text-sm\" style={{ backgroundColor: 'var(--ff-error-light)', color: 'var(--ff-error)' }}>\n {error}\n </div>\n )}\n\n {/* Document Selection */}\n {step === 'select' && (\n <div className=\"ff-space-y-4\">\n <p className=\"ff-text-center ff-mb-6\" style={{ color: 'var(--ff-text-muted)' }}>\n Please upload the following documents to verify your identity\n </p>\n <div className=\"ff-grid ff-gap-3\">\n {requiredDocuments.map((type) => {\n const Icon = DOCUMENT_ICONS[type];\n const info = DOCUMENT_TYPES[type];\n const doc = documents.get(type);\n const isComplete = isDocumentComplete(type);\n\n return (\n <button\n key={type}\n onClick={() => selectDocument(type)}\n className={clsx(\n 'ff-flex ff-items-center ff-gap-4 ff-p-4 ff-rounded-xl ff-border-2 ff-text-left ff-transition-all ff-duration-150',\n isComplete\n ? 'ff-border-transparent'\n : 'ff-border-transparent hover:ff-border-transparent'\n )}\n style={{\n backgroundColor: isComplete ? 'var(--ff-success-light)' : 'var(--ff-bg-secondary)',\n borderColor: isComplete ? 'var(--ff-success)' : 'var(--ff-border-light)',\n }}\n >\n <div\n className=\"ff-p-3 ff-rounded-xl\"\n style={{\n backgroundColor: isComplete ? 'rgba(41, 142, 51, 0.15)' : 'var(--ff-bg-tertiary)',\n }}\n >\n {isComplete ? (\n <CheckCircle className=\"ff-w-6 ff-h-6\" style={{ color: 'var(--ff-success)' }} />\n ) : (\n <Icon className=\"ff-w-6 ff-h-6\" style={{ color: 'var(--ff-text-secondary)' }} />\n )}\n </div>\n <div className=\"ff-flex-1\">\n <p className=\"ff-font-medium\" style={{ color: 'var(--ff-text-primary)' }}>{info.label}</p>\n <p className=\"ff-text-sm\" style={{ color: 'var(--ff-text-muted)' }}>{info.description}</p>\n </div>\n <ChevronRight className=\"ff-w-5 ff-h-5\" style={{ color: 'var(--ff-text-muted)' }} />\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Document Upload */}\n {step === 'upload' && currentDocumentType && (\n <div className=\"ff-py-4\">\n <div className=\"ff-max-w-lg ff-mx-auto\">\n <DocumentUploader documentType={currentDocumentType} onFileSelect={handleFileSelect} />\n </div>\n </div>\n )}\n\n {/* Processing */}\n {step === 'processing' && (\n <div className=\"ff-flex ff-flex-col ff-items-center ff-justify-center ff-py-12\">\n <Loader2 className=\"ff-w-12 ff-h-12 ff-animate-spin ff-mb-4\" style={{ color: 'var(--ff-primary-90)' }} />\n <h3 className=\"ff-text-lg ff-font-semibold ff-mb-2\" style={{ color: 'var(--ff-text-primary)' }}>\n Processing Documents\n </h3>\n <p style={{ color: 'var(--ff-text-muted)' }} className=\"ff-text-center\">\n We're analyzing your documents. This may take a moment...\n </p>\n </div>\n )}\n\n {/* Review */}\n {step === 'review' && (\n <div className=\"ff-space-y-6\">\n <div className=\"ff-text-center ff-mb-6\">\n <h3 className=\"ff-text-lg ff-font-semibold\" style={{ color: 'var(--ff-text-primary)' }}>Review Your Documents</h3>\n <p style={{ color: 'var(--ff-text-muted)' }}>\n Please review the extracted information before completing verification\n </p>\n </div>\n\n <div className=\"ff-grid ff-gap-4\">\n {requiredDocuments.map((type) => (\n <div\n key={type}\n className=\"ff-rounded-xl ff-p-4\"\n style={{ backgroundColor: 'var(--ff-bg-secondary)', border: '1px solid var(--ff-border-light)' }}\n >\n <DocumentStatus documentType={type} showDetails={true} />\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Complete */}\n {step === 'complete' && (\n <div className=\"ff-flex ff-flex-col ff-items-center ff-justify-center ff-py-12\">\n <div\n className=\"ff-w-16 ff-h-16 ff-rounded-full ff-flex ff-items-center ff-justify-center ff-mb-4\"\n style={{ backgroundColor: isVerified ? 'var(--ff-success-light)' : 'var(--ff-warning-light)' }}\n >\n {isVerified ? (\n <CheckCircle className=\"ff-w-10 ff-h-10\" style={{ color: 'var(--ff-success)' }} />\n ) : (\n <ShieldCheck className=\"ff-w-10 ff-h-10\" style={{ color: 'var(--ff-warning)' }} />\n )}\n </div>\n <h3 className=\"ff-text-xl ff-font-semibold ff-mb-2\" style={{ color: 'var(--ff-text-primary)' }}>\n {isVerified ? 'Verification Complete!' : 'Review Required'}\n </h3>\n <p style={{ color: 'var(--ff-text-muted)' }} className=\"ff-text-center\">\n {isVerified\n ? 'Your identity has been successfully verified.'\n : 'Additional review may be required. We will contact you if needed.'}\n </p>\n </div>\n )}\n </div>\n\n {/* Modal Footer */}\n {step !== 'complete' && (\n <div className=\"ff-modal-footer\">\n <button\n onClick={() => {\n if (step === 'upload') {\n setStep('select');\n } else if (step === 'review') {\n setStep('select');\n }\n }}\n disabled={isLoading}\n className=\"ff-btn ff-btn-secondary\"\n >\n Back\n </button>\n\n {step === 'review' && (\n <button\n onClick={handleVerify}\n disabled={isLoading || !areAllDocumentsProcessed()}\n className=\"ff-btn ff-btn-primary\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"ff-w-4 ff-h-4 ff-animate-spin\" />\n Verifying...\n </>\n ) : (\n 'Complete Verification'\n )}\n </button>\n )}\n\n {step === 'select' && areAllDocumentsUploaded() && (\n <button\n onClick={() => setStep('review')}\n className=\"ff-btn ff-btn-primary\"\n >\n Review & Verify\n </button>\n )}\n </div>\n )}\n </div>\n </StyleProvider>\n );\n};\n"],"names":["__iconNode","Car","createLucideIcon","Clock","FileText","House","Image","ShieldCheck","Shield","createEmptyDocumentState","type","initialState","useKYCStore","create","set","get","sessionId","documents","docsMap","file","doc","previewUrl","updated","status","data","step","requiredDocuments","currentDocumentType","currentIndex","i","verified","isLoading","error","DocumentUploader","documentType","onFileSelect","setDocumentFile","documentState","documentInfo","DOCUMENT_TYPES","onDrop","useCallback","acceptedFiles","rejectedFiles","getRootProps","getInputProps","isDragActive","useDropzone","formatFileSize","bytes","getFileIcon","_a","jsx","clearFile","e","jsxs","X","clsx","Upload","format","AlertCircle","DocumentStatus","showDetails","statusConfig","CheckCircle","AlertTriangle","XCircle","Loader2","Icon","getConfidenceColor","confidence","flag","index","KYC_STEP_LABELS","DOCUMENT_ICONS","Home","KYCWizard","onComplete","onCancel","onError","isVerified","verificationStatus","setSessionId","setRequiredDocuments","setCurrentDocumentType","setDocumentStatus","setDocumentData","setStep","nextDocument","setVerificationStatus","setVerified","setLoading","setError","areAllDocumentsUploaded","areAllDocumentsProcessed","reset","pollingDocument","setPollingDocument","useState","useEffect","initializeSession","result","getClient","err","handleFileSelect","pollDocumentStatus","documentId","attempts","consecutiveErrors","poll","docType","handleVerify","handleCancel","selectDocument","isDocumentComplete","getDisplayStepIndex","currentStep","StyleProvider","s","React","info","isComplete","ChevronRight","Fragment"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
1
+ {"version":3,"file":"KYCWizard-BbVeACaA.mjs","sources":["../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/car.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/clock.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file-text.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/house.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/shield-check.js","../../../node_modules/.pnpm/lucide-react@0.563.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/shield.js","../src/store/kyc-store.ts","../src/kyc/components/DocumentUploader.tsx","../src/kyc/components/DocumentStatus.tsx","../src/kyc/components/KYCWizard.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\",\n key: \"5owen\"\n }\n ],\n [\"circle\", { cx: \"7\", cy: \"17\", r: \"2\", key: \"u2ysq9\" }],\n [\"path\", { d: \"M9 17h6\", key: \"r8uit2\" }],\n [\"circle\", { cx: \"17\", cy: \"17\", r: \"2\", key: \"axvx0g\" }]\n];\nconst Car = createLucideIcon(\"car\", __iconNode);\n\nexport { __iconNode, Car as default };\n//# sourceMappingURL=car.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\", key: \"5wwlr5\" }],\n [\n \"path\",\n {\n d: \"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\n key: \"r6nss1\"\n }\n ]\n];\nconst House = createLucideIcon(\"house\", __iconNode);\n\nexport { __iconNode, House as default };\n//# sourceMappingURL=house.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n];\nconst ShieldCheck = createLucideIcon(\"shield-check\", __iconNode);\n\nexport { __iconNode, ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n];\nconst Shield = createLucideIcon(\"shield\", __iconNode);\n\nexport { __iconNode, Shield as default };\n//# sourceMappingURL=shield.js.map\n","import { create } from 'zustand';\nimport type { \n DocumentType, \n KYCDocument, \n DocumentStatus,\n FraudFlag,\n ExtractedData,\n} from '@fileflow/shared';\n\nexport type KYCStep = 'select' | 'upload' | 'processing' | 'review' | 'complete';\n\nexport interface DocumentState {\n id: string | null;\n type: DocumentType;\n status: DocumentStatus;\n file: File | null;\n previewUrl: string | null;\n extractedData: ExtractedData | null;\n confidence: number;\n fraudFlags: FraudFlag[];\n error: string | null;\n}\n\nexport interface KYCState {\n // Session\n sessionId: string | null;\n status: string;\n step: KYCStep;\n \n // Required documents\n requiredDocuments: DocumentType[];\n currentDocumentType: DocumentType | null;\n \n // Document states\n documents: Map<DocumentType, DocumentState>;\n \n // Verification\n isVerified: boolean;\n verificationStatus: object | null;\n \n // UI state\n isLoading: boolean;\n error: string | null;\n}\n\nexport interface KYCActions {\n // Initialize\n setSessionId: (sessionId: string) => void;\n setRequiredDocuments: (documents: DocumentType[]) => void;\n \n // Document management\n setCurrentDocumentType: (type: DocumentType) => void;\n setDocumentFile: (type: DocumentType, file: File) => void;\n setDocumentStatus: (type: DocumentType, status: DocumentStatus) => void;\n setDocumentData: (type: DocumentType, data: Partial<DocumentState>) => void;\n clearDocumentPreview: (type: DocumentType) => void;\n \n // Navigation\n setStep: (step: KYCStep) => void;\n nextDocument: () => void;\n \n // Verification\n setVerificationStatus: (status: object) => void;\n setVerified: (verified: boolean) => void;\n \n // Status\n setStatus: (status: string) => void;\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n \n // Helpers\n getNextRequiredDocument: () => DocumentType | null;\n areAllDocumentsUploaded: () => boolean;\n areAllDocumentsProcessed: () => boolean;\n \n // Reset\n reset: () => void;\n}\n\nconst createEmptyDocumentState = (type: DocumentType): DocumentState => ({\n id: null,\n type,\n status: 'uploaded',\n file: null,\n previewUrl: null,\n extractedData: null,\n confidence: 0,\n fraudFlags: [],\n error: null,\n});\n\nconst initialState: KYCState = {\n sessionId: null,\n status: 'idle',\n step: 'select',\n requiredDocuments: [],\n currentDocumentType: null,\n documents: new Map(),\n isVerified: false,\n verificationStatus: null,\n isLoading: false,\n error: null,\n};\n\nexport const useKYCStore = create<KYCState & KYCActions>((set, get) => ({\n ...initialState,\n\n setSessionId: (sessionId) => set({ sessionId }),\n\n setRequiredDocuments: (documents) => {\n const docsMap = new Map<DocumentType, DocumentState>();\n for (const type of documents) {\n docsMap.set(type, createEmptyDocumentState(type));\n }\n set({ \n requiredDocuments: documents, \n documents: docsMap,\n currentDocumentType: documents[0] || null,\n });\n },\n\n setCurrentDocumentType: (type) => set({ currentDocumentType: type }),\n\n setDocumentFile: (type, file) => {\n const { documents } = get();\n const doc = documents.get(type) || createEmptyDocumentState(type);\n \n // Create preview URL\n const previewUrl = URL.createObjectURL(file);\n \n const updated = new Map(documents);\n updated.set(type, {\n ...doc,\n file,\n previewUrl,\n status: 'uploaded',\n error: null,\n });\n \n set({ documents: updated });\n },\n\n setDocumentStatus: (type, status) => {\n const { documents } = get();\n const doc = documents.get(type);\n if (doc) {\n const updated = new Map(documents);\n updated.set(type, { ...doc, status });\n set({ documents: updated });\n }\n },\n\n setDocumentData: (type, data) => {\n const { documents } = get();\n const doc = documents.get(type);\n if (doc) {\n const updated = new Map(documents);\n updated.set(type, { ...doc, ...data });\n set({ documents: updated });\n }\n },\n\n clearDocumentPreview: (type) => {\n const { documents } = get();\n const doc = documents.get(type);\n if (doc?.previewUrl) {\n URL.revokeObjectURL(doc.previewUrl);\n }\n },\n\n setStep: (step) => set({ step }),\n\n nextDocument: () => {\n const { requiredDocuments, currentDocumentType, documents } = get();\n const currentIndex = currentDocumentType \n ? requiredDocuments.indexOf(currentDocumentType) \n : -1;\n \n // Find next document that needs upload\n for (let i = currentIndex + 1; i < requiredDocuments.length; i++) {\n const type = requiredDocuments[i];\n const doc = documents.get(type);\n if (!doc?.file) {\n set({ currentDocumentType: type });\n return;\n }\n }\n \n // All documents uploaded, move to processing/review\n set({ \n currentDocumentType: null,\n step: 'processing',\n });\n },\n\n setVerificationStatus: (status) => set({ verificationStatus: status }),\n \n setVerified: (verified) => set({ isVerified: verified }),\n\n setStatus: (status) => set({ status }),\n \n setLoading: (isLoading) => set({ isLoading }),\n \n setError: (error) => set({ error }),\n\n getNextRequiredDocument: () => {\n const { requiredDocuments, documents } = get();\n for (const type of requiredDocuments) {\n const doc = documents.get(type);\n if (!doc?.file) {\n return type;\n }\n }\n return null;\n },\n\n areAllDocumentsUploaded: () => {\n const { requiredDocuments, documents } = get();\n return requiredDocuments.every((type) => {\n const doc = documents.get(type);\n return doc?.file !== null;\n });\n },\n\n areAllDocumentsProcessed: () => {\n const { requiredDocuments, documents } = get();\n return requiredDocuments.every((type) => {\n const doc = documents.get(type);\n return doc?.status === 'completed' || doc?.status === 'requires_review';\n });\n },\n\n reset: () => {\n // Clean up preview URLs\n const { documents } = get();\n for (const doc of documents.values()) {\n if (doc.previewUrl) {\n URL.revokeObjectURL(doc.previewUrl);\n }\n }\n set(initialState);\n },\n}));\n","import React, { useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { Upload, FileText, Image, AlertCircle, X } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useKYCStore } from '../../store/kyc-store';\nimport type { DocumentType } from '@fileflow/shared';\nimport { DOCUMENT_TYPES } from '@fileflow/shared';\n\ninterface DocumentUploaderProps {\n documentType: DocumentType;\n onFileSelect?: (file: File) => void;\n}\n\nexport const DocumentUploader: React.FC<DocumentUploaderProps> = ({\n documentType,\n onFileSelect,\n}) => {\n const { documents, setDocumentFile, isLoading } = useKYCStore();\n const documentState = documents.get(documentType);\n const documentInfo = DOCUMENT_TYPES[documentType];\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: unknown[]) => {\n if (rejectedFiles.length > 0) {\n return;\n }\n\n if (acceptedFiles.length > 0) {\n const file = acceptedFiles[0];\n setDocumentFile(documentType, file);\n onFileSelect?.(file);\n }\n },\n [documentType, onFileSelect, setDocumentFile]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: {\n 'application/pdf': ['.pdf'],\n 'image/jpeg': ['.jpg', '.jpeg'],\n 'image/png': ['.png'],\n },\n maxSize: documentInfo.maxFileSize,\n multiple: false,\n disabled: isLoading,\n });\n\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n const getFileIcon = () => {\n if (documentState?.file?.type === 'application/pdf') {\n return <FileText className=\"ff-w-6 ff-h-6\" />;\n }\n return <Image className=\"ff-w-6 ff-h-6\" />;\n };\n\n const clearFile = (e: React.MouseEvent) => {\n e.stopPropagation();\n useKYCStore.getState().clearDocumentPreview(documentType);\n setDocumentFile(documentType, null as unknown as File);\n };\n\n // Show preview if file is selected\n if (documentState?.file && documentState.previewUrl) {\n return (\n <div className=\"ff-space-y-4\">\n {/* Document Info */}\n <div className=\"ff-p-4 ff-rounded-xl\" style={{ backgroundColor: 'var(--ff-primary-20)', border: '1px solid var(--ff-primary-50)' }}>\n <div className=\"ff-flex ff-items-center ff-gap-3\">\n <div className=\"ff-p-2 ff-rounded-lg\" style={{ backgroundColor: 'var(--ff-primary-30)' }}>\n <span style={{ color: 'var(--ff-primary-90)' }}>{getFileIcon()}</span>\n </div>\n <div className=\"ff-flex-1 ff-min-w-0\">\n <p className=\"ff-font-medium ff-truncate\" style={{ color: 'var(--ff-primary-110)' }}>\n {documentState.file.name}\n </p>\n <p className=\"ff-text-sm\" style={{ color: 'var(--ff-primary-90)' }}>\n {formatFileSize(documentState.file.size)}\n </p>\n </div>\n <button\n onClick={clearFile}\n className=\"ff-p-1.5 ff-rounded-full ff-transition-colors\"\n style={{ color: 'var(--ff-primary-90)' }}\n aria-label=\"Remove file\"\n >\n <X className=\"ff-w-5 ff-h-5\" />\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"ff-document-preview ff-aspect-[3/4] ff-max-h-96\">\n {documentState.file.type === 'application/pdf' ? (\n <iframe\n src={documentState.previewUrl}\n className=\"ff-w-full ff-h-full ff-rounded-xl\"\n title=\"Document preview\"\n />\n ) : (\n <img\n src={documentState.previewUrl}\n alt=\"Document preview\"\n className=\"ff-w-full ff-h-full ff-object-contain ff-rounded-xl\"\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ff-space-y-6\">\n {/* Document Type Info */}\n <div className=\"ff-text-center ff-mb-4\">\n <h3 className=\"ff-text-lg ff-font-semibold\" style={{ color: 'var(--ff-text-primary)' }}>{documentInfo.label}</h3>\n <p className=\"ff-text-sm ff-mt-1\" style={{ color: 'var(--ff-text-muted)' }}>{documentInfo.description}</p>\n </div>\n\n {/* Dropzone - Demo style */}\n <div\n {...getRootProps()}\n className={clsx(\n 'ff-dropzone',\n isDragActive && 'ff-dropzone-active',\n isLoading && 'ff-opacity-50 ff-cursor-not-allowed'\n )}\n >\n <input {...getInputProps()} />\n <div className=\"ff-dropzone-icon-wrapper\">\n <Upload className=\"ff-dropzone-icon\" />\n </div>\n <h3 className=\"ff-dropzone-text\">\n {isDragActive ? 'Drop your document here' : 'Upload your document'}\n </h3>\n <p className=\"ff-dropzone-hint\">Drag and drop or click to select</p>\n <label className=\"ff-inline-block\">\n <span className={clsx(\n 'ff-btn ff-btn-primary',\n isLoading && 'ff-opacity-50 ff-cursor-wait'\n )}>\n {isLoading ? 'Processing...' : 'Choose file'}\n </span>\n </label>\n <div className=\"ff-flex ff-flex-wrap ff-justify-center ff-gap-2 ff-mt-3\">\n {documentInfo.acceptedFormats.map((format) => (\n <span \n key={format} \n className=\"ff-px-2 ff-py-1 ff-rounded ff-text-xs\"\n style={{ backgroundColor: 'var(--ff-bg-tertiary)', color: 'var(--ff-text-muted)' }}\n >\n {format.toUpperCase()}\n </span>\n ))}\n <span className=\"ff-px-2 ff-py-1 ff-text-xs\" style={{ color: 'var(--ff-text-muted)' }}>\n Max {formatFileSize(documentInfo.maxFileSize)}\n </span>\n </div>\n </div>\n\n {/* Error */}\n {documentState?.error && (\n <div className=\"ff-flex ff-items-center ff-gap-2 ff-p-4 ff-rounded-lg ff-text-sm\" style={{ backgroundColor: 'var(--ff-error-light)', color: 'var(--ff-error)' }}>\n <AlertCircle className=\"ff-w-4 ff-h-4 ff-flex-shrink-0\" />\n <p>{documentState.error}</p>\n </div>\n )}\n\n {/* Tips */}\n <div className=\"ff-rounded-xl ff-p-4\" style={{ backgroundColor: 'var(--ff-bg-secondary)' }}>\n <h4 className=\"ff-text-sm ff-font-medium ff-mb-2\" style={{ color: 'var(--ff-text-secondary)' }}>Tips for best results:</h4>\n <ul className=\"ff-text-sm ff-space-y-1 ff-list-disc ff-list-inside\" style={{ color: 'var(--ff-text-muted)' }}>\n <li>Ensure all text is clearly visible and readable</li>\n <li>Avoid glare, shadows, or blurry images</li>\n <li>Include all four corners of the document</li>\n <li>Use good lighting when taking photos</li>\n </ul>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { CheckCircle, XCircle, AlertTriangle, Loader2, Clock } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useKYCStore } from '../../store/kyc-store';\nimport type { DocumentType, DocumentStatus as DocStatus } from '@fileflow/shared';\nimport { DOCUMENT_TYPES } from '@fileflow/shared';\n\ninterface DocumentStatusProps {\n documentType: DocumentType;\n showDetails?: boolean;\n}\n\nexport const DocumentStatus: React.FC<DocumentStatusProps> = ({\n documentType,\n showDetails = true,\n}) => {\n const { documents } = useKYCStore();\n const documentState = documents.get(documentType);\n const documentInfo = DOCUMENT_TYPES[documentType];\n\n const getStatusConfig = (status?: DocStatus) => {\n switch (status) {\n case 'completed':\n return {\n icon: CheckCircle,\n iconColor: 'var(--ff-success)',\n bgColor: 'var(--ff-success-light)',\n label: 'Verified',\n labelColor: 'var(--ff-success)',\n description: 'Document successfully processed',\n };\n case 'requires_review':\n return {\n icon: AlertTriangle,\n iconColor: 'var(--ff-warning)',\n bgColor: 'var(--ff-warning-light)',\n label: 'Review Required',\n labelColor: 'var(--ff-warning)',\n description: 'Manual verification may be needed',\n };\n case 'failed':\n return {\n icon: XCircle,\n iconColor: 'var(--ff-error)',\n bgColor: 'var(--ff-error-light)',\n label: 'Failed',\n labelColor: 'var(--ff-error)',\n description: 'Unable to process document',\n };\n case 'processing':\n return {\n icon: Loader2,\n iconColor: 'var(--ff-primary-90)',\n bgColor: 'var(--ff-primary-20)',\n label: 'Processing',\n labelColor: 'var(--ff-primary-90)',\n description: 'Analyzing document...',\n };\n case 'uploaded':\n return {\n icon: Clock,\n iconColor: 'var(--ff-text-secondary)',\n bgColor: 'var(--ff-bg-tertiary)',\n label: 'Pending',\n labelColor: 'var(--ff-text-secondary)',\n description: 'Waiting to be processed',\n };\n default:\n return {\n icon: Clock,\n iconColor: 'var(--ff-text-muted)',\n bgColor: 'var(--ff-bg-tertiary)',\n label: 'Not Uploaded',\n labelColor: 'var(--ff-text-muted)',\n description: 'Upload document to continue',\n };\n }\n };\n\n const statusConfig = getStatusConfig(documentState?.status);\n const Icon = statusConfig.icon;\n\n const getConfidenceColor = (confidence: number) => {\n if (confidence >= 0.8) return 'var(--ff-success)';\n if (confidence >= 0.6) return 'var(--ff-warning)';\n return 'var(--ff-error)';\n };\n\n return (\n <div className=\"ff-space-y-3\">\n {/* Status Header */}\n <div className=\"ff-flex ff-items-center ff-gap-3\">\n <div className=\"ff-p-2 ff-rounded-xl\" style={{ backgroundColor: statusConfig.bgColor }}>\n <Icon\n className={clsx(\n 'ff-w-5 ff-h-5',\n documentState?.status === 'processing' && 'ff-animate-spin'\n )}\n style={{ color: statusConfig.iconColor }}\n />\n </div>\n <div>\n <p className=\"ff-font-medium\" style={{ color: 'var(--ff-text-primary)' }}>{documentInfo.label}</p>\n <p className=\"ff-text-sm\" style={{ color: statusConfig.labelColor }}>{statusConfig.label}</p>\n </div>\n </div>\n\n {/* Confidence Score */}\n {documentState?.confidence !== undefined && documentState.confidence > 0 && (\n <div className=\"ff-space-y-1\">\n <div className=\"ff-flex ff-items-center ff-justify-between ff-text-sm\">\n <span style={{ color: 'var(--ff-text-secondary)' }}>Confidence</span>\n <span className=\"ff-font-medium\" style={{ color: getConfidenceColor(documentState.confidence) }}>\n {Math.round(documentState.confidence * 100)}%\n </span>\n </div>\n <div className=\"ff-progress\">\n <div\n className=\"ff-progress-bar\"\n style={{ \n width: `${documentState.confidence * 100}%`,\n backgroundColor: getConfidenceColor(documentState.confidence)\n }}\n />\n </div>\n </div>\n )}\n\n {/* Fraud Flags */}\n {showDetails && documentState?.fraudFlags && documentState.fraudFlags.length > 0 && (\n <div className=\"ff-space-y-2\">\n <p className=\"ff-text-sm ff-font-medium\" style={{ color: 'var(--ff-text-secondary)' }}>Issues Detected</p>\n <div className=\"ff-space-y-1\">\n {documentState.fraudFlags.map((flag, index) => (\n <div\n key={index}\n className=\"ff-flex ff-items-start ff-gap-2 ff-p-2 ff-rounded-lg ff-text-sm\"\n style={{\n backgroundColor: flag.severity === 'high' ? 'var(--ff-error-light)' : flag.severity === 'medium' ? 'var(--ff-warning-light)' : 'var(--ff-bg-tertiary)',\n color: flag.severity === 'high' ? 'var(--ff-error)' : flag.severity === 'medium' ? 'var(--ff-warning)' : 'var(--ff-text-secondary)',\n }}\n >\n {flag.severity === 'high' ? (\n <XCircle className=\"ff-w-4 ff-h-4 ff-flex-shrink-0 ff-mt-0.5\" />\n ) : (\n <AlertTriangle className=\"ff-w-4 ff-h-4 ff-flex-shrink-0 ff-mt-0.5\" />\n )}\n <span>{flag.message}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Extracted Data Preview */}\n {showDetails &&\n documentState?.extractedData &&\n documentState.status === 'completed' && (\n <div className=\"ff-rounded-xl ff-p-3\" style={{ backgroundColor: 'var(--ff-bg-tertiary)' }}>\n <p className=\"ff-text-sm ff-font-medium ff-mb-2\" style={{ color: 'var(--ff-text-secondary)' }}>\n Extracted Information\n </p>\n <dl className=\"ff-space-y-1 ff-text-sm\">\n {'fullName' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Name</dt>\n <dd className=\"ff-font-medium\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.fullName}\n </dd>\n </div>\n )}\n {'dateOfBirth' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Date of Birth</dt>\n <dd style={{ color: 'var(--ff-text-primary)' }}>{documentState.extractedData.dateOfBirth}</dd>\n </div>\n )}\n {documentState.extractedData.documentType === 'passport' &&\n 'passportNumber' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Passport #</dt>\n <dd className=\"ff-font-mono\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.passportNumber}\n </dd>\n </div>\n )}\n {documentState.extractedData.documentType === 'drivers_license' &&\n 'licenseNumber' in documentState.extractedData && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>License #</dt>\n <dd className=\"ff-font-mono\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.licenseNumber}\n </dd>\n </div>\n )}\n {'address' in documentState.extractedData && documentState.extractedData.address && (\n <div className=\"ff-flex ff-justify-between\">\n <dt style={{ color: 'var(--ff-text-muted)' }}>Address</dt>\n <dd className=\"ff-text-right\" style={{ color: 'var(--ff-text-primary)' }}>\n {documentState.extractedData.address.city},{' '}\n {documentState.extractedData.address.province}\n </dd>\n </div>\n )}\n </dl>\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport {\n FileText,\n Car,\n Home,\n CheckCircle,\n X,\n Loader2,\n ChevronRight,\n ShieldCheck,\n Shield,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useKYCStore, type KYCStep } from '../../store/kyc-store';\nimport { getClient } from '../../api/client';\nimport { DocumentUploader } from './DocumentUploader';\nimport { DocumentStatus } from './DocumentStatus';\nimport { StyleProvider } from '../../styles/StyleProvider';\nimport type { DocumentType, KYCSession, KYCDocument } from '@fileflow/shared';\nimport { DOCUMENT_TYPES } from '@fileflow/shared';\n\n// KYC steps for the step indicator\nconst KYC_STEP_LABELS = ['select', 'upload', 'review', 'complete'] as const;\n\ninterface KYCWizardProps {\n requiredDocuments: DocumentType[];\n onComplete?: (session: KYCSession) => void;\n onCancel?: () => void;\n onError?: (error: Error) => void;\n}\n\nconst DOCUMENT_ICONS: Record<DocumentType, React.ElementType> = {\n passport: FileText,\n drivers_license: Car,\n proof_of_address: Home,\n};\n\nexport const KYCWizard: React.FC<KYCWizardProps> = ({\n requiredDocuments,\n onComplete,\n onCancel,\n onError,\n}) => {\n const {\n sessionId,\n step,\n currentDocumentType,\n documents,\n isVerified,\n verificationStatus,\n isLoading,\n error,\n setSessionId,\n setRequiredDocuments,\n setCurrentDocumentType,\n setDocumentStatus,\n setDocumentData,\n setStep,\n nextDocument,\n setVerificationStatus,\n setVerified,\n setLoading,\n setError,\n areAllDocumentsUploaded,\n areAllDocumentsProcessed,\n reset,\n } = useKYCStore();\n\n const [pollingDocument, setPollingDocument] = useState<string | null>(null);\n\n // Initialize\n useEffect(() => {\n setRequiredDocuments(requiredDocuments);\n initializeSession();\n\n return () => {\n // Cleanup polling on unmount\n setPollingDocument(null);\n };\n }, [requiredDocuments]);\n\n const initializeSession = async () => {\n try {\n setLoading(true);\n const client = getClient();\n const result = await client.createKYCSession(requiredDocuments);\n setSessionId(result.sessionId);\n setStep('upload');\n } catch (err) {\n const error = err as Error;\n setError(error.message);\n onError?.(error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleFileSelect = useCallback(\n async (file: File) => {\n if (!sessionId || !currentDocumentType) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const client = getClient();\n const result = await client.uploadKYCDocument(sessionId, currentDocumentType, file);\n\n setDocumentData(currentDocumentType, {\n id: result.documentId,\n status: 'processing',\n });\n\n // Start polling for document status\n setPollingDocument(result.documentId);\n pollDocumentStatus(result.documentId);\n } catch (err) {\n const error = err as Error;\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: error.message,\n });\n onError?.(error);\n } finally {\n setLoading(false);\n }\n },\n [sessionId, currentDocumentType]\n );\n\n const pollDocumentStatus = async (documentId: string) => {\n const maxAttempts = 30;\n const maxConsecutiveErrors = 3; // Stop after 3 consecutive errors\n let attempts = 0;\n let consecutiveErrors = 0;\n\n const poll = async () => {\n if (attempts >= maxAttempts) {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: 'Processing timed out. Please try again.',\n });\n }\n return;\n }\n\n // Stop polling if we've had too many consecutive errors\n if (consecutiveErrors >= maxConsecutiveErrors) {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: 'Failed to check document status. Please refresh and try again.',\n });\n }\n return;\n }\n\n try {\n const client = getClient();\n const result = await client.getKYCDocument(documentId);\n const doc = result.document as KYCDocument;\n\n // Reset consecutive errors on success\n consecutiveErrors = 0;\n\n const docType = doc.type as DocumentType;\n setDocumentData(docType, {\n id: doc.id,\n status: doc.status,\n extractedData: doc.extractedData,\n confidence: doc.confidence,\n fraudFlags: doc.fraudFlags,\n error: null, // Clear any previous errors\n });\n\n if (doc.status === 'completed' || doc.status === 'requires_review' || doc.status === 'failed') {\n setPollingDocument(null);\n\n // Check if all documents are processed\n if (areAllDocumentsUploaded()) {\n const allProcessed = areAllDocumentsProcessed();\n if (allProcessed) {\n setStep('review');\n }\n } else {\n // Move to next document\n nextDocument();\n }\n return;\n }\n\n // Continue polling\n attempts++;\n setTimeout(poll, 2000);\n } catch (err) {\n const error = err as Error & { status?: number };\n consecutiveErrors++;\n attempts++;\n \n // On 404, stop immediately - the document doesn't exist\n if (error.status === 404 || error.message?.includes('not found')) {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: 'Session not found or invalid state',\n });\n }\n return;\n }\n\n // On other errors, retry with backoff (up to maxConsecutiveErrors times)\n if (consecutiveErrors < maxConsecutiveErrors) {\n setTimeout(poll, 3000 * consecutiveErrors); // Exponential backoff\n } else {\n setPollingDocument(null);\n if (currentDocumentType) {\n setDocumentData(currentDocumentType, {\n status: 'failed',\n error: error.message || 'Failed to process document',\n });\n }\n }\n }\n };\n\n poll();\n };\n\n const handleVerify = async () => {\n if (!sessionId) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const client = getClient();\n const result = await client.verifyKYCSession(sessionId, true);\n\n setVerificationStatus(result.verificationStatus);\n const status = result.verificationStatus as { isVerified: boolean };\n setVerified(status.isVerified);\n setStep('complete');\n\n onComplete?.(result as unknown as KYCSession);\n } catch (err) {\n const error = err as Error;\n setError(error.message);\n onError?.(error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCancel = () => {\n reset();\n onCancel?.();\n };\n\n const selectDocument = (type: DocumentType) => {\n setCurrentDocumentType(type);\n setStep('upload');\n };\n\n const isDocumentComplete = (type: DocumentType) => {\n const doc = documents.get(type);\n return doc?.status === 'completed' || doc?.status === 'requires_review';\n };\n\n // Get step index for the step indicator\n const getDisplayStepIndex = () => {\n const currentStep = step === 'processing' ? 'upload' : step;\n return KYC_STEP_LABELS.indexOf(currentStep as typeof KYC_STEP_LABELS[number]);\n };\n\n return (\n <StyleProvider>\n <div className=\"ff-container ff-modal\">\n {/* Modal Header - Demo style */}\n <div className=\"ff-modal-header\">\n <div className=\"ff-modal-header-left\">\n <div className=\"ff-flex ff-items-center ff-gap-3\">\n <div className=\"ff-modal-icon\">\n <Shield />\n </div>\n <h2 className=\"ff-modal-title\">Identity Verification</h2>\n </div>\n {/* Step Indicator - Demo style */}\n <div className=\"ff-steps ff-ml-4\">\n {KYC_STEP_LABELS.map((s, i) => (\n <React.Fragment key={s}>\n <div\n className={clsx(\n 'ff-step',\n getDisplayStepIndex() === i && 'ff-step-active',\n getDisplayStepIndex() > i && 'ff-step-complete',\n getDisplayStepIndex() < i && 'ff-step-pending'\n )}\n >\n {getDisplayStepIndex() > i ? '✓' : i + 1}\n </div>\n {i < KYC_STEP_LABELS.length - 1 && (\n <div className={clsx(\n 'ff-step-connector',\n getDisplayStepIndex() > i && 'ff-step-connector-complete'\n )} />\n )}\n </React.Fragment>\n ))}\n </div>\n </div>\n <button\n onClick={handleCancel}\n className=\"ff-modal-close\"\n >\n <X className=\"ff-w-5 ff-h-5\" />\n </button>\n </div>\n\n {/* Modal Body */}\n <div className=\"ff-modal-body\">\n {error && (\n <div className=\"ff-mb-4 ff-p-4 ff-rounded-lg ff-text-sm\" style={{ backgroundColor: 'var(--ff-error-light)', color: 'var(--ff-error)' }}>\n {error}\n </div>\n )}\n\n {/* Document Selection */}\n {step === 'select' && (\n <div className=\"ff-space-y-4\">\n <p className=\"ff-text-center ff-mb-6\" style={{ color: 'var(--ff-text-muted)' }}>\n Please upload the following documents to verify your identity\n </p>\n <div className=\"ff-grid ff-gap-3\">\n {requiredDocuments.map((type) => {\n const Icon = DOCUMENT_ICONS[type];\n const info = DOCUMENT_TYPES[type];\n const doc = documents.get(type);\n const isComplete = isDocumentComplete(type);\n\n return (\n <button\n key={type}\n onClick={() => selectDocument(type)}\n className={clsx(\n 'ff-flex ff-items-center ff-gap-4 ff-p-4 ff-rounded-xl ff-border-2 ff-text-left ff-transition-all ff-duration-150',\n isComplete\n ? 'ff-border-transparent'\n : 'ff-border-transparent hover:ff-border-transparent'\n )}\n style={{\n backgroundColor: isComplete ? 'var(--ff-success-light)' : 'var(--ff-bg-secondary)',\n borderColor: isComplete ? 'var(--ff-success)' : 'var(--ff-border-light)',\n }}\n >\n <div\n className=\"ff-p-3 ff-rounded-xl\"\n style={{\n backgroundColor: isComplete ? 'rgba(41, 142, 51, 0.15)' : 'var(--ff-bg-tertiary)',\n }}\n >\n {isComplete ? (\n <CheckCircle className=\"ff-w-6 ff-h-6\" style={{ color: 'var(--ff-success)' }} />\n ) : (\n <Icon className=\"ff-w-6 ff-h-6\" style={{ color: 'var(--ff-text-secondary)' }} />\n )}\n </div>\n <div className=\"ff-flex-1\">\n <p className=\"ff-font-medium\" style={{ color: 'var(--ff-text-primary)' }}>{info.label}</p>\n <p className=\"ff-text-sm\" style={{ color: 'var(--ff-text-muted)' }}>{info.description}</p>\n </div>\n <ChevronRight className=\"ff-w-5 ff-h-5\" style={{ color: 'var(--ff-text-muted)' }} />\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Document Upload */}\n {step === 'upload' && currentDocumentType && (\n <div className=\"ff-py-4\">\n <div className=\"ff-max-w-lg ff-mx-auto\">\n <DocumentUploader documentType={currentDocumentType} onFileSelect={handleFileSelect} />\n </div>\n </div>\n )}\n\n {/* Processing */}\n {step === 'processing' && (\n <div className=\"ff-flex ff-flex-col ff-items-center ff-justify-center ff-py-12\">\n <Loader2 className=\"ff-w-12 ff-h-12 ff-animate-spin ff-mb-4\" style={{ color: 'var(--ff-primary-90)' }} />\n <h3 className=\"ff-text-lg ff-font-semibold ff-mb-2\" style={{ color: 'var(--ff-text-primary)' }}>\n Processing Documents\n </h3>\n <p style={{ color: 'var(--ff-text-muted)' }} className=\"ff-text-center\">\n We're analyzing your documents. This may take a moment...\n </p>\n </div>\n )}\n\n {/* Review */}\n {step === 'review' && (\n <div className=\"ff-space-y-6\">\n <div className=\"ff-text-center ff-mb-6\">\n <h3 className=\"ff-text-lg ff-font-semibold\" style={{ color: 'var(--ff-text-primary)' }}>Review Your Documents</h3>\n <p style={{ color: 'var(--ff-text-muted)' }}>\n Please review the extracted information before completing verification\n </p>\n </div>\n\n <div className=\"ff-grid ff-gap-4\">\n {requiredDocuments.map((type) => (\n <div\n key={type}\n className=\"ff-rounded-xl ff-p-4\"\n style={{ backgroundColor: 'var(--ff-bg-secondary)', border: '1px solid var(--ff-border-light)' }}\n >\n <DocumentStatus documentType={type} showDetails={true} />\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Complete */}\n {step === 'complete' && (\n <div className=\"ff-flex ff-flex-col ff-items-center ff-justify-center ff-py-12\">\n <div\n className=\"ff-w-16 ff-h-16 ff-rounded-full ff-flex ff-items-center ff-justify-center ff-mb-4\"\n style={{ backgroundColor: isVerified ? 'var(--ff-success-light)' : 'var(--ff-warning-light)' }}\n >\n {isVerified ? (\n <CheckCircle className=\"ff-w-10 ff-h-10\" style={{ color: 'var(--ff-success)' }} />\n ) : (\n <ShieldCheck className=\"ff-w-10 ff-h-10\" style={{ color: 'var(--ff-warning)' }} />\n )}\n </div>\n <h3 className=\"ff-text-xl ff-font-semibold ff-mb-2\" style={{ color: 'var(--ff-text-primary)' }}>\n {isVerified ? 'Verification Complete!' : 'Review Required'}\n </h3>\n <p style={{ color: 'var(--ff-text-muted)' }} className=\"ff-text-center\">\n {isVerified\n ? 'Your identity has been successfully verified.'\n : 'Additional review may be required. We will contact you if needed.'}\n </p>\n </div>\n )}\n </div>\n\n {/* Modal Footer */}\n {step !== 'complete' && (\n <div className=\"ff-modal-footer\">\n <button\n onClick={() => {\n if (step === 'upload') {\n setStep('select');\n } else if (step === 'review') {\n setStep('select');\n }\n }}\n disabled={isLoading}\n className=\"ff-btn ff-btn-secondary\"\n >\n Back\n </button>\n\n {step === 'review' && (\n <button\n onClick={handleVerify}\n disabled={isLoading || !areAllDocumentsProcessed()}\n className=\"ff-btn ff-btn-primary\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"ff-w-4 ff-h-4 ff-animate-spin\" />\n Verifying...\n </>\n ) : (\n 'Complete Verification'\n )}\n </button>\n )}\n\n {step === 'select' && areAllDocumentsUploaded() && (\n <button\n onClick={() => setStep('review')}\n className=\"ff-btn ff-btn-primary\"\n >\n Review & Verify\n </button>\n )}\n </div>\n )}\n </div>\n </StyleProvider>\n );\n};\n"],"names":["__iconNode","Car","createLucideIcon","Clock","FileText","House","Image","ShieldCheck","Shield","createEmptyDocumentState","type","initialState","useKYCStore","create","set","get","sessionId","documents","docsMap","file","doc","previewUrl","updated","status","data","step","requiredDocuments","currentDocumentType","currentIndex","i","verified","isLoading","error","DocumentUploader","documentType","onFileSelect","setDocumentFile","documentState","documentInfo","DOCUMENT_TYPES","onDrop","useCallback","acceptedFiles","rejectedFiles","getRootProps","getInputProps","isDragActive","useDropzone","formatFileSize","bytes","getFileIcon","_a","jsx","clearFile","e","jsxs","X","clsx","Upload","format","AlertCircle","DocumentStatus","showDetails","statusConfig","CheckCircle","AlertTriangle","XCircle","Loader2","Icon","getConfidenceColor","confidence","flag","index","KYC_STEP_LABELS","DOCUMENT_ICONS","Home","KYCWizard","onComplete","onCancel","onError","isVerified","verificationStatus","setSessionId","setRequiredDocuments","setCurrentDocumentType","setDocumentStatus","setDocumentData","setStep","nextDocument","setVerificationStatus","setVerified","setLoading","setError","areAllDocumentsUploaded","areAllDocumentsProcessed","reset","pollingDocument","setPollingDocument","useState","useEffect","initializeSession","result","getClient","err","handleFileSelect","pollDocumentStatus","documentId","attempts","consecutiveErrors","poll","docType","handleVerify","handleCancel","selectDocument","isDocumentComplete","getDisplayStepIndex","currentStep","StyleProvider","s","React","info","isComplete","ChevronRight","Fragment"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
@@ -1,4 +1,4 @@
1
- "use strict";const e=require("react/jsx-runtime"),k=require("react"),c=require("./index-RFYSKfrk.js");/**
1
+ "use strict";const e=require("react/jsx-runtime"),k=require("react"),c=require("./index-CQzYw3WX.js");/**
2
2
  * @license lucide-react v0.563.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -34,4 +34,4 @@
34
34
  * This source code is licensed under the ISC license.
35
35
  * See the LICENSE file in the root directory of this source tree.
36
36
  */const me=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],xe=c.createLucideIcon("shield",me),q=l=>({id:null,type:l,status:"uploaded",file:null,previewUrl:null,extractedData:null,confidence:0,fraudFlags:[],error:null}),Y={sessionId:null,status:"idle",step:"select",requiredDocuments:[],currentDocumentType:null,documents:new Map,isVerified:!1,verificationStatus:null,isLoading:!1,error:null},U=c.create((l,o)=>({...Y,setSessionId:r=>l({sessionId:r}),setRequiredDocuments:r=>{const s=new Map;for(const a of r)s.set(a,q(a));l({requiredDocuments:r,documents:s,currentDocumentType:r[0]||null})},setCurrentDocumentType:r=>l({currentDocumentType:r}),setDocumentFile:(r,s)=>{const{documents:a}=o(),t=a.get(r)||q(r),f=URL.createObjectURL(s),x=new Map(a);x.set(r,{...t,file:s,previewUrl:f,status:"uploaded",error:null}),l({documents:x})},setDocumentStatus:(r,s)=>{const{documents:a}=o(),t=a.get(r);if(t){const f=new Map(a);f.set(r,{...t,status:s}),l({documents:f})}},setDocumentData:(r,s)=>{const{documents:a}=o(),t=a.get(r);if(t){const f=new Map(a);f.set(r,{...t,...s}),l({documents:f})}},clearDocumentPreview:r=>{const{documents:s}=o(),a=s.get(r);a!=null&&a.previewUrl&&URL.revokeObjectURL(a.previewUrl)},setStep:r=>l({step:r}),nextDocument:()=>{const{requiredDocuments:r,currentDocumentType:s,documents:a}=o(),t=s?r.indexOf(s):-1;for(let f=t+1;f<r.length;f++){const x=r[f],m=a.get(x);if(!(m!=null&&m.file)){l({currentDocumentType:x});return}}l({currentDocumentType:null,step:"processing"})},setVerificationStatus:r=>l({verificationStatus:r}),setVerified:r=>l({isVerified:r}),setStatus:r=>l({status:r}),setLoading:r=>l({isLoading:r}),setError:r=>l({error:r}),getNextRequiredDocument:()=>{const{requiredDocuments:r,documents:s}=o();for(const a of r){const t=s.get(a);if(!(t!=null&&t.file))return a}return null},areAllDocumentsUploaded:()=>{const{requiredDocuments:r,documents:s}=o();return r.every(a=>{const t=s.get(a);return(t==null?void 0:t.file)!==null})},areAllDocumentsProcessed:()=>{const{requiredDocuments:r,documents:s}=o();return r.every(a=>{const t=s.get(a);return(t==null?void 0:t.status)==="completed"||(t==null?void 0:t.status)==="requires_review"})},reset:()=>{const{documents:r}=o();for(const s of r.values())s.previewUrl&&URL.revokeObjectURL(s.previewUrl);l(Y)}})),B=({documentType:l,onFileSelect:o})=>{const{documents:r,setDocumentFile:s,isLoading:a}=U(),t=r.get(l),f=c.DOCUMENT_TYPES[l],x=k.useCallback((d,z)=>{if(!(z.length>0)&&d.length>0){const h=d[0];s(l,h),o==null||o(h)}},[l,o,s]),{getRootProps:m,getInputProps:u,isDragActive:g}=c.useDropzone({onDrop:x,accept:{"application/pdf":[".pdf"],"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"]},maxSize:f.maxFileSize,multiple:!1,disabled:a}),C=d=>d<1024?`${d} B`:d<1024*1024?`${(d/1024).toFixed(1)} KB`:`${(d/(1024*1024)).toFixed(1)} MB`,S=()=>{var d;return((d=t==null?void 0:t.file)==null?void 0:d.type)==="application/pdf"?e.jsx(O,{className:"ff-w-6 ff-h-6"}):e.jsx(oe,{className:"ff-w-6 ff-h-6"})},M=d=>{d.stopPropagation(),U.getState().clearDocumentPreview(l),s(l,null)};return t!=null&&t.file&&t.previewUrl?e.jsxs("div",{className:"ff-space-y-4",children:[e.jsx("div",{className:"ff-p-4 ff-rounded-xl",style:{backgroundColor:"var(--ff-primary-20)",border:"1px solid var(--ff-primary-50)"},children:e.jsxs("div",{className:"ff-flex ff-items-center ff-gap-3",children:[e.jsx("div",{className:"ff-p-2 ff-rounded-lg",style:{backgroundColor:"var(--ff-primary-30)"},children:e.jsx("span",{style:{color:"var(--ff-primary-90)"},children:S()})}),e.jsxs("div",{className:"ff-flex-1 ff-min-w-0",children:[e.jsx("p",{className:"ff-font-medium ff-truncate",style:{color:"var(--ff-primary-110)"},children:t.file.name}),e.jsx("p",{className:"ff-text-sm",style:{color:"var(--ff-primary-90)"},children:C(t.file.size)})]}),e.jsx("button",{onClick:M,className:"ff-p-1.5 ff-rounded-full ff-transition-colors",style:{color:"var(--ff-primary-90)"},"aria-label":"Remove file",children:e.jsx(c.X,{className:"ff-w-5 ff-h-5"})})]})}),e.jsx("div",{className:"ff-document-preview ff-aspect-[3/4] ff-max-h-96",children:t.file.type==="application/pdf"?e.jsx("iframe",{src:t.previewUrl,className:"ff-w-full ff-h-full ff-rounded-xl",title:"Document preview"}):e.jsx("img",{src:t.previewUrl,alt:"Document preview",className:"ff-w-full ff-h-full ff-object-contain ff-rounded-xl"})})]}):e.jsxs("div",{className:"ff-space-y-6",children:[e.jsxs("div",{className:"ff-text-center ff-mb-4",children:[e.jsx("h3",{className:"ff-text-lg ff-font-semibold",style:{color:"var(--ff-text-primary)"},children:f.label}),e.jsx("p",{className:"ff-text-sm ff-mt-1",style:{color:"var(--ff-text-muted)"},children:f.description})]}),e.jsxs("div",{...m(),className:c.clsx("ff-dropzone",g&&"ff-dropzone-active",a&&"ff-opacity-50 ff-cursor-not-allowed"),children:[e.jsx("input",{...u()}),e.jsx("div",{className:"ff-dropzone-icon-wrapper",children:e.jsx(c.Upload,{className:"ff-dropzone-icon"})}),e.jsx("h3",{className:"ff-dropzone-text",children:g?"Drop your document here":"Upload your document"}),e.jsx("p",{className:"ff-dropzone-hint",children:"Drag and drop or click to select"}),e.jsx("label",{className:"ff-inline-block",children:e.jsx("span",{className:c.clsx("ff-btn ff-btn-primary",a&&"ff-opacity-50 ff-cursor-wait"),children:a?"Processing...":"Choose file"})}),e.jsxs("div",{className:"ff-flex ff-flex-wrap ff-justify-center ff-gap-2 ff-mt-3",children:[f.acceptedFormats.map(d=>e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded ff-text-xs",style:{backgroundColor:"var(--ff-bg-tertiary)",color:"var(--ff-text-muted)"},children:d.toUpperCase()},d)),e.jsxs("span",{className:"ff-px-2 ff-py-1 ff-text-xs",style:{color:"var(--ff-text-muted)"},children:["Max ",C(f.maxFileSize)]})]})]}),(t==null?void 0:t.error)&&e.jsxs("div",{className:"ff-flex ff-items-center ff-gap-2 ff-p-4 ff-rounded-lg ff-text-sm",style:{backgroundColor:"var(--ff-error-light)",color:"var(--ff-error)"},children:[e.jsx(c.CircleAlert,{className:"ff-w-4 ff-h-4 ff-flex-shrink-0"}),e.jsx("p",{children:t.error})]}),e.jsxs("div",{className:"ff-rounded-xl ff-p-4",style:{backgroundColor:"var(--ff-bg-secondary)"},children:[e.jsx("h4",{className:"ff-text-sm ff-font-medium ff-mb-2",style:{color:"var(--ff-text-secondary)"},children:"Tips for best results:"}),e.jsxs("ul",{className:"ff-text-sm ff-space-y-1 ff-list-disc ff-list-inside",style:{color:"var(--ff-text-muted)"},children:[e.jsx("li",{children:"Ensure all text is clearly visible and readable"}),e.jsx("li",{children:"Avoid glare, shadows, or blurry images"}),e.jsx("li",{children:"Include all four corners of the document"}),e.jsx("li",{children:"Use good lighting when taking photos"})]})]})]})},K=({documentType:l,showDetails:o=!0})=>{const{documents:r}=U(),s=r.get(l),a=c.DOCUMENT_TYPES[l],f=(u=>{switch(u){case"completed":return{icon:c.CircleCheckBig,iconColor:"var(--ff-success)",bgColor:"var(--ff-success-light)",label:"Verified",labelColor:"var(--ff-success)",description:"Document successfully processed"};case"requires_review":return{icon:c.TriangleAlert,iconColor:"var(--ff-warning)",bgColor:"var(--ff-warning-light)",label:"Review Required",labelColor:"var(--ff-warning)",description:"Manual verification may be needed"};case"failed":return{icon:c.CircleX,iconColor:"var(--ff-error)",bgColor:"var(--ff-error-light)",label:"Failed",labelColor:"var(--ff-error)",description:"Unable to process document"};case"processing":return{icon:c.LoaderCircle,iconColor:"var(--ff-primary-90)",bgColor:"var(--ff-primary-20)",label:"Processing",labelColor:"var(--ff-primary-90)",description:"Analyzing document..."};case"uploaded":return{icon:V,iconColor:"var(--ff-text-secondary)",bgColor:"var(--ff-bg-tertiary)",label:"Pending",labelColor:"var(--ff-text-secondary)",description:"Waiting to be processed"};default:return{icon:V,iconColor:"var(--ff-text-muted)",bgColor:"var(--ff-bg-tertiary)",label:"Not Uploaded",labelColor:"var(--ff-text-muted)",description:"Upload document to continue"}}})(s==null?void 0:s.status),x=f.icon,m=u=>u>=.8?"var(--ff-success)":u>=.6?"var(--ff-warning)":"var(--ff-error)";return e.jsxs("div",{className:"ff-space-y-3",children:[e.jsxs("div",{className:"ff-flex ff-items-center ff-gap-3",children:[e.jsx("div",{className:"ff-p-2 ff-rounded-xl",style:{backgroundColor:f.bgColor},children:e.jsx(x,{className:c.clsx("ff-w-5 ff-h-5",(s==null?void 0:s.status)==="processing"&&"ff-animate-spin"),style:{color:f.iconColor}})}),e.jsxs("div",{children:[e.jsx("p",{className:"ff-font-medium",style:{color:"var(--ff-text-primary)"},children:a.label}),e.jsx("p",{className:"ff-text-sm",style:{color:f.labelColor},children:f.label})]})]}),(s==null?void 0:s.confidence)!==void 0&&s.confidence>0&&e.jsxs("div",{className:"ff-space-y-1",children:[e.jsxs("div",{className:"ff-flex ff-items-center ff-justify-between ff-text-sm",children:[e.jsx("span",{style:{color:"var(--ff-text-secondary)"},children:"Confidence"}),e.jsxs("span",{className:"ff-font-medium",style:{color:m(s.confidence)},children:[Math.round(s.confidence*100),"%"]})]}),e.jsx("div",{className:"ff-progress",children:e.jsx("div",{className:"ff-progress-bar",style:{width:`${s.confidence*100}%`,backgroundColor:m(s.confidence)}})})]}),o&&(s==null?void 0:s.fraudFlags)&&s.fraudFlags.length>0&&e.jsxs("div",{className:"ff-space-y-2",children:[e.jsx("p",{className:"ff-text-sm ff-font-medium",style:{color:"var(--ff-text-secondary)"},children:"Issues Detected"}),e.jsx("div",{className:"ff-space-y-1",children:s.fraudFlags.map((u,g)=>e.jsxs("div",{className:"ff-flex ff-items-start ff-gap-2 ff-p-2 ff-rounded-lg ff-text-sm",style:{backgroundColor:u.severity==="high"?"var(--ff-error-light)":u.severity==="medium"?"var(--ff-warning-light)":"var(--ff-bg-tertiary)",color:u.severity==="high"?"var(--ff-error)":u.severity==="medium"?"var(--ff-warning)":"var(--ff-text-secondary)"},children:[u.severity==="high"?e.jsx(c.CircleX,{className:"ff-w-4 ff-h-4 ff-flex-shrink-0 ff-mt-0.5"}):e.jsx(c.TriangleAlert,{className:"ff-w-4 ff-h-4 ff-flex-shrink-0 ff-mt-0.5"}),e.jsx("span",{children:u.message})]},g))})]}),o&&(s==null?void 0:s.extractedData)&&s.status==="completed"&&e.jsxs("div",{className:"ff-rounded-xl ff-p-3",style:{backgroundColor:"var(--ff-bg-tertiary)"},children:[e.jsx("p",{className:"ff-text-sm ff-font-medium ff-mb-2",style:{color:"var(--ff-text-secondary)"},children:"Extracted Information"}),e.jsxs("dl",{className:"ff-space-y-1 ff-text-sm",children:["fullName"in s.extractedData&&e.jsxs("div",{className:"ff-flex ff-justify-between",children:[e.jsx("dt",{style:{color:"var(--ff-text-muted)"},children:"Name"}),e.jsx("dd",{className:"ff-font-medium",style:{color:"var(--ff-text-primary)"},children:s.extractedData.fullName})]}),"dateOfBirth"in s.extractedData&&e.jsxs("div",{className:"ff-flex ff-justify-between",children:[e.jsx("dt",{style:{color:"var(--ff-text-muted)"},children:"Date of Birth"}),e.jsx("dd",{style:{color:"var(--ff-text-primary)"},children:s.extractedData.dateOfBirth})]}),s.extractedData.documentType==="passport"&&"passportNumber"in s.extractedData&&e.jsxs("div",{className:"ff-flex ff-justify-between",children:[e.jsx("dt",{style:{color:"var(--ff-text-muted)"},children:"Passport #"}),e.jsx("dd",{className:"ff-font-mono",style:{color:"var(--ff-text-primary)"},children:s.extractedData.passportNumber})]}),s.extractedData.documentType==="drivers_license"&&"licenseNumber"in s.extractedData&&e.jsxs("div",{className:"ff-flex ff-justify-between",children:[e.jsx("dt",{style:{color:"var(--ff-text-muted)"},children:"License #"}),e.jsx("dd",{className:"ff-font-mono",style:{color:"var(--ff-text-primary)"},children:s.extractedData.licenseNumber})]}),"address"in s.extractedData&&s.extractedData.address&&e.jsxs("div",{className:"ff-flex ff-justify-between",children:[e.jsx("dt",{style:{color:"var(--ff-text-muted)"},children:"Address"}),e.jsxs("dd",{className:"ff-text-right",style:{color:"var(--ff-text-primary)"},children:[s.extractedData.address.city,","," ",s.extractedData.address.province]})]})]})]})]})},P=["select","upload","review","complete"],pe={passport:O,drivers_license:fe,proof_of_address:ne},he=({requiredDocuments:l,onComplete:o,onCancel:r,onError:s})=>{const{sessionId:a,step:t,currentDocumentType:f,documents:x,isVerified:m,verificationStatus:u,isLoading:g,error:C,setSessionId:S,setRequiredDocuments:M,setCurrentDocumentType:d,setDocumentStatus:z,setDocumentData:h,setStep:j,nextDocument:$,setVerificationStatus:H,setVerified:E,setLoading:b,setError:I,areAllDocumentsUploaded:T,areAllDocumentsProcessed:R,reset:W}=U(),[ve,N]=k.useState(null);k.useEffect(()=>(M(l),X(),()=>{N(null)}),[l]);const X=async()=>{try{b(!0);const n=await c.getClient().createKYCSession(l);S(n.sessionId),j("upload")}catch(i){const n=i;I(n.message),s==null||s(n)}finally{b(!1)}},G=k.useCallback(async i=>{if(!(!a||!f))try{b(!0),I(null);const p=await c.getClient().uploadKYCDocument(a,f,i);h(f,{id:p.documentId,status:"processing"}),N(p.documentId),J(p.documentId)}catch(n){const p=n;h(f,{status:"failed",error:p.message}),s==null||s(p)}finally{b(!1)}},[a,f]),J=async i=>{let v=0,D=0;const L=async()=>{var A;if(v>=30){N(null),f&&h(f,{status:"failed",error:"Processing timed out. Please try again."});return}if(D>=3){N(null),f&&h(f,{status:"failed",error:"Failed to check document status. Please refresh and try again."});return}try{const y=(await c.getClient().getKYCDocument(i)).document;D=0;const te=y.type;if(h(te,{id:y.id,status:y.status,extractedData:y.extractedData,confidence:y.confidence,fraudFlags:y.fraudFlags,error:null}),y.status==="completed"||y.status==="requires_review"||y.status==="failed"){N(null),T()?R()&&j("review"):$();return}v++,setTimeout(L,2e3)}catch(F){const _=F;if(D++,v++,_.status===404||(A=_.message)!=null&&A.includes("not found")){N(null),f&&h(f,{status:"failed",error:"Session not found or invalid state"});return}D<3?setTimeout(L,3e3*D):(N(null),f&&h(f,{status:"failed",error:_.message||"Failed to process document"}))}};L()},Q=async()=>{if(a)try{b(!0),I(null);const n=await c.getClient().verifyKYCSession(a,!0);H(n.verificationStatus);const p=n.verificationStatus;E(p.isVerified),j("complete"),o==null||o(n)}catch(i){const n=i;I(n.message),s==null||s(n)}finally{b(!1)}},Z=()=>{W(),r==null||r()},ee=i=>{d(i),j("upload")},se=i=>{const n=x.get(i);return(n==null?void 0:n.status)==="completed"||(n==null?void 0:n.status)==="requires_review"},w=()=>{const i=t==="processing"?"upload":t;return P.indexOf(i)};return e.jsx(c.StyleProvider,{children:e.jsxs("div",{className:"ff-container ff-modal",children:[e.jsxs("div",{className:"ff-modal-header",children:[e.jsxs("div",{className:"ff-modal-header-left",children:[e.jsxs("div",{className:"ff-flex ff-items-center ff-gap-3",children:[e.jsx("div",{className:"ff-modal-icon",children:e.jsx(xe,{})}),e.jsx("h2",{className:"ff-modal-title",children:"Identity Verification"})]}),e.jsx("div",{className:"ff-steps ff-ml-4",children:P.map((i,n)=>e.jsxs(k.Fragment,{children:[e.jsx("div",{className:c.clsx("ff-step",w()===n&&"ff-step-active",w()>n&&"ff-step-complete",w()<n&&"ff-step-pending"),children:w()>n?"✓":n+1}),n<P.length-1&&e.jsx("div",{className:c.clsx("ff-step-connector",w()>n&&"ff-step-connector-complete")})]},i))})]}),e.jsx("button",{onClick:Z,className:"ff-modal-close",children:e.jsx(c.X,{className:"ff-w-5 ff-h-5"})})]}),e.jsxs("div",{className:"ff-modal-body",children:[C&&e.jsx("div",{className:"ff-mb-4 ff-p-4 ff-rounded-lg ff-text-sm",style:{backgroundColor:"var(--ff-error-light)",color:"var(--ff-error)"},children:C}),t==="select"&&e.jsxs("div",{className:"ff-space-y-4",children:[e.jsx("p",{className:"ff-text-center ff-mb-6",style:{color:"var(--ff-text-muted)"},children:"Please upload the following documents to verify your identity"}),e.jsx("div",{className:"ff-grid ff-gap-3",children:l.map(i=>{const n=pe[i],p=c.DOCUMENT_TYPES[i];x.get(i);const v=se(i);return e.jsxs("button",{onClick:()=>ee(i),className:c.clsx("ff-flex ff-items-center ff-gap-4 ff-p-4 ff-rounded-xl ff-border-2 ff-text-left ff-transition-all ff-duration-150",v?"ff-border-transparent":"ff-border-transparent hover:ff-border-transparent"),style:{backgroundColor:v?"var(--ff-success-light)":"var(--ff-bg-secondary)",borderColor:v?"var(--ff-success)":"var(--ff-border-light)"},children:[e.jsx("div",{className:"ff-p-3 ff-rounded-xl",style:{backgroundColor:v?"rgba(41, 142, 51, 0.15)":"var(--ff-bg-tertiary)"},children:v?e.jsx(c.CircleCheckBig,{className:"ff-w-6 ff-h-6",style:{color:"var(--ff-success)"}}):e.jsx(n,{className:"ff-w-6 ff-h-6",style:{color:"var(--ff-text-secondary)"}})}),e.jsxs("div",{className:"ff-flex-1",children:[e.jsx("p",{className:"ff-font-medium",style:{color:"var(--ff-text-primary)"},children:p.label}),e.jsx("p",{className:"ff-text-sm",style:{color:"var(--ff-text-muted)"},children:p.description})]}),e.jsx(c.ChevronRight,{className:"ff-w-5 ff-h-5",style:{color:"var(--ff-text-muted)"}})]},i)})})]}),t==="upload"&&f&&e.jsx("div",{className:"ff-py-4",children:e.jsx("div",{className:"ff-max-w-lg ff-mx-auto",children:e.jsx(B,{documentType:f,onFileSelect:G})})}),t==="processing"&&e.jsxs("div",{className:"ff-flex ff-flex-col ff-items-center ff-justify-center ff-py-12",children:[e.jsx(c.LoaderCircle,{className:"ff-w-12 ff-h-12 ff-animate-spin ff-mb-4",style:{color:"var(--ff-primary-90)"}}),e.jsx("h3",{className:"ff-text-lg ff-font-semibold ff-mb-2",style:{color:"var(--ff-text-primary)"},children:"Processing Documents"}),e.jsx("p",{style:{color:"var(--ff-text-muted)"},className:"ff-text-center",children:"We're analyzing your documents. This may take a moment..."})]}),t==="review"&&e.jsxs("div",{className:"ff-space-y-6",children:[e.jsxs("div",{className:"ff-text-center ff-mb-6",children:[e.jsx("h3",{className:"ff-text-lg ff-font-semibold",style:{color:"var(--ff-text-primary)"},children:"Review Your Documents"}),e.jsx("p",{style:{color:"var(--ff-text-muted)"},children:"Please review the extracted information before completing verification"})]}),e.jsx("div",{className:"ff-grid ff-gap-4",children:l.map(i=>e.jsx("div",{className:"ff-rounded-xl ff-p-4",style:{backgroundColor:"var(--ff-bg-secondary)",border:"1px solid var(--ff-border-light)"},children:e.jsx(K,{documentType:i,showDetails:!0})},i))})]}),t==="complete"&&e.jsxs("div",{className:"ff-flex ff-flex-col ff-items-center ff-justify-center ff-py-12",children:[e.jsx("div",{className:"ff-w-16 ff-h-16 ff-rounded-full ff-flex ff-items-center ff-justify-center ff-mb-4",style:{backgroundColor:m?"var(--ff-success-light)":"var(--ff-warning-light)"},children:m?e.jsx(c.CircleCheckBig,{className:"ff-w-10 ff-h-10",style:{color:"var(--ff-success)"}}):e.jsx(ue,{className:"ff-w-10 ff-h-10",style:{color:"var(--ff-warning)"}})}),e.jsx("h3",{className:"ff-text-xl ff-font-semibold ff-mb-2",style:{color:"var(--ff-text-primary)"},children:m?"Verification Complete!":"Review Required"}),e.jsx("p",{style:{color:"var(--ff-text-muted)"},className:"ff-text-center",children:m?"Your identity has been successfully verified.":"Additional review may be required. We will contact you if needed."})]})]}),t!=="complete"&&e.jsxs("div",{className:"ff-modal-footer",children:[e.jsx("button",{onClick:()=>{(t==="upload"||t==="review")&&j("select")},disabled:g,className:"ff-btn ff-btn-secondary",children:"Back"}),t==="review"&&e.jsx("button",{onClick:Q,disabled:g||!R(),className:"ff-btn ff-btn-primary",children:g?e.jsxs(e.Fragment,{children:[e.jsx(c.LoaderCircle,{className:"ff-w-4 ff-h-4 ff-animate-spin"}),"Verifying..."]}):"Complete Verification"}),t==="select"&&T()&&e.jsx("button",{onClick:()=>j("review"),className:"ff-btn ff-btn-primary",children:"Review & Verify"})]})]})})};exports.DocumentStatus=K;exports.DocumentUploader=B;exports.KYCWizard=he;exports.useKYCStore=U;
37
- //# sourceMappingURL=KYCWizard-DecrJ0MW.js.map
37
+ //# sourceMappingURL=KYCWizard-CMQUzKSL.js.map