@transfergratis/react-native-sdk 0.1.31 → 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.
@@ -18,5 +18,6 @@ export declare const TemplateKYCExample: React.FC<{
18
18
  documentType: string;
19
19
  region?: string;
20
20
  };
21
+ onSessionSave?: (sessionId: string) => void;
21
22
  }>;
22
23
  //# sourceMappingURL=TemplateKYCExample.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateKYCExample.d.ts","sourceRoot":"","sources":["../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAsIxE,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF,CAyCA,CAAC"}
1
+ {"version":3,"file":"TemplateKYCExample.d.ts","sourceRoot":"","sources":["../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAsIxE,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,CA0CA,CAAC"}
@@ -128,7 +128,7 @@ const advancedVerificationTemplate = {
128
128
  },
129
129
  ]
130
130
  };
131
- export const TemplateKYCExample = ({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume }) => {
131
+ export const TemplateKYCExample = ({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave }) => {
132
132
  const handleComplete = (data) => {
133
133
  console.log('KYC Template completed with data:', data);
134
134
  onComplete(data);
@@ -148,7 +148,7 @@ export const TemplateKYCExample = ({ onComplete, onCancel, onError, language, AP
148
148
  return (<SafeAreaView style={{ flex: 1, paddingVertical: 25 }}>
149
149
  <View style={{ flex: 1 }}>
150
150
  <TemplateKYCFlow template={templateToUse} templateId={templateId} onComplete={handleComplete} onError={handleError} onCancel={handleCancel} language={language} // ou "en" pour l'anglais
151
- API_KEY={API_KEY} env={env} serverEnv={serverEnv} existingSessionId={existingSessionId} initialComponentIndex={initialComponentIndex} initialCountryResume={initialCountryResume}/>
151
+ API_KEY={API_KEY} env={env} serverEnv={serverEnv} existingSessionId={existingSessionId} initialComponentIndex={initialComponentIndex} initialCountryResume={initialCountryResume} onSessionSave={onSessionSave}/>
152
152
  </View>
153
153
  </SafeAreaView>);
154
154
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateKYCExample.js","sourceRoot":"","sources":["../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { View, SafeAreaView } from 'react-native';\nimport { TemplateKYCFlow } from './TemplateKYCFlowRefactored';\nimport { KYCTemplate, VerificationState } from '../types/KYC.types';\nimport { KycEnvironment, BackendEnvironment } from '../types/env.types';\n\n\n\n\nconst advancedVerificationTemplate: KYCTemplate = {\n id: 1,\n name: {\n en: \"Advanced Verification\",\n fr: \"Vérification Avancée\"\n },\n description: {\n en: \"Extended identity verification flow\",\n fr: \"Processus de vérification d'identité étendu\"\n },\n version: \"1.1.0\",\n components: [\n {\n id: 5,\n type: \"location\" as const,\n order: 1,\n labels: {\n en: \"Enable your location\",\n fr: \"Activez votre localisation\"\n },\n instructions: {\n en: \"We need your GPS location for compliance purposes.\",\n fr: \"Nous avons besoin de votre localisation GPS pour des raisons réglementaires.\"\n },\n ui: {\n icon: \"location-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Enable Location\", fr: \"Activer la localisation\" }\n },\n config: {\n accuracy: \"high\",\n required: true\n } as const\n },\n {\n id: 6,\n type: \"country_selection\" as const,\n order: 2,\n labels: {\n en: \"Select your country\",\n fr: \"Sélectionnez votre pays\"\n },\n instructions: {\n en: \"Choose your country of residence.\",\n fr: \"Choisissez votre pays de résidence.\"\n },\n ui: {\n icon: \"country-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Confirm\", fr: \"Confirmer\" }\n },\n config: {\n allowed_countries: [\"CM\", \"NG\", \"CI\", \"KE\", \"GH\"],\n default_country: \"CM\",\n required: true\n } as const\n },\n {\n id: 1,\n type: \"id_card\" as const,\n order: 3,\n templateId: 1,\n labels: {\n front: {\n en: \"Upload front of ID card\",\n fr: \"Téléversez le recto de votre carte d'identité\"\n },\n back: {\n en: \"Upload back of ID card\",\n fr: \"Téléversez le verso de votre carte d'identité\"\n },\n },\n instructions: {\n front: {\n en: \"Take a clear photo of the front of your ID.\",\n fr: \"Prenez une photo nette du recto de votre pièce.\"\n },\n back: {\n en: \"Take a clear photo of the back of your ID.\",\n fr: \"Prenez une photo nette du verso de votre pièce.\"\n },\n },\n ui: {\n front: {\n icon: \"id-card-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n back: {\n icon: \"id-card-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n },\n config: {\n sides: [\"front\", \"back\"],\n allowed_formats: [\"jpg\", \"png\"],\n max_size_mb: 5,\n document_types: [\"drivers_licence\", \"passport\", \"drivers_licence\", \"national_id\"],\n\n } as const\n },\n {\n id: 3,\n type: \"selfie\" as const,\n order: 5,\n templateId: 1,\n labels: {\n en: \"Take selfies from different angles\",\n fr: \"Prenez des selfies sous différents angles\"\n },\n instructions: {\n en: \"Take selfies from front, left, and right angles.\",\n fr: \"Prenez des selfies de face, profil gauche et profil droit.\"\n },\n ui: {\n icon: \"selfie-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n config: {\n liveness_check: true,\n max_attempts: 3,\n orientations: [\"center\", \"left\", \"right\"]\n } as const\n },\n ]\n};\n\nexport const TemplateKYCExample: React.FC<{\n onComplete: (data: VerificationState) => void;\n onCancel: () => void;\n onError: (error: string) => void;\n language: string;\n API_KEY?: string;\n templateId?: string;\n template?: KYCTemplate;\n env?: KycEnvironment; // Flow execution: PRODUCTION (full AI) or SANDBOX (skip AI)\n serverEnv?: BackendEnvironment; // Backend to call: PRODUCTION or TEST (API URL)\n existingSessionId?: string;\n initialComponentIndex?: number;\n initialCountryResume?: { code: string; documentType: string; region?: string };\n}> = ({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume }) => {\n const handleComplete = (data: VerificationState) => {\n console.log('KYC Template completed with data:', data);\n onComplete(data);\n // Ici vous pouvez envoyer les données à votre API\n };\n\n const handleCancel = () => {\n console.log('KYC Template flow cancelled');\n onCancel();\n };\n\n const handleError = (error: string) => {\n console.error('KYC Template error:', error);\n onError(error);\n };\n\n // Transform backend template to SDK format\n // Determine which template to use: prefer templateId for dynamic loading, then template prop, then fallback to hardcoded\n const templateToUse = templateId ? undefined : (template || advancedVerificationTemplate);\n\n return (\n <SafeAreaView style={{ flex: 1, paddingVertical: 25 }}>\n <View style={{ flex: 1 }}>\n <TemplateKYCFlow\n template={templateToUse}\n templateId={templateId}\n onComplete={handleComplete}\n onError={handleError}\n onCancel={handleCancel}\n language={language} // ou \"en\" pour l'anglais\n API_KEY={API_KEY}\n env={env}\n serverEnv={serverEnv}\n existingSessionId={existingSessionId}\n initialComponentIndex={initialComponentIndex}\n initialCountryResume={initialCountryResume}\n />\n </View>\n </SafeAreaView>\n );\n};\n\n"]}
1
+ {"version":3,"file":"TemplateKYCExample.js","sourceRoot":"","sources":["../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { View, SafeAreaView } from 'react-native';\nimport { TemplateKYCFlow } from './TemplateKYCFlowRefactored';\nimport { KYCTemplate, VerificationState } from '../types/KYC.types';\nimport { KycEnvironment, BackendEnvironment } from '../types/env.types';\n\n\n\n\nconst advancedVerificationTemplate: KYCTemplate = {\n id: 1,\n name: {\n en: \"Advanced Verification\",\n fr: \"Vérification Avancée\"\n },\n description: {\n en: \"Extended identity verification flow\",\n fr: \"Processus de vérification d'identité étendu\"\n },\n version: \"1.1.0\",\n components: [\n {\n id: 5,\n type: \"location\" as const,\n order: 1,\n labels: {\n en: \"Enable your location\",\n fr: \"Activez votre localisation\"\n },\n instructions: {\n en: \"We need your GPS location for compliance purposes.\",\n fr: \"Nous avons besoin de votre localisation GPS pour des raisons réglementaires.\"\n },\n ui: {\n icon: \"location-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Enable Location\", fr: \"Activer la localisation\" }\n },\n config: {\n accuracy: \"high\",\n required: true\n } as const\n },\n {\n id: 6,\n type: \"country_selection\" as const,\n order: 2,\n labels: {\n en: \"Select your country\",\n fr: \"Sélectionnez votre pays\"\n },\n instructions: {\n en: \"Choose your country of residence.\",\n fr: \"Choisissez votre pays de résidence.\"\n },\n ui: {\n icon: \"country-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Confirm\", fr: \"Confirmer\" }\n },\n config: {\n allowed_countries: [\"CM\", \"NG\", \"CI\", \"KE\", \"GH\"],\n default_country: \"CM\",\n required: true\n } as const\n },\n {\n id: 1,\n type: \"id_card\" as const,\n order: 3,\n templateId: 1,\n labels: {\n front: {\n en: \"Upload front of ID card\",\n fr: \"Téléversez le recto de votre carte d'identité\"\n },\n back: {\n en: \"Upload back of ID card\",\n fr: \"Téléversez le verso de votre carte d'identité\"\n },\n },\n instructions: {\n front: {\n en: \"Take a clear photo of the front of your ID.\",\n fr: \"Prenez une photo nette du recto de votre pièce.\"\n },\n back: {\n en: \"Take a clear photo of the back of your ID.\",\n fr: \"Prenez une photo nette du verso de votre pièce.\"\n },\n },\n ui: {\n front: {\n icon: \"id-card-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n back: {\n icon: \"id-card-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n },\n config: {\n sides: [\"front\", \"back\"],\n allowed_formats: [\"jpg\", \"png\"],\n max_size_mb: 5,\n document_types: [\"drivers_licence\", \"passport\", \"drivers_licence\", \"national_id\"],\n\n } as const\n },\n {\n id: 3,\n type: \"selfie\" as const,\n order: 5,\n templateId: 1,\n labels: {\n en: \"Take selfies from different angles\",\n fr: \"Prenez des selfies sous différents angles\"\n },\n instructions: {\n en: \"Take selfies from front, left, and right angles.\",\n fr: \"Prenez des selfies de face, profil gauche et profil droit.\"\n },\n ui: {\n icon: \"selfie-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n config: {\n liveness_check: true,\n max_attempts: 3,\n orientations: [\"center\", \"left\", \"right\"]\n } as const\n },\n ]\n};\n\nexport const TemplateKYCExample: React.FC<{\n onComplete: (data: VerificationState) => void;\n onCancel: () => void;\n onError: (error: string) => void;\n language: string;\n API_KEY?: string;\n templateId?: string;\n template?: KYCTemplate;\n env?: KycEnvironment; // Flow execution: PRODUCTION (full AI) or SANDBOX (skip AI)\n serverEnv?: BackendEnvironment; // Backend to call: PRODUCTION or TEST (API URL)\n existingSessionId?: string;\n initialComponentIndex?: number;\n initialCountryResume?: { code: string; documentType: string; region?: string };\n onSessionSave?: (sessionId: string) => void;\n}> = ({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave }) => {\n const handleComplete = (data: VerificationState) => {\n console.log('KYC Template completed with data:', data);\n onComplete(data);\n // Ici vous pouvez envoyer les données à votre API\n };\n\n const handleCancel = () => {\n console.log('KYC Template flow cancelled');\n onCancel();\n };\n\n const handleError = (error: string) => {\n console.error('KYC Template error:', error);\n onError(error);\n };\n\n // Transform backend template to SDK format\n // Determine which template to use: prefer templateId for dynamic loading, then template prop, then fallback to hardcoded\n const templateToUse = templateId ? undefined : (template || advancedVerificationTemplate);\n\n return (\n <SafeAreaView style={{ flex: 1, paddingVertical: 25 }}>\n <View style={{ flex: 1 }}>\n <TemplateKYCFlow\n template={templateToUse}\n templateId={templateId}\n onComplete={handleComplete}\n onError={handleError}\n onCancel={handleCancel}\n language={language} // ou \"en\" pour l'anglais\n API_KEY={API_KEY}\n env={env}\n serverEnv={serverEnv}\n existingSessionId={existingSessionId}\n initialComponentIndex={initialComponentIndex}\n initialCountryResume={initialCountryResume}\n onSessionSave={onSessionSave}\n />\n </View>\n </SafeAreaView>\n );\n};\n\n"]}
@@ -20,6 +20,7 @@ interface TemplateKYCFlowProps {
20
20
  documentType: string;
21
21
  region?: string;
22
22
  };
23
+ onSessionSave?: (sessionId: string) => void;
23
24
  }
24
25
  export declare const TemplateKYCFlow: React.FC<TemplateKYCFlowProps>;
25
26
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateKYCFlowRefactored.d.ts","sourceRoot":"","sources":["../../src/components/TemplateKYCFlowRefactored.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAkBpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4GAA4G;IAC5G,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+EAA+E;IAC/E,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAsH1D,CAAC"}
1
+ {"version":3,"file":"TemplateKYCFlowRefactored.d.ts","sourceRoot":"","sources":["../../src/components/TemplateKYCFlowRefactored.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAkBpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4GAA4G;IAC5G,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+EAA+E;IAC/E,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwH1D,CAAC"}
@@ -18,7 +18,7 @@ import { PhoneVerificationTemplate } from './KYCElements/PhoneVerificationTempla
18
18
  import { PersonalInformationTemplate } from './KYCElements/PersonalInformationTemplate';
19
19
  import { AdditionalDocumentsTemplate } from './KYCElements/AdditionalDocumentsTemplate';
20
20
  import KYCConfig from '../config/KYCConfig';
21
- export const TemplateKYCFlow = ({ template: providedTemplate, templateId, onComplete, onError, language = 'fr', onCancel, API_KEY, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume, }) => {
21
+ export const TemplateKYCFlow = ({ template: providedTemplate, templateId, onComplete, onError, language = 'fr', onCancel, API_KEY, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave, }) => {
22
22
  const { t } = useI18n();
23
23
  const { template: loadedTemplate, isLoading, error, loadTemplate } = useTemplateLoader();
24
24
  // Which backend URL to call (independent from flow env)
@@ -85,7 +85,7 @@ export const TemplateKYCFlow = ({ template: providedTemplate, templateId, onComp
85
85
  </Text>
86
86
  </View>);
87
87
  }
88
- return (<TemplateKYCFlowProvider template={template} onComplete={onComplete} onError={onError} onCancel={OnCancel} initialLanguage={language} apiKey={API_KEY} env={env} existingSessionId={existingSessionId} initialComponentIndex={initialComponentIndex} initialCountryResume={initialCountryResume}>
88
+ return (<TemplateKYCFlowProvider template={template} onComplete={onComplete} onError={onError} onCancel={OnCancel} initialLanguage={language} apiKey={API_KEY} env={env} existingSessionId={existingSessionId} initialComponentIndex={initialComponentIndex} initialCountryResume={initialCountryResume} onSessionSave={onSessionSave}>
89
89
  <TemplateKYCFlowContent onCancel={OnCancel}/>
90
90
  </TemplateKYCFlowProvider>);
91
91
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateKYCFlowRefactored.js","sourceRoot":"","sources":["../../src/components/TemplateKYCFlowRefactored.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, TouchableOpacity, ActivityIndicator, Dimensions, ScrollView, Platform } from 'react-native';\nimport { KYCTemplate, VerificationState } from '../types/KYC.types';\nimport { TemplateKYCFlowProvider, useTemplateKYCFlowContext } from '../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../hooks/useI18n';\nimport { showAlert } from '../utils/platformAlert';\nimport { IDCardCapture } from './KYCElements/IDCardCapture';\nimport { SelfieCaptureTemplate } from './KYCElements/SelfieCaptureTemplate';\nimport { FileUploadTemplate } from './KYCElements/FileUploadTemplate';\nimport { LocationCaptureTemplate } from './KYCElements/LocationCaptureTemplate';\nimport { CountrySelectionTemplate } from './KYCElements/CountrySelectionTemplate';\nimport { InitializationStep } from './KYCElements/InitializationStep';\nimport { ReviewSubmitTemplate } from './KYCElements/ReviewSubmitTemplate';\nimport { VerificationProgressTemplate } from './KYCElements/VerificationProgressTemplate';\nimport { useTemplateLoader } from '../hooks/useTemplateLoader';\nimport { WelcomeTemplate } from './KYCElements/WelcomeTemplate';\nimport { EmailVerificationTemplate } from './KYCElements/EmailVerificationTemplate';\nimport { PhoneVerificationTemplate } from './KYCElements/PhoneVerificationTemplate';\nimport { PersonalInformationTemplate } from './KYCElements/PersonalInformationTemplate';\nimport { AdditionalDocumentsTemplate } from './KYCElements/AdditionalDocumentsTemplate';\nimport { KycEnvironment, BackendEnvironment } from '../types/env.types';\nimport KYCConfig from '../config/KYCConfig';\n\ninterface TemplateKYCFlowProps {\n template?: KYCTemplate; // Format SDK direct (existing, now optional)\n templateId?: string; // New: ID to load from API\n onComplete?: (data: VerificationState) => void;\n onError?: (error: string) => void;\n language?: string;\n onCancel?: () => void;\n API_KEY?: string; // Required if templateId is used\n env?: KycEnvironment; // Flow execution: PRODUCTION (full AI) or SANDBOX (skip AI)\n serverEnv?: BackendEnvironment; // Backend to call: PRODUCTION or TEST (API URL)\n existingSessionId?: string;\n /** Index in template.components (0-based) to resume at — e.g. from URL component_index or template table */\n initialComponentIndex?: number;\n /** Pays / type de document depuis l'URL de reprise (reprise multi-appareil) */\n initialCountryResume?: { code: string; documentType: string; region?: string };\n}\n\nexport const TemplateKYCFlow: React.FC<TemplateKYCFlowProps> = ({\n template: providedTemplate,\n templateId,\n onComplete,\n onError,\n language = 'fr',\n onCancel,\n API_KEY,\n env = 'PRODUCTION',\n serverEnv,\n existingSessionId,\n initialComponentIndex,\n initialCountryResume,\n}) => {\n const { t } = useI18n();\n const { template: loadedTemplate, isLoading, error, loadTemplate } = useTemplateLoader();\n\n // Which backend URL to call (independent from flow env)\n useEffect(() => {\n if (serverEnv !== undefined) {\n KYCConfig.setBackendEnvironment(serverEnv);\n }\n }, [serverEnv]);\n\n // Validate props\n useEffect(() => {\n if (!providedTemplate && !templateId) {\n const errorMsg = 'Either template or templateId must be provided';\n onError?.(errorMsg);\n return;\n }\n\n if (templateId && !API_KEY) {\n // Try to load without API key (will use token authentication)\n loadTemplate(templateId);\n } else if (templateId && API_KEY) {\n loadTemplate(templateId, API_KEY);\n }\n }, [templateId, API_KEY, providedTemplate, loadTemplate, onError]);\n\n // Handle loading errors\n useEffect(() => {\n if (error) {\n onError?.(error);\n }\n }, [error, onError]);\n\n const OnCancel = () => {\n showAlert(\n t('kyc.cancelConfirmation.title'),\n t('kyc.cancelConfirmation.message'),\n [\n { text: t('kyc.cancelConfirmation.cancelButton'), style: 'cancel' },\n {\n text: t('kyc.cancelConfirmation.confirmButton'),\n onPress: () => {\n onCancel?.();\n }\n },\n ]\n );\n };\n\n // Determine which template to use\n const template = providedTemplate || loadedTemplate;\n\n // Show loading state while fetching template\n if (templateId && isLoading && !template) {\n return (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.loadingText}>{t('common.loading') || 'Loading template...'}</Text>\n </View>\n );\n }\n\n // Show error state if template failed to load\n if (templateId && error && !template) {\n return (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error}</Text>\n <TouchableOpacity\n style={styles.retryButton}\n onPress={() => loadTemplate(templateId, API_KEY)}\n >\n <Text style={styles.retryButtonText}>{t('common.retry') || 'Retry'}</Text>\n </TouchableOpacity>\n </View>\n );\n }\n\n // Show error if no template available\n if (!template) {\n return (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>\n {t('errors.unknownError') || 'Template not available'}\n </Text>\n </View>\n );\n }\n\n return (\n <TemplateKYCFlowProvider\n template={template}\n onComplete={onComplete}\n onError={onError}\n onCancel={OnCancel}\n initialLanguage={language}\n apiKey={API_KEY}\n env={env}\n existingSessionId={existingSessionId}\n initialComponentIndex={initialComponentIndex}\n initialCountryResume={initialCountryResume}\n >\n <TemplateKYCFlowContent onCancel={OnCancel} />\n </TemplateKYCFlowProvider>\n );\n};\n\nconst TemplateKYCFlowContent: React.FC<{ onCancel?: () => void }> = ({ onCancel }) => {\n const {\n state,\n actions,\n currentComponent,\n progress,\n } = useTemplateKYCFlowContext();\n\n const { t } = useI18n();\n\n const updateComponentData = (componentId: number, data: unknown) => {\n actions.updateComponentData(componentId, data);\n };\n\n if (!currentComponent) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>{t('errors.unknownError')}</Text>\n </View>\n );\n }\n\n // Rendu du composant actuel\n const renderCurrentComponent = () => {\n const commonProps = {\n component: currentComponent,\n value: state.componentData[currentComponent.id],\n onValueChange: (data: unknown) => updateComponentData(currentComponent.id, data),\n error: state.errors[currentComponent.id],\n language: state.currentLanguage,\n };\n\n if (!state.session.isInitialized) {\n return <InitializationStep session={state.session} />\n }\n\n switch (currentComponent.type) {\n case 'welcome':\n return <WelcomeTemplate {...commonProps} />;\n\n case 'id_card':\n return <IDCardCapture {...commonProps} />;\n\n case 'selfie':\n return <SelfieCaptureTemplate {...commonProps} />;\n\n case 'file_upload':\n return <FileUploadTemplate {...commonProps} />;\n\n case 'location':\n return <LocationCaptureTemplate {...commonProps} />;\n\n case 'country_selection':\n return <CountrySelectionTemplate {...commonProps} />;\n\n case 'review_submit':\n return <ReviewSubmitTemplate {...commonProps} />;\n\n case 'email_verification':\n return <EmailVerificationTemplate {...commonProps} />;\n\n case 'phone_verification':\n return <PhoneVerificationTemplate {...commonProps} />;\n\n case 'personal_information':\n return <PersonalInformationTemplate {...commonProps} />;\n\n case 'additional_documents':\n return <AdditionalDocumentsTemplate {...commonProps} />;\n\n case 'verification_progress':\n return <VerificationProgressTemplate {...commonProps} />;\n\n default:\n return (\n <View style={styles.unsupportedContainer}>\n <Text style={styles.unsupportedText}>\n {t('errors.unknownError')}: {currentComponent.type}\n </Text>\n </View>\n );\n }\n };\n\n return (\n <View style={{ flex: 1, position: 'relative' }}>\n {state.isProcessing && (\n <View style={styles.processingContainer}>\n <Text style={styles.processingText}>{t('common.loading')}</Text>\n <ActivityIndicator size=\"large\" color=\"#fff\" />\n </View>\n )}\n <SafeAreaView style={styles.container}>\n {/* Header avec informations sur l'étape */}\n\n {(state.showCustomStepper && state.session.isInitialized) ? (\n <View style={styles.header}>\n <Text style={styles.progressText}>\n {t('kyc.step', {\n current: (state.template.components.findIndex(c => c.id === currentComponent.id) + 1) || (state.currentComponentIndex + 1),\n total: state.template.components.length,\n })}\n </Text>\n <View style={styles.progressContainer}>\n <View style={styles.progressBar}>\n <View\n style={[\n styles.progressFill,\n { width: `${progress}%` }\n ]}\n />\n </View>\n\n </View>\n\n <View style={{ position: 'absolute', right: 12, top: 12 }}>\n <TouchableOpacity onPress={onCancel} disabled={!onCancel} style={{ opacity: onCancel ? 1 : 0.5 }}>\n <Text style={{ fontSize: 20, fontWeight: 'bold', color: '#333' }}>{`X`}</Text>\n </TouchableOpacity>\n </View>\n </View>\n ) : null}\n\n {/* Contenu principal */}\n <ScrollView\n style={styles.scrollView}\n contentContainerStyle={styles.content}\n showsVerticalScrollIndicator={Platform.OS === 'web'}\n bounces={false}\n >\n {renderCurrentComponent()}\n </ScrollView>\n\n {state.isProcessing && (\n <View style={styles.processingContainer}>\n <Text style={styles.processingText}>{t('common.loading')}</Text>\n <ActivityIndicator size=\"large\" color=\"#fff\" />\n </View>\n )}\n </SafeAreaView>\n </View>\n\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n\n },\n header: {\n backgroundColor: 'white',\n paddingVertical: 20,\n paddingHorizontal: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#e0e0e0',\n marginHorizontal: 12,\n marginTop: 12,\n // shadow\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 1.84,\n elevation: 5,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n },\n description: {\n fontSize: 16,\n color: '#666',\n marginBottom: 20,\n },\n progressContainer: {\n // marginBottom: 20,\n },\n progressBar: {\n height: 8,\n backgroundColor: '#e0e0e0',\n borderRadius: 4,\n overflow: 'hidden',\n },\n progressFill: {\n height: '100%',\n backgroundColor: '#2DBD60',\n borderRadius: 4,\n },\n progressText: {\n fontSize: 14,\n color: 'black',\n fontWeight: '600',\n textAlign: 'left',\n marginBottom: 8,\n },\n stepInfo: {\n backgroundColor: '#f8f9fa',\n padding: 16,\n borderRadius: 8,\n borderLeftWidth: 4,\n borderLeftColor: '#2DBD60',\n },\n stepTitle: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginBottom: 8,\n },\n stepDescription: {\n fontSize: 14,\n color: '#666',\n lineHeight: 20,\n },\n scrollView: {\n flex: 1,\n },\n content: {\n flexGrow: 1,\n alignItems: 'center',\n paddingBottom: 20, // Add padding for better mobile scrolling\n },\n navigation: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n padding: 20,\n backgroundColor: 'white',\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n },\n navButton: {\n paddingHorizontal: 24,\n paddingVertical: 12,\n borderRadius: 8,\n minWidth: 100,\n alignItems: 'center',\n },\n primaryButton: {\n backgroundColor: '#2DBD60',\n },\n navButtonText: {\n fontSize: 16,\n fontWeight: '600',\n color: 'white',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 16,\n textAlign: 'center',\n margin: 20,\n },\n unsupportedContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n unsupportedText: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n },\n processingContainer: {\n position: 'absolute',\n flex: 1,\n width: Dimensions.get('window').width,\n height: Dimensions.get('window').height,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 10000000,\n },\n processingText: {\n fontSize: 16,\n color: '#fff',\n textAlign: 'center',\n fontWeight: 'bold',\n marginBottom: 10,\n },\n loadingContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#f5f5f5',\n },\n loadingText: {\n marginTop: 16,\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n },\n errorContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#f5f5f5',\n padding: 20,\n },\n retryButton: {\n marginTop: 20,\n paddingHorizontal: 24,\n paddingVertical: 12,\n backgroundColor: '#2DBD60',\n borderRadius: 8,\n },\n retryButtonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '600',\n },\n}); "]}
1
+ {"version":3,"file":"TemplateKYCFlowRefactored.js","sourceRoot":"","sources":["../../src/components/TemplateKYCFlowRefactored.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE3I,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AAExF,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAoB5C,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC9D,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EACV,UAAU,EACV,OAAO,EACP,QAAQ,GAAG,IAAI,EACf,QAAQ,EACR,OAAO,EACP,GAAG,GAAG,YAAY,EAClB,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACd,EAAE,EAAE;IACH,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAEzF,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,iBAAiB;IACjB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,gDAAgD,CAAC;YAClE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,8DAA8D;YAC9D,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;YACjC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,wBAAwB;IACxB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,SAAS,CACP,CAAC,CAAC,8BAA8B,CAAC,EACjC,CAAC,CAAC,gCAAgC,CAAC,EACnC;YACE,EAAE,IAAI,EAAE,CAAC,CAAC,qCAAqC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;YACnE;gBACE,IAAI,EAAE,CAAC,CAAC,sCAAsC,CAAC;gBAC/C,OAAO,EAAE,GAAG,EAAE;oBACZ,QAAQ,EAAE,EAAE,CAAC;gBACf,CAAC;aACF;SACF,CACF,CAAC;IACJ,CAAC,CAAC;IAEF,kCAAkC;IAClC,MAAM,QAAQ,GAAG,gBAAgB,IAAI,cAAc,CAAC;IAEpD,6CAA6C;IAC7C,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzC,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;QAAA,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAC/C;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,EAAE,IAAI,CACvF;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,IAAI,UAAU,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACjC;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAC5C;QAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAC1B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAEjD;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,EAAE,IAAI,CAC3E;QAAA,EAAE,gBAAgB,CACpB;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACjC;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;UAAA,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,wBAAwB,CACvD;QAAA,EAAE,IAAI,CACR;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,CAAC,uBAAuB,CACtB,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,eAAe,CAAC,CAAC,QAAQ,CAAC,CAC1B,MAAM,CAAC,CAAC,OAAO,CAAC,CAChB,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,CACrC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAC7C,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,CAC3C,aAAa,CAAC,CAAC,aAAa,CAAC,CAE7B;MAAA,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAC7C;IAAA,EAAE,uBAAuB,CAAC,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAwC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACnF,MAAM,EACJ,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,QAAQ,GACT,GAAG,yBAAyB,EAAE,CAAC;IAEhC,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,MAAM,mBAAmB,GAAG,CAAC,WAAmB,EAAE,IAAa,EAAE,EAAE;QACjE,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE,IAAI,CACjE;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,gBAAgB;YAC3B,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC/C,aAAa,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC;YAChF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC,QAAQ,EAAE,KAAK,CAAC,eAAe;SAChC,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAG,CAAA;QACvD,CAAC;QAED,QAAQ,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAC9B,KAAK,SAAS;gBACZ,OAAO,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAE9C,KAAK,SAAS;gBACZ,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAE5C,KAAK,QAAQ;gBACX,OAAO,CAAC,qBAAqB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAEpD,KAAK,aAAa;gBAChB,OAAO,CAAC,kBAAkB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAEjD,KAAK,UAAU;gBACb,OAAO,CAAC,uBAAuB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAEtD,KAAK,mBAAmB;gBACtB,OAAO,CAAC,wBAAwB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAEvD,KAAK,eAAe;gBAClB,OAAO,CAAC,oBAAoB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAEnD,KAAK,oBAAoB;gBACvB,OAAO,CAAC,yBAAyB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAExD,KAAK,oBAAoB;gBACvB,OAAO,CAAC,yBAAyB,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAExD,KAAK,sBAAsB;gBACzB,OAAO,CAAC,2BAA2B,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAE1D,KAAK,sBAAsB;gBACzB,OAAO,CAAC,2BAA2B,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAE1D,KAAK,uBAAuB;gBAC1B,OAAO,CAAC,4BAA4B,CAAC,IAAI,WAAW,CAAC,EAAG,CAAC;YAE3D;gBACE,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CACvC;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAClC;cAAA,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CACpD;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,IAAI,CAAC,CACR,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAC7C;MAAA,CAAC,KAAK,CAAC,YAAY,IAAI,CACrB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACtC;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAC/D;UAAA,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAC9C;QAAA,EAAE,IAAI,CAAC,CACR,CACD;MAAA,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CACpC;QAAA,CAAC,0CAA0C,CAE3C;;QAAA,CAAC,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAC1D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CACzB;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/B;cAAA,CAAC,CAAC,CAAC,UAAU,EAAE;gBACb,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;gBAC1H,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;aACxC,CAAC,CACJ;YAAA,EAAE,IAAI,CACN;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CACpC;cAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAC9B;gBAAA,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;gBACL,MAAM,CAAC,YAAY;gBACnB,EAAE,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE;aAC1B,CAAC,EAEN;cAAA,EAAE,IAAI,CAER;;YAAA,EAAE,IAAI,CAEN;;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CACxD;cAAA,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAC/F;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAC/E;cAAA,EAAE,gBAAgB,CACpB;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,IAAI,CAER;;QAAA,CAAC,uBAAuB,CACxB;QAAA,CAAC,UAAU,CACT,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CACzB,qBAAqB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACtC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,CACpD,OAAO,CAAC,CAAC,KAAK,CAAC,CAEf;UAAA,CAAC,sBAAsB,EAAE,CAC3B;QAAA,EAAE,UAAU,CAEZ;;QAAA,CAAC,KAAK,CAAC,YAAY,IAAI,CACrB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACtC;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAC/D;YAAA,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAC9C;UAAA,EAAE,IAAI,CAAC,CACR,CACH;MAAA,EAAE,YAAY,CAChB;IAAA,EAAE,IAAI,CAAC,CAER,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;QACP,eAAe,EAAE,SAAS;KAE3B;IACD,MAAM,EAAE;QACN,eAAe,EAAE,OAAO;QACxB,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,SAAS;QAC5B,gBAAgB,EAAE,EAAE;QACpB,SAAS,EAAE,EAAE;QACb,SAAS;QACT,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,CAAC;KACb;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,CAAC;KAChB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,EAAE;KACjB;IACD,iBAAiB,EAAE;IACjB,oBAAoB;KACrB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,CAAC;QACT,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,QAAQ;KACnB;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC;KAChB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,CAAC;KAChB;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,SAAS;QAC1B,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,SAAS;KAC3B;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,CAAC;KAChB;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,EAAE;KACf;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC;KACR;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,EAAE,EAAE,0CAA0C;KAC9D;IACD,UAAU,EAAE;QACV,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;QAC/B,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,OAAO;QACxB,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,SAAS;KAC1B;IACD,SAAS,EAAE;QACT,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,QAAQ;KACrB;IACD,aAAa,EAAE;QACb,eAAe,EAAE,SAAS;KAC3B;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO;KACf;IACD,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE;KACX;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,EAAE;KACZ;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB;IACD,mBAAmB,EAAE;QACnB,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK;QACrC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM;QACvC,eAAe,EAAE,oBAAoB;QACrC,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,QAAQ;KACjB;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,EAAE;KACjB;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,SAAS;KAC3B;IACD,WAAW,EAAE;QACX,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB;IACD,cAAc,EAAE;QACd,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,SAAS;QAC1B,OAAO,EAAE,EAAE;KACZ;IACD,WAAW,EAAE;QACX,SAAS,EAAE,EAAE;QACb,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC;KAChB;IACD,eAAe,EAAE;QACf,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;CACF,CAAC,CAAC","sourcesContent":["import React, { useEffect } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, TouchableOpacity, ActivityIndicator, Dimensions, ScrollView, Platform } from 'react-native';\nimport { KYCTemplate, VerificationState } from '../types/KYC.types';\nimport { TemplateKYCFlowProvider, useTemplateKYCFlowContext } from '../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../hooks/useI18n';\nimport { showAlert } from '../utils/platformAlert';\nimport { IDCardCapture } from './KYCElements/IDCardCapture';\nimport { SelfieCaptureTemplate } from './KYCElements/SelfieCaptureTemplate';\nimport { FileUploadTemplate } from './KYCElements/FileUploadTemplate';\nimport { LocationCaptureTemplate } from './KYCElements/LocationCaptureTemplate';\nimport { CountrySelectionTemplate } from './KYCElements/CountrySelectionTemplate';\nimport { InitializationStep } from './KYCElements/InitializationStep';\nimport { ReviewSubmitTemplate } from './KYCElements/ReviewSubmitTemplate';\nimport { VerificationProgressTemplate } from './KYCElements/VerificationProgressTemplate';\nimport { useTemplateLoader } from '../hooks/useTemplateLoader';\nimport { WelcomeTemplate } from './KYCElements/WelcomeTemplate';\nimport { EmailVerificationTemplate } from './KYCElements/EmailVerificationTemplate';\nimport { PhoneVerificationTemplate } from './KYCElements/PhoneVerificationTemplate';\nimport { PersonalInformationTemplate } from './KYCElements/PersonalInformationTemplate';\nimport { AdditionalDocumentsTemplate } from './KYCElements/AdditionalDocumentsTemplate';\nimport { KycEnvironment, BackendEnvironment } from '../types/env.types';\nimport KYCConfig from '../config/KYCConfig';\n\ninterface TemplateKYCFlowProps {\n template?: KYCTemplate; // Format SDK direct (existing, now optional)\n templateId?: string; // New: ID to load from API\n onComplete?: (data: VerificationState) => void;\n onError?: (error: string) => void;\n language?: string;\n onCancel?: () => void;\n API_KEY?: string; // Required if templateId is used\n env?: KycEnvironment; // Flow execution: PRODUCTION (full AI) or SANDBOX (skip AI)\n serverEnv?: BackendEnvironment; // Backend to call: PRODUCTION or TEST (API URL)\n existingSessionId?: string;\n /** Index in template.components (0-based) to resume at — e.g. from URL component_index or template table */\n initialComponentIndex?: number;\n /** Pays / type de document depuis l'URL de reprise (reprise multi-appareil) */\n initialCountryResume?: { code: string; documentType: string; region?: string };\n onSessionSave?: (sessionId: string) => void;\n}\n\nexport const TemplateKYCFlow: React.FC<TemplateKYCFlowProps> = ({\n template: providedTemplate,\n templateId,\n onComplete,\n onError,\n language = 'fr',\n onCancel,\n API_KEY,\n env = 'PRODUCTION',\n serverEnv,\n existingSessionId,\n initialComponentIndex,\n initialCountryResume,\n onSessionSave,\n}) => {\n const { t } = useI18n();\n const { template: loadedTemplate, isLoading, error, loadTemplate } = useTemplateLoader();\n\n // Which backend URL to call (independent from flow env)\n useEffect(() => {\n if (serverEnv !== undefined) {\n KYCConfig.setBackendEnvironment(serverEnv);\n }\n }, [serverEnv]);\n\n // Validate props\n useEffect(() => {\n if (!providedTemplate && !templateId) {\n const errorMsg = 'Either template or templateId must be provided';\n onError?.(errorMsg);\n return;\n }\n\n if (templateId && !API_KEY) {\n // Try to load without API key (will use token authentication)\n loadTemplate(templateId);\n } else if (templateId && API_KEY) {\n loadTemplate(templateId, API_KEY);\n }\n }, [templateId, API_KEY, providedTemplate, loadTemplate, onError]);\n\n // Handle loading errors\n useEffect(() => {\n if (error) {\n onError?.(error);\n }\n }, [error, onError]);\n\n const OnCancel = () => {\n showAlert(\n t('kyc.cancelConfirmation.title'),\n t('kyc.cancelConfirmation.message'),\n [\n { text: t('kyc.cancelConfirmation.cancelButton'), style: 'cancel' },\n {\n text: t('kyc.cancelConfirmation.confirmButton'),\n onPress: () => {\n onCancel?.();\n }\n },\n ]\n );\n };\n\n // Determine which template to use\n const template = providedTemplate || loadedTemplate;\n\n // Show loading state while fetching template\n if (templateId && isLoading && !template) {\n return (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.loadingText}>{t('common.loading') || 'Loading template...'}</Text>\n </View>\n );\n }\n\n // Show error state if template failed to load\n if (templateId && error && !template) {\n return (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error}</Text>\n <TouchableOpacity\n style={styles.retryButton}\n onPress={() => loadTemplate(templateId, API_KEY)}\n >\n <Text style={styles.retryButtonText}>{t('common.retry') || 'Retry'}</Text>\n </TouchableOpacity>\n </View>\n );\n }\n\n // Show error if no template available\n if (!template) {\n return (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>\n {t('errors.unknownError') || 'Template not available'}\n </Text>\n </View>\n );\n }\n\n return (\n <TemplateKYCFlowProvider\n template={template}\n onComplete={onComplete}\n onError={onError}\n onCancel={OnCancel}\n initialLanguage={language}\n apiKey={API_KEY}\n env={env}\n existingSessionId={existingSessionId}\n initialComponentIndex={initialComponentIndex}\n initialCountryResume={initialCountryResume}\n onSessionSave={onSessionSave}\n >\n <TemplateKYCFlowContent onCancel={OnCancel} />\n </TemplateKYCFlowProvider>\n );\n};\n\nconst TemplateKYCFlowContent: React.FC<{ onCancel?: () => void }> = ({ onCancel }) => {\n const {\n state,\n actions,\n currentComponent,\n progress,\n } = useTemplateKYCFlowContext();\n\n const { t } = useI18n();\n\n const updateComponentData = (componentId: number, data: unknown) => {\n actions.updateComponentData(componentId, data);\n };\n\n if (!currentComponent) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>{t('errors.unknownError')}</Text>\n </View>\n );\n }\n\n // Rendu du composant actuel\n const renderCurrentComponent = () => {\n const commonProps = {\n component: currentComponent,\n value: state.componentData[currentComponent.id],\n onValueChange: (data: unknown) => updateComponentData(currentComponent.id, data),\n error: state.errors[currentComponent.id],\n language: state.currentLanguage,\n };\n\n if (!state.session.isInitialized) {\n return <InitializationStep session={state.session} />\n }\n\n switch (currentComponent.type) {\n case 'welcome':\n return <WelcomeTemplate {...commonProps} />;\n\n case 'id_card':\n return <IDCardCapture {...commonProps} />;\n\n case 'selfie':\n return <SelfieCaptureTemplate {...commonProps} />;\n\n case 'file_upload':\n return <FileUploadTemplate {...commonProps} />;\n\n case 'location':\n return <LocationCaptureTemplate {...commonProps} />;\n\n case 'country_selection':\n return <CountrySelectionTemplate {...commonProps} />;\n\n case 'review_submit':\n return <ReviewSubmitTemplate {...commonProps} />;\n\n case 'email_verification':\n return <EmailVerificationTemplate {...commonProps} />;\n\n case 'phone_verification':\n return <PhoneVerificationTemplate {...commonProps} />;\n\n case 'personal_information':\n return <PersonalInformationTemplate {...commonProps} />;\n\n case 'additional_documents':\n return <AdditionalDocumentsTemplate {...commonProps} />;\n\n case 'verification_progress':\n return <VerificationProgressTemplate {...commonProps} />;\n\n default:\n return (\n <View style={styles.unsupportedContainer}>\n <Text style={styles.unsupportedText}>\n {t('errors.unknownError')}: {currentComponent.type}\n </Text>\n </View>\n );\n }\n };\n\n return (\n <View style={{ flex: 1, position: 'relative' }}>\n {state.isProcessing && (\n <View style={styles.processingContainer}>\n <Text style={styles.processingText}>{t('common.loading')}</Text>\n <ActivityIndicator size=\"large\" color=\"#fff\" />\n </View>\n )}\n <SafeAreaView style={styles.container}>\n {/* Header avec informations sur l'étape */}\n\n {(state.showCustomStepper && state.session.isInitialized) ? (\n <View style={styles.header}>\n <Text style={styles.progressText}>\n {t('kyc.step', {\n current: (state.template.components.findIndex(c => c.id === currentComponent.id) + 1) || (state.currentComponentIndex + 1),\n total: state.template.components.length,\n })}\n </Text>\n <View style={styles.progressContainer}>\n <View style={styles.progressBar}>\n <View\n style={[\n styles.progressFill,\n { width: `${progress}%` }\n ]}\n />\n </View>\n\n </View>\n\n <View style={{ position: 'absolute', right: 12, top: 12 }}>\n <TouchableOpacity onPress={onCancel} disabled={!onCancel} style={{ opacity: onCancel ? 1 : 0.5 }}>\n <Text style={{ fontSize: 20, fontWeight: 'bold', color: '#333' }}>{`X`}</Text>\n </TouchableOpacity>\n </View>\n </View>\n ) : null}\n\n {/* Contenu principal */}\n <ScrollView\n style={styles.scrollView}\n contentContainerStyle={styles.content}\n showsVerticalScrollIndicator={Platform.OS === 'web'}\n bounces={false}\n >\n {renderCurrentComponent()}\n </ScrollView>\n\n {state.isProcessing && (\n <View style={styles.processingContainer}>\n <Text style={styles.processingText}>{t('common.loading')}</Text>\n <ActivityIndicator size=\"large\" color=\"#fff\" />\n </View>\n )}\n </SafeAreaView>\n </View>\n\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n\n },\n header: {\n backgroundColor: 'white',\n paddingVertical: 20,\n paddingHorizontal: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#e0e0e0',\n marginHorizontal: 12,\n marginTop: 12,\n // shadow\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 1.84,\n elevation: 5,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n },\n description: {\n fontSize: 16,\n color: '#666',\n marginBottom: 20,\n },\n progressContainer: {\n // marginBottom: 20,\n },\n progressBar: {\n height: 8,\n backgroundColor: '#e0e0e0',\n borderRadius: 4,\n overflow: 'hidden',\n },\n progressFill: {\n height: '100%',\n backgroundColor: '#2DBD60',\n borderRadius: 4,\n },\n progressText: {\n fontSize: 14,\n color: 'black',\n fontWeight: '600',\n textAlign: 'left',\n marginBottom: 8,\n },\n stepInfo: {\n backgroundColor: '#f8f9fa',\n padding: 16,\n borderRadius: 8,\n borderLeftWidth: 4,\n borderLeftColor: '#2DBD60',\n },\n stepTitle: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginBottom: 8,\n },\n stepDescription: {\n fontSize: 14,\n color: '#666',\n lineHeight: 20,\n },\n scrollView: {\n flex: 1,\n },\n content: {\n flexGrow: 1,\n alignItems: 'center',\n paddingBottom: 20, // Add padding for better mobile scrolling\n },\n navigation: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n padding: 20,\n backgroundColor: 'white',\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n },\n navButton: {\n paddingHorizontal: 24,\n paddingVertical: 12,\n borderRadius: 8,\n minWidth: 100,\n alignItems: 'center',\n },\n primaryButton: {\n backgroundColor: '#2DBD60',\n },\n navButtonText: {\n fontSize: 16,\n fontWeight: '600',\n color: 'white',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 16,\n textAlign: 'center',\n margin: 20,\n },\n unsupportedContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n unsupportedText: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n },\n processingContainer: {\n position: 'absolute',\n flex: 1,\n width: Dimensions.get('window').width,\n height: Dimensions.get('window').height,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 10000000,\n },\n processingText: {\n fontSize: 16,\n color: '#fff',\n textAlign: 'center',\n fontWeight: 'bold',\n marginBottom: 10,\n },\n loadingContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#f5f5f5',\n },\n loadingText: {\n marginTop: 16,\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n },\n errorContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#f5f5f5',\n padding: 20,\n },\n retryButton: {\n marginTop: 20,\n paddingHorizontal: 24,\n paddingVertical: 12,\n backgroundColor: '#2DBD60',\n borderRadius: 8,\n },\n retryButtonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '600',\n },\n}); "]}
@@ -36,6 +36,7 @@ interface TemplateKYCFlowProviderProps {
36
36
  documentType: string;
37
37
  region?: string;
38
38
  };
39
+ onSessionSave?: (sessionId: string) => void;
39
40
  }
40
41
  export declare const TemplateKYCFlowProvider: React.FC<TemplateKYCFlowProviderProps>;
41
42
  export declare const useTemplateKYCFlowContext: () => TemplateKYCFlowContextType;
@@ -43,6 +44,6 @@ export declare const useTemplateKYCFlow: (template: KYCTemplate, onComplete?: (d
43
44
  code: string;
44
45
  documentType: string;
45
46
  region?: string;
46
- }) => UseTemplateReturn;
47
+ }, onSessionSave?: (sessionId: string) => void) => UseTemplateReturn;
47
48
  export {};
48
49
  //# sourceMappingURL=useTemplateKYCFlow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTemplateKYCFlow.d.ts","sourceRoot":"","sources":["../../src/hooks/useTemplateKYCFlow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAA6D,SAAS,EAAa,MAAM,OAAO,CAAC;AAC/G,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAA6C,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAClK,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQpD,UAAU,0BAA0B;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC;IACzB,gBAAgB,EAAE,GAAG,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAA,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACrF,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,UAAU,4BAA4B;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iGAAiG;IACjG,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6GAA6G;IAC7G,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAoB1E,CAAC;AAGF,eAAO,MAAM,yBAAyB,QAAO,0BAM5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,WAAW,EACrB,aAAa,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,EAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,WAAW,MAAM,IAAI,EACrB,kBAAiB,MAAa,EAC9B,SAAS,MAAM,EACf,MAAK,cAA6B,EAClC,oBAAoB,MAAM,EAC1B,wBAAwB,MAAM,EAC9B,uBAAuB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7E,iBAq8BF,CAAC"}
1
+ {"version":3,"file":"useTemplateKYCFlow.d.ts","sourceRoot":"","sources":["../../src/hooks/useTemplateKYCFlow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAA6D,SAAS,EAAqB,MAAM,OAAO,CAAC;AACvH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAA6C,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAClK,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQpD,UAAU,0BAA0B;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC;IACzB,gBAAgB,EAAE,GAAG,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAA,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACrF,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,UAAU,4BAA4B;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iGAAiG;IACjG,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6GAA6G;IAC7G,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAqB1E,CAAC;AAGF,eAAO,MAAM,yBAAyB,QAAO,0BAM5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,WAAW,EACrB,aAAa,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,EAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,WAAW,MAAM,IAAI,EACrB,kBAAiB,MAAa,EAC9B,SAAS,MAAM,EACf,MAAK,cAA6B,EAClC,oBAAoB,MAAM,EAC1B,wBAAwB,MAAM,EAC9B,uBAAuB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9E,gBAAgB,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KAC1C,iBA+8BF,CAAC"}
@@ -1,12 +1,12 @@
1
- import React, { useState, useCallback, useMemo, createContext, useContext, useEffect } from 'react';
1
+ import React, { useState, useCallback, useMemo, createContext, useContext, useEffect, useRef } from 'react';
2
2
  import kycService, { authentification, truncateFields } from '../modules/api/KYCService';
3
3
  import useI18n from './useI18n';
4
4
  import { logger } from '../utils/logger';
5
5
  import { countryMapping } from '../config/region_mapping';
6
6
  import { countryData } from '../config/countriesData';
7
7
  const TemplateKYCFlowContext = createContext(undefined);
8
- export const TemplateKYCFlowProvider = ({ children, template, onComplete, onError, onCancel, initialLanguage = 'en', apiKey, env = 'PRODUCTION', existingSessionId, initialComponentIndex, initialCountryResume, }) => {
9
- const hookResult = useTemplateKYCFlow(template, onComplete, onError, onCancel, initialLanguage, apiKey, env, existingSessionId, initialComponentIndex, initialCountryResume);
8
+ export const TemplateKYCFlowProvider = ({ children, template, onComplete, onError, onCancel, initialLanguage = 'en', apiKey, env = 'PRODUCTION', existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave, }) => {
9
+ const hookResult = useTemplateKYCFlow(template, onComplete, onError, onCancel, initialLanguage, apiKey, env, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave);
10
10
  return (<TemplateKYCFlowContext.Provider value={hookResult}>
11
11
  {children}
12
12
  </TemplateKYCFlowContext.Provider>);
@@ -19,7 +19,7 @@ export const useTemplateKYCFlowContext = () => {
19
19
  }
20
20
  return context;
21
21
  };
22
- export const useTemplateKYCFlow = (template, onComplete, onError, onCancel, initialLanguage = 'en', apiKey, env = 'PRODUCTION', existingSessionId, initialComponentIndex, initialCountryResume) => {
22
+ export const useTemplateKYCFlow = (template, onComplete, onError, onCancel, initialLanguage = 'en', apiKey, env = 'PRODUCTION', existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave) => {
23
23
  const { setLocale } = useI18n();
24
24
  useEffect(() => {
25
25
  setLocale(initialLanguage);
@@ -170,6 +170,7 @@ export const useTemplateKYCFlow = (template, onComplete, onError, onCancel, init
170
170
  };
171
171
  // État du flux
172
172
  const [state, setState] = useState(() => buildInitialState());
173
+ const hasSavedSessionRef = useRef(false);
173
174
  // Fonction utilitaire pour convertir base64 en data URI pour l'affichage
174
175
  const base64ToDataUri = useCallback((base64, mimeType = 'image/jpeg') => {
175
176
  // Si c'est déjà une data URI, retourner tel quel
@@ -616,6 +617,15 @@ export const useTemplateKYCFlow = (template, onComplete, onError, onCancel, init
616
617
  logger.log('Resuming on new device: initializing session so data can load', { existingSessionId, initialComponentIndex });
617
618
  initializeSession();
618
619
  }, [existingSessionId, state.session.session_id, state.session.isInitialized, initializeSession]);
620
+ // Emit session id once when session becomes available.
621
+ useEffect(() => {
622
+ if (!onSessionSave || hasSavedSessionRef.current)
623
+ return;
624
+ if (!state.session.isInitialized || !state.session.session_id)
625
+ return;
626
+ hasSavedSessionRef.current = true;
627
+ onSessionSave(state.session.session_id);
628
+ }, [onSessionSave, state.session.isInitialized, state.session.session_id]);
619
629
  // Validation d'un composant (dataOverride permet de valider sans attendre la mise à jour du state)
620
630
  const validateComponent = useCallback((componentId, dataOverride) => {
621
631
  const component = state.template.components.find(c => c.id === componentId);
@@ -1 +1 @@
1
- {"version":3,"file":"useTemplateKYCFlow.js","sourceRoot":"","sources":["../../src/hooks/useTemplateKYCFlow.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useMemo, createContext, useContext, ReactNode, useEffect } from 'react';\nimport { KYCTemplate, TemplateState, TemplateActions, UseTemplateReturn, TemplateComponent, GovernmentDocumentType, VerificationState } from '../types/KYC.types';\nimport { KycEnvironment } from '../types/env.types';\nimport kycService, { authentification, truncateFields } from '../modules/api/KYCService';\nimport useI18n from './useI18n';\nimport { logger } from '../utils/logger';\nimport { countryMapping } from '../config/region_mapping';\nimport { countryData } from '../config/countriesData';\n\n// Context pour le provider\ninterface TemplateKYCFlowContextType {\n state: TemplateState;\n actions: TemplateActions;\n currentComponent: any;\n progress: number;\n canGoNext: boolean;\n canGoPrevious: boolean;\n isComplete: boolean;\n getLocalizedText: (text: { en: string; fr: string;[key: string]: string }) => string;\n initializeSession: () => Promise<void>;\n env: KycEnvironment;\n apiKey?: string;\n}\n\nconst TemplateKYCFlowContext = createContext<TemplateKYCFlowContextType | undefined>(undefined);\n\n// Provider component\ninterface TemplateKYCFlowProviderProps {\n children: ReactNode;\n template: KYCTemplate;\n onComplete?: (data: VerificationState) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n initialLanguage?: string;\n apiKey?: string;\n env?: KycEnvironment;\n existingSessionId?: string;\n /** Index in template.components where to resume (0-based). Simple to store in template table. */\n initialComponentIndex?: number;\n /** Pays / type de document depuis l'URL de reprise — évite de dépendre du backend pour afficher les pays. */\n initialCountryResume?: { code: string; documentType: string; region?: string };\n}\n\nexport const TemplateKYCFlowProvider: React.FC<TemplateKYCFlowProviderProps> = ({\n children,\n template,\n onComplete,\n onError,\n onCancel,\n initialLanguage = 'en',\n apiKey,\n env = 'PRODUCTION',\n existingSessionId,\n initialComponentIndex,\n initialCountryResume,\n}) => {\n const hookResult = useTemplateKYCFlow(template, onComplete, onError, onCancel, initialLanguage, apiKey, env, existingSessionId, initialComponentIndex, initialCountryResume);\n\n return (\n <TemplateKYCFlowContext.Provider value={hookResult}>\n {children}\n </TemplateKYCFlowContext.Provider>\n );\n};\n\n// Hook pour utiliser le context\nexport const useTemplateKYCFlowContext = (): TemplateKYCFlowContextType => {\n const context = useContext(TemplateKYCFlowContext);\n if (!context) {\n throw new Error('useTemplateKYCFlowContext must be used within a TemplateKYCFlowProvider');\n }\n return context;\n};\n\nexport const useTemplateKYCFlow = (\n template: KYCTemplate,\n onComplete?: (data: VerificationState) => void,\n onError?: (error: string) => void,\n onCancel?: () => void,\n initialLanguage: string = 'en',\n apiKey?: string,\n env: KycEnvironment = 'PRODUCTION',\n existingSessionId?: string,\n initialComponentIndex?: number,\n initialCountryResume?: { code: string; documentType: string; region?: string },\n): UseTemplateReturn => {\n\n const { setLocale } = useI18n();\n\n useEffect(() => {\n setLocale(initialLanguage);\n }, [initialLanguage, apiKey]);\n\n // Helpers to align SDK steps with backend actions/templates\n const isUiOnlyStep = useCallback((type: TemplateComponent['type']) => {\n return type === 'verification_progress';\n }, [apiKey]);\n\n\n\n const ensureReviewSubmitStep = useCallback((tpl: KYCTemplate): KYCTemplate => {\n const hasReview = tpl.components.some(c => c.type === 'review_submit');\n if (hasReview) return tpl;\n\n const lastOrder = tpl.components.reduce((acc, c) => Math.max(acc, c.order ?? 0), 0);\n const lastId = tpl.components.reduce((acc, c) => Math.max(acc, c.id), 0);\n\n const reviewComponent: TemplateComponent = {\n id: lastId + 1,\n type: 'review_submit',\n order: lastOrder + 1,\n labels: { en: 'Review & Submit', fr: 'Revoir & Soumettre' },\n instructions: { en: 'Confirm and submit', fr: 'Confirmer et soumettre' },\n ui: { buttonText: { en: 'Complete Verification', fr: 'Terminer la vérification' } },\n // @ts-ignore - config unused for review component\n config: {},\n } as TemplateComponent;\n\n return {\n ...tpl,\n components: [...tpl.components, reviewComponent],\n };\n }, [apiKey]);\n\n const ensureVerificationProgressStep = useCallback((tpl: KYCTemplate): KYCTemplate => {\n const hasVerification = tpl.components.some(c => c.type === 'verification_progress');\n if (hasVerification) return tpl;\n\n const lastOrder = tpl.components.reduce((acc, c) => Math.max(acc, c.order ?? 0), 0);\n const lastId = tpl.components.reduce((acc, c) => Math.max(acc, c.id), 0);\n\n const verificationComponent: TemplateComponent = {\n id: lastId + 2,\n type: 'verification_progress',\n order: lastOrder + 2,\n labels: { en: 'Verification', fr: 'Vérification' },\n instructions: { en: 'We\\'re reviewing your documents', fr: 'Nous analysons vos documents' },\n ui: { buttonText: { en: '', fr: '' } },\n // @ts-ignore - config unused for progress component\n config: {},\n } as TemplateComponent;\n\n return {\n ...tpl,\n components: [...tpl.components, verificationComponent],\n };\n }, [apiKey]);\n\n const templateWithReview = useMemo(() => ensureReviewSubmitStep(template), [template, ensureReviewSubmitStep, apiKey]);\n const templateWithReviewAndVerification = useMemo(() => ensureVerificationProgressStep(templateWithReview), [templateWithReview, ensureVerificationProgressStep, apiKey]);\n\n // État initial du flux (initialComponentIndex = index dans template.components pour reprendre au bon composant)\n const buildInitialState = (): TemplateState => {\n let resumeAtIndex = 0;\n let completedComponents: number[] = [];\n let initialComponentData: Record<number, unknown> = {};\n\n logger.log('buildInitialState called', { initialComponentIndex, existingSessionId, initialCountryResume });\n\n if (initialComponentIndex !== undefined && initialComponentIndex >= 0) {\n const maxIndex = templateWithReviewAndVerification.components.length - 1;\n const requestedIndex = Math.min(initialComponentIndex, maxIndex);\n const requestedComponent = templateWithReviewAndVerification.components[requestedIndex];\n\n logger.log('Processing initialComponentIndex (component in template)', {\n initialComponentIndex,\n requestedIndex,\n maxIndex,\n componentType: requestedComponent?.type,\n componentId: requestedComponent?.id,\n });\n\n // Reprendre au composant en cours (id_card, selfie, etc.)\n if (requestedComponent?.type === 'id_card') {\n if (existingSessionId) {\n logger.log('id_card with existing session - staying at id_card');\n resumeAtIndex = requestedIndex;\n if (resumeAtIndex > 0) {\n completedComponents = templateWithReviewAndVerification.components\n .slice(0, resumeAtIndex)\n .map(component => component.id);\n }\n } else {\n const countrySelectionIndex = templateWithReviewAndVerification.components.findIndex(\n c => c.type === 'country_selection'\n );\n logger.log('id_card without session - going back to country_selection', { countrySelectionIndex });\n if (countrySelectionIndex >= 0) {\n resumeAtIndex = countrySelectionIndex;\n if (countrySelectionIndex > 0) {\n completedComponents = templateWithReviewAndVerification.components\n .slice(0, countrySelectionIndex)\n .map(component => component.id);\n }\n } else {\n resumeAtIndex = 0;\n }\n }\n } else if (requestedComponent?.type === 'review_submit') {\n resumeAtIndex = requestedIndex;\n completedComponents = [];\n } else {\n resumeAtIndex = requestedIndex;\n if (resumeAtIndex > 0) {\n completedComponents = templateWithReviewAndVerification.components\n .slice(0, resumeAtIndex)\n .map(component => component.id);\n }\n }\n\n logger.log('Final initial state (resume at component index)', {\n resumeAtIndex,\n completedComponentsCount: completedComponents.length,\n componentAtResume: templateWithReviewAndVerification.components[resumeAtIndex]?.type,\n });\n }\n\n if (initialCountryResume?.code && initialCountryResume?.documentType) {\n const countrySel = templateWithReviewAndVerification.components.find(c => c.type === 'country_selection');\n if (countrySel && countryData[initialCountryResume.code]) {\n initialComponentData[countrySel.id] = {\n code: initialCountryResume.code,\n documentType: initialCountryResume.documentType,\n region: initialCountryResume.region || 'root',\n ...countryData[initialCountryResume.code],\n };\n logger.log('Prefilled country_selection from URL', { code: initialCountryResume.code, documentType: initialCountryResume.documentType });\n }\n }\n\n return {\n template: templateWithReviewAndVerification,\n currentComponentIndex: resumeAtIndex,\n completedComponents: completedComponents,\n componentData: initialComponentData,\n errors: {},\n isProcessing: false,\n currentLanguage: initialLanguage,\n showCustomStepper: true,\n session: {\n session_id: existingSessionId || '',\n token: '',\n isInitialized: false,\n isProcessing: false,\n error: null,\n sessionDataRestored: !existingSessionId || Boolean(initialCountryResume?.code && initialCountryResume?.documentType),\n },\n verification: {\n status: 'idle',\n },\n };\n };\n\n // État du flux\n const [state, setState] = useState<TemplateState>(() => buildInitialState());\n \n // Fonction utilitaire pour convertir base64 en data URI pour l'affichage\n const base64ToDataUri = useCallback((base64: string, mimeType: string = 'image/jpeg'): string => {\n // Si c'est déjà une data URI, retourner tel quel\n if (base64.startsWith('data:')) {\n return base64;\n }\n // Sinon, créer une data URI\n return `data:${mimeType};base64,${base64}`;\n }, []);\n\n // Charger les données de session si on reprend une session existante\n useEffect(() => {\n const loadSessionData = async () => {\n // Ne charger que si on a une session existante\n if (!existingSessionId) {\n logger.log('No existingSessionId, skipping data load');\n return;\n }\n\n // Si initialComponentIndex n'est pas défini ou est 0, on ne charge pas (début de session)\n if (initialComponentIndex === undefined || initialComponentIndex === 0) {\n logger.log('initialComponentIndex is 0 or undefined, skipping data load');\n return;\n }\n\n // Attendre que la session soit initialisée\n if (!state.session.isInitialized || !state.session.session_id) {\n logger.log('Session not initialized yet, waiting...', {\n isInitialized: state.session.isInitialized,\n sessionId: state.session.session_id\n });\n return;\n }\n\n try {\n logger.log('Loading session data for resume:', { sessionId: existingSessionId, componentIndex: initialComponentIndex });\n const result = await kycService.getVerificationResult(state.session.session_id);\n const sessionData = result[state.session.session_id]?.data;\n\n if (sessionData) {\n // Restaurer les données des composants depuis la session\n // Utiliser 'as any' car VerificationResult peut avoir des propriétés dynamiques\n const data: any = sessionData;\n const restoredComponentData: Record<number, any> = {};\n\n // Parcourir les composants jusqu'au composant de reprise (inclu) pour restaurer leurs données\n templateWithReviewAndVerification.components\n .slice(0, initialComponentIndex + 1)\n .forEach((component) => {\n // Essayer de restaurer les données selon le type de composant\n if (component.type === 'id_card' || component.type === 'file_upload') {\n // Les documents peuvent être dans différentes structures\n let documents: any = null;\n \n // Chercher dans différentes structures possibles\n if (data.documents) {\n documents = data.documents;\n } else if (data.user_data?.documents) {\n documents = data.user_data.documents;\n } else if (data.document_images) {\n documents = data.document_images;\n }\n\n if (documents) {\n // Convertir les images base64 en format utilisable\n const restoredDocuments: Record<string, any> = {};\n \n Object.keys(documents).forEach((key) => {\n const doc = documents[key];\n if (typeof doc === 'object' && doc !== null) {\n // Si on a un fichier base64, créer une structure avec dir et file\n if (doc.file || doc.base64) {\n const base64Data = doc.file || doc.base64;\n restoredDocuments[key] = {\n dir: base64ToDataUri(base64Data), // Utiliser data URI pour l'affichage\n file: base64Data, // Garder le base64 pour l'envoi\n mrz: doc.mrz || '',\n templatePath: doc.templatePath || '',\n };\n } else {\n // Sinon, garder la structure originale\n restoredDocuments[key] = doc;\n }\n } else if (typeof doc === 'string') {\n // Si c'est directement une string base64\n restoredDocuments[key] = {\n dir: base64ToDataUri(doc),\n file: doc,\n mrz: '',\n templatePath: '',\n };\n }\n });\n\n if (Object.keys(restoredDocuments).length > 0) {\n restoredComponentData[component.id] = restoredDocuments;\n }\n }\n } else if (component.type === 'selfie') {\n // Les selfies peuvent être dans sessionData.selfie_info\n if (data.selfie_info) {\n const selfieData: Record<string, any> = {};\n const selfieInfo: any = data.selfie_info;\n \n // Si selfie_info contient une image\n if (selfieInfo.image) {\n const base64Image = selfieInfo.image;\n selfieData['front'] = {\n dir: base64ToDataUri(base64Image),\n file: base64Image,\n };\n }\n \n // Si on a plusieurs orientations\n if (selfieInfo.orientations) {\n Object.keys(selfieInfo.orientations).forEach((orientation) => {\n const img = selfieInfo.orientations[orientation];\n if (img) {\n selfieData[orientation] = {\n dir: base64ToDataUri(img),\n file: img,\n };\n }\n });\n }\n\n if (Object.keys(selfieData).length > 0) {\n restoredComponentData[component.id] = selfieData;\n }\n }\n } else if (component.type === 'country_selection') {\n // Reconstruire country_selection au format attendu par IDCardCapture / CountrySelectionTemplate (code, documentType, region, regionMapping)\n const meta = data.metadata || data.user_data || data;\n const code = meta.country || meta.country_code || meta.code;\n const documentType = meta.document_type || meta.documentType;\n const region = meta.region;\n if (code && documentType != null) {\n const country = countryData[code];\n const mapping = countryMapping[code as keyof typeof countryMapping];\n if (country) {\n restoredComponentData[component.id] = {\n code,\n ...country,\n documentType,\n region: region || undefined,\n regionMapping: mapping || undefined,\n };\n logger.log('Restored country_selection for resume', { code, documentType, region });\n } else {\n restoredComponentData[component.id] = { code, documentType, region: region || undefined, regionMapping: mapping || undefined };\n }\n } else if (data.metadata || data.user_data) {\n restoredComponentData[component.id] = {\n ...(data.metadata || {}),\n ...(data.user_data || {}),\n };\n }\n } else if (component.type === 'location') {\n // Les données de localisation peuvent être dans metadata\n if (data.metadata?.location || data.user_data?.location) {\n restoredComponentData[component.id] = {\n ...(data.metadata?.location || {}),\n ...(data.user_data?.location || {}),\n };\n }\n }\n });\n\n // Fallback: si pas de country_selection restauré mais on a des documents avec templatePath, déduire code/documentType (ex. \"templates/national_id_CM_front.jpg\")\n const countrySelectionComponent = templateWithReviewAndVerification.components.find(c => c.type === 'country_selection');\n if (countrySelectionComponent && !restoredComponentData[countrySelectionComponent.id] && data.documents) {\n const docs = data.documents as Record<string, { templatePath?: string }>;\n const firstDoc = Object.values(docs).find(d => d?.templatePath);\n const path = firstDoc?.templatePath || '';\n const match = path.match(/([a-z_]+)_([A-Z]{2})(?:_|$)/i) || path.match(/([A-Z]{2})/);\n const code = match ? (match[2] || match[1]).toUpperCase().slice(0, 2) : null;\n const docTypeFromPath = path.match(/(national_id|identity_card|passport|passport_card)/i)?.[1]?.toLowerCase().replace('identity_card', 'national_id') || null;\n if (code && countryData[code]) {\n const documentType = docTypeFromPath || 'national_id';\n const mapping = countryMapping[code as keyof typeof countryMapping];\n const country = countryData[code];\n restoredComponentData[countrySelectionComponent.id] = {\n code,\n ...country,\n documentType,\n region: undefined,\n regionMapping: mapping || undefined,\n };\n logger.log('Restored country_selection from document templatePath', { code, documentType, path });\n }\n }\n\n // Mettre à jour l'état avec les données restaurées\n if (Object.keys(restoredComponentData).length > 0) {\n logger.log('Session data restored - components:', Object.keys(restoredComponentData));\n logger.log('Session data restored - sample data:', truncateFields(restoredComponentData));\n setState(prev => ({\n ...prev,\n componentData: {\n ...prev.componentData,\n ...restoredComponentData,\n },\n session: { ...prev.session, sessionDataRestored: true },\n }));\n logger.log('Component data updated in state');\n } else {\n logger.log('No component data to restore from session');\n setState(prev => ({ ...prev, session: { ...prev.session, sessionDataRestored: true } }));\n }\n } else {\n setState(prev => ({ ...prev, session: { ...prev.session, sessionDataRestored: true } }));\n }\n } catch (error) {\n logger.error('Error loading session data:', truncateFields(error));\n setState(prev => ({ ...prev, session: { ...prev.session, sessionDataRestored: true } }));\n }\n };\n\n loadSessionData();\n }, [existingSessionId, initialComponentIndex, state.session.isInitialized, state.session.session_id, templateWithReviewAndVerification.components, base64ToDataUri]);\n\n // Si l'index pointe vers Review alors que des étapes ne sont pas complétées, ramener à la première étape incomplète\n useEffect(() => {\n const comp = state.template.components[state.currentComponentIndex];\n if (!comp || comp.type !== 'review_submit') return;\n const nonReview = state.template.components.filter(\n c => c.type !== 'review_submit' && c.type !== 'verification_progress'\n );\n if (nonReview.every(c => state.completedComponents.includes(c.id))) return;\n const firstIncomplete = nonReview.find(c => !state.completedComponents.includes(c.id));\n if (!firstIncomplete) return;\n const targetIndex = state.template.components.findIndex(c => c.id === firstIncomplete.id);\n if (targetIndex >= 0 && targetIndex !== state.currentComponentIndex) {\n setState(prev => ({ ...prev, currentComponentIndex: targetIndex }));\n }\n }, [state.currentComponentIndex, state.completedComponents, state.template.components]);\n\n const mapComponentTypeToAction = useCallback((type: TemplateComponent['type']): string | null => {\n switch (type) {\n case 'id_card':\n case 'file_upload':\n return 'document_upload';\n case 'selfie':\n return 'selfie_capture';\n case 'location':\n return 'location_permission';\n case 'review_submit':\n return 'final_submit';\n case 'country_selection':\n // No direct backend action; pack into metadata of next actionable step\n return null;\n case 'welcome':\n // UI-only step, no backend action needed\n return null;\n case 'initialization':\n return 'initialize_session';\n case 'verification_progress':\n return null; // UI-only\n default:\n return null;\n }\n }, []);\n\n const chooseTemplateId = useCallback((tpl: KYCTemplate): string => {\n const types = tpl.components.map(c => c.type);\n const hasLocation = types.includes('location');\n const hasSelfie = types.includes('selfie');\n const hasIdDoc = types.includes('id_card') || types.includes('file_upload');\n // Simple heuristic to map to backend examples\n if (hasLocation && hasSelfie && hasIdDoc) return 'enhanced_id';\n if (hasSelfie && hasIdDoc) return 'standard_passport';\n return 'standard_passport';\n }, [apiKey]);\n\n\n const computeServerStepIndex = useCallback((tpl: KYCTemplate, upToIndex: number): number => {\n // Count actionable steps before the current component (exclude UI-only and country_selection)\n const actionable = tpl.components\n .slice(0, upToIndex)\n .filter(c => !isUiOnlyStep(c.type) && mapComponentTypeToAction(c.type) !== null);\n return actionable.length; // 0-based\n }, [isUiOnlyStep, mapComponentTypeToAction, apiKey]);\n\n // Build backend-friendly payloads per action\n const buildPayloadForComponent = useCallback((action: string | null, component: TemplateComponent, rawData: any, templateId: string, step: number) => {\n console.log('apiKey in buildPayloadForComponent', apiKey);\n\n const base = { template_id: templateId || null, templateId: templateId || null, step: component.order, permissionGranted: true } as any;\n if (!action) {\n return base;\n }\n // Document upload expects documents; include country_selection in metadata so resume can restore it\n if (action === 'document_upload') {\n const documents: Record<string, any> = {};\n if (rawData && typeof rawData === 'object') {\n Object.keys(rawData).forEach((key) => {\n documents[key] = rawData[key];\n });\n }\n const countryComp = state.template.components.find(c => c.type === 'country_selection');\n const countryDataForPayload = countryComp ? state.componentData[countryComp.id] : null;\n const metadata: Record<string, unknown> = {};\n if (countryDataForPayload?.code) {\n metadata.country = countryDataForPayload.code;\n metadata.document_type = countryDataForPayload.documentType;\n if (countryDataForPayload.region != null) metadata.region = countryDataForPayload.region;\n }\n return {\n ...base,\n documents,\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n }\n\n if (action === 'selfie_capture') {\n const documents: Record<string, any> = {};\n if (rawData && typeof rawData === 'object') {\n\n Object.keys(rawData).forEach((key) => {\n documents[key] = rawData[key];\n });\n }\n const idCardID = Object.keys(state.componentData).find((c: string) => c === \"1\");\n if (idCardID) {\n const _idCardData = state.componentData[idCardID];\n const documentType = _idCardData?.documentType;\n // Map national_id to identity_card for selfie capture\n const mappedDocumentType = documentType === 'national_id' ? 'identity_card' : (documentType as GovernmentDocumentType || 'identity_card');\n return { ...base, documents, country: _idCardData?.country || '', documentType: mappedDocumentType };\n }\n return { ...base, documents };\n }\n\n if (action === 'location_permission') {\n return { ...base, ...({ metadata: rawData || {} }), ...({ permissionGranted: true, }) };\n }\n\n // Default: wrap as metadata\n return { ...base, metadata: { ...(rawData || {}) } };\n }, [state.componentData, apiKey]);\n // Ensure the template contains a final review step\n\n // console.log('apiKey in useTemplateKYCFlow', apiKey);\n\n\n // Composant actuel (peut être redirigé si on pointe vers Review alors que le flux n'est pas terminé)\n const currentComponent = useMemo(() => {\n const comp = state.template.components[state.currentComponentIndex] || null;\n if (!comp || comp.type !== 'review_submit') return comp;\n const nonReview = state.template.components.filter(\n c => c.type !== 'review_submit' && c.type !== 'verification_progress'\n );\n const allDone = nonReview.every(c => state.completedComponents.includes(c.id));\n if (allDone) return comp;\n const firstIncomplete = nonReview.find(c => !state.completedComponents.includes(c.id));\n return firstIncomplete || comp;\n }, [state.template.components, state.currentComponentIndex, state.completedComponents, apiKey]);\n\n // Progression du flux (basée sur le composant effectivement affiché)\n const progress = useMemo(() => {\n const idx = currentComponent\n ? state.template.components.findIndex(c => c.id === currentComponent.id)\n : state.currentComponentIndex;\n const i = idx >= 0 ? idx : state.currentComponentIndex;\n return state.template.components.length > 0\n ? ((i + 1) / state.template.components.length) * 100\n : 0;\n }, [currentComponent, state.template.components, state.currentComponentIndex, apiKey]);\n\n // Vérifications de navigation\n const canGoNext = useMemo(() => {\n return state.currentComponentIndex < state.template.components.length - 1;\n }, [state.currentComponentIndex, state.template.components.length, apiKey]);\n\n const canGoPrevious = useMemo(() => {\n return state.currentComponentIndex > 0;\n }, [state.currentComponentIndex, apiKey]);\n\n const isComplete = useMemo(() => {\n const atReview = state.template.components[state.currentComponentIndex]?.type === 'review_submit';\n const nonReviewCount = state.template.components.filter(c => c.type !== 'review_submit').length;\n const completedNonReview = state.completedComponents.length >= nonReviewCount;\n return atReview && completedNonReview;\n }, [state.currentComponentIndex, state.completedComponents.length, state.template.components, apiKey]);\n\n // Fonction pour obtenir le texte localisé\n const getLocalizedText = useCallback((text: { en: string; fr: string;[key: string]: string }): string => {\n return text[state.currentLanguage] || text.en || '';\n }, [state.currentLanguage, apiKey]);\n\n const initializeSession = useCallback(async () => {\n try {\n setState(prev => ({\n ...prev,\n session: {\n ...prev.session,\n isInitialized: false,\n isProcessing: true,\n error: null,\n },\n }));\n logger.log('Initializing session');\n\n const token = apiKey ? undefined : await authentification();\n console.log('token in initializeSession', { token, apiKey },);\n\n // Check if we already have a session ID from URL params (passed via state or prop)\n let session;\n const existingSessionId = state.session.session_id; // This might be set from initial props if we add logic for it\n\n if (existingSessionId && existingSessionId.length > 0) {\n logger.log('Resuming existing session:', existingSessionId);\n // Verify existence/validity if needed, for now trust the ID and just fetch/use it\n session = { session_id: existingSessionId };\n } else {\n session = await kycService.newSession({ token, apiKey });\n }\n\n // Align backend flow from step 0 with initialize_session\n try {\n const templateId = chooseTemplateId(templateWithReviewAndVerification);\n await kycService.verificationSession({\n session_id: session.session_id,\n step: 0,\n data: { template_id: templateId, metadata: { language: initialLanguage } },\n templateId: templateId,\n token: token,\n action: 'initialize_session',\n apiKey: apiKey,\n });\n } catch (e) {\n logger.error('Error initializing session:', JSON.stringify(e, null, 2));\n // Non-fatal: we will surface errors via state below if needed\n }\n\n setState(prev => ({\n ...prev,\n session: {\n ...prev.session,\n session_id: session.session_id,\n token: token,\n isInitialized: true,\n isProcessing: false,\n error: null,\n }\n }));\n } catch (error) {\n\n logger.error('Error initializing session:', JSON.stringify(error, null, 2));\n setState(prev => ({\n ...prev,\n session: {\n ...prev.session,\n isInitialized: false,\n isProcessing: false,\n error: \"Erreur lors de l'initialisation de la session\",\n },\n }));\n }\n }, [apiKey]);\n\n // When user switches device: resume with existingSessionId + initialStep — ensure session is initialized so loadSessionData runs\n useEffect(() => {\n if (!existingSessionId || state.session.isInitialized) return;\n if (state.session.session_id !== existingSessionId) return;\n logger.log('Resuming on new device: initializing session so data can load', { existingSessionId, initialComponentIndex });\n initializeSession();\n }, [existingSessionId, state.session.session_id, state.session.isInitialized, initializeSession]);\n\n // Validation d'un composant (dataOverride permet de valider sans attendre la mise à jour du state)\n const validateComponent = useCallback((componentId: number, dataOverride?: any): boolean => {\n const component = state.template.components.find(c => c.id === componentId);\n if (!component) return false;\n\n const componentData = dataOverride !== undefined ? dataOverride : state.componentData[componentId];\n\n switch (component.type) {\n case 'id_card':\n // Vérifier si au moins un côté a été capturé\n return componentData && Object.keys(componentData).length > 0;\n\n case 'selfie':\n // Vérifier si toutes les orientations ont été capturées\n const config = component.config as any;\n const orientations = config.orientations || ['front'];\n return componentData && orientations.every((orientation: string) => componentData[orientation]);\n\n case 'file_upload':\n // Vérifier si un fichier a été uploadé\n return componentData && componentData.file;\n\n case 'location':\n // Vérifier si la localisation a été obtenue\n return componentData && componentData.latitude && componentData.longitude;\n\n case 'country_selection':\n // Vérifier si un pays a été sélectionné\n logger.log(\"componentData\", truncateFields(componentData), componentId);\n\n return componentData && componentData.code && componentData.regionMapping;\n\n case 'welcome':\n // Welcome is valid once user has given consent (componentData is set when they click Get Started)\n return componentData && componentData.consentGiven !== false;\n\n case 'email_verification':\n return componentData && componentData.verified === true;\n\n case 'phone_verification':\n return componentData && componentData.verified === true;\n\n case 'personal_information':\n return componentData && Object.keys(componentData).length > 0;\n\n case 'additional_documents':\n // Optional by default in template config, but if required we should check based on config\n // For now, return true or check length if present\n return true;\n\n case 'review_submit':\n return true;\n default:\n return false;\n }\n }, [state.template.components, state.componentData, apiKey]);\n\n // Actions du flux\n const actions: TemplateActions = {\n // Initialiser le template\n initializeTemplate: useCallback((newTemplate: KYCTemplate) => {\n const withReview = ensureReviewSubmitStep(newTemplate);\n const withVerification = ensureVerificationProgressStep(withReview);\n setState(prev => ({\n ...prev,\n template: withVerification,\n currentComponentIndex: 0,\n completedComponents: [],\n componentData: {},\n errors: {},\n isProcessing: false,\n verification: { status: 'idle', result: undefined },\n }));\n }, [ensureReviewSubmitStep, ensureVerificationProgressStep, apiKey]),\n\n // Passer au composant suivant (overrideData = données du step courant si déjà connues, évite un double clic)\n nextComponent: useCallback(async (overrideData?: any) => {\n if (!canGoNext) return;\n\n const currentComp = state.template.components[state.currentComponentIndex];\n if (!currentComp) return;\n\n // Prevent multiple simultaneous calls\n setState(prev => {\n if (prev.isProcessing) {\n return prev;\n }\n return {\n ...prev,\n isProcessing: true,\n };\n });\n // Valider avec override ou state\n if (!validateComponent(currentComp.id, overrideData)) {\n setState(prev => ({\n ...prev,\n isProcessing: false,\n errors: {\n ...prev.errors,\n [currentComp.id]: state.currentLanguage === \"en\" ? \"please complete this step before moving on\" : \" 'Veuillez compléter cette étape avant de continuer'\"\n }\n }));\n return;\n\n }\n\n try {\n const component = state.template.components.find(c => c.id === currentComp.id);\n if (!component) {\n setState(prev => ({\n ...prev,\n isProcessing: false,\n }));\n return;\n }\n\n if (component.type === 'review_submit') {\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex + 1,\n completedComponents: [...prev.completedComponents, currentComp.id],\n componentData: overrideData !== undefined ? { ...prev.componentData, [currentComp.id]: overrideData } : prev.componentData,\n isProcessing: false,\n verification: { status: 'in_progress' },\n errors: { ...prev.errors, [currentComp.id]: '' }\n }));\n return;\n }\n // Determine backend action and step index\n const action = mapComponentTypeToAction(component.type);\n const templateId = chooseTemplateId(state.template);\n const serverStep = computeServerStepIndex(state.template, state.currentComponentIndex);\n\n // Optionally send initialize_session at step 0 before first actionable action\n if (serverStep === 0) {\n try {\n // await kycService.verificationSession({\n // sessionId: state.session.session_id,\n // step: 0,\n // data: { template_id: templateId, metadata: { language: state.currentLanguage } },\n // templateId: templateId,\n // token: state.session.token,\n // action: 'initialize_session'\n // });\n } catch (e) {\n // if init fails, surface error below in the main call handling\n }\n }\n\n // Skip UI-only and data-only steps that have no backend action\n if (!action) {\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex + 1,\n completedComponents: [...prev.completedComponents, currentComp.id],\n componentData: overrideData !== undefined ? { ...prev.componentData, [currentComp.id]: overrideData } : prev.componentData,\n isProcessing: false,\n errors: { ...prev.errors, [currentComp.id]: '' }\n }));\n return;\n }\n\n const step = serverStep === 0 && action !== 'initialize_session' ? 1 : serverStep;\n const currentStepData = overrideData !== undefined ? overrideData : state.componentData[currentComp.id];\n const payloadData = buildPayloadForComponent(action, component, currentStepData, templateId, step);\n console.log('payloadData', action, apiKey);\n\n await kycService.verificationSession({\n session_id: state.session.session_id,\n step: step,\n data: payloadData,\n templateId: templateId,\n token: state.session.token,\n action: action,\n apiKey: apiKey ?? \"-\",\n });\n logger.log(\"currentComp state\", truncateFields(state));\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex + 1,\n completedComponents: [...prev.completedComponents, currentComp.id],\n componentData: overrideData !== undefined ? { ...prev.componentData, [currentComp.id]: overrideData } : prev.componentData,\n isProcessing: false,\n ...(action === \"location_permission\" ? { permissionGranted: true } : {}),\n errors: { ...prev.errors, [currentComp.id]: '' }\n }));\n\n } catch (error) {\n logger.error('Error in nextComponent:', error);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n errors: {\n ...prev.errors,\n [currentComp.id]: 'Erreur lors de la validation du composant'\n }\n }));\n }\n\n }, [canGoNext, state.currentComponentIndex, state.template.components, validateComponent, apiKey, state.session.session_id, state.session.token, buildPayloadForComponent, mapComponentTypeToAction, chooseTemplateId, state.currentLanguage]),\n\n // Retourner au composant précédent\n previousComponent: useCallback(() => {\n if (!canGoPrevious) return;\n\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex - 1,\n }));\n }, [canGoPrevious, apiKey]),\n\n // Aller à un composant spécifique\n goToComponent: useCallback((componentId: number) => {\n const componentIndex = state.template.components.findIndex(c => c.id === componentId);\n if (componentIndex !== -1) {\n setState(prev => ({\n ...prev,\n currentComponentIndex: componentIndex,\n }));\n }\n }, [state.template.components, apiKey]),\n\n // Mettre à jour les données d'un composant\n updateComponentData: useCallback((componentId: number, data: any) => {\n logger.log(\"updateComponentData\", componentId, JSON.stringify(truncateFields(data), null, 2));\n\n setState(prev => ({\n ...prev,\n componentData: {\n ...prev.componentData,\n [componentId]: data\n },\n errors: {\n ...prev.errors,\n [componentId]: ''\n }\n }));\n\n }, [apiKey]),\n\n // Valider un composant\n validateComponent: useCallback((componentId: number, dataOverride?: any) => {\n return validateComponent(componentId, dataOverride);\n }, [validateComponent, apiKey]),\n // complet verification\n submitVerification: useCallback(async () => {\n setState(prev => ({ ...prev, isProcessing: true }));\n try {\n onComplete?.(state.verification);\n\n } catch (error) {\n setState(prev => ({ ...prev, isProcessing: false }));\n }\n }, [state.session.session_id, state.verification, onComplete, apiKey]),\n\n // Soumettre le template complet\n submitTemplate: useCallback(async () => {\n // Allow submission when on the review step and all previous steps are valid\n const atReview = state.template.components[state.currentComponentIndex]?.type === 'review_submit';\n const allValid = state.template.components\n .filter(c => c.type !== 'review_submit')\n .every(comp => validateComponent(comp.id));\n if (!(atReview && allValid)) {\n onError?.('Le flux KYC n\\'est pas encore terminé');\n return;\n }\n\n setState(prev => ({ ...prev, isProcessing: true }));\n\n try {\n // Vérifier que tous les composants (hors review) sont validés\n if (!allValid) throw new Error('Certaines étapes ne sont pas complètes');\n\n // Appeler le callback de completion\n // onComplete?.(state.componentData);\n\n setState(prev => ({ ...prev, isProcessing: false }));\n } catch (error) {\n setState(prev => ({ ...prev, isProcessing: false }));\n onError?.(error instanceof Error ? error.message : 'Erreur lors de la soumission');\n }\n }, [state.template.components, state.verification, state.currentComponentIndex, validateComponent, state.componentData, onComplete, onError, apiKey]),\n\n // Réinitialiser le template\n resetTemplate: useCallback(() => {\n setState(buildInitialState());\n }, [buildInitialState, apiKey]),\n\n // Changer la langue\n setLanguage: useCallback((language: string) => {\n setState(prev => ({\n ...prev,\n currentLanguage: language,\n }));\n }, [apiKey]),\n\n // Afficher le stepper personnalisé\n showCustomStepper: useCallback((show: boolean) => {\n setState(prev => ({\n ...prev,\n showCustomStepper: show,\n }));\n }, [apiKey]),\n\n setVerificationState: useCallback((verificationState) => {\n setState(prev => ({\n ...prev,\n verification: verificationState,\n }));\n }, [apiKey]),\n };\n\n return {\n state,\n actions,\n currentComponent,\n progress,\n canGoNext,\n canGoPrevious,\n isComplete,\n getLocalizedText,\n initializeSession,\n env,\n apiKey,\n } as UseTemplateReturn;\n}; "]}
1
+ {"version":3,"file":"useTemplateKYCFlow.js","sourceRoot":"","sources":["../../src/hooks/useTemplateKYCFlow.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useMemo, createContext, useContext, ReactNode, useEffect, useRef } from 'react';\nimport { KYCTemplate, TemplateState, TemplateActions, UseTemplateReturn, TemplateComponent, GovernmentDocumentType, VerificationState } from '../types/KYC.types';\nimport { KycEnvironment } from '../types/env.types';\nimport kycService, { authentification, truncateFields } from '../modules/api/KYCService';\nimport useI18n from './useI18n';\nimport { logger } from '../utils/logger';\nimport { countryMapping } from '../config/region_mapping';\nimport { countryData } from '../config/countriesData';\n\n// Context pour le provider\ninterface TemplateKYCFlowContextType {\n state: TemplateState;\n actions: TemplateActions;\n currentComponent: any;\n progress: number;\n canGoNext: boolean;\n canGoPrevious: boolean;\n isComplete: boolean;\n getLocalizedText: (text: { en: string; fr: string;[key: string]: string }) => string;\n initializeSession: () => Promise<void>;\n env: KycEnvironment;\n apiKey?: string;\n}\n\nconst TemplateKYCFlowContext = createContext<TemplateKYCFlowContextType | undefined>(undefined);\n\n// Provider component\ninterface TemplateKYCFlowProviderProps {\n children: ReactNode;\n template: KYCTemplate;\n onComplete?: (data: VerificationState) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n initialLanguage?: string;\n apiKey?: string;\n env?: KycEnvironment;\n existingSessionId?: string;\n /** Index in template.components where to resume (0-based). Simple to store in template table. */\n initialComponentIndex?: number;\n /** Pays / type de document depuis l'URL de reprise — évite de dépendre du backend pour afficher les pays. */\n initialCountryResume?: { code: string; documentType: string; region?: string };\n onSessionSave?: (sessionId: string) => void;\n}\n\nexport const TemplateKYCFlowProvider: React.FC<TemplateKYCFlowProviderProps> = ({\n children,\n template,\n onComplete,\n onError,\n onCancel,\n initialLanguage = 'en',\n apiKey,\n env = 'PRODUCTION',\n existingSessionId,\n initialComponentIndex,\n initialCountryResume,\n onSessionSave,\n}) => {\n const hookResult = useTemplateKYCFlow(template, onComplete, onError, onCancel, initialLanguage, apiKey, env, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave);\n\n return (\n <TemplateKYCFlowContext.Provider value={hookResult}>\n {children}\n </TemplateKYCFlowContext.Provider>\n );\n};\n\n// Hook pour utiliser le context\nexport const useTemplateKYCFlowContext = (): TemplateKYCFlowContextType => {\n const context = useContext(TemplateKYCFlowContext);\n if (!context) {\n throw new Error('useTemplateKYCFlowContext must be used within a TemplateKYCFlowProvider');\n }\n return context;\n};\n\nexport const useTemplateKYCFlow = (\n template: KYCTemplate,\n onComplete?: (data: VerificationState) => void,\n onError?: (error: string) => void,\n onCancel?: () => void,\n initialLanguage: string = 'en',\n apiKey?: string,\n env: KycEnvironment = 'PRODUCTION',\n existingSessionId?: string,\n initialComponentIndex?: number,\n initialCountryResume?: { code: string; documentType: string; region?: string },\n onSessionSave?: (sessionId: string) => void,\n): UseTemplateReturn => {\n\n const { setLocale } = useI18n();\n\n useEffect(() => {\n setLocale(initialLanguage);\n }, [initialLanguage, apiKey]);\n\n // Helpers to align SDK steps with backend actions/templates\n const isUiOnlyStep = useCallback((type: TemplateComponent['type']) => {\n return type === 'verification_progress';\n }, [apiKey]);\n\n\n\n const ensureReviewSubmitStep = useCallback((tpl: KYCTemplate): KYCTemplate => {\n const hasReview = tpl.components.some(c => c.type === 'review_submit');\n if (hasReview) return tpl;\n\n const lastOrder = tpl.components.reduce((acc, c) => Math.max(acc, c.order ?? 0), 0);\n const lastId = tpl.components.reduce((acc, c) => Math.max(acc, c.id), 0);\n\n const reviewComponent: TemplateComponent = {\n id: lastId + 1,\n type: 'review_submit',\n order: lastOrder + 1,\n labels: { en: 'Review & Submit', fr: 'Revoir & Soumettre' },\n instructions: { en: 'Confirm and submit', fr: 'Confirmer et soumettre' },\n ui: { buttonText: { en: 'Complete Verification', fr: 'Terminer la vérification' } },\n // @ts-ignore - config unused for review component\n config: {},\n } as TemplateComponent;\n\n return {\n ...tpl,\n components: [...tpl.components, reviewComponent],\n };\n }, [apiKey]);\n\n const ensureVerificationProgressStep = useCallback((tpl: KYCTemplate): KYCTemplate => {\n const hasVerification = tpl.components.some(c => c.type === 'verification_progress');\n if (hasVerification) return tpl;\n\n const lastOrder = tpl.components.reduce((acc, c) => Math.max(acc, c.order ?? 0), 0);\n const lastId = tpl.components.reduce((acc, c) => Math.max(acc, c.id), 0);\n\n const verificationComponent: TemplateComponent = {\n id: lastId + 2,\n type: 'verification_progress',\n order: lastOrder + 2,\n labels: { en: 'Verification', fr: 'Vérification' },\n instructions: { en: 'We\\'re reviewing your documents', fr: 'Nous analysons vos documents' },\n ui: { buttonText: { en: '', fr: '' } },\n // @ts-ignore - config unused for progress component\n config: {},\n } as TemplateComponent;\n\n return {\n ...tpl,\n components: [...tpl.components, verificationComponent],\n };\n }, [apiKey]);\n\n const templateWithReview = useMemo(() => ensureReviewSubmitStep(template), [template, ensureReviewSubmitStep, apiKey]);\n const templateWithReviewAndVerification = useMemo(() => ensureVerificationProgressStep(templateWithReview), [templateWithReview, ensureVerificationProgressStep, apiKey]);\n\n // État initial du flux (initialComponentIndex = index dans template.components pour reprendre au bon composant)\n const buildInitialState = (): TemplateState => {\n let resumeAtIndex = 0;\n let completedComponents: number[] = [];\n let initialComponentData: Record<number, unknown> = {};\n\n logger.log('buildInitialState called', { initialComponentIndex, existingSessionId, initialCountryResume });\n\n if (initialComponentIndex !== undefined && initialComponentIndex >= 0) {\n const maxIndex = templateWithReviewAndVerification.components.length - 1;\n const requestedIndex = Math.min(initialComponentIndex, maxIndex);\n const requestedComponent = templateWithReviewAndVerification.components[requestedIndex];\n\n logger.log('Processing initialComponentIndex (component in template)', {\n initialComponentIndex,\n requestedIndex,\n maxIndex,\n componentType: requestedComponent?.type,\n componentId: requestedComponent?.id,\n });\n\n // Reprendre au composant en cours (id_card, selfie, etc.)\n if (requestedComponent?.type === 'id_card') {\n if (existingSessionId) {\n logger.log('id_card with existing session - staying at id_card');\n resumeAtIndex = requestedIndex;\n if (resumeAtIndex > 0) {\n completedComponents = templateWithReviewAndVerification.components\n .slice(0, resumeAtIndex)\n .map(component => component.id);\n }\n } else {\n const countrySelectionIndex = templateWithReviewAndVerification.components.findIndex(\n c => c.type === 'country_selection'\n );\n logger.log('id_card without session - going back to country_selection', { countrySelectionIndex });\n if (countrySelectionIndex >= 0) {\n resumeAtIndex = countrySelectionIndex;\n if (countrySelectionIndex > 0) {\n completedComponents = templateWithReviewAndVerification.components\n .slice(0, countrySelectionIndex)\n .map(component => component.id);\n }\n } else {\n resumeAtIndex = 0;\n }\n }\n } else if (requestedComponent?.type === 'review_submit') {\n resumeAtIndex = requestedIndex;\n completedComponents = [];\n } else {\n resumeAtIndex = requestedIndex;\n if (resumeAtIndex > 0) {\n completedComponents = templateWithReviewAndVerification.components\n .slice(0, resumeAtIndex)\n .map(component => component.id);\n }\n }\n\n logger.log('Final initial state (resume at component index)', {\n resumeAtIndex,\n completedComponentsCount: completedComponents.length,\n componentAtResume: templateWithReviewAndVerification.components[resumeAtIndex]?.type,\n });\n }\n\n if (initialCountryResume?.code && initialCountryResume?.documentType) {\n const countrySel = templateWithReviewAndVerification.components.find(c => c.type === 'country_selection');\n if (countrySel && countryData[initialCountryResume.code]) {\n initialComponentData[countrySel.id] = {\n code: initialCountryResume.code,\n documentType: initialCountryResume.documentType,\n region: initialCountryResume.region || 'root',\n ...countryData[initialCountryResume.code],\n };\n logger.log('Prefilled country_selection from URL', { code: initialCountryResume.code, documentType: initialCountryResume.documentType });\n }\n }\n\n return {\n template: templateWithReviewAndVerification,\n currentComponentIndex: resumeAtIndex,\n completedComponents: completedComponents,\n componentData: initialComponentData,\n errors: {},\n isProcessing: false,\n currentLanguage: initialLanguage,\n showCustomStepper: true,\n session: {\n session_id: existingSessionId || '',\n token: '',\n isInitialized: false,\n isProcessing: false,\n error: null,\n sessionDataRestored: !existingSessionId || Boolean(initialCountryResume?.code && initialCountryResume?.documentType),\n },\n verification: {\n status: 'idle',\n },\n };\n };\n\n // État du flux\n const [state, setState] = useState<TemplateState>(() => buildInitialState());\n const hasSavedSessionRef = useRef(false);\n \n // Fonction utilitaire pour convertir base64 en data URI pour l'affichage\n const base64ToDataUri = useCallback((base64: string, mimeType: string = 'image/jpeg'): string => {\n // Si c'est déjà une data URI, retourner tel quel\n if (base64.startsWith('data:')) {\n return base64;\n }\n // Sinon, créer une data URI\n return `data:${mimeType};base64,${base64}`;\n }, []);\n\n // Charger les données de session si on reprend une session existante\n useEffect(() => {\n const loadSessionData = async () => {\n // Ne charger que si on a une session existante\n if (!existingSessionId) {\n logger.log('No existingSessionId, skipping data load');\n return;\n }\n\n // Si initialComponentIndex n'est pas défini ou est 0, on ne charge pas (début de session)\n if (initialComponentIndex === undefined || initialComponentIndex === 0) {\n logger.log('initialComponentIndex is 0 or undefined, skipping data load');\n return;\n }\n\n // Attendre que la session soit initialisée\n if (!state.session.isInitialized || !state.session.session_id) {\n logger.log('Session not initialized yet, waiting...', {\n isInitialized: state.session.isInitialized,\n sessionId: state.session.session_id\n });\n return;\n }\n\n try {\n logger.log('Loading session data for resume:', { sessionId: existingSessionId, componentIndex: initialComponentIndex });\n const result = await kycService.getVerificationResult(state.session.session_id);\n const sessionData = result[state.session.session_id]?.data;\n\n if (sessionData) {\n // Restaurer les données des composants depuis la session\n // Utiliser 'as any' car VerificationResult peut avoir des propriétés dynamiques\n const data: any = sessionData;\n const restoredComponentData: Record<number, any> = {};\n\n // Parcourir les composants jusqu'au composant de reprise (inclu) pour restaurer leurs données\n templateWithReviewAndVerification.components\n .slice(0, initialComponentIndex + 1)\n .forEach((component) => {\n // Essayer de restaurer les données selon le type de composant\n if (component.type === 'id_card' || component.type === 'file_upload') {\n // Les documents peuvent être dans différentes structures\n let documents: any = null;\n \n // Chercher dans différentes structures possibles\n if (data.documents) {\n documents = data.documents;\n } else if (data.user_data?.documents) {\n documents = data.user_data.documents;\n } else if (data.document_images) {\n documents = data.document_images;\n }\n\n if (documents) {\n // Convertir les images base64 en format utilisable\n const restoredDocuments: Record<string, any> = {};\n \n Object.keys(documents).forEach((key) => {\n const doc = documents[key];\n if (typeof doc === 'object' && doc !== null) {\n // Si on a un fichier base64, créer une structure avec dir et file\n if (doc.file || doc.base64) {\n const base64Data = doc.file || doc.base64;\n restoredDocuments[key] = {\n dir: base64ToDataUri(base64Data), // Utiliser data URI pour l'affichage\n file: base64Data, // Garder le base64 pour l'envoi\n mrz: doc.mrz || '',\n templatePath: doc.templatePath || '',\n };\n } else {\n // Sinon, garder la structure originale\n restoredDocuments[key] = doc;\n }\n } else if (typeof doc === 'string') {\n // Si c'est directement une string base64\n restoredDocuments[key] = {\n dir: base64ToDataUri(doc),\n file: doc,\n mrz: '',\n templatePath: '',\n };\n }\n });\n\n if (Object.keys(restoredDocuments).length > 0) {\n restoredComponentData[component.id] = restoredDocuments;\n }\n }\n } else if (component.type === 'selfie') {\n // Les selfies peuvent être dans sessionData.selfie_info\n if (data.selfie_info) {\n const selfieData: Record<string, any> = {};\n const selfieInfo: any = data.selfie_info;\n \n // Si selfie_info contient une image\n if (selfieInfo.image) {\n const base64Image = selfieInfo.image;\n selfieData['front'] = {\n dir: base64ToDataUri(base64Image),\n file: base64Image,\n };\n }\n \n // Si on a plusieurs orientations\n if (selfieInfo.orientations) {\n Object.keys(selfieInfo.orientations).forEach((orientation) => {\n const img = selfieInfo.orientations[orientation];\n if (img) {\n selfieData[orientation] = {\n dir: base64ToDataUri(img),\n file: img,\n };\n }\n });\n }\n\n if (Object.keys(selfieData).length > 0) {\n restoredComponentData[component.id] = selfieData;\n }\n }\n } else if (component.type === 'country_selection') {\n // Reconstruire country_selection au format attendu par IDCardCapture / CountrySelectionTemplate (code, documentType, region, regionMapping)\n const meta = data.metadata || data.user_data || data;\n const code = meta.country || meta.country_code || meta.code;\n const documentType = meta.document_type || meta.documentType;\n const region = meta.region;\n if (code && documentType != null) {\n const country = countryData[code];\n const mapping = countryMapping[code as keyof typeof countryMapping];\n if (country) {\n restoredComponentData[component.id] = {\n code,\n ...country,\n documentType,\n region: region || undefined,\n regionMapping: mapping || undefined,\n };\n logger.log('Restored country_selection for resume', { code, documentType, region });\n } else {\n restoredComponentData[component.id] = { code, documentType, region: region || undefined, regionMapping: mapping || undefined };\n }\n } else if (data.metadata || data.user_data) {\n restoredComponentData[component.id] = {\n ...(data.metadata || {}),\n ...(data.user_data || {}),\n };\n }\n } else if (component.type === 'location') {\n // Les données de localisation peuvent être dans metadata\n if (data.metadata?.location || data.user_data?.location) {\n restoredComponentData[component.id] = {\n ...(data.metadata?.location || {}),\n ...(data.user_data?.location || {}),\n };\n }\n }\n });\n\n // Fallback: si pas de country_selection restauré mais on a des documents avec templatePath, déduire code/documentType (ex. \"templates/national_id_CM_front.jpg\")\n const countrySelectionComponent = templateWithReviewAndVerification.components.find(c => c.type === 'country_selection');\n if (countrySelectionComponent && !restoredComponentData[countrySelectionComponent.id] && data.documents) {\n const docs = data.documents as Record<string, { templatePath?: string }>;\n const firstDoc = Object.values(docs).find(d => d?.templatePath);\n const path = firstDoc?.templatePath || '';\n const match = path.match(/([a-z_]+)_([A-Z]{2})(?:_|$)/i) || path.match(/([A-Z]{2})/);\n const code = match ? (match[2] || match[1]).toUpperCase().slice(0, 2) : null;\n const docTypeFromPath = path.match(/(national_id|identity_card|passport|passport_card)/i)?.[1]?.toLowerCase().replace('identity_card', 'national_id') || null;\n if (code && countryData[code]) {\n const documentType = docTypeFromPath || 'national_id';\n const mapping = countryMapping[code as keyof typeof countryMapping];\n const country = countryData[code];\n restoredComponentData[countrySelectionComponent.id] = {\n code,\n ...country,\n documentType,\n region: undefined,\n regionMapping: mapping || undefined,\n };\n logger.log('Restored country_selection from document templatePath', { code, documentType, path });\n }\n }\n\n // Mettre à jour l'état avec les données restaurées\n if (Object.keys(restoredComponentData).length > 0) {\n logger.log('Session data restored - components:', Object.keys(restoredComponentData));\n logger.log('Session data restored - sample data:', truncateFields(restoredComponentData));\n setState(prev => ({\n ...prev,\n componentData: {\n ...prev.componentData,\n ...restoredComponentData,\n },\n session: { ...prev.session, sessionDataRestored: true },\n }));\n logger.log('Component data updated in state');\n } else {\n logger.log('No component data to restore from session');\n setState(prev => ({ ...prev, session: { ...prev.session, sessionDataRestored: true } }));\n }\n } else {\n setState(prev => ({ ...prev, session: { ...prev.session, sessionDataRestored: true } }));\n }\n } catch (error) {\n logger.error('Error loading session data:', truncateFields(error));\n setState(prev => ({ ...prev, session: { ...prev.session, sessionDataRestored: true } }));\n }\n };\n\n loadSessionData();\n }, [existingSessionId, initialComponentIndex, state.session.isInitialized, state.session.session_id, templateWithReviewAndVerification.components, base64ToDataUri]);\n\n // Si l'index pointe vers Review alors que des étapes ne sont pas complétées, ramener à la première étape incomplète\n useEffect(() => {\n const comp = state.template.components[state.currentComponentIndex];\n if (!comp || comp.type !== 'review_submit') return;\n const nonReview = state.template.components.filter(\n c => c.type !== 'review_submit' && c.type !== 'verification_progress'\n );\n if (nonReview.every(c => state.completedComponents.includes(c.id))) return;\n const firstIncomplete = nonReview.find(c => !state.completedComponents.includes(c.id));\n if (!firstIncomplete) return;\n const targetIndex = state.template.components.findIndex(c => c.id === firstIncomplete.id);\n if (targetIndex >= 0 && targetIndex !== state.currentComponentIndex) {\n setState(prev => ({ ...prev, currentComponentIndex: targetIndex }));\n }\n }, [state.currentComponentIndex, state.completedComponents, state.template.components]);\n\n const mapComponentTypeToAction = useCallback((type: TemplateComponent['type']): string | null => {\n switch (type) {\n case 'id_card':\n case 'file_upload':\n return 'document_upload';\n case 'selfie':\n return 'selfie_capture';\n case 'location':\n return 'location_permission';\n case 'review_submit':\n return 'final_submit';\n case 'country_selection':\n // No direct backend action; pack into metadata of next actionable step\n return null;\n case 'welcome':\n // UI-only step, no backend action needed\n return null;\n case 'initialization':\n return 'initialize_session';\n case 'verification_progress':\n return null; // UI-only\n default:\n return null;\n }\n }, []);\n\n const chooseTemplateId = useCallback((tpl: KYCTemplate): string => {\n const types = tpl.components.map(c => c.type);\n const hasLocation = types.includes('location');\n const hasSelfie = types.includes('selfie');\n const hasIdDoc = types.includes('id_card') || types.includes('file_upload');\n // Simple heuristic to map to backend examples\n if (hasLocation && hasSelfie && hasIdDoc) return 'enhanced_id';\n if (hasSelfie && hasIdDoc) return 'standard_passport';\n return 'standard_passport';\n }, [apiKey]);\n\n\n const computeServerStepIndex = useCallback((tpl: KYCTemplate, upToIndex: number): number => {\n // Count actionable steps before the current component (exclude UI-only and country_selection)\n const actionable = tpl.components\n .slice(0, upToIndex)\n .filter(c => !isUiOnlyStep(c.type) && mapComponentTypeToAction(c.type) !== null);\n return actionable.length; // 0-based\n }, [isUiOnlyStep, mapComponentTypeToAction, apiKey]);\n\n // Build backend-friendly payloads per action\n const buildPayloadForComponent = useCallback((action: string | null, component: TemplateComponent, rawData: any, templateId: string, step: number) => {\n console.log('apiKey in buildPayloadForComponent', apiKey);\n\n const base = { template_id: templateId || null, templateId: templateId || null, step: component.order, permissionGranted: true } as any;\n if (!action) {\n return base;\n }\n // Document upload expects documents; include country_selection in metadata so resume can restore it\n if (action === 'document_upload') {\n const documents: Record<string, any> = {};\n if (rawData && typeof rawData === 'object') {\n Object.keys(rawData).forEach((key) => {\n documents[key] = rawData[key];\n });\n }\n const countryComp = state.template.components.find(c => c.type === 'country_selection');\n const countryDataForPayload = countryComp ? state.componentData[countryComp.id] : null;\n const metadata: Record<string, unknown> = {};\n if (countryDataForPayload?.code) {\n metadata.country = countryDataForPayload.code;\n metadata.document_type = countryDataForPayload.documentType;\n if (countryDataForPayload.region != null) metadata.region = countryDataForPayload.region;\n }\n return {\n ...base,\n documents,\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n }\n\n if (action === 'selfie_capture') {\n const documents: Record<string, any> = {};\n if (rawData && typeof rawData === 'object') {\n\n Object.keys(rawData).forEach((key) => {\n documents[key] = rawData[key];\n });\n }\n const idCardID = Object.keys(state.componentData).find((c: string) => c === \"1\");\n if (idCardID) {\n const _idCardData = state.componentData[idCardID];\n const documentType = _idCardData?.documentType;\n // Map national_id to identity_card for selfie capture\n const mappedDocumentType = documentType === 'national_id' ? 'identity_card' : (documentType as GovernmentDocumentType || 'identity_card');\n return { ...base, documents, country: _idCardData?.country || '', documentType: mappedDocumentType };\n }\n return { ...base, documents };\n }\n\n if (action === 'location_permission') {\n return { ...base, ...({ metadata: rawData || {} }), ...({ permissionGranted: true, }) };\n }\n\n // Default: wrap as metadata\n return { ...base, metadata: { ...(rawData || {}) } };\n }, [state.componentData, apiKey]);\n // Ensure the template contains a final review step\n\n // console.log('apiKey in useTemplateKYCFlow', apiKey);\n\n\n // Composant actuel (peut être redirigé si on pointe vers Review alors que le flux n'est pas terminé)\n const currentComponent = useMemo(() => {\n const comp = state.template.components[state.currentComponentIndex] || null;\n if (!comp || comp.type !== 'review_submit') return comp;\n const nonReview = state.template.components.filter(\n c => c.type !== 'review_submit' && c.type !== 'verification_progress'\n );\n const allDone = nonReview.every(c => state.completedComponents.includes(c.id));\n if (allDone) return comp;\n const firstIncomplete = nonReview.find(c => !state.completedComponents.includes(c.id));\n return firstIncomplete || comp;\n }, [state.template.components, state.currentComponentIndex, state.completedComponents, apiKey]);\n\n // Progression du flux (basée sur le composant effectivement affiché)\n const progress = useMemo(() => {\n const idx = currentComponent\n ? state.template.components.findIndex(c => c.id === currentComponent.id)\n : state.currentComponentIndex;\n const i = idx >= 0 ? idx : state.currentComponentIndex;\n return state.template.components.length > 0\n ? ((i + 1) / state.template.components.length) * 100\n : 0;\n }, [currentComponent, state.template.components, state.currentComponentIndex, apiKey]);\n\n // Vérifications de navigation\n const canGoNext = useMemo(() => {\n return state.currentComponentIndex < state.template.components.length - 1;\n }, [state.currentComponentIndex, state.template.components.length, apiKey]);\n\n const canGoPrevious = useMemo(() => {\n return state.currentComponentIndex > 0;\n }, [state.currentComponentIndex, apiKey]);\n\n const isComplete = useMemo(() => {\n const atReview = state.template.components[state.currentComponentIndex]?.type === 'review_submit';\n const nonReviewCount = state.template.components.filter(c => c.type !== 'review_submit').length;\n const completedNonReview = state.completedComponents.length >= nonReviewCount;\n return atReview && completedNonReview;\n }, [state.currentComponentIndex, state.completedComponents.length, state.template.components, apiKey]);\n\n // Fonction pour obtenir le texte localisé\n const getLocalizedText = useCallback((text: { en: string; fr: string;[key: string]: string }): string => {\n return text[state.currentLanguage] || text.en || '';\n }, [state.currentLanguage, apiKey]);\n\n const initializeSession = useCallback(async () => {\n try {\n setState(prev => ({\n ...prev,\n session: {\n ...prev.session,\n isInitialized: false,\n isProcessing: true,\n error: null,\n },\n }));\n logger.log('Initializing session');\n\n const token = apiKey ? undefined : await authentification();\n console.log('token in initializeSession', { token, apiKey },);\n\n // Check if we already have a session ID from URL params (passed via state or prop)\n let session;\n const existingSessionId = state.session.session_id; // This might be set from initial props if we add logic for it\n\n if (existingSessionId && existingSessionId.length > 0) {\n logger.log('Resuming existing session:', existingSessionId);\n // Verify existence/validity if needed, for now trust the ID and just fetch/use it\n session = { session_id: existingSessionId };\n } else {\n session = await kycService.newSession({ token, apiKey });\n }\n\n // Align backend flow from step 0 with initialize_session\n try {\n const templateId = chooseTemplateId(templateWithReviewAndVerification);\n await kycService.verificationSession({\n session_id: session.session_id,\n step: 0,\n data: { template_id: templateId, metadata: { language: initialLanguage } },\n templateId: templateId,\n token: token,\n action: 'initialize_session',\n apiKey: apiKey,\n });\n } catch (e) {\n logger.error('Error initializing session:', JSON.stringify(e, null, 2));\n // Non-fatal: we will surface errors via state below if needed\n }\n\n setState(prev => ({\n ...prev,\n session: {\n ...prev.session,\n session_id: session.session_id,\n token: token,\n isInitialized: true,\n isProcessing: false,\n error: null,\n }\n }));\n } catch (error) {\n\n logger.error('Error initializing session:', JSON.stringify(error, null, 2));\n setState(prev => ({\n ...prev,\n session: {\n ...prev.session,\n isInitialized: false,\n isProcessing: false,\n error: \"Erreur lors de l'initialisation de la session\",\n },\n }));\n }\n }, [apiKey]);\n\n // When user switches device: resume with existingSessionId + initialStep — ensure session is initialized so loadSessionData runs\n useEffect(() => {\n if (!existingSessionId || state.session.isInitialized) return;\n if (state.session.session_id !== existingSessionId) return;\n logger.log('Resuming on new device: initializing session so data can load', { existingSessionId, initialComponentIndex });\n initializeSession();\n }, [existingSessionId, state.session.session_id, state.session.isInitialized, initializeSession]);\n\n // Emit session id once when session becomes available.\n useEffect(() => {\n if (!onSessionSave || hasSavedSessionRef.current) return;\n if (!state.session.isInitialized || !state.session.session_id) return;\n\n hasSavedSessionRef.current = true;\n onSessionSave(state.session.session_id);\n }, [onSessionSave, state.session.isInitialized, state.session.session_id]);\n\n // Validation d'un composant (dataOverride permet de valider sans attendre la mise à jour du state)\n const validateComponent = useCallback((componentId: number, dataOverride?: any): boolean => {\n const component = state.template.components.find(c => c.id === componentId);\n if (!component) return false;\n\n const componentData = dataOverride !== undefined ? dataOverride : state.componentData[componentId];\n\n switch (component.type) {\n case 'id_card':\n // Vérifier si au moins un côté a été capturé\n return componentData && Object.keys(componentData).length > 0;\n\n case 'selfie':\n // Vérifier si toutes les orientations ont été capturées\n const config = component.config as any;\n const orientations = config.orientations || ['front'];\n return componentData && orientations.every((orientation: string) => componentData[orientation]);\n\n case 'file_upload':\n // Vérifier si un fichier a été uploadé\n return componentData && componentData.file;\n\n case 'location':\n // Vérifier si la localisation a été obtenue\n return componentData && componentData.latitude && componentData.longitude;\n\n case 'country_selection':\n // Vérifier si un pays a été sélectionné\n logger.log(\"componentData\", truncateFields(componentData), componentId);\n\n return componentData && componentData.code && componentData.regionMapping;\n\n case 'welcome':\n // Welcome is valid once user has given consent (componentData is set when they click Get Started)\n return componentData && componentData.consentGiven !== false;\n\n case 'email_verification':\n return componentData && componentData.verified === true;\n\n case 'phone_verification':\n return componentData && componentData.verified === true;\n\n case 'personal_information':\n return componentData && Object.keys(componentData).length > 0;\n\n case 'additional_documents':\n // Optional by default in template config, but if required we should check based on config\n // For now, return true or check length if present\n return true;\n\n case 'review_submit':\n return true;\n default:\n return false;\n }\n }, [state.template.components, state.componentData, apiKey]);\n\n // Actions du flux\n const actions: TemplateActions = {\n // Initialiser le template\n initializeTemplate: useCallback((newTemplate: KYCTemplate) => {\n const withReview = ensureReviewSubmitStep(newTemplate);\n const withVerification = ensureVerificationProgressStep(withReview);\n setState(prev => ({\n ...prev,\n template: withVerification,\n currentComponentIndex: 0,\n completedComponents: [],\n componentData: {},\n errors: {},\n isProcessing: false,\n verification: { status: 'idle', result: undefined },\n }));\n }, [ensureReviewSubmitStep, ensureVerificationProgressStep, apiKey]),\n\n // Passer au composant suivant (overrideData = données du step courant si déjà connues, évite un double clic)\n nextComponent: useCallback(async (overrideData?: any) => {\n if (!canGoNext) return;\n\n const currentComp = state.template.components[state.currentComponentIndex];\n if (!currentComp) return;\n\n // Prevent multiple simultaneous calls\n setState(prev => {\n if (prev.isProcessing) {\n return prev;\n }\n return {\n ...prev,\n isProcessing: true,\n };\n });\n // Valider avec override ou state\n if (!validateComponent(currentComp.id, overrideData)) {\n setState(prev => ({\n ...prev,\n isProcessing: false,\n errors: {\n ...prev.errors,\n [currentComp.id]: state.currentLanguage === \"en\" ? \"please complete this step before moving on\" : \" 'Veuillez compléter cette étape avant de continuer'\"\n }\n }));\n return;\n\n }\n\n try {\n const component = state.template.components.find(c => c.id === currentComp.id);\n if (!component) {\n setState(prev => ({\n ...prev,\n isProcessing: false,\n }));\n return;\n }\n\n if (component.type === 'review_submit') {\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex + 1,\n completedComponents: [...prev.completedComponents, currentComp.id],\n componentData: overrideData !== undefined ? { ...prev.componentData, [currentComp.id]: overrideData } : prev.componentData,\n isProcessing: false,\n verification: { status: 'in_progress' },\n errors: { ...prev.errors, [currentComp.id]: '' }\n }));\n return;\n }\n // Determine backend action and step index\n const action = mapComponentTypeToAction(component.type);\n const templateId = chooseTemplateId(state.template);\n const serverStep = computeServerStepIndex(state.template, state.currentComponentIndex);\n\n // Optionally send initialize_session at step 0 before first actionable action\n if (serverStep === 0) {\n try {\n // await kycService.verificationSession({\n // sessionId: state.session.session_id,\n // step: 0,\n // data: { template_id: templateId, metadata: { language: state.currentLanguage } },\n // templateId: templateId,\n // token: state.session.token,\n // action: 'initialize_session'\n // });\n } catch (e) {\n // if init fails, surface error below in the main call handling\n }\n }\n\n // Skip UI-only and data-only steps that have no backend action\n if (!action) {\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex + 1,\n completedComponents: [...prev.completedComponents, currentComp.id],\n componentData: overrideData !== undefined ? { ...prev.componentData, [currentComp.id]: overrideData } : prev.componentData,\n isProcessing: false,\n errors: { ...prev.errors, [currentComp.id]: '' }\n }));\n return;\n }\n\n const step = serverStep === 0 && action !== 'initialize_session' ? 1 : serverStep;\n const currentStepData = overrideData !== undefined ? overrideData : state.componentData[currentComp.id];\n const payloadData = buildPayloadForComponent(action, component, currentStepData, templateId, step);\n console.log('payloadData', action, apiKey);\n\n await kycService.verificationSession({\n session_id: state.session.session_id,\n step: step,\n data: payloadData,\n templateId: templateId,\n token: state.session.token,\n action: action,\n apiKey: apiKey ?? \"-\",\n });\n logger.log(\"currentComp state\", truncateFields(state));\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex + 1,\n completedComponents: [...prev.completedComponents, currentComp.id],\n componentData: overrideData !== undefined ? { ...prev.componentData, [currentComp.id]: overrideData } : prev.componentData,\n isProcessing: false,\n ...(action === \"location_permission\" ? { permissionGranted: true } : {}),\n errors: { ...prev.errors, [currentComp.id]: '' }\n }));\n\n } catch (error) {\n logger.error('Error in nextComponent:', error);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n errors: {\n ...prev.errors,\n [currentComp.id]: 'Erreur lors de la validation du composant'\n }\n }));\n }\n\n }, [canGoNext, state.currentComponentIndex, state.template.components, validateComponent, apiKey, state.session.session_id, state.session.token, buildPayloadForComponent, mapComponentTypeToAction, chooseTemplateId, state.currentLanguage]),\n\n // Retourner au composant précédent\n previousComponent: useCallback(() => {\n if (!canGoPrevious) return;\n\n setState(prev => ({\n ...prev,\n currentComponentIndex: prev.currentComponentIndex - 1,\n }));\n }, [canGoPrevious, apiKey]),\n\n // Aller à un composant spécifique\n goToComponent: useCallback((componentId: number) => {\n const componentIndex = state.template.components.findIndex(c => c.id === componentId);\n if (componentIndex !== -1) {\n setState(prev => ({\n ...prev,\n currentComponentIndex: componentIndex,\n }));\n }\n }, [state.template.components, apiKey]),\n\n // Mettre à jour les données d'un composant\n updateComponentData: useCallback((componentId: number, data: any) => {\n logger.log(\"updateComponentData\", componentId, JSON.stringify(truncateFields(data), null, 2));\n\n setState(prev => ({\n ...prev,\n componentData: {\n ...prev.componentData,\n [componentId]: data\n },\n errors: {\n ...prev.errors,\n [componentId]: ''\n }\n }));\n\n }, [apiKey]),\n\n // Valider un composant\n validateComponent: useCallback((componentId: number, dataOverride?: any) => {\n return validateComponent(componentId, dataOverride);\n }, [validateComponent, apiKey]),\n // complet verification\n submitVerification: useCallback(async () => {\n setState(prev => ({ ...prev, isProcessing: true }));\n try {\n onComplete?.(state.verification);\n\n } catch (error) {\n setState(prev => ({ ...prev, isProcessing: false }));\n }\n }, [state.session.session_id, state.verification, onComplete, apiKey]),\n\n // Soumettre le template complet\n submitTemplate: useCallback(async () => {\n // Allow submission when on the review step and all previous steps are valid\n const atReview = state.template.components[state.currentComponentIndex]?.type === 'review_submit';\n const allValid = state.template.components\n .filter(c => c.type !== 'review_submit')\n .every(comp => validateComponent(comp.id));\n if (!(atReview && allValid)) {\n onError?.('Le flux KYC n\\'est pas encore terminé');\n return;\n }\n\n setState(prev => ({ ...prev, isProcessing: true }));\n\n try {\n // Vérifier que tous les composants (hors review) sont validés\n if (!allValid) throw new Error('Certaines étapes ne sont pas complètes');\n\n // Appeler le callback de completion\n // onComplete?.(state.componentData);\n\n setState(prev => ({ ...prev, isProcessing: false }));\n } catch (error) {\n setState(prev => ({ ...prev, isProcessing: false }));\n onError?.(error instanceof Error ? error.message : 'Erreur lors de la soumission');\n }\n }, [state.template.components, state.verification, state.currentComponentIndex, validateComponent, state.componentData, onComplete, onError, apiKey]),\n\n // Réinitialiser le template\n resetTemplate: useCallback(() => {\n setState(buildInitialState());\n }, [buildInitialState, apiKey]),\n\n // Changer la langue\n setLanguage: useCallback((language: string) => {\n setState(prev => ({\n ...prev,\n currentLanguage: language,\n }));\n }, [apiKey]),\n\n // Afficher le stepper personnalisé\n showCustomStepper: useCallback((show: boolean) => {\n setState(prev => ({\n ...prev,\n showCustomStepper: show,\n }));\n }, [apiKey]),\n\n setVerificationState: useCallback((verificationState) => {\n setState(prev => ({\n ...prev,\n verification: verificationState,\n }));\n }, [apiKey]),\n };\n\n return {\n state,\n actions,\n currentComponent,\n progress,\n canGoNext,\n canGoPrevious,\n isComplete,\n getLocalizedText,\n initializeSession,\n env,\n apiKey,\n } as UseTemplateReturn;\n}; "]}
@@ -3,6 +3,7 @@ interface WebKYCEntryProps {
3
3
  onComplete?: (data: any) => void;
4
4
  onError?: (error: string) => void;
5
5
  onCancel?: () => void;
6
+ onSessionSave?: (sessionId: string) => void;
6
7
  }
7
8
  declare const WebKYCEntry: React.FC<WebKYCEntryProps>;
8
9
  export default WebKYCEntry;
@@ -1 +1 @@
1
- {"version":3,"file":"WebKYCEntry.d.ts","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAUhE,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AA0BD,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAoR3C,CAAC;AA0DF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"WebKYCEntry.d.ts","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAUhE,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AA2BD,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA2T3C,CAAC;AA0DF,eAAe,WAAW,CAAC"}
@@ -6,7 +6,7 @@ import { useI18n } from '../hooks/useI18n';
6
6
  import { TemplateKYCExample } from '../components/TemplateKYCExample';
7
7
  import { isCallbackUrlAllowed } from '../config/allowedDomains';
8
8
  import KYCConfig from '../config/KYCConfig';
9
- const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
9
+ const WebKYCEntry = ({ onComplete, onError, onCancel, onSessionSave, }) => {
10
10
  const { setLocale } = useI18n();
11
11
  const [urlParams, setUrlParams] = useState({});
12
12
  const [isLoading, setIsLoading] = useState(true);
@@ -27,6 +27,7 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
27
27
  token: urlParams.get('token') || undefined,
28
28
  return_url: urlParams.get('return_url') || undefined,
29
29
  push_url: urlParams.get('push_url') || undefined,
30
+ save_session_url: urlParams.get('save_session_url') || undefined,
30
31
  lang: urlParams.get('lang') || 'en',
31
32
  theme: urlParams.get('theme') || 'light',
32
33
  kyc_id: urlParams.get('kyc_id') || undefined,
@@ -176,6 +177,37 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
176
177
  });
177
178
  onCancel?.();
178
179
  }, [redirectToReturnUrl, urlParams.kyc_id, onCancel]);
180
+ const handleSessionSave = useCallback(async (sessionId) => {
181
+ console.log('KYC session created:', sessionId);
182
+ if (urlParams.save_session_url) {
183
+ try {
184
+ const payload = {
185
+ status: 'session_created',
186
+ result: {
187
+ session_id: sessionId,
188
+ kyc_id: sessionId,
189
+ },
190
+ };
191
+ const controller = new AbortController();
192
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
193
+ await fetch(urlParams.save_session_url, {
194
+ method: 'POST',
195
+ headers: {
196
+ 'Content-Type': 'application/json',
197
+ },
198
+ body: JSON.stringify(payload),
199
+ signal: controller.signal,
200
+ });
201
+ clearTimeout(timeoutId);
202
+ console.log('Successfully pushed session data to save_session_url');
203
+ }
204
+ catch (err) {
205
+ // Fail open - do not block the KYC flow if save_session webhook fails
206
+ console.warn('Failed to push session data to save_session_url:', err);
207
+ }
208
+ }
209
+ onSessionSave?.(sessionId);
210
+ }, [urlParams.save_session_url, onSessionSave]);
179
211
  // Initialize component
180
212
  useEffect(() => {
181
213
  try {
@@ -226,7 +258,7 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
226
258
  return undefined;
227
259
  const index = parseInt(raw, 10);
228
260
  return Number.isNaN(index) ? undefined : index;
229
- })()} initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined}/>
261
+ })()} initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined} onSessionSave={handleSessionSave}/>
230
262
  </SafeAreaView>);
231
263
  };
232
264
  const styles = StyleSheet.create({
@@ -1 +1 @@
1
- {"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\n// import { TemplateKYCFlow } from '../components/TemplateKYCFlowRefactored';\n// import { KYCTemplate } from '../types/KYC.types';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed } from '../config/allowedDomains';\nimport KYCConfig from '../config/KYCConfig';\nimport { BackendEnvironment } from '../types/env.types';\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string; // Optional secret for signature generation\n env?: 'PRODUCTION' | 'SANDBOX'; // Environment mode\n template_id?: string; // Template ID for dynamic template loading\n server_env?: BackendEnvironment; // Backend environment mode\n step?: string; // Deprecated: use component_index.\n component_index?: string; // Index in template.components (0-based) to resume at\n country?: string; // Code pays pour restaurer la sélection (reprise multi-appareil)\n document_type?: string; // Type de document (national_id, passport, etc.)\n region?: string; // Région si applicable\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\nconst WebKYCEntry: React.FC<WebKYCEntryProps> = ({\n onComplete,\n onError,\n onCancel,\n}) => {\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n // Parse URL parameters\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n\n const urlParams = new URLSearchParams(window.location.search);\n const envParam = urlParams.get('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n\n const serverEnvParam = urlParams.get('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION'\n ? (serverEnvParam as BackendEnvironment)\n : 'PRODUCTION';\n\n return {\n token: urlParams.get('token') || undefined,\n return_url: urlParams.get('return_url') || undefined,\n push_url: urlParams.get('push_url') || undefined,\n lang: urlParams.get('lang') || 'en',\n theme: urlParams.get('theme') || 'light',\n kyc_id: urlParams.get('kyc_id') || undefined,\n secret: urlParams.get('secret') || undefined,\n env: validEnv,\n template_id: urlParams.get('template_id') || undefined,\n server_env: validServerEnv,\n step: urlParams.get('step') || undefined,\n component_index: urlParams.get('component_index') || undefined,\n country: urlParams.get('country') || undefined,\n document_type: urlParams.get('document_type') || undefined,\n region: urlParams.get('region') || undefined,\n };\n }, []);\n\n // Safe redirect function with enhanced validation\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url } = urlParams;\n\n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n // Enhanced URL validation with domain whitelist\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n\n // Log suspicious redirect attempt\n console.warn('Suspicious redirect attempt blocked:', {\n url: return_url,\n reason: validation.reason,\n timestamp: new Date().toISOString(),\n });\n return;\n }\n // Send postMessage to parent if in iframe\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps,\n }, targetOrigin);\n } else {\n window.location.href = return_url;\n }\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n // Handle KYC completion\n const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed:', data);\n\n // Check if still processing/analyzing\n const isStillProcessing = data.isProcessing || data.session?.isProcessing;\n\n // Handle Push URL webhook if provided\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'success', // verification completed successfully\n result: data, // pass complete data object as result\n };\n\n // Send data to provided push_url with a timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n await fetch(urlParams.push_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(verificationState),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed KYC data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n\n redirectToReturnUrl({\n status: 'completed',\n kyc_id: data.session_id || urlParams.kyc_id,\n message: 'KYC process completed successfully',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: {\n document_analyzed: data.documentAnalysisComplete || false,\n selfie_analyzed: data.selfieAnalysisComplete || false,\n liveness_checked: data.livenessCheckComplete || false,\n },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n // Handle KYC error\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: 'error',\n kyc_id: urlParams.kyc_id,\n message: error,\n processing_state: 'pending',\n });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n // Handle KYC cancellation\n const handleCancel = useCallback(() => {\n console.log('KYC cancelled', urlParams.push_url, urlParams);\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'cancelled', // verification cancelled\n result: null, // pass null as result\n };\n\n // Send data to provided push_url with a timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n fetch(urlParams.push_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(verificationState),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed KYC cancellation data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n redirectToReturnUrl({\n status: 'cancelled',\n kyc_id: urlParams.kyc_id,\n message: 'KYC process was cancelled',\n processing_state: 'pending',\n });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, onCancel]);\n\n // Initialize component\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n\n // Set language if provided\n if (params.lang) {\n setLocale(params.lang);\n }\n\n // Configure backend environment\n if (params.server_env) {\n KYCConfig.setBackendEnvironment(params.server_env);\n }\n\n setIsLoading(false);\n } catch (error) {\n console.error('Error parsing URL parameters:', error);\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n\n if (isLoading) {\n return (\n <View style={styles.container}>\n <Text style={styles.loadingText}>Loading KYC process...</Text>\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>Error: {error}</Text>\n </View>\n );\n }\n\n if (!urlParams.token) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>No token provided in URL parameters</Text>\n </View>\n );\n }\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n <TemplateKYCExample\n onComplete={handleComplete}\n onCancel={handleCancel}\n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n templateId={urlParams.template_id}\n env={urlParams.env || 'PRODUCTION'}\n serverEnv={urlParams.server_env}\n existingSessionId={urlParams.kyc_id}\n initialComponentIndex={(() => {\n const raw = urlParams.component_index ?? urlParams.step;\n if (raw == null || raw === '') return undefined;\n const index = parseInt(raw, 10);\n return Number.isNaN(index) ? undefined : index;\n })()}\n initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined}\n />\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n overflow: 'visible' as any, // Allow scrolling on web\n },\n loadingText: {\n fontSize: 18,\n textAlign: 'center',\n marginTop: 50,\n color: '#666',\n },\n errorText: {\n fontSize: 16,\n textAlign: 'center',\n marginTop: 50,\n color: '#dc2626',\n paddingHorizontal: 20,\n },\n analyzingOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 9999,\n },\n analyzingContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n analyzingText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginTop: 16,\n textAlign: 'center',\n },\n analyzingSubtext: {\n fontSize: 14,\n color: '#666',\n marginTop: 8,\n textAlign: 'center',\n },\n});\n\nexport default WebKYCEntry;\n"]}
1
+ {"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\n// import { TemplateKYCFlow } from '../components/TemplateKYCFlowRefactored';\n// import { KYCTemplate } from '../types/KYC.types';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed } from '../config/allowedDomains';\nimport KYCConfig from '../config/KYCConfig';\nimport { BackendEnvironment } from '../types/env.types';\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onSessionSave?: (sessionId: string) => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n save_session_url?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string; // Optional secret for signature generation\n env?: 'PRODUCTION' | 'SANDBOX'; // Environment mode\n template_id?: string; // Template ID for dynamic template loading\n server_env?: BackendEnvironment; // Backend environment mode\n step?: string; // Deprecated: use component_index.\n component_index?: string; // Index in template.components (0-based) to resume at\n country?: string; // Code pays pour restaurer la sélection (reprise multi-appareil)\n document_type?: string; // Type de document (national_id, passport, etc.)\n region?: string; // Région si applicable\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\nconst WebKYCEntry: React.FC<WebKYCEntryProps> = ({\n onComplete,\n onError,\n onCancel,\n onSessionSave,\n}) => {\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n // Parse URL parameters\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n\n const urlParams = new URLSearchParams(window.location.search);\n const envParam = urlParams.get('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n\n const serverEnvParam = urlParams.get('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION'\n ? (serverEnvParam as BackendEnvironment)\n : 'PRODUCTION';\n\n return {\n token: urlParams.get('token') || undefined,\n return_url: urlParams.get('return_url') || undefined,\n push_url: urlParams.get('push_url') || undefined,\n save_session_url: urlParams.get('save_session_url') || undefined,\n lang: urlParams.get('lang') || 'en',\n theme: urlParams.get('theme') || 'light',\n kyc_id: urlParams.get('kyc_id') || undefined,\n secret: urlParams.get('secret') || undefined,\n env: validEnv,\n template_id: urlParams.get('template_id') || undefined,\n server_env: validServerEnv,\n step: urlParams.get('step') || undefined,\n component_index: urlParams.get('component_index') || undefined,\n country: urlParams.get('country') || undefined,\n document_type: urlParams.get('document_type') || undefined,\n region: urlParams.get('region') || undefined,\n };\n }, []);\n\n // Safe redirect function with enhanced validation\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url } = urlParams;\n\n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n // Enhanced URL validation with domain whitelist\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n\n // Log suspicious redirect attempt\n console.warn('Suspicious redirect attempt blocked:', {\n url: return_url,\n reason: validation.reason,\n timestamp: new Date().toISOString(),\n });\n return;\n }\n // Send postMessage to parent if in iframe\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps,\n }, targetOrigin);\n } else {\n window.location.href = return_url;\n }\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n // Handle KYC completion\n const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed:', data);\n\n // Check if still processing/analyzing\n const isStillProcessing = data.isProcessing || data.session?.isProcessing;\n\n // Handle Push URL webhook if provided\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'success', // verification completed successfully\n result: data, // pass complete data object as result\n };\n\n // Send data to provided push_url with a timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n await fetch(urlParams.push_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(verificationState),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed KYC data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n\n redirectToReturnUrl({\n status: 'completed',\n kyc_id: data.session_id || urlParams.kyc_id,\n message: 'KYC process completed successfully',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: {\n document_analyzed: data.documentAnalysisComplete || false,\n selfie_analyzed: data.selfieAnalysisComplete || false,\n liveness_checked: data.livenessCheckComplete || false,\n },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n // Handle KYC error\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: 'error',\n kyc_id: urlParams.kyc_id,\n message: error,\n processing_state: 'pending',\n });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n // Handle KYC cancellation\n const handleCancel = useCallback(() => {\n console.log('KYC cancelled', urlParams.push_url, urlParams);\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'cancelled', // verification cancelled\n result: null, // pass null as result\n };\n\n // Send data to provided push_url with a timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n fetch(urlParams.push_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(verificationState),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed KYC cancellation data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n redirectToReturnUrl({\n status: 'cancelled',\n kyc_id: urlParams.kyc_id,\n message: 'KYC process was cancelled',\n processing_state: 'pending',\n });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, onCancel]);\n\n const handleSessionSave = useCallback(async (sessionId: string) => {\n console.log('KYC session created:', sessionId);\n\n if (urlParams.save_session_url) {\n try {\n const payload = {\n status: 'session_created',\n result: {\n session_id: sessionId,\n kyc_id: sessionId,\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n await fetch(urlParams.save_session_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed session data to save_session_url');\n } catch (err) {\n // Fail open - do not block the KYC flow if save_session webhook fails\n console.warn('Failed to push session data to save_session_url:', err);\n }\n }\n\n onSessionSave?.(sessionId);\n }, [urlParams.save_session_url, onSessionSave]);\n\n // Initialize component\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n\n // Set language if provided\n if (params.lang) {\n setLocale(params.lang);\n }\n\n // Configure backend environment\n if (params.server_env) {\n KYCConfig.setBackendEnvironment(params.server_env);\n }\n\n setIsLoading(false);\n } catch (error) {\n console.error('Error parsing URL parameters:', error);\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n\n if (isLoading) {\n return (\n <View style={styles.container}>\n <Text style={styles.loadingText}>Loading KYC process...</Text>\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>Error: {error}</Text>\n </View>\n );\n }\n\n if (!urlParams.token) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>No token provided in URL parameters</Text>\n </View>\n );\n }\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n <TemplateKYCExample\n onComplete={handleComplete}\n onCancel={handleCancel}\n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n templateId={urlParams.template_id}\n env={urlParams.env || 'PRODUCTION'}\n serverEnv={urlParams.server_env}\n existingSessionId={urlParams.kyc_id}\n initialComponentIndex={(() => {\n const raw = urlParams.component_index ?? urlParams.step;\n if (raw == null || raw === '') return undefined;\n const index = parseInt(raw, 10);\n return Number.isNaN(index) ? undefined : index;\n })()}\n initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined}\n onSessionSave={handleSessionSave}\n />\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n overflow: 'visible' as any, // Allow scrolling on web\n },\n loadingText: {\n fontSize: 18,\n textAlign: 'center',\n marginTop: 50,\n color: '#666',\n },\n errorText: {\n fontSize: 16,\n textAlign: 'center',\n marginTop: 50,\n color: '#dc2626',\n paddingHorizontal: 20,\n },\n analyzingOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 9999,\n },\n analyzingContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n analyzingText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginTop: 16,\n textAlign: 'center',\n },\n analyzingSubtext: {\n fontSize: 14,\n color: '#666',\n marginTop: 8,\n textAlign: 'center',\n },\n});\n\nexport default WebKYCEntry;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transfergratis/react-native-sdk",
3
- "version": "0.1.31",
3
+ "version": "0.1.32",
4
4
  "description": "transfergratis react native sdk",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -149,7 +149,8 @@ export const TemplateKYCExample: React.FC<{
149
149
  existingSessionId?: string;
150
150
  initialComponentIndex?: number;
151
151
  initialCountryResume?: { code: string; documentType: string; region?: string };
152
- }> = ({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume }) => {
152
+ onSessionSave?: (sessionId: string) => void;
153
+ }> = ({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave }) => {
153
154
  const handleComplete = (data: VerificationState) => {
154
155
  console.log('KYC Template completed with data:', data);
155
156
  onComplete(data);
@@ -186,6 +187,7 @@ export const TemplateKYCExample: React.FC<{
186
187
  existingSessionId={existingSessionId}
187
188
  initialComponentIndex={initialComponentIndex}
188
189
  initialCountryResume={initialCountryResume}
190
+ onSessionSave={onSessionSave}
189
191
  />
190
192
  </View>
191
193
  </SafeAreaView>
@@ -36,6 +36,7 @@ interface TemplateKYCFlowProps {
36
36
  initialComponentIndex?: number;
37
37
  /** Pays / type de document depuis l'URL de reprise (reprise multi-appareil) */
38
38
  initialCountryResume?: { code: string; documentType: string; region?: string };
39
+ onSessionSave?: (sessionId: string) => void;
39
40
  }
40
41
 
41
42
  export const TemplateKYCFlow: React.FC<TemplateKYCFlowProps> = ({
@@ -51,6 +52,7 @@ export const TemplateKYCFlow: React.FC<TemplateKYCFlowProps> = ({
51
52
  existingSessionId,
52
53
  initialComponentIndex,
53
54
  initialCountryResume,
55
+ onSessionSave,
54
56
  }) => {
55
57
  const { t } = useI18n();
56
58
  const { template: loadedTemplate, isLoading, error, loadTemplate } = useTemplateLoader();
@@ -152,6 +154,7 @@ export const TemplateKYCFlow: React.FC<TemplateKYCFlowProps> = ({
152
154
  existingSessionId={existingSessionId}
153
155
  initialComponentIndex={initialComponentIndex}
154
156
  initialCountryResume={initialCountryResume}
157
+ onSessionSave={onSessionSave}
155
158
  >
156
159
  <TemplateKYCFlowContent onCancel={OnCancel} />
157
160
  </TemplateKYCFlowProvider>
@@ -1,4 +1,4 @@
1
- import React, { useState, useCallback, useMemo, createContext, useContext, ReactNode, useEffect } from 'react';
1
+ import React, { useState, useCallback, useMemo, createContext, useContext, ReactNode, useEffect, useRef } from 'react';
2
2
  import { KYCTemplate, TemplateState, TemplateActions, UseTemplateReturn, TemplateComponent, GovernmentDocumentType, VerificationState } from '../types/KYC.types';
3
3
  import { KycEnvironment } from '../types/env.types';
4
4
  import kycService, { authentification, truncateFields } from '../modules/api/KYCService';
@@ -39,6 +39,7 @@ interface TemplateKYCFlowProviderProps {
39
39
  initialComponentIndex?: number;
40
40
  /** Pays / type de document depuis l'URL de reprise — évite de dépendre du backend pour afficher les pays. */
41
41
  initialCountryResume?: { code: string; documentType: string; region?: string };
42
+ onSessionSave?: (sessionId: string) => void;
42
43
  }
43
44
 
44
45
  export const TemplateKYCFlowProvider: React.FC<TemplateKYCFlowProviderProps> = ({
@@ -53,8 +54,9 @@ export const TemplateKYCFlowProvider: React.FC<TemplateKYCFlowProviderProps> = (
53
54
  existingSessionId,
54
55
  initialComponentIndex,
55
56
  initialCountryResume,
57
+ onSessionSave,
56
58
  }) => {
57
- const hookResult = useTemplateKYCFlow(template, onComplete, onError, onCancel, initialLanguage, apiKey, env, existingSessionId, initialComponentIndex, initialCountryResume);
59
+ const hookResult = useTemplateKYCFlow(template, onComplete, onError, onCancel, initialLanguage, apiKey, env, existingSessionId, initialComponentIndex, initialCountryResume, onSessionSave);
58
60
 
59
61
  return (
60
62
  <TemplateKYCFlowContext.Provider value={hookResult}>
@@ -83,6 +85,7 @@ export const useTemplateKYCFlow = (
83
85
  existingSessionId?: string,
84
86
  initialComponentIndex?: number,
85
87
  initialCountryResume?: { code: string; documentType: string; region?: string },
88
+ onSessionSave?: (sessionId: string) => void,
86
89
  ): UseTemplateReturn => {
87
90
 
88
91
  const { setLocale } = useI18n();
@@ -253,6 +256,7 @@ export const useTemplateKYCFlow = (
253
256
 
254
257
  // État du flux
255
258
  const [state, setState] = useState<TemplateState>(() => buildInitialState());
259
+ const hasSavedSessionRef = useRef(false);
256
260
 
257
261
  // Fonction utilitaire pour convertir base64 en data URI pour l'affichage
258
262
  const base64ToDataUri = useCallback((base64: string, mimeType: string = 'image/jpeg'): string => {
@@ -723,6 +727,15 @@ export const useTemplateKYCFlow = (
723
727
  initializeSession();
724
728
  }, [existingSessionId, state.session.session_id, state.session.isInitialized, initializeSession]);
725
729
 
730
+ // Emit session id once when session becomes available.
731
+ useEffect(() => {
732
+ if (!onSessionSave || hasSavedSessionRef.current) return;
733
+ if (!state.session.isInitialized || !state.session.session_id) return;
734
+
735
+ hasSavedSessionRef.current = true;
736
+ onSessionSave(state.session.session_id);
737
+ }, [onSessionSave, state.session.isInitialized, state.session.session_id]);
738
+
726
739
  // Validation d'un composant (dataOverride permet de valider sans attendre la mise à jour du state)
727
740
  const validateComponent = useCallback((componentId: number, dataOverride?: any): boolean => {
728
741
  const component = state.template.components.find(c => c.id === componentId);
@@ -12,12 +12,14 @@ interface WebKYCEntryProps {
12
12
  onComplete?: (data: any) => void;
13
13
  onError?: (error: string) => void;
14
14
  onCancel?: () => void;
15
+ onSessionSave?: (sessionId: string) => void;
15
16
  }
16
17
 
17
18
  interface URLParams {
18
19
  token?: string;
19
20
  return_url?: string;
20
21
  push_url?: string;
22
+ save_session_url?: string;
21
23
  lang?: string;
22
24
  theme?: string;
23
25
  kyc_id?: string;
@@ -42,6 +44,7 @@ const WebKYCEntry: React.FC<WebKYCEntryProps> = ({
42
44
  onComplete,
43
45
  onError,
44
46
  onCancel,
47
+ onSessionSave,
45
48
  }) => {
46
49
  const { setLocale } = useI18n();
47
50
  const [urlParams, setUrlParams] = useState<URLParams>({});
@@ -66,6 +69,7 @@ const WebKYCEntry: React.FC<WebKYCEntryProps> = ({
66
69
  token: urlParams.get('token') || undefined,
67
70
  return_url: urlParams.get('return_url') || undefined,
68
71
  push_url: urlParams.get('push_url') || undefined,
72
+ save_session_url: urlParams.get('save_session_url') || undefined,
69
73
  lang: urlParams.get('lang') || 'en',
70
74
  theme: urlParams.get('theme') || 'light',
71
75
  kyc_id: urlParams.get('kyc_id') || undefined,
@@ -234,6 +238,42 @@ const WebKYCEntry: React.FC<WebKYCEntryProps> = ({
234
238
  onCancel?.();
235
239
  }, [redirectToReturnUrl, urlParams.kyc_id, onCancel]);
236
240
 
241
+ const handleSessionSave = useCallback(async (sessionId: string) => {
242
+ console.log('KYC session created:', sessionId);
243
+
244
+ if (urlParams.save_session_url) {
245
+ try {
246
+ const payload = {
247
+ status: 'session_created',
248
+ result: {
249
+ session_id: sessionId,
250
+ kyc_id: sessionId,
251
+ },
252
+ };
253
+
254
+ const controller = new AbortController();
255
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
256
+
257
+ await fetch(urlParams.save_session_url, {
258
+ method: 'POST',
259
+ headers: {
260
+ 'Content-Type': 'application/json',
261
+ },
262
+ body: JSON.stringify(payload),
263
+ signal: controller.signal,
264
+ });
265
+
266
+ clearTimeout(timeoutId);
267
+ console.log('Successfully pushed session data to save_session_url');
268
+ } catch (err) {
269
+ // Fail open - do not block the KYC flow if save_session webhook fails
270
+ console.warn('Failed to push session data to save_session_url:', err);
271
+ }
272
+ }
273
+
274
+ onSessionSave?.(sessionId);
275
+ }, [urlParams.save_session_url, onSessionSave]);
276
+
237
277
  // Initialize component
238
278
  useEffect(() => {
239
279
  try {
@@ -311,6 +351,7 @@ const WebKYCEntry: React.FC<WebKYCEntryProps> = ({
311
351
  return Number.isNaN(index) ? undefined : index;
312
352
  })()}
313
353
  initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined}
354
+ onSessionSave={handleSessionSave}
314
355
  />
315
356
  </SafeAreaView>
316
357
  );