@kwik-id/sdk-react 0.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +311 -0
  2. package/dist/assets/animations/id_scan.json.d.ts +3250 -0
  3. package/dist/assets/animations/selfie.json.d.ts +3269 -0
  4. package/dist/assets/image-processor.worker-B6Di_lR_.js +1 -0
  5. package/dist/components/themed-photo-back-svg.d.ts +4 -0
  6. package/dist/components/themed-photo-back-svg.d.ts.map +1 -0
  7. package/dist/components/themed-welcome-svg.d.ts +4 -0
  8. package/dist/components/themed-welcome-svg.d.ts.map +1 -0
  9. package/dist/context/kwik-id-context.d.ts +125 -0
  10. package/dist/context/kwik-id-context.d.ts.map +1 -0
  11. package/dist/hooks/index.d.ts +16 -0
  12. package/dist/hooks/index.d.ts.map +1 -0
  13. package/dist/hooks/kwik-id-context.d.ts +53 -0
  14. package/dist/hooks/kwik-id-context.d.ts.map +1 -0
  15. package/dist/hooks/use-camera.d.ts +64 -0
  16. package/dist/hooks/use-camera.d.ts.map +1 -0
  17. package/dist/hooks/use-face-detection.d.ts +68 -0
  18. package/dist/hooks/use-face-detection.d.ts.map +1 -0
  19. package/dist/hooks/use-handoff.d.ts +19 -0
  20. package/dist/hooks/use-handoff.d.ts.map +1 -0
  21. package/dist/hooks/use-kwik-id.d.ts +27 -0
  22. package/dist/hooks/use-kwik-id.d.ts.map +1 -0
  23. package/dist/hooks/use-liveness.d.ts +73 -0
  24. package/dist/hooks/use-liveness.d.ts.map +1 -0
  25. package/dist/hooks/use-quality.d.ts +59 -0
  26. package/dist/hooks/use-quality.d.ts.map +1 -0
  27. package/dist/hooks/use-verification.d.ts +80 -0
  28. package/dist/hooks/use-verification.d.ts.map +1 -0
  29. package/dist/index.d.ts +39 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +8383 -0
  32. package/dist/services/api.service.d.ts +136 -0
  33. package/dist/services/api.service.d.ts.map +1 -0
  34. package/dist/services/index.d.ts +2 -0
  35. package/dist/services/index.d.ts.map +1 -0
  36. package/dist/utils/image-compression.d.ts +25 -0
  37. package/dist/utils/image-compression.d.ts.map +1 -0
  38. package/dist/utils/image-quality.d.ts +37 -0
  39. package/dist/utils/image-quality.d.ts.map +1 -0
  40. package/dist/utils/image-worker.d.ts +14 -0
  41. package/dist/utils/image-worker.d.ts.map +1 -0
  42. package/dist/utils/index.d.ts +4 -0
  43. package/dist/utils/index.d.ts.map +1 -0
  44. package/dist/utils/upload-manager.d.ts +69 -0
  45. package/dist/utils/upload-manager.d.ts.map +1 -0
  46. package/dist/views/consent-step.d.ts +9 -0
  47. package/dist/views/consent-step.d.ts.map +1 -0
  48. package/dist/views/document-upload-step.d.ts +10 -0
  49. package/dist/views/document-upload-step.d.ts.map +1 -0
  50. package/dist/views/handoff-choice-view.d.ts +7 -0
  51. package/dist/views/handoff-choice-view.d.ts.map +1 -0
  52. package/dist/views/handoff-qr-view.d.ts +10 -0
  53. package/dist/views/handoff-qr-view.d.ts.map +1 -0
  54. package/dist/views/kid-branding.d.ts +3 -0
  55. package/dist/views/kid-branding.d.ts.map +1 -0
  56. package/dist/views/kwik-id.d.ts +50 -0
  57. package/dist/views/kwik-id.d.ts.map +1 -0
  58. package/dist/views/kyc-form.d.ts +2 -0
  59. package/dist/views/kyc-form.d.ts.map +1 -0
  60. package/dist/views/kyc-modal-flow.d.ts +10 -0
  61. package/dist/views/kyc-modal-flow.d.ts.map +1 -0
  62. package/dist/views/kyc-substeps/camera-capture.d.ts +11 -0
  63. package/dist/views/kyc-substeps/camera-capture.d.ts.map +1 -0
  64. package/dist/views/kyc-substeps/document-type-selection.d.ts +8 -0
  65. package/dist/views/kyc-substeps/document-type-selection.d.ts.map +1 -0
  66. package/dist/views/kyc-substeps/intro-step.d.ts +6 -0
  67. package/dist/views/kyc-substeps/intro-step.d.ts.map +1 -0
  68. package/dist/views/kyc-substeps/photo-confirmation.d.ts +10 -0
  69. package/dist/views/kyc-substeps/photo-confirmation.d.ts.map +1 -0
  70. package/dist/views/kyc-substeps/prepare-id-back.d.ts +8 -0
  71. package/dist/views/kyc-substeps/prepare-id-back.d.ts.map +1 -0
  72. package/dist/views/kyc-substeps/prepare-id-front.d.ts +8 -0
  73. package/dist/views/kyc-substeps/prepare-id-front.d.ts.map +1 -0
  74. package/dist/views/kyc-substeps/prepare-selfie.d.ts +6 -0
  75. package/dist/views/kyc-substeps/prepare-selfie.d.ts.map +1 -0
  76. package/dist/views/kyc-substeps/selfie-confirmation.d.ts +8 -0
  77. package/dist/views/kyc-substeps/selfie-confirmation.d.ts.map +1 -0
  78. package/dist/views/selfie-step.d.ts +10 -0
  79. package/dist/views/selfie-step.d.ts.map +1 -0
  80. package/dist/views/step-indicator.d.ts +13 -0
  81. package/dist/views/step-indicator.d.ts.map +1 -0
  82. package/dist/views/verification-step.d.ts +13 -0
  83. package/dist/views/verification-step.d.ts.map +1 -0
  84. package/dist/workers/image-processor.worker.d.ts +19 -0
  85. package/dist/workers/image-processor.worker.d.ts.map +1 -0
  86. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ (function(){"use strict";function h(t){let a=0;const r=t.length/4;for(let c=0;c<t.length;c+=4)a+=.299*t[c]+.587*t[c+1]+.114*t[c+2];const e=a/r,o=Math.min(100,e/255*100);return e<50?{score:o,isAcceptable:!1,message:"Image is too dark. Please ensure better lighting."}:e>220?{score:o,isAcceptable:!1,message:"Image is too bright. Please reduce exposure or lighting."}:{score:o,isAcceptable:!0}}function A(t,a,r){const e=new Float32Array(a*r);for(let s=0;s<t.length;s+=4)e[s/4]=.299*t[s]+.587*t[s+1]+.114*t[s+2];let o=0,c=0,l=0;for(let s=1;s<r-1;s++)for(let m=1;m<a-1;m++){const f=s*a+m,g=e[f-a]+e[f-1]-4*e[f]+e[f+1]+e[f+a];o+=g,c+=g*g,l++}const i=o/l,n=c/l-i*i,u=Math.min(100,n/500*100);return n<0?{score:u,isAcceptable:!1,message:"Image is too blurry. Please hold the camera steady."}:{score:u,isAcceptable:!0}}self.onmessage=async t=>{const{id:a,type:r}=t.data;if(r==="analyze-quality"){const{buffer:e,width:o,height:c}=t.data,l=new Uint8ClampedArray(e),i=h(l),n=A(l,o,c),u={score:(i.score+n.score)/2,isAcceptable:i.isAcceptable&&n.isAcceptable,message:i.isAcceptable?n.isAcceptable?void 0:n.message:i.message};self.postMessage({id:a,luminance:i,blur:n,overall:u});return}if(r==="compress"){const{bitmap:e,maxSizeKB:o,quality:c,maxWidth:l,maxHeight:i}=t.data;if(typeof OffscreenCanvas>"u"){self.postMessage({id:a,fallback:!0}),e.close();return}const n=Math.min(e.width,l??1920),u=Math.min(e.height,i??1920),s=new OffscreenCanvas(n,u);s.getContext("2d").drawImage(e,0,0,n,u),e.close();const f=(o??500)*1024;let g=c??.8,p=await s.convertToBlob({type:"image/jpeg",quality:g}),b=0;for(;p.size>f&&b<5;)g*=.8,p=await s.convertToBlob({type:"image/jpeg",quality:g}),b++;const y=await p.arrayBuffer();self.postMessage({id:a,buffer:y},[y])}}})();
@@ -0,0 +1,4 @@
1
+ export declare function ThemedPhotoBackSVG({ className }: {
2
+ className?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=themed-photo-back-svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themed-photo-back-svg.d.ts","sourceRoot":"","sources":["../../src/components/themed-photo-back-svg.tsx"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,EAAE,SAAc,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAmD5E"}
@@ -0,0 +1,4 @@
1
+ export declare function ThemedWelcomeSVG({ className }: {
2
+ className?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=themed-welcome-svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themed-welcome-svg.d.ts","sourceRoot":"","sources":["../../src/components/themed-welcome-svg.tsx"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,EAAE,SAAc,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CA0F1E"}
@@ -0,0 +1,125 @@
1
+ import { default as React } from 'react';
2
+ import { AlignmentResult, Challenge, ChallengeResult, DetectedFace, KwikIdEventName, KwikIdSDK, KwikIdSDKOptions, PassiveLivenessResult, QualityResult, SDKState, SubmitResponse, VerificationResult } from '../../../sdk-core/src/index.ts';
3
+ /**
4
+ * SDK Context State
5
+ */
6
+ export interface KwikIdContextState {
7
+ /** SDK instance (null until initialized) */
8
+ sdk: KwikIdSDK | null;
9
+ /** Current SDK status (string state like 'idle', 'ready', etc.) */
10
+ status: SDKState;
11
+ /** Full SDK state object */
12
+ state: any;
13
+ /** Whether SDK is ready to use */
14
+ isReady: boolean;
15
+ /** Whether camera is active */
16
+ isCameraActive: boolean;
17
+ /** Whether currently processing */
18
+ isProcessing: boolean;
19
+ /** Current error (if any) */
20
+ error: Error | null;
21
+ /** Latest quality analysis result */
22
+ qualityResult: QualityResult | null;
23
+ /** Latest detected face */
24
+ detectedFace: DetectedFace | null;
25
+ /** Latest alignment result */
26
+ alignmentResult: AlignmentResult | null;
27
+ /** Latest passive liveness result */
28
+ passiveLivenessResult: PassiveLivenessResult | null;
29
+ /** Current active challenge */
30
+ currentChallenge: Challenge | null;
31
+ /** Latest challenge result */
32
+ challengeResult: ChallengeResult | null;
33
+ /** Final verification result */
34
+ verificationResult: VerificationResult | null;
35
+ /** Upload progress (0-100) */
36
+ uploadProgress: number;
37
+ }
38
+ /**
39
+ * SDK Context Actions
40
+ */
41
+ export interface KwikIdContextActions {
42
+ /** Initialize SDK with client secret */
43
+ initialize: (clientSecret: string) => Promise<void>;
44
+ /** Start camera */
45
+ startCamera: (videoElement: HTMLVideoElement) => Promise<MediaStream>;
46
+ /** Stop camera */
47
+ stopCamera: () => void;
48
+ /** Capture current frame */
49
+ capture: (type?: "selfie" | "document") => Promise<{
50
+ blob: Blob;
51
+ metadata: unknown;
52
+ }>;
53
+ /** Analyze frame quality */
54
+ analyzeQuality: (imageData: ImageData) => QualityResult;
55
+ /** Detect face in frame */
56
+ detectFace: (imageData: ImageData) => Promise<DetectedFace | null>;
57
+ /** Check face alignment */
58
+ checkAlignment: (face: DetectedFace) => AlignmentResult;
59
+ /** Run passive liveness check */
60
+ runPassiveLiveness: (videoElement: HTMLVideoElement) => Promise<PassiveLivenessResult>;
61
+ /** Start active liveness challenge */
62
+ startActiveChallenge: () => Promise<Challenge>;
63
+ /** Process frame for active challenge */
64
+ processChallenge: (imageData: ImageData) => Promise<ChallengeResult | null>;
65
+ /** Submit verification */
66
+ submit: () => Promise<SubmitResponse>;
67
+ /** Reset SDK state */
68
+ reset: () => void;
69
+ /** Subscribe to SDK event */
70
+ on: <E extends KwikIdEventName>(event: E, handler: (data: unknown) => void) => () => void;
71
+ }
72
+ /**
73
+ * Full context value
74
+ */
75
+ export type KwikIdContextValue = KwikIdContextState & KwikIdContextActions;
76
+ /**
77
+ * Provider Props
78
+ */
79
+ export interface KwikIdProviderProps {
80
+ /** SDK configuration options */
81
+ options?: Partial<Omit<KwikIdSDKOptions, "clientSecret">>;
82
+ /** Children components */
83
+ children: React.ReactNode;
84
+ /** Optional client secret for auto-initialization */
85
+ clientSecret?: string;
86
+ /** Called when SDK initializes successfully */
87
+ onInitialized?: () => void;
88
+ /** Called on SDK error */
89
+ onError?: (error: Error) => void;
90
+ /** Called when verification is complete (fires with full VerificationResult from SDK event) */
91
+ onComplete?: (result: VerificationResult) => void;
92
+ }
93
+ declare const KwikIdContext: React.Context<KwikIdContextValue | undefined>;
94
+ /**
95
+ * KwikId Provider Component
96
+ *
97
+ * Wraps your application to provide SDK functionality via React context
98
+ *
99
+ * @example
100
+ * ```tsx
101
+ * <KwikIdProvider
102
+ * options={{ apiBaseUrl: 'https://api.kwik-id.com' }}
103
+ * onComplete={(result) => console.log(result)}
104
+ * >
105
+ * <App />
106
+ * </KwikIdProvider>
107
+ * ```
108
+ */
109
+ export declare function KwikIdProvider({ options, children, clientSecret, onInitialized, onError, onComplete, }: KwikIdProviderProps): import("react/jsx-runtime").JSX.Element;
110
+ /**
111
+ * Hook to access KwikId context
112
+ *
113
+ * @throws Error if used outside of KwikIdProvider
114
+ *
115
+ * @example
116
+ * ```tsx
117
+ * function MyComponent() {
118
+ * const { isReady, startCamera } = useKwikIdContext();
119
+ * // ...
120
+ * }
121
+ * ```
122
+ */
123
+ export declare function useKwikIdContext(): KwikIdContextValue;
124
+ export { KwikIdContext };
125
+ //# sourceMappingURL=kwik-id-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kwik-id-context.d.ts","sourceRoot":"","sources":["../../src/context/kwik-id-context.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * React Hooks for KwikId SDK
3
+ */
4
+ export { useKwikID, KwikIDProvider, KwikIDContext } from './kwik-id-context';
5
+ export { useKwikId } from './use-kwik-id';
6
+ export { useCamera } from './use-camera';
7
+ export type { UseCameraOptions, UseCameraReturn } from './use-camera';
8
+ export { useQuality } from './use-quality';
9
+ export type { UseQualityOptions, UseQualityReturn } from './use-quality';
10
+ export { useFaceDetection } from './use-face-detection';
11
+ export type { UseFaceDetectionOptions, UseFaceDetectionReturn } from './use-face-detection';
12
+ export { useLiveness } from './use-liveness';
13
+ export type { UseLivenessOptions, UseLivenessReturn } from './use-liveness';
14
+ export { useVerification } from './use-verification';
15
+ export type { UseVerificationOptions, UseVerificationReturn, VerificationStep, } from './use-verification';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACR,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,GACnB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { AlignmentResult, DetectedFace, KwikIdSDK, PassiveLivenessResult, QualityResult } from '../../../sdk-core/src/index.ts';
2
+ import { KwikIDConfig } from '../../../types/src/index.ts';
3
+ /**
4
+ * Extended context value that includes SDK functionality
5
+ */
6
+ interface KwikIDContextValue extends KwikIDConfig {
7
+ isConfigured: boolean;
8
+ /** SDK instance (null until clientSecret is provided) */
9
+ sdk: KwikIdSDK | null;
10
+ /** SDK ready state */
11
+ isSDKReady: boolean;
12
+ /** Organization name from session */
13
+ orgName?: string;
14
+ /** Organization logo URL from session */
15
+ orgLogoUrl?: string;
16
+ /** Latest quality analysis */
17
+ qualityResult: QualityResult | null;
18
+ /** Latest detected face */
19
+ detectedFace: DetectedFace | null;
20
+ /** Latest alignment result */
21
+ alignmentResult: AlignmentResult | null;
22
+ /** Latest liveness result */
23
+ livenessResult: PassiveLivenessResult | null;
24
+ /** Initialize SDK with client secret */
25
+ initializeSDK: (clientSecret: string) => Promise<void>;
26
+ /** Analyze video frame quality */
27
+ analyzeQuality: (video: HTMLVideoElement) => QualityResult | null;
28
+ /** Detect face in video frame */
29
+ detectFace: (video: HTMLVideoElement) => Promise<DetectedFace | null>;
30
+ /** Check face alignment */
31
+ checkAlignment: () => Promise<AlignmentResult | null>;
32
+ /** Run passive liveness check */
33
+ runPassiveLiveness: () => Promise<PassiveLivenessResult | null>;
34
+ /** Submit for verification */
35
+ submitVerification: (documentType: string) => Promise<unknown>;
36
+ /** Upload a pre-captured file to the backend */
37
+ uploadFile: (type: "document_front" | "document_back" | "selfie", file: File | Blob, onProgress?: (progress: number) => void) => Promise<{
38
+ fileKey: string;
39
+ }>;
40
+ }
41
+ declare const KwikIDContext: import('react').Context<KwikIDContextValue | undefined>;
42
+ export declare const useKwikID: () => KwikIDContextValue;
43
+ interface KwikIDProviderProps {
44
+ config: KwikIDConfig;
45
+ children: React.ReactNode;
46
+ /** Optional client secret to auto-initialize SDK */
47
+ clientSecret?: string;
48
+ /** Base URL for SDK API calls */
49
+ baseUrl?: string;
50
+ }
51
+ export declare const KwikIDProvider: React.FC<KwikIDProviderProps>;
52
+ export { KwikIDContext };
53
+ //# sourceMappingURL=kwik-id-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kwik-id-context.d.ts","sourceRoot":"","sources":["../../src/hooks/kwik-id-context.tsx"],"names":[],"mappings":"AAgBA,OAAO,EACH,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAK9C;;GAEG;AACH,UAAU,kBAAmB,SAAQ,YAAY;IAC7C,YAAY,EAAE,OAAO,CAAC;IACtB,yDAAyD;IACzD,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,sBAAsB;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,2BAA2B;IAC3B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,8BAA8B;IAC9B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,6BAA6B;IAC7B,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,wCAAwC;IACxC,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,kCAAkC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,aAAa,GAAG,IAAI,CAAC;IAClE,iCAAiC;IACjC,UAAU,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACtE,2BAA2B;IAC3B,cAAc,EAAE,MAAM,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACtD,iCAAiC;IACjC,kBAAkB,EAAE,MAAM,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IAChE,8BAA8B;IAC9B,kBAAkB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,gDAAgD;IAChD,UAAU,EAAE,CACR,IAAI,EAAE,gBAAgB,GAAG,eAAe,GAAG,QAAQ,EACnD,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KACtC,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrC;AAED,QAAA,MAAM,aAAa,yDAA2D,CAAC;AAE/E,eAAO,MAAM,SAAS,0BAMrB,CAAC;AAEF,UAAU,mBAAmB;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiNxD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { CaptureMetadata } from '../../../sdk-core/src/index.ts';
2
+ export interface UseCameraOptions {
3
+ /** Auto-start camera when ready */
4
+ autoStart?: boolean;
5
+ /** Mirror video preview */
6
+ mirror?: boolean;
7
+ /** Preferred facing mode */
8
+ facingMode?: "user" | "environment";
9
+ }
10
+ export interface UseCameraReturn {
11
+ /** Reference to attach to video element */
12
+ videoRef: React.RefObject<HTMLVideoElement | null>;
13
+ /** Whether camera is active */
14
+ isActive: boolean;
15
+ /** Whether camera is initializing */
16
+ isInitializing: boolean;
17
+ /** Camera error (if any) */
18
+ error: Error | null;
19
+ /** Current media stream */
20
+ stream: MediaStream | null;
21
+ /** Start camera */
22
+ start: () => Promise<void>;
23
+ /** Stop camera */
24
+ stop: () => void;
25
+ /** Capture current frame as ImageData */
26
+ captureFrame: () => ImageData | null;
27
+ /** Capture current frame as Blob with metadata */
28
+ captureBlob: (type?: "selfie" | "document") => Promise<{
29
+ blob: Blob;
30
+ metadata: CaptureMetadata;
31
+ } | null>;
32
+ /** Switch between front/back camera */
33
+ switchCamera: () => Promise<void>;
34
+ }
35
+ /**
36
+ * Camera management hook
37
+ *
38
+ * @example
39
+ * ```tsx
40
+ * function CameraView() {
41
+ * const { videoRef, isActive, start, stop, captureFrame } = useCamera({
42
+ * autoStart: true,
43
+ * mirror: true
44
+ * });
45
+ *
46
+ * const handleCapture = () => {
47
+ * const frame = captureFrame();
48
+ * if (frame) {
49
+ * // Process frame...
50
+ * }
51
+ * };
52
+ *
53
+ * return (
54
+ * <div>
55
+ * <video ref={videoRef} autoPlay playsInline muted />
56
+ * <button onClick={handleCapture}>Capture</button>
57
+ * </div>
58
+ * );
59
+ * }
60
+ * ```
61
+ */
62
+ export declare function useCamera(options?: UseCameraOptions): UseCameraReturn;
63
+ export default useCamera;
64
+ //# sourceMappingURL=use-camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-camera.d.ts","sourceRoot":"","sources":["../../src/hooks/use-camera.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,eAAe,EAAyB,MAAM,mBAAmB,CAAC;AAIhF,MAAM,WAAW,gBAAgB;IAC7B,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC5B,2CAA2C;IAC3C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAEnD,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAElB,qCAAqC;IACrC,cAAc,EAAE,OAAO,CAAC;IAExB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB,2BAA2B;IAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAE3B,mBAAmB;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,kBAAkB;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB,yCAAyC;IACzC,YAAY,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IAErC,kDAAkD;IAClD,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,KAAK,OAAO,CAAC;QACnD,IAAI,EAAE,IAAI,CAAC;QACX,QAAQ,EAAE,eAAe,CAAC;KAC7B,GAAG,IAAI,CAAC,CAAC;IAEV,uCAAuC;IACvC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAuJzE;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { AlignmentGuidance, AlignmentResult, BoundingBox, DetectedFace, FacePose } from '../../../sdk-core/src/index.ts';
2
+ export interface UseFaceDetectionOptions {
3
+ /** Enable continuous detection */
4
+ continuous?: boolean;
5
+ /** Detection interval in ms (default: 100) */
6
+ interval?: number;
7
+ /** Also check alignment */
8
+ checkAlignment?: boolean;
9
+ }
10
+ export interface UseFaceDetectionReturn {
11
+ /** Latest detected face */
12
+ face: DetectedFace | null;
13
+ /** Face bounding box */
14
+ boundingBox: BoundingBox | null;
15
+ /** Head pose (yaw, pitch, roll) */
16
+ pose: FacePose | null;
17
+ /** Whether a face is detected */
18
+ hasFace: boolean;
19
+ /** Latest alignment result */
20
+ alignment: AlignmentResult | null;
21
+ /** Whether face is aligned */
22
+ isAligned: boolean;
23
+ /** Alignment guidance */
24
+ guidance: AlignmentGuidance | null;
25
+ /** Detect face in a single frame */
26
+ detect: (imageData: ImageData) => Promise<DetectedFace | null>;
27
+ /** Start continuous detection */
28
+ startContinuous: (getFrame: () => ImageData | null) => void;
29
+ /** Stop continuous detection */
30
+ stopContinuous: () => void;
31
+ /** Whether continuous detection is running */
32
+ isDetecting: boolean;
33
+ }
34
+ /**
35
+ * Face detection hook with alignment checking
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * function FaceView() {
40
+ * const { captureFrame } = useCamera();
41
+ * const {
42
+ * face,
43
+ * boundingBox,
44
+ * isAligned,
45
+ * guidance,
46
+ * startContinuous
47
+ * } = useFaceDetection({
48
+ * continuous: true,
49
+ * checkAlignment: true
50
+ * });
51
+ *
52
+ * useEffect(() => {
53
+ * startContinuous(captureFrame);
54
+ * }, []);
55
+ *
56
+ * return (
57
+ * <div>
58
+ * {face && <FaceOverlay boundingBox={boundingBox} />}
59
+ * {guidance && <div>{guidance.message}</div>}
60
+ * {isAligned && <div>✓ Face aligned</div>}
61
+ * </div>
62
+ * );
63
+ * }
64
+ * ```
65
+ */
66
+ export declare function useFaceDetection(options?: UseFaceDetectionOptions): UseFaceDetectionReturn;
67
+ export default useFaceDetection;
68
+ //# sourceMappingURL=use-face-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-face-detection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-face-detection.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,QAAQ,EACX,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,uBAAuB;IACpC,kCAAkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACnC,2BAA2B;IAC3B,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAE1B,wBAAwB;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAEhC,mCAAmC;IACnC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEtB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IAEjB,8BAA8B;IAC9B,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAElC,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;IAEnB,yBAAyB;IACzB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAEnC,oCAAoC;IACpC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAE/D,iCAAiC;IACjC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAE5D,gCAAgC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAuH9F;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { HandoffState } from '../../../sdk-core/src/index.ts';
2
+ export interface UseHandoffReturn {
3
+ /** Whether the current device is a desktop */
4
+ isDesktop: boolean;
5
+ /** Whether the handoff option should be offered */
6
+ shouldOfferHandoff: boolean;
7
+ /** Current handoff state */
8
+ handoffState: HandoffState;
9
+ /** Initiate a new handoff (generates QR code) */
10
+ initiateHandoff: () => Promise<void>;
11
+ /** Cancel an active handoff */
12
+ cancelHandoff: () => Promise<void>;
13
+ /** Whether a handoff is currently active (any non-idle state) */
14
+ isHandoffActive: boolean;
15
+ /** Whether the handoff completed successfully */
16
+ isHandoffComplete: boolean;
17
+ }
18
+ export declare function useHandoff(): UseHandoffReturn;
19
+ //# sourceMappingURL=use-handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-handoff.d.ts","sourceRoot":"","sources":["../../src/hooks/use-handoff.ts"],"names":[],"mappings":"AAQA,OAAO,EAEH,KAAK,YAAY,EAGpB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,gBAAgB;IAC7B,8CAA8C;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,4BAA4B;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,iDAAiD;IACjD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,+BAA+B;IAC/B,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iEAAiE;IACjE,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,iBAAiB,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAyD7C"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Main SDK hook - provides full access to SDK state and actions
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * function VerificationPage() {
7
+ * const {
8
+ * isReady,
9
+ * status,
10
+ * initialize,
11
+ * startCamera,
12
+ * submit
13
+ * } = useKwikId();
14
+ *
15
+ * useEffect(() => {
16
+ * if (!isReady) {
17
+ * initialize(clientSecret);
18
+ * }
19
+ * }, [isReady]);
20
+ *
21
+ * return <div>Status: {status}</div>;
22
+ * }
23
+ * ```
24
+ */
25
+ export declare function useKwikId(): import('..').KwikIdContextValue;
26
+ export default useKwikId;
27
+ //# sourceMappingURL=use-kwik-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kwik-id.d.ts","sourceRoot":"","sources":["../../src/hooks/use-kwik-id.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,oCAExB;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { Challenge, ChallengeResult, ChallengeType, PassiveLivenessResult } from '../../../sdk-core/src/index.ts';
2
+ export interface UseLivenessOptions {
3
+ /** Run passive liveness automatically */
4
+ autoPassive?: boolean;
5
+ /** Number of active challenges to run */
6
+ challengeCount?: number;
7
+ /** Specific challenge types to use */
8
+ challengeTypes?: ChallengeType[];
9
+ }
10
+ export interface UseLivenessReturn {
11
+ /** Passive liveness result */
12
+ passiveResult: PassiveLivenessResult | null;
13
+ /** Whether passive liveness passed */
14
+ passivePassed: boolean;
15
+ /** Current active challenge */
16
+ currentChallenge: Challenge | null;
17
+ /** Latest challenge result */
18
+ challengeResult: ChallengeResult | null;
19
+ /** All completed challenge results */
20
+ completedChallenges: ChallengeResult[];
21
+ /** Whether all challenges passed */
22
+ allChallengesPassed: boolean;
23
+ /** Challenge progress (e.g., "2/3") */
24
+ challengeProgress: string;
25
+ /** Whether liveness check is in progress */
26
+ isChecking: boolean;
27
+ /** Run passive liveness check */
28
+ runPassive: (videoElement: HTMLVideoElement) => Promise<PassiveLivenessResult>;
29
+ /** Start an active challenge */
30
+ startChallenge: () => Promise<Challenge>;
31
+ /** Process frame for current challenge */
32
+ processFrame: (imageData: ImageData) => Promise<ChallengeResult | null>;
33
+ /** Reset liveness state */
34
+ reset: () => void;
35
+ }
36
+ /**
37
+ * Liveness detection hook
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * function LivenessCheck({ videoRef }) {
42
+ * const {
43
+ * passiveResult,
44
+ * currentChallenge,
45
+ * challengeProgress,
46
+ * runPassive,
47
+ * startChallenge,
48
+ * processFrame
49
+ * } = useLiveness({ challengeCount: 2 });
50
+ *
51
+ * // Run passive liveness first
52
+ * useEffect(() => {
53
+ * if (videoRef.current) {
54
+ * runPassive(videoRef.current);
55
+ * }
56
+ * }, []);
57
+ *
58
+ * return (
59
+ * <div>
60
+ * {currentChallenge && (
61
+ * <div>
62
+ * Challenge: {currentChallenge.type}
63
+ * Progress: {challengeProgress}
64
+ * </div>
65
+ * )}
66
+ * </div>
67
+ * );
68
+ * }
69
+ * ```
70
+ */
71
+ export declare function useLiveness(options?: UseLivenessOptions): UseLivenessReturn;
72
+ export default useLiveness;
73
+ //# sourceMappingURL=use-liveness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-liveness.d.ts","sourceRoot":"","sources":["../../src/hooks/use-liveness.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,kBAAkB;IAC/B,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,sCAAsC;IACtC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAC9B,8BAA8B;IAC9B,aAAa,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAE5C,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IAEvB,+BAA+B;IAC/B,gBAAgB,EAAE,SAAS,GAAG,IAAI,CAAC;IAEnC,8BAA8B;IAC9B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IAExC,sCAAsC;IACtC,mBAAmB,EAAE,eAAe,EAAE,CAAC;IAEvC,oCAAoC;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAE7B,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAE1B,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IAEpB,iCAAiC;IACjC,UAAU,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE/E,gCAAgC;IAChC,cAAc,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzC,0CAA0C;IAC1C,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAExE,2BAA2B;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAiI/E;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { QualityGuidance, QualityResult } from '../../../sdk-core/src/index.ts';
2
+ export interface UseQualityOptions {
3
+ /** Enable continuous analysis */
4
+ continuous?: boolean;
5
+ /** Analysis interval in ms (default: 100) */
6
+ interval?: number;
7
+ /** Minimum quality score to pass (0-1) */
8
+ minQuality?: number;
9
+ }
10
+ export interface UseQualityReturn {
11
+ /** Latest quality result */
12
+ result: QualityResult | null;
13
+ /** Whether quality passes minimum threshold */
14
+ isPassing: boolean;
15
+ /** Current guidance messages */
16
+ guidance: QualityGuidance[];
17
+ /** Quality score (0-1) */
18
+ score: number;
19
+ /** Analyze a single frame */
20
+ analyze: (imageData: ImageData) => QualityResult;
21
+ /** Start continuous analysis */
22
+ startContinuous: (getFrame: () => ImageData | null) => void;
23
+ /** Stop continuous analysis */
24
+ stopContinuous: () => void;
25
+ /** Whether continuous analysis is running */
26
+ isAnalyzing: boolean;
27
+ }
28
+ /**
29
+ * Quality analysis hook
30
+ *
31
+ * @example
32
+ * ```tsx
33
+ * function QualityView() {
34
+ * const { captureFrame } = useCamera();
35
+ * const { result, isPassing, guidance, startContinuous, stopContinuous } = useQuality({
36
+ * continuous: true,
37
+ * minQuality: 0.7
38
+ * });
39
+ *
40
+ * useEffect(() => {
41
+ * startContinuous(captureFrame);
42
+ * return () => stopContinuous();
43
+ * }, []);
44
+ *
45
+ * return (
46
+ * <div>
47
+ * <div>Quality: {result?.score.toFixed(2)}</div>
48
+ * <div>Status: {isPassing ? '✓' : '✗'}</div>
49
+ * {guidance.map((g, i) => (
50
+ * <div key={i}>{g.message}</div>
51
+ * ))}
52
+ * </div>
53
+ * );
54
+ * }
55
+ * ```
56
+ */
57
+ export declare function useQuality(options?: UseQualityOptions): UseQualityReturn;
58
+ export default useQuality;
59
+ //# sourceMappingURL=use-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-quality.d.ts","sourceRoot":"","sources":["../../src/hooks/use-quality.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIxE,MAAM,WAAW,iBAAiB;IAC9B,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,4BAA4B;IAC5B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAE7B,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IAEnB,gCAAgC;IAChC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAE5B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IAEd,6BAA6B;IAC7B,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,aAAa,CAAC;IAEjD,gCAAgC;IAChC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAE5D,+BAA+B;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,6CAA6C;IAC7C,WAAW,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CA0F5E;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { SDKState, SubmitResponse, VerificationResult } from '../../../sdk-core/src/index.ts';
2
+ export type VerificationStep = "init" | "camera" | "quality" | "face" | "liveness" | "capture" | "document" | "uploading" | "processing" | "complete" | "error";
3
+ export interface UseVerificationOptions {
4
+ /** Required document types */
5
+ documentTypes?: ("id_card" | "passport" | "drivers_license")[];
6
+ /** Whether to require liveness check */
7
+ requireLiveness?: boolean;
8
+ /** Number of liveness challenges */
9
+ livenessChalllengeCount?: number;
10
+ }
11
+ export interface UseVerificationReturn {
12
+ /** Current verification step */
13
+ step: VerificationStep;
14
+ /** SDK status */
15
+ status: SDKState;
16
+ /** Overall progress (0-100) */
17
+ progress: number;
18
+ /** Final verification result */
19
+ result: VerificationResult | null;
20
+ /** Current error */
21
+ error: Error | null;
22
+ /** Whether verification is complete */
23
+ isComplete: boolean;
24
+ /** Whether verification passed */
25
+ isPassed: boolean;
26
+ /** Upload progress (0-100) */
27
+ uploadProgress: number;
28
+ /** Step-by-step instructions */
29
+ instructions: string;
30
+ /** Go to next step */
31
+ nextStep: () => void;
32
+ /** Go to previous step */
33
+ prevStep: () => void;
34
+ /** Go to specific step */
35
+ goToStep: (step: VerificationStep) => void;
36
+ /** Submit verification */
37
+ submit: () => Promise<SubmitResponse>;
38
+ /** Reset verification */
39
+ reset: () => void;
40
+ /** Retry from current step */
41
+ retry: () => void;
42
+ }
43
+ /**
44
+ * Verification flow hook
45
+ *
46
+ * @example
47
+ * ```tsx
48
+ * function VerificationFlow() {
49
+ * const {
50
+ * step,
51
+ * progress,
52
+ * instructions,
53
+ * result,
54
+ * isComplete,
55
+ * submit,
56
+ * nextStep
57
+ * } = useVerification({ requireLiveness: true });
58
+ *
59
+ * return (
60
+ * <div>
61
+ * <ProgressBar value={progress} />
62
+ * <p>{instructions}</p>
63
+ *
64
+ * {step === 'camera' && <CameraView onReady={nextStep} />}
65
+ * {step === 'liveness' && <LivenessCheck onPass={nextStep} />}
66
+ * {step === 'capture' && <CaptureButton onClick={nextStep} />}
67
+ *
68
+ * {isComplete && (
69
+ * <div>
70
+ * Result: {result?.status}
71
+ * </div>
72
+ * )}
73
+ * </div>
74
+ * );
75
+ * }
76
+ * ```
77
+ */
78
+ export declare function useVerification(options?: UseVerificationOptions): UseVerificationReturn;
79
+ export default useVerification;
80
+ //# sourceMappingURL=use-verification.d.ts.map