@kernaq/verify-react-native 1.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/locale.ts","../src/theme.ts","../src/hooks/usePermissions.ts","../src/steps/IntroStep.tsx","../src/hooks/useCamera.ts","../src/steps/DocumentStep.tsx","../src/steps/SelfieStep.tsx","../src/steps/LivenessStep.tsx","../src/steps/ProcessingStep.tsx","../src/steps/ResultStep.tsx","../src/KernaqVerify.tsx"],"sourcesContent":["import type { VerifyLocale } from './types'\n\nexport const DEFAULT_LOCALE: VerifyLocale = {\n intro_title: 'Verify your identity',\n intro_body: \"This takes about 60 seconds. You'll need your ID document and a clear view of your face.\",\n intro_cta: 'Get started',\n doc_title: 'Scan your document',\n doc_instruction: 'Hold your ID flat inside the frame. Make sure it\\'s well-lit and all four corners are visible.',\n doc_capture_btn: 'Capture',\n doc_retake_btn: 'Retake',\n doc_next_btn: 'Looks good',\n selfie_title: 'Take a selfie',\n selfie_instruction: 'Look straight at the camera. Keep your face inside the oval.',\n selfie_capture_btn: 'Take selfie',\n selfie_retake_btn: 'Retake',\n selfie_next_btn: 'Looks good',\n liveness_title: 'Liveness check',\n liveness_instruction: 'Press start, then slowly turn your head left and right.',\n liveness_start_btn: 'Start recording',\n liveness_recording: 'Recording…',\n processing_title: 'Verifying your identity',\n processing_subtitle: 'This usually takes a few seconds.',\n result_pass_title: 'Verification passed',\n result_pass_body: 'Your identity has been verified successfully.',\n result_fail_title: 'Verification failed',\n result_fail_body: 'We were unable to verify your identity. Please try again.',\n result_review_title: 'Under review',\n result_review_body: 'Your submission is being reviewed. This usually takes a few minutes.',\n result_retry_btn: 'Try again',\n error_camera_denied: 'Camera access denied. Please allow camera permissions in settings.',\n error_quality: 'Image quality too low. Try better lighting or hold the camera steady.',\n error_network: 'Network error. Please check your connection and try again.',\n}\n","import type { VerifyTheme } from './types'\n\nexport interface ResolvedTheme {\n accent: string\n bg: string\n text: string\n subtext: string\n border: string\n card: string\n radius: number\n}\n\nexport function resolveTheme(theme?: VerifyTheme): ResolvedTheme {\n const dark = theme?.mode === 'dark'\n return {\n accent: theme?.accentColor ?? '#111827',\n bg: theme?.backgroundColor ?? (dark ? '#1a1a2e' : '#ffffff'),\n text: theme?.textColor ?? (dark ? '#f9fafb' : '#111827'),\n subtext: theme?.subtextColor ?? (dark ? '#9ca3af' : '#6b7280'),\n border: theme?.borderColor ?? (dark ? '#374151' : '#e5e7eb'),\n card: theme?.cardColor ?? (dark ? '#111827' : '#f9fafb'),\n radius: theme?.borderRadius ?? 12,\n }\n}\n","import { useState, useCallback } from 'react'\nimport { Platform, Linking, Alert } from 'react-native'\nimport {\n check,\n request,\n PERMISSIONS,\n RESULTS,\n type Permission,\n} from 'react-native-permissions'\n\nexport type PermissionStatus = 'unknown' | 'granted' | 'denied' | 'blocked'\n\nexport function usePermissions() {\n const [status, setStatus] = useState<PermissionStatus>('unknown')\n\n const cameraPermission: Permission =\n Platform.OS === 'ios'\n ? PERMISSIONS.IOS.CAMERA\n : PERMISSIONS.ANDROID.CAMERA\n\n const micPermission: Permission =\n Platform.OS === 'ios'\n ? PERMISSIONS.IOS.MICROPHONE\n : PERMISSIONS.ANDROID.RECORD_AUDIO\n\n const requestPermissions = useCallback(async (): Promise<boolean> => {\n try {\n const camResult = await check(cameraPermission)\n\n if (camResult === RESULTS.GRANTED) {\n // Also request mic for liveness video\n await request(micPermission)\n setStatus('granted')\n return true\n }\n\n if (camResult === RESULTS.BLOCKED) {\n setStatus('blocked')\n Alert.alert(\n 'Camera Permission Required',\n 'Camera access is blocked. Please enable it in your device settings.',\n [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Open Settings', onPress: () => Linking.openSettings() },\n ]\n )\n return false\n }\n\n // Request camera\n const result = await request(cameraPermission)\n if (result === RESULTS.GRANTED) {\n await request(micPermission)\n setStatus('granted')\n return true\n }\n\n setStatus('denied')\n return false\n } catch {\n setStatus('denied')\n return false\n }\n }, [cameraPermission, micPermission])\n\n return { status, requestPermissions }\n}\n","import React from 'react'\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native'\nimport type { ResolvedTheme } from '../theme'\nimport type { VerifyLocale } from '../types'\n\ninterface Props {\n theme: ResolvedTheme\n locale: VerifyLocale\n onStart: () => void\n}\n\nexport function IntroStep({ theme, locale, onStart }: Props) {\n const s = styles(theme)\n return (\n <View style={s.container}>\n <View style={s.steps}>\n {[\n { icon: '🪪', label: 'Document' },\n { icon: '🤳', label: 'Selfie' },\n { icon: '👁️', label: 'Liveness' },\n ].map((item) => (\n <View key={item.label} style={s.step}>\n <View style={s.stepIcon}>\n <Text style={s.stepEmoji}>{item.icon}</Text>\n </View>\n <Text style={s.stepLabel}>{item.label}</Text>\n </View>\n ))}\n </View>\n\n <Text style={s.title}>{locale.intro_title}</Text>\n <Text style={s.body}>{locale.intro_body}</Text>\n\n <TouchableOpacity style={s.btn} onPress={onStart} activeOpacity={0.85}>\n <Text style={s.btnText}>{locale.intro_cta}</Text>\n </TouchableOpacity>\n </View>\n )\n}\n\nconst styles = (t: ResolvedTheme) =>\n StyleSheet.create({\n container: { padding: 24 },\n steps: {\n flexDirection: 'row',\n justifyContent: 'center',\n gap: 20,\n marginBottom: 28,\n },\n step: { alignItems: 'center', gap: 8 },\n stepIcon: {\n width: 56,\n height: 56,\n borderRadius: 14,\n backgroundColor: t.card,\n borderWidth: 1,\n borderColor: t.border,\n alignItems: 'center',\n justifyContent: 'center',\n },\n stepEmoji: { fontSize: 24 },\n stepLabel: { fontSize: 12, color: t.subtext },\n title: {\n fontSize: 22,\n fontWeight: '700',\n color: t.text,\n marginBottom: 10,\n },\n body: {\n fontSize: 14,\n color: t.subtext,\n lineHeight: 21,\n marginBottom: 28,\n },\n btn: {\n backgroundColor: t.accent,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n },\n btnText: { color: '#fff', fontSize: 15, fontWeight: '600' },\n })\n","import { useRef, useCallback } from 'react'\nimport {\n useCameraDevice,\n useCameraPermission,\n type Camera,\n} from 'react-native-vision-camera'\n\nexport type CameraFacing = 'front' | 'back'\n\nexport interface CaptureResult {\n uri: string\n width: number\n height: number\n}\n\nexport interface VideoResult {\n uri: string\n duration: number\n}\n\nexport function useCamera(facing: CameraFacing = 'back') {\n const cameraRef = useRef<Camera>(null)\n const device = useCameraDevice(facing)\n const { hasPermission } = useCameraPermission()\n\n const capturePhoto = useCallback(async (): Promise<CaptureResult | null> => {\n if (!cameraRef.current) return null\n try {\n const photo = await cameraRef.current.takePhoto({\n flash: 'off',\n enableShutterSound: false,\n })\n return {\n uri: `file://${photo.path}`,\n width: photo.width,\n height: photo.height,\n }\n } catch {\n return null\n }\n }, [])\n\n const startRecording = useCallback(\n (\n onFinished: (video: VideoResult) => void,\n onError: (err: unknown) => void\n ) => {\n if (!cameraRef.current) return\n cameraRef.current.startRecording({\n flash: 'off',\n onRecordingFinished: (video) => {\n onFinished({ uri: `file://${video.path}`, duration: video.duration })\n },\n onRecordingError: onError,\n })\n },\n []\n )\n\n const stopRecording = useCallback(async () => {\n if (!cameraRef.current) return\n await cameraRef.current.stopRecording()\n }, [])\n\n return {\n cameraRef,\n device,\n hasPermission,\n capturePhoto,\n startRecording,\n stopRecording,\n }\n}\n","import React from 'react'\nimport {\n View,\n Text,\n TouchableOpacity,\n Image,\n StyleSheet,\n ActivityIndicator,\n} from 'react-native'\nimport { Camera } from 'react-native-vision-camera'\nimport { useCamera } from '../hooks/useCamera'\nimport type { ResolvedTheme } from '../theme'\nimport type { VerifyLocale } from '../types'\n\ninterface Props {\n theme: ResolvedTheme\n locale: VerifyLocale\n onCapture: (uri: string) => void\n}\n\nexport function DocumentStep({ theme, locale, onCapture }: Props) {\n const { cameraRef, device, capturePhoto } = useCamera('back')\n const [preview, setPreview] = React.useState<string | null>(null)\n const [capturing, setCapturing] = React.useState(false)\n const s = styles(theme)\n\n const handleCapture = async () => {\n setCapturing(true)\n const result = await capturePhoto()\n setCapturing(false)\n if (result) setPreview(result.uri)\n }\n\n const handleConfirm = () => {\n if (preview) onCapture(preview)\n }\n\n if (!device) {\n return (\n <View style={s.container}>\n <ActivityIndicator color={theme.accent} />\n </View>\n )\n }\n\n return (\n <View style={s.container}>\n <Text style={s.title}>{locale.doc_title}</Text>\n <Text style={s.subtitle}>{locale.doc_instruction}</Text>\n\n {preview ? (\n <>\n <Image source={{ uri: preview }} style={s.preview} resizeMode=\"cover\" />\n <TouchableOpacity style={s.btnPrimary} onPress={handleConfirm} activeOpacity={0.85}>\n <Text style={s.btnText}>{locale.doc_next_btn}</Text>\n </TouchableOpacity>\n <TouchableOpacity style={s.btnSecondary} onPress={() => setPreview(null)} activeOpacity={0.75}>\n <Text style={s.btnSecondaryText}>{locale.doc_retake_btn}</Text>\n </TouchableOpacity>\n </>\n ) : (\n <>\n <View style={s.viewport}>\n <Camera\n ref={cameraRef}\n style={StyleSheet.absoluteFill}\n device={device}\n isActive={true}\n photo={true}\n />\n {/* Document frame guide */}\n <View style={s.frameGuide} pointerEvents=\"none\" />\n </View>\n <TouchableOpacity\n style={[s.btnPrimary, capturing && s.btnDisabled]}\n onPress={handleCapture}\n disabled={capturing}\n activeOpacity={0.85}\n >\n {capturing\n ? <ActivityIndicator color=\"#fff\" />\n : <Text style={s.btnText}>{locale.doc_capture_btn}</Text>\n }\n </TouchableOpacity>\n </>\n )}\n </View>\n )\n}\n\nconst styles = (t: ResolvedTheme) =>\n StyleSheet.create({\n container: { padding: 24 },\n title: { fontSize: 20, fontWeight: '700', color: t.text, marginBottom: 8 },\n subtitle: { fontSize: 14, color: t.subtext, lineHeight: 20, marginBottom: 16 },\n viewport: {\n width: '100%',\n aspectRatio: 4 / 3,\n borderRadius: t.radius,\n overflow: 'hidden',\n backgroundColor: '#000',\n marginBottom: 16,\n position: 'relative',\n },\n frameGuide: {\n position: 'absolute',\n top: '8%',\n left: '5%',\n right: '5%',\n bottom: '8%',\n borderWidth: 2,\n borderColor: 'rgba(255,255,255,0.7)',\n borderRadius: 8,\n },\n preview: {\n width: '100%',\n aspectRatio: 4 / 3,\n borderRadius: t.radius,\n marginBottom: 16,\n borderWidth: 1,\n borderColor: t.border,\n },\n btnPrimary: {\n backgroundColor: t.accent,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n marginBottom: 10,\n },\n btnSecondary: {\n backgroundColor: t.card,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: t.border,\n },\n btnDisabled: { opacity: 0.6 },\n btnText: { color: '#fff', fontSize: 15, fontWeight: '600' },\n btnSecondaryText: { color: t.text, fontSize: 15, fontWeight: '600' },\n })\n","import React from 'react'\nimport {\n View,\n Text,\n TouchableOpacity,\n Image,\n StyleSheet,\n ActivityIndicator,\n} from 'react-native'\nimport { Camera } from 'react-native-vision-camera'\nimport { useCamera } from '../hooks/useCamera'\nimport type { ResolvedTheme } from '../theme'\nimport type { VerifyLocale } from '../types'\n\ninterface Props {\n theme: ResolvedTheme\n locale: VerifyLocale\n onCapture: (uri: string) => void\n onBack: () => void\n}\n\nexport function SelfieStep({ theme, locale, onCapture, onBack }: Props) {\n const { cameraRef, device, capturePhoto } = useCamera('front')\n const [preview, setPreview] = React.useState<string | null>(null)\n const [capturing, setCapturing] = React.useState(false)\n const s = styles(theme)\n\n const handleCapture = async () => {\n setCapturing(true)\n const result = await capturePhoto()\n setCapturing(false)\n if (result) setPreview(result.uri)\n }\n\n if (!device) return <ActivityIndicator color={theme.accent} style={{ margin: 40 }} />\n\n return (\n <View style={s.container}>\n <Text style={s.title}>{locale.selfie_title}</Text>\n <Text style={s.subtitle}>{locale.selfie_instruction}</Text>\n\n {preview ? (\n <>\n <Image source={{ uri: preview }} style={s.preview} resizeMode=\"cover\" />\n <TouchableOpacity style={s.btnPrimary} onPress={() => onCapture(preview)} activeOpacity={0.85}>\n <Text style={s.btnText}>{locale.selfie_next_btn}</Text>\n </TouchableOpacity>\n <TouchableOpacity style={s.btnSecondary} onPress={() => setPreview(null)} activeOpacity={0.75}>\n <Text style={s.btnSecondaryText}>{locale.selfie_retake_btn}</Text>\n </TouchableOpacity>\n </>\n ) : (\n <>\n <View style={s.viewport}>\n <Camera\n ref={cameraRef}\n style={StyleSheet.absoluteFill}\n device={device}\n isActive={true}\n photo={true}\n />\n {/* Oval face guide */}\n <View style={s.ovalGuide} pointerEvents=\"none\" />\n </View>\n <TouchableOpacity\n style={[s.btnPrimary, capturing && s.btnDisabled]}\n onPress={handleCapture}\n disabled={capturing}\n activeOpacity={0.85}\n >\n {capturing\n ? <ActivityIndicator color=\"#fff\" />\n : <Text style={s.btnText}>{locale.selfie_capture_btn}</Text>\n }\n </TouchableOpacity>\n <TouchableOpacity style={s.btnSecondary} onPress={onBack} activeOpacity={0.75}>\n <Text style={s.btnSecondaryText}>{locale.doc_retake_btn}</Text>\n </TouchableOpacity>\n </>\n )}\n </View>\n )\n}\n\nconst styles = (t: ResolvedTheme) =>\n StyleSheet.create({\n container: { padding: 24 },\n title: { fontSize: 20, fontWeight: '700', color: t.text, marginBottom: 8 },\n subtitle: { fontSize: 14, color: t.subtext, lineHeight: 20, marginBottom: 16 },\n viewport: {\n width: '100%',\n aspectRatio: 3 / 4,\n borderRadius: t.radius,\n overflow: 'hidden',\n backgroundColor: '#000',\n marginBottom: 16,\n position: 'relative',\n alignSelf: 'center',\n maxWidth: 280,\n },\n ovalGuide: {\n position: 'absolute',\n top: '8%',\n left: '12%',\n right: '12%',\n bottom: '8%',\n borderWidth: 2,\n borderColor: 'rgba(255,255,255,0.7)',\n borderRadius: 999,\n },\n preview: {\n width: 240,\n height: 320,\n borderRadius: t.radius,\n marginBottom: 16,\n alignSelf: 'center',\n borderWidth: 1,\n borderColor: t.border,\n },\n btnPrimary: {\n backgroundColor: t.accent,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n marginBottom: 10,\n },\n btnSecondary: {\n backgroundColor: t.card,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: t.border,\n },\n btnDisabled: { opacity: 0.6 },\n btnText: { color: '#fff', fontSize: 15, fontWeight: '600' },\n btnSecondaryText: { color: t.text, fontSize: 15, fontWeight: '600' },\n })\n","import React, { useState, useEffect, useRef } from 'react'\nimport {\n View,\n Text,\n TouchableOpacity,\n StyleSheet,\n ActivityIndicator,\n Animated,\n} from 'react-native'\nimport { Camera } from 'react-native-vision-camera'\nimport { useCamera } from '../hooks/useCamera'\nimport type { ResolvedTheme } from '../theme'\nimport type { VerifyLocale } from '../types'\n\ninterface Props {\n theme: ResolvedTheme\n locale: VerifyLocale\n duration: number // ms\n onCapture: (uri: string) => void\n onBack: () => void\n}\n\nexport function LivenessStep({ theme, locale, duration, onCapture, onBack }: Props) {\n const { cameraRef, device, startRecording, stopRecording } = useCamera('front')\n const [recording, setRecording] = useState(false)\n const [countdown, setCountdown] = useState(Math.ceil(duration / 1000))\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const pulseAnim = useRef(new Animated.Value(1)).current\n const s = styles(theme)\n\n // Pulse animation for recording indicator\n useEffect(() => {\n if (recording) {\n Animated.loop(\n Animated.sequence([\n Animated.timing(pulseAnim, { toValue: 0.3, duration: 600, useNativeDriver: true }),\n Animated.timing(pulseAnim, { toValue: 1, duration: 600, useNativeDriver: true }),\n ])\n ).start()\n } else {\n pulseAnim.setValue(1)\n }\n }, [recording, pulseAnim])\n\n const handleStart = () => {\n if (!cameraRef.current) return\n setRecording(true)\n setCountdown(Math.ceil(duration / 1000))\n\n startRecording(\n (video) => {\n setRecording(false)\n onCapture(video.uri)\n },\n () => setRecording(false)\n )\n\n // Countdown tick\n let remaining = duration / 1000\n timerRef.current = setInterval(() => {\n remaining -= 0.1\n setCountdown(Math.max(0, Math.ceil(remaining)))\n if (remaining <= 0) {\n if (timerRef.current) clearInterval(timerRef.current)\n stopRecording()\n }\n }, 100)\n }\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearInterval(timerRef.current)\n }\n }, [])\n\n if (!device) return <ActivityIndicator color={theme.accent} style={{ margin: 40 }} />\n\n return (\n <View style={s.container}>\n <Text style={s.title}>{locale.liveness_title}</Text>\n <Text style={s.subtitle}>\n {recording ? locale.liveness_recording : locale.liveness_instruction}\n </Text>\n\n <View style={s.viewport}>\n <Camera\n ref={cameraRef}\n style={StyleSheet.absoluteFill}\n device={device}\n isActive={true}\n video={true}\n audio={true}\n />\n <View style={s.ovalGuide} pointerEvents=\"none\" />\n\n {recording && (\n <>\n <View style={s.recBadge}>\n <Animated.View style={[s.recDot, { opacity: pulseAnim }]} />\n <Text style={s.recText}>REC</Text>\n </View>\n <View style={s.countdownBadge}>\n <Text style={s.countdownText}>{countdown}</Text>\n </View>\n </>\n )}\n </View>\n\n {!recording && (\n <>\n <TouchableOpacity style={s.btnPrimary} onPress={handleStart} activeOpacity={0.85}>\n <Text style={s.btnText}>{locale.liveness_start_btn}</Text>\n </TouchableOpacity>\n <TouchableOpacity style={s.btnSecondary} onPress={onBack} activeOpacity={0.75}>\n <Text style={s.btnSecondaryText}>{locale.selfie_retake_btn}</Text>\n </TouchableOpacity>\n </>\n )}\n </View>\n )\n}\n\nconst styles = (t: ResolvedTheme) =>\n StyleSheet.create({\n container: { padding: 24 },\n title: { fontSize: 20, fontWeight: '700', color: t.text, marginBottom: 8 },\n subtitle: { fontSize: 14, color: t.subtext, lineHeight: 20, marginBottom: 16 },\n viewport: {\n width: '100%',\n aspectRatio: 3 / 4,\n borderRadius: t.radius,\n overflow: 'hidden',\n backgroundColor: '#000',\n marginBottom: 16,\n alignSelf: 'center',\n maxWidth: 280,\n position: 'relative',\n },\n ovalGuide: {\n position: 'absolute',\n top: '8%',\n left: '12%',\n right: '12%',\n bottom: '8%',\n borderWidth: 2,\n borderColor: 'rgba(255,255,255,0.7)',\n borderRadius: 999,\n },\n recBadge: {\n position: 'absolute',\n top: 10,\n left: 10,\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: 'rgba(220,38,38,0.85)',\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n gap: 6,\n },\n recDot: {\n width: 8,\n height: 8,\n borderRadius: 4,\n backgroundColor: '#fff',\n },\n recText: { color: '#fff', fontSize: 12, fontWeight: '700' },\n countdownBadge: {\n position: 'absolute',\n bottom: 12,\n alignSelf: 'center',\n width: 44,\n height: 44,\n borderRadius: 22,\n backgroundColor: 'rgba(0,0,0,0.5)',\n alignItems: 'center',\n justifyContent: 'center',\n },\n countdownText: { color: '#fff', fontSize: 18, fontWeight: '700' },\n btnPrimary: {\n backgroundColor: t.accent,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n marginBottom: 10,\n },\n btnSecondary: {\n backgroundColor: t.card,\n borderRadius: t.radius,\n paddingVertical: 14,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: t.border,\n },\n btnText: { color: '#fff', fontSize: 15, fontWeight: '600' },\n btnSecondaryText: { color: t.text, fontSize: 15, fontWeight: '600' },\n })\n","import React, { useEffect, useRef } from 'react'\nimport { View, Text, StyleSheet, Animated } from 'react-native'\nimport type { ResolvedTheme } from '../theme'\nimport type { VerifyLocale } from '../types'\n\ninterface Props {\n theme: ResolvedTheme\n locale: VerifyLocale\n}\n\nexport function ProcessingStep({ theme, locale }: Props) {\n const spinAnim = useRef(new Animated.Value(0)).current\n const s = styles(theme)\n\n useEffect(() => {\n Animated.loop(\n Animated.timing(spinAnim, {\n toValue: 1,\n duration: 800,\n useNativeDriver: true,\n })\n ).start()\n }, [spinAnim])\n\n const spin = spinAnim.interpolate({\n inputRange: [0, 1],\n outputRange: ['0deg', '360deg'],\n })\n\n return (\n <View style={s.container}>\n <Animated.View style={[s.spinner, { transform: [{ rotate: spin }] }]} />\n <Text style={s.title}>{locale.processing_title}</Text>\n <Text style={s.subtitle}>{locale.processing_subtitle}</Text>\n </View>\n )\n}\n\nconst styles = (t: ResolvedTheme) =>\n StyleSheet.create({\n container: {\n padding: 48,\n alignItems: 'center',\n gap: 16,\n },\n spinner: {\n width: 52,\n height: 52,\n borderRadius: 26,\n borderWidth: 4,\n borderColor: t.border,\n borderTopColor: t.accent,\n marginBottom: 8,\n },\n title: {\n fontSize: 18,\n fontWeight: '700',\n color: t.text,\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 14,\n color: t.subtext,\n textAlign: 'center',\n },\n })\n","import React from 'react'\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native'\nimport type { ResolvedTheme } from '../theme'\nimport type { VerifyLocale, VerifyResult, VerifyVerdict } from '../types'\n\ninterface Props {\n theme: ResolvedTheme\n locale: VerifyLocale\n result: VerifyResult | null\n error: string | null\n onRetry: () => void\n}\n\nconst ICONS: Record<VerifyVerdict, string> = {\n pass: '✅',\n fail: '❌',\n review: '⏳',\n}\n\nconst ICON_BG: Record<VerifyVerdict, string> = {\n pass: '#d1fae5',\n fail: '#fee2e2',\n review: '#fef3c7',\n}\n\nexport function ResultStep({ theme, locale, result, error, onRetry }: Props) {\n const s = styles(theme)\n\n if (!result) {\n return (\n <View style={s.container}>\n <View style={[s.iconWrap, { backgroundColor: '#fee2e2' }]}>\n <Text style={s.icon}>❌</Text>\n </View>\n <Text style={s.title}>{locale.result_fail_title}</Text>\n <Text style={s.body}>{error ?? locale.result_fail_body}</Text>\n <TouchableOpacity style={s.btn} onPress={onRetry} activeOpacity={0.85}>\n <Text style={s.btnText}>{locale.result_retry_btn}</Text>\n </TouchableOpacity>\n </View>\n )\n }\n\n const titles: Record<VerifyVerdict, string> = {\n pass: locale.result_pass_title,\n fail: locale.result_fail_title,\n review: locale.result_review_title,\n }\n const bodies: Record<VerifyVerdict, string> = {\n pass: locale.result_pass_body,\n fail: locale.result_fail_body,\n review: locale.result_review_body,\n }\n\n return (\n <View style={s.container}>\n <View style={[s.iconWrap, { backgroundColor: ICON_BG[result.verdict] }]}>\n <Text style={s.icon}>{ICONS[result.verdict]}</Text>\n </View>\n <Text style={s.title}>{titles[result.verdict]}</Text>\n <Text style={s.body}>{bodies[result.verdict]}</Text>\n {result.verdict === 'fail' && (\n <TouchableOpacity style={s.btn} onPress={onRetry} activeOpacity={0.85}>\n <Text style={s.btnText}>{locale.result_retry_btn}</Text>\n </TouchableOpacity>\n )}\n </View>\n )\n}\n\nconst styles = (t: ResolvedTheme) =>\n StyleSheet.create({\n container: {\n padding: 40,\n alignItems: 'center',\n gap: 12,\n },\n iconWrap: {\n width: 76,\n height: 76,\n borderRadius: 38,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 8,\n },\n icon: { fontSize: 34 },\n title: {\n fontSize: 20,\n fontWeight: '700',\n color: t.text,\n textAlign: 'center',\n },\n body: {\n fontSize: 14,\n color: t.subtext,\n textAlign: 'center',\n lineHeight: 21,\n },\n btn: {\n marginTop: 8,\n backgroundColor: t.accent,\n borderRadius: t.radius,\n paddingVertical: 14,\n paddingHorizontal: 32,\n alignItems: 'center',\n },\n btnText: { color: '#fff', fontSize: 15, fontWeight: '600' },\n })\n","/**\n * <KernaqVerify /> — drop-in identity verification modal for React Native.\n *\n * Usage:\n * import { KernaqVerify } from '@kernaq/verify-react-native'\n *\n * <KernaqVerify\n * visible={showVerify}\n * apiKey=\"k_test_...\"\n * country=\"KEN\"\n * reference={userId}\n * onComplete={(result) => console.log(result.verdict)}\n * onCancel={() => setShowVerify(false)}\n * />\n */\nimport React, { useState, useCallback, useMemo } from 'react'\nimport {\n Modal,\n View,\n Text,\n TouchableOpacity,\n ScrollView,\n StyleSheet,\n SafeAreaView,\n Platform,\n} from 'react-native'\nimport { DEFAULT_LOCALE } from './locale'\nimport { resolveTheme } from './theme'\nimport { usePermissions } from './hooks/usePermissions'\nimport { IntroStep } from './steps/IntroStep'\nimport { DocumentStep } from './steps/DocumentStep'\nimport { SelfieStep } from './steps/SelfieStep'\nimport { LivenessStep } from './steps/LivenessStep'\nimport { ProcessingStep } from './steps/ProcessingStep'\nimport { ResultStep } from './steps/ResultStep'\nimport type { VerifyConfig, VerifyStep, VerifyResult, VerifyLocale } from './types'\n\ninterface Props extends VerifyConfig {\n visible: boolean\n}\n\ntype CaptureState = {\n documentUri?: string\n selfieUri?: string\n videoUri?: string\n}\n\nconst STEP_INDEX: Record<VerifyStep, number> = {\n intro: -1,\n document: 0,\n selfie: 1,\n liveness: 2,\n processing: 3,\n result: 3,\n}\n\nexport function KernaqVerify({\n visible,\n apiKey,\n backendUrl,\n country = 'KEN',\n reference,\n sandbox = false,\n livenessDuration = 3000,\n documentTypes = ['national_id', 'passport'],\n theme: themeProp,\n locale: localeProp,\n onCancel,\n onComplete,\n onError,\n}: Props) {\n const [step, setStep] = useState<VerifyStep>('intro')\n const [capture, setCapture] = useState<CaptureState>({})\n const [result, setResult] = useState<VerifyResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n const theme = useMemo(() => resolveTheme(themeProp), [themeProp])\n const locale: VerifyLocale = useMemo(\n () => ({ ...DEFAULT_LOCALE, ...localeProp }),\n [localeProp]\n )\n const { requestPermissions } = usePermissions()\n const s = styles(theme)\n\n const reset = useCallback(() => {\n setStep('intro')\n setCapture({})\n setResult(null)\n setError(null)\n }, [])\n\n const goto = useCallback(async (next: VerifyStep) => {\n if (next === 'document' || next === 'selfie' || next === 'liveness') {\n const granted = await requestPermissions()\n if (!granted) {\n setError(locale.error_camera_denied)\n return\n }\n }\n setStep(next)\n if (next === 'processing') {\n submit()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [capture, locale])\n\n const submit = useCallback(async () => {\n const { documentUri, selfieUri, videoUri } = capture\n if (!documentUri || !selfieUri) {\n setError('Missing captures — please restart.')\n setStep('result')\n return\n }\n\n const base = (backendUrl ?? 'https://api.identity.kernaq.com/v1').replace(/\\/$/, '')\n const form = new FormData()\n\n form.append('document', {\n uri: documentUri,\n name: 'document.jpg',\n type: 'image/jpeg',\n } as unknown as Blob)\n\n form.append('selfie', {\n uri: selfieUri,\n name: 'selfie.jpg',\n type: 'image/jpeg',\n } as unknown as Blob)\n\n if (videoUri) {\n form.append('video', {\n uri: videoUri,\n name: 'liveness.mp4',\n type: 'video/mp4',\n } as unknown as Blob)\n }\n\n form.append('document_type', documentTypes[0] ?? 'national_id')\n form.append('country', country)\n form.append('reference', reference ?? `kq_${Date.now()}`)\n if (sandbox) form.append('sandbox', 'true')\n\n const headers: Record<string, string> = {\n 'Content-Type': 'multipart/form-data',\n }\n if (apiKey) headers['X-API-Key'] = apiKey\n\n try {\n const res = await fetch(`${base}/verify`, {\n method: 'POST',\n headers,\n body: form,\n })\n const body = (await res.json()) as Record<string, unknown>\n if (!res.ok) throw new Error((body['message'] as string) ?? `HTTP ${res.status}`)\n\n const r: VerifyResult = {\n verificationId: body['verification_id'] as string,\n reference: body['reference'] as string,\n verdict: body['verdict'] as 'pass' | 'fail' | 'review',\n score: (body['score'] as number) ?? 0,\n faceMatch: (body['face_match'] as boolean) ?? false,\n isLive: (body['is_live'] as boolean) ?? false,\n documentFields: body['document_fields'] as Record<string, string> | undefined,\n }\n setResult(r)\n setStep('result')\n onComplete?.(r)\n } catch (err) {\n const msg = (err as Error).message\n setError(`${locale.error_network} ${msg}`)\n setStep('result')\n onError?.({ code: 'network_error', message: msg })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [capture])\n\n const handleCancel = () => {\n reset()\n onCancel?.()\n }\n\n const progressSteps: VerifyStep[] = ['document', 'selfie', 'liveness', 'processing']\n const currentIdx = STEP_INDEX[step]\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n presentationStyle=\"pageSheet\"\n onRequestClose={handleCancel}\n >\n <SafeAreaView style={[s.safeArea, { backgroundColor: theme.bg }]}>\n {/* Header */}\n <View style={s.header}>\n <Text style={s.logo}>Kernaq</Text>\n {step !== 'processing' && (\n <TouchableOpacity onPress={handleCancel} style={s.closeBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>\n <Text style={s.closeText}>✕</Text>\n </TouchableOpacity>\n )}\n </View>\n\n {/* Progress bar */}\n {currentIdx >= 0 && (\n <View style={s.progress}>\n {progressSteps.map((_, i) => (\n <View\n key={i}\n style={[\n s.progressDot,\n i < currentIdx && { backgroundColor: theme.accent, opacity: 0.4 },\n i === currentIdx && { backgroundColor: theme.accent },\n ]}\n />\n ))}\n </View>\n )}\n\n {/* Body */}\n <ScrollView\n style={s.scroll}\n contentContainerStyle={s.scrollContent}\n keyboardShouldPersistTaps=\"handled\"\n bounces={false}\n >\n {step === 'intro' && (\n <IntroStep\n theme={theme}\n locale={locale}\n onStart={() => goto('document')}\n />\n )}\n {step === 'document' && (\n <DocumentStep\n theme={theme}\n locale={locale}\n onCapture={(uri) => {\n setCapture((c) => ({ ...c, documentUri: uri }))\n goto('selfie')\n }}\n />\n )}\n {step === 'selfie' && (\n <SelfieStep\n theme={theme}\n locale={locale}\n onCapture={(uri) => {\n setCapture((c) => ({ ...c, selfieUri: uri }))\n goto('liveness')\n }}\n onBack={() => setStep('document')}\n />\n )}\n {step === 'liveness' && (\n <LivenessStep\n theme={theme}\n locale={locale}\n duration={livenessDuration}\n onCapture={(uri) => {\n setCapture((c) => ({ ...c, videoUri: uri }))\n goto('processing')\n }}\n onBack={() => setStep('selfie')}\n />\n )}\n {step === 'processing' && (\n <ProcessingStep theme={theme} locale={locale} />\n )}\n {step === 'result' && (\n <ResultStep\n theme={theme}\n locale={locale}\n result={result}\n error={error}\n onRetry={() => {\n reset()\n setStep('intro')\n }}\n />\n )}\n </ScrollView>\n </SafeAreaView>\n </Modal>\n )\n}\n\nconst styles = (t: ReturnType<typeof resolveTheme>) =>\n StyleSheet.create({\n safeArea: {\n flex: 1,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 20,\n paddingTop: Platform.OS === 'android' ? 16 : 8,\n paddingBottom: 8,\n },\n logo: {\n fontSize: 14,\n fontWeight: '700',\n color: t.accent,\n letterSpacing: 1.2,\n textTransform: 'uppercase',\n },\n closeBtn: {\n padding: 4,\n },\n closeText: {\n fontSize: 18,\n color: t.subtext,\n },\n progress: {\n flexDirection: 'row',\n gap: 6,\n paddingHorizontal: 20,\n paddingBottom: 8,\n },\n progressDot: {\n flex: 1,\n height: 3,\n borderRadius: 999,\n backgroundColor: t.border,\n },\n scroll: { flex: 1 },\n scrollContent: { flexGrow: 1 },\n })\n"],"names":["DEFAULT_LOCALE","intro_title","intro_body","intro_cta","doc_title","doc_instruction","doc_capture_btn","doc_retake_btn","doc_next_btn","selfie_title","selfie_instruction","selfie_capture_btn","selfie_retake_btn","selfie_next_btn","liveness_title","liveness_instruction","liveness_start_btn","liveness_recording","processing_title","processing_subtitle","result_pass_title","result_pass_body","result_fail_title","result_fail_body","result_review_title","result_review_body","result_retry_btn","error_camera_denied","error_quality","error_network","resolveTheme","theme","dark","mode","accent","accentColor","bg","backgroundColor","text","textColor","subtext","subtextColor","border","borderColor","card","cardColor","radius","borderRadius","usePermissions","status","setStatus","useState","cameraPermission","Platform","OS","PERMISSIONS","IOS","CAMERA","ANDROID","micPermission","MICROPHONE","RECORD_AUDIO","requestPermissions","useCallback","camResult","check","RESULTS","GRANTED","request","BLOCKED","Alert","alert","style","onPress","Linking","openSettings","result","IntroStep","locale","onStart","s","styles","View","container","steps","icon","label","map","item","key","step","stepIcon","Text","stepEmoji","stepLabel","title","body","TouchableOpacity","btn","activeOpacity","btnText","t","StyleSheet","create","padding","flexDirection","justifyContent","gap","marginBottom","alignItems","width","height","borderWidth","fontSize","color","fontWeight","lineHeight","paddingVertical","useCamera","facing","cameraRef","useRef","device","useCameraDevice","hasPermission","useCameraPermission","capturePhoto","current","photo","takePhoto","flash","enableShutterSound","uri","path","startRecording","onFinished","onError","onRecordingFinished","video","duration","onRecordingError","stopRecording","DocumentStep","onCapture","preview","setPreview","React","capturing","setCapturing","handleCapture","handleConfirm","ActivityIndicator","subtitle","Image","source","resizeMode","btnPrimary","btnSecondary","btnSecondaryText","viewport","Camera","ref","absoluteFill","isActive","frameGuide","pointerEvents","btnDisabled","disabled","aspectRatio","overflow","position","top","left","right","bottom","opacity","SelfieStep","onBack","margin","ovalGuide","alignSelf","maxWidth","LivenessStep","recording","setRecording","countdown","setCountdown","Math","ceil","timerRef","pulseAnim","Animated","Value","useEffect","loop","sequence","timing","toValue","useNativeDriver","start","setValue","handleStart","remaining","setInterval","max","clearInterval","audio","recBadge","recDot","recText","countdownBadge","countdownText","paddingHorizontal","ProcessingStep","spinAnim","spin","interpolate","inputRange","outputRange","spinner","transform","rotate","borderTopColor","textAlign","ICONS","pass","fail","review","ICON_BG","ResultStep","error","onRetry","iconWrap","titles","bodies","verdict","marginTop","STEP_INDEX","intro","document","selfie","liveness","processing","KernaqVerify","visible","apiKey","backendUrl","country","reference","sandbox","livenessDuration","documentTypes","themeProp","localeProp","onCancel","onComplete","setStep","capture","setCapture","setResult","setError","useMemo","reset","goto","next","granted","submit","documentUri","selfieUri","videoUri","base","replace","form","FormData","append","name","type","Date","now","headers","res","fetch","method","json","ok","Error","r","verificationId","score","faceMatch","isLive","documentFields","err","msg","message","code","handleCancel","progressSteps","currentIdx","Modal","animationType","presentationStyle","onRequestClose","SafeAreaView","safeArea","header","logo","closeBtn","hitSlop","closeText","progress","_","i","progressDot","ScrollView","scroll","contentContainerStyle","scrollContent","keyboardShouldPersistTaps","bounces","c","flex","paddingTop","paddingBottom","letterSpacing","textTransform","flexGrow"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@kernaq/verify-react-native",
3
+ "version": "1.0.2",
4
+ "description": "Drop-in KYC verification UI for React Native — document capture, selfie, and liveness in one component.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.esm.js",
7
+ "types": "dist/index.d.ts",
8
+ "react-native": "src/index.ts",
9
+ "source": "src/index.ts",
10
+ "files": [
11
+ "src",
12
+ "dist",
13
+ "!**/__tests__",
14
+ "!**/__fixtures__",
15
+ "!**/__mocks__"
16
+ ],
17
+ "scripts": {
18
+ "build": "rollup -c rollup.config.mjs",
19
+ "lint": "tsc --noEmit"
20
+ },
21
+ "keywords": [
22
+ "react-native",
23
+ "kyc",
24
+ "identity",
25
+ "verification",
26
+ "liveness",
27
+ "kernaq"
28
+ ],
29
+ "author": "Kernaq",
30
+ "license": "SEE LICENSE IN LICENSE",
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "registry": "https://registry.npmjs.org"
34
+ },
35
+ "peerDependencies": {
36
+ "react": ">=18.0.0",
37
+ "react-native": ">=0.73.0",
38
+ "react-native-permissions": ">=4.0.0",
39
+ "react-native-vision-camera": ">=4.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@rollup/plugin-node-resolve": "^16.0.3",
43
+ "@rollup/plugin-swc": "^0.4.1",
44
+ "@swc/core": "^1.16.2",
45
+ "@typescript/typescript6": "^6.0.0",
46
+ "@types/react": "^19.0.0",
47
+ "rollup": "^4.63.1",
48
+ "rollup-plugin-dts": "^6.5.1",
49
+ "typescript": "^7.0.2"
50
+ }
51
+ }
@@ -0,0 +1,329 @@
1
+ /**
2
+ * <KernaqVerify /> — drop-in identity verification modal for React Native.
3
+ *
4
+ * Usage:
5
+ * import { KernaqVerify } from '@kernaq/verify-react-native'
6
+ *
7
+ * <KernaqVerify
8
+ * visible={showVerify}
9
+ * apiKey="k_test_..."
10
+ * country="KEN"
11
+ * reference={userId}
12
+ * onComplete={(result) => console.log(result.verdict)}
13
+ * onCancel={() => setShowVerify(false)}
14
+ * />
15
+ */
16
+ import React, { useState, useCallback, useMemo } from 'react'
17
+ import {
18
+ Modal,
19
+ View,
20
+ Text,
21
+ TouchableOpacity,
22
+ ScrollView,
23
+ StyleSheet,
24
+ SafeAreaView,
25
+ Platform,
26
+ } from 'react-native'
27
+ import { DEFAULT_LOCALE } from './locale'
28
+ import { resolveTheme } from './theme'
29
+ import { usePermissions } from './hooks/usePermissions'
30
+ import { IntroStep } from './steps/IntroStep'
31
+ import { DocumentStep } from './steps/DocumentStep'
32
+ import { SelfieStep } from './steps/SelfieStep'
33
+ import { LivenessStep } from './steps/LivenessStep'
34
+ import { ProcessingStep } from './steps/ProcessingStep'
35
+ import { ResultStep } from './steps/ResultStep'
36
+ import type { VerifyConfig, VerifyStep, VerifyResult, VerifyLocale } from './types'
37
+
38
+ interface Props extends VerifyConfig {
39
+ visible: boolean
40
+ }
41
+
42
+ type CaptureState = {
43
+ documentUri?: string
44
+ selfieUri?: string
45
+ videoUri?: string
46
+ }
47
+
48
+ const STEP_INDEX: Record<VerifyStep, number> = {
49
+ intro: -1,
50
+ document: 0,
51
+ selfie: 1,
52
+ liveness: 2,
53
+ processing: 3,
54
+ result: 3,
55
+ }
56
+
57
+ export function KernaqVerify({
58
+ visible,
59
+ apiKey,
60
+ backendUrl,
61
+ country = 'KEN',
62
+ reference,
63
+ sandbox = false,
64
+ livenessDuration = 3000,
65
+ documentTypes = ['national_id', 'passport'],
66
+ theme: themeProp,
67
+ locale: localeProp,
68
+ onCancel,
69
+ onComplete,
70
+ onError,
71
+ }: Props) {
72
+ const [step, setStep] = useState<VerifyStep>('intro')
73
+ const [capture, setCapture] = useState<CaptureState>({})
74
+ const [result, setResult] = useState<VerifyResult | null>(null)
75
+ const [error, setError] = useState<string | null>(null)
76
+
77
+ const theme = useMemo(() => resolveTheme(themeProp), [themeProp])
78
+ const locale: VerifyLocale = useMemo(
79
+ () => ({ ...DEFAULT_LOCALE, ...localeProp }),
80
+ [localeProp]
81
+ )
82
+ const { requestPermissions } = usePermissions()
83
+ const s = styles(theme)
84
+
85
+ const reset = useCallback(() => {
86
+ setStep('intro')
87
+ setCapture({})
88
+ setResult(null)
89
+ setError(null)
90
+ }, [])
91
+
92
+ const goto = useCallback(async (next: VerifyStep) => {
93
+ if (next === 'document' || next === 'selfie' || next === 'liveness') {
94
+ const granted = await requestPermissions()
95
+ if (!granted) {
96
+ setError(locale.error_camera_denied)
97
+ return
98
+ }
99
+ }
100
+ setStep(next)
101
+ if (next === 'processing') {
102
+ submit()
103
+ }
104
+ // eslint-disable-next-line react-hooks/exhaustive-deps
105
+ }, [capture, locale])
106
+
107
+ const submit = useCallback(async () => {
108
+ const { documentUri, selfieUri, videoUri } = capture
109
+ if (!documentUri || !selfieUri) {
110
+ setError('Missing captures — please restart.')
111
+ setStep('result')
112
+ return
113
+ }
114
+
115
+ const base = (backendUrl ?? 'https://api.identity.kernaq.com/v1').replace(/\/$/, '')
116
+ const form = new FormData()
117
+
118
+ form.append('document', {
119
+ uri: documentUri,
120
+ name: 'document.jpg',
121
+ type: 'image/jpeg',
122
+ } as unknown as Blob)
123
+
124
+ form.append('selfie', {
125
+ uri: selfieUri,
126
+ name: 'selfie.jpg',
127
+ type: 'image/jpeg',
128
+ } as unknown as Blob)
129
+
130
+ if (videoUri) {
131
+ form.append('video', {
132
+ uri: videoUri,
133
+ name: 'liveness.mp4',
134
+ type: 'video/mp4',
135
+ } as unknown as Blob)
136
+ }
137
+
138
+ form.append('document_type', documentTypes[0] ?? 'national_id')
139
+ form.append('country', country)
140
+ form.append('reference', reference ?? `kq_${Date.now()}`)
141
+ if (sandbox) form.append('sandbox', 'true')
142
+
143
+ const headers: Record<string, string> = {
144
+ 'Content-Type': 'multipart/form-data',
145
+ }
146
+ if (apiKey) headers['X-API-Key'] = apiKey
147
+
148
+ try {
149
+ const res = await fetch(`${base}/verify`, {
150
+ method: 'POST',
151
+ headers,
152
+ body: form,
153
+ })
154
+ const body = (await res.json()) as Record<string, unknown>
155
+ if (!res.ok) throw new Error((body['message'] as string) ?? `HTTP ${res.status}`)
156
+
157
+ const r: VerifyResult = {
158
+ verificationId: body['verification_id'] as string,
159
+ reference: body['reference'] as string,
160
+ verdict: body['verdict'] as 'pass' | 'fail' | 'review',
161
+ score: (body['score'] as number) ?? 0,
162
+ faceMatch: (body['face_match'] as boolean) ?? false,
163
+ isLive: (body['is_live'] as boolean) ?? false,
164
+ documentFields: body['document_fields'] as Record<string, string> | undefined,
165
+ }
166
+ setResult(r)
167
+ setStep('result')
168
+ onComplete?.(r)
169
+ } catch (err) {
170
+ const msg = (err as Error).message
171
+ setError(`${locale.error_network} ${msg}`)
172
+ setStep('result')
173
+ onError?.({ code: 'network_error', message: msg })
174
+ }
175
+ // eslint-disable-next-line react-hooks/exhaustive-deps
176
+ }, [capture])
177
+
178
+ const handleCancel = () => {
179
+ reset()
180
+ onCancel?.()
181
+ }
182
+
183
+ const progressSteps: VerifyStep[] = ['document', 'selfie', 'liveness', 'processing']
184
+ const currentIdx = STEP_INDEX[step]
185
+
186
+ return (
187
+ <Modal
188
+ visible={visible}
189
+ animationType="slide"
190
+ presentationStyle="pageSheet"
191
+ onRequestClose={handleCancel}
192
+ >
193
+ <SafeAreaView style={[s.safeArea, { backgroundColor: theme.bg }]}>
194
+ {/* Header */}
195
+ <View style={s.header}>
196
+ <Text style={s.logo}>Kernaq</Text>
197
+ {step !== 'processing' && (
198
+ <TouchableOpacity onPress={handleCancel} style={s.closeBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
199
+ <Text style={s.closeText}>✕</Text>
200
+ </TouchableOpacity>
201
+ )}
202
+ </View>
203
+
204
+ {/* Progress bar */}
205
+ {currentIdx >= 0 && (
206
+ <View style={s.progress}>
207
+ {progressSteps.map((_, i) => (
208
+ <View
209
+ key={i}
210
+ style={[
211
+ s.progressDot,
212
+ i < currentIdx && { backgroundColor: theme.accent, opacity: 0.4 },
213
+ i === currentIdx && { backgroundColor: theme.accent },
214
+ ]}
215
+ />
216
+ ))}
217
+ </View>
218
+ )}
219
+
220
+ {/* Body */}
221
+ <ScrollView
222
+ style={s.scroll}
223
+ contentContainerStyle={s.scrollContent}
224
+ keyboardShouldPersistTaps="handled"
225
+ bounces={false}
226
+ >
227
+ {step === 'intro' && (
228
+ <IntroStep
229
+ theme={theme}
230
+ locale={locale}
231
+ onStart={() => goto('document')}
232
+ />
233
+ )}
234
+ {step === 'document' && (
235
+ <DocumentStep
236
+ theme={theme}
237
+ locale={locale}
238
+ onCapture={(uri) => {
239
+ setCapture((c) => ({ ...c, documentUri: uri }))
240
+ goto('selfie')
241
+ }}
242
+ />
243
+ )}
244
+ {step === 'selfie' && (
245
+ <SelfieStep
246
+ theme={theme}
247
+ locale={locale}
248
+ onCapture={(uri) => {
249
+ setCapture((c) => ({ ...c, selfieUri: uri }))
250
+ goto('liveness')
251
+ }}
252
+ onBack={() => setStep('document')}
253
+ />
254
+ )}
255
+ {step === 'liveness' && (
256
+ <LivenessStep
257
+ theme={theme}
258
+ locale={locale}
259
+ duration={livenessDuration}
260
+ onCapture={(uri) => {
261
+ setCapture((c) => ({ ...c, videoUri: uri }))
262
+ goto('processing')
263
+ }}
264
+ onBack={() => setStep('selfie')}
265
+ />
266
+ )}
267
+ {step === 'processing' && (
268
+ <ProcessingStep theme={theme} locale={locale} />
269
+ )}
270
+ {step === 'result' && (
271
+ <ResultStep
272
+ theme={theme}
273
+ locale={locale}
274
+ result={result}
275
+ error={error}
276
+ onRetry={() => {
277
+ reset()
278
+ setStep('intro')
279
+ }}
280
+ />
281
+ )}
282
+ </ScrollView>
283
+ </SafeAreaView>
284
+ </Modal>
285
+ )
286
+ }
287
+
288
+ const styles = (t: ReturnType<typeof resolveTheme>) =>
289
+ StyleSheet.create({
290
+ safeArea: {
291
+ flex: 1,
292
+ },
293
+ header: {
294
+ flexDirection: 'row',
295
+ alignItems: 'center',
296
+ justifyContent: 'space-between',
297
+ paddingHorizontal: 20,
298
+ paddingTop: Platform.OS === 'android' ? 16 : 8,
299
+ paddingBottom: 8,
300
+ },
301
+ logo: {
302
+ fontSize: 14,
303
+ fontWeight: '700',
304
+ color: t.accent,
305
+ letterSpacing: 1.2,
306
+ textTransform: 'uppercase',
307
+ },
308
+ closeBtn: {
309
+ padding: 4,
310
+ },
311
+ closeText: {
312
+ fontSize: 18,
313
+ color: t.subtext,
314
+ },
315
+ progress: {
316
+ flexDirection: 'row',
317
+ gap: 6,
318
+ paddingHorizontal: 20,
319
+ paddingBottom: 8,
320
+ },
321
+ progressDot: {
322
+ flex: 1,
323
+ height: 3,
324
+ borderRadius: 999,
325
+ backgroundColor: t.border,
326
+ },
327
+ scroll: { flex: 1 },
328
+ scrollContent: { flexGrow: 1 },
329
+ })
@@ -0,0 +1,73 @@
1
+ import { useRef, useCallback } from 'react'
2
+ import {
3
+ useCameraDevice,
4
+ useCameraPermission,
5
+ type Camera,
6
+ } from 'react-native-vision-camera'
7
+
8
+ export type CameraFacing = 'front' | 'back'
9
+
10
+ export interface CaptureResult {
11
+ uri: string
12
+ width: number
13
+ height: number
14
+ }
15
+
16
+ export interface VideoResult {
17
+ uri: string
18
+ duration: number
19
+ }
20
+
21
+ export function useCamera(facing: CameraFacing = 'back') {
22
+ const cameraRef = useRef<Camera>(null)
23
+ const device = useCameraDevice(facing)
24
+ const { hasPermission } = useCameraPermission()
25
+
26
+ const capturePhoto = useCallback(async (): Promise<CaptureResult | null> => {
27
+ if (!cameraRef.current) return null
28
+ try {
29
+ const photo = await cameraRef.current.takePhoto({
30
+ flash: 'off',
31
+ enableShutterSound: false,
32
+ })
33
+ return {
34
+ uri: `file://${photo.path}`,
35
+ width: photo.width,
36
+ height: photo.height,
37
+ }
38
+ } catch {
39
+ return null
40
+ }
41
+ }, [])
42
+
43
+ const startRecording = useCallback(
44
+ (
45
+ onFinished: (video: VideoResult) => void,
46
+ onError: (err: unknown) => void
47
+ ) => {
48
+ if (!cameraRef.current) return
49
+ cameraRef.current.startRecording({
50
+ flash: 'off',
51
+ onRecordingFinished: (video) => {
52
+ onFinished({ uri: `file://${video.path}`, duration: video.duration })
53
+ },
54
+ onRecordingError: onError,
55
+ })
56
+ },
57
+ []
58
+ )
59
+
60
+ const stopRecording = useCallback(async () => {
61
+ if (!cameraRef.current) return
62
+ await cameraRef.current.stopRecording()
63
+ }, [])
64
+
65
+ return {
66
+ cameraRef,
67
+ device,
68
+ hasPermission,
69
+ capturePhoto,
70
+ startRecording,
71
+ stopRecording,
72
+ }
73
+ }