datakeen-session-react 1.1.140-dev.77 → 1.1.140-dev.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cjs/components/nfc-scan/NfcScanNode.js +89 -0
  2. package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +1 -0
  3. package/dist/cjs/components/nfc-scan/NfcSuccessAnimation.js +40 -0
  4. package/dist/cjs/components/nfc-scan/NfcSuccessAnimation.js.map +1 -0
  5. package/dist/cjs/components/session/DocumentCheck.js +89 -35
  6. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  7. package/dist/cjs/hooks/useNfcSseStatus.js +46 -0
  8. package/dist/cjs/hooks/useNfcSseStatus.js.map +1 -0
  9. package/dist/cjs/hooks/useUserInputForm.js +8 -2
  10. package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
  11. package/dist/cjs/i18n/en.json.js +10 -1
  12. package/dist/cjs/i18n/en.json.js.map +1 -1
  13. package/dist/cjs/i18n/fr.json.js +10 -1
  14. package/dist/cjs/i18n/fr.json.js.map +1 -1
  15. package/dist/cjs/index.css.js +1 -1
  16. package/dist/cjs/services/api.js +1 -0
  17. package/dist/cjs/services/api.js.map +1 -1
  18. package/dist/cjs/types/session.js.map +1 -1
  19. package/dist/esm/components/nfc-scan/NfcScanNode.js +85 -0
  20. package/dist/esm/components/nfc-scan/NfcScanNode.js.map +1 -0
  21. package/dist/esm/components/nfc-scan/NfcSuccessAnimation.js +36 -0
  22. package/dist/esm/components/nfc-scan/NfcSuccessAnimation.js.map +1 -0
  23. package/dist/esm/components/session/DocumentCheck.js +89 -35
  24. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  25. package/dist/esm/hooks/useNfcSseStatus.js +44 -0
  26. package/dist/esm/hooks/useNfcSseStatus.js.map +1 -0
  27. package/dist/esm/hooks/useUserInputForm.js +8 -2
  28. package/dist/esm/hooks/useUserInputForm.js.map +1 -1
  29. package/dist/esm/i18n/en.json.js +10 -2
  30. package/dist/esm/i18n/en.json.js.map +1 -1
  31. package/dist/esm/i18n/fr.json.js +10 -2
  32. package/dist/esm/i18n/fr.json.js.map +1 -1
  33. package/dist/esm/index.css.js +1 -1
  34. package/dist/esm/services/api.js +1 -1
  35. package/dist/esm/services/api.js.map +1 -1
  36. package/dist/esm/types/session.js.map +1 -1
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../../../src/services/api.ts"],"sourcesContent":["import axios, { AxiosError } from \"axios\";\nimport type {\n AxiosInstance,\n AxiosResponse,\n InternalAxiosRequestConfig,\n AxiosRequestConfig,\n} from \"axios\";\nimport { API_BASE_URL } from \"../config/env\";\n\n// Types pour window global\ndeclare global {\n interface Window {\n VITE_API_BASE_URL?: string;\n }\n}\n\n// Helpers\nconst normalizeBaseURL = (url: string | undefined | null): string => {\n const DEFAULT_BASE_URL = \"https://dev2.datakeen.co/backend\";\n if (!url) {\n return DEFAULT_BASE_URL;\n }\n\n const trimmed = url.trim();\n if (!trimmed) {\n return DEFAULT_BASE_URL;\n }\n\n try {\n const parsed = new URL(trimmed);\n const cleanedPath = parsed.pathname.replace(/\\/+$/, \"\");\n const hasBackendSegment = /\\/backend(\\/|$)/.test(cleanedPath);\n const normalizedPath = hasBackendSegment\n ? cleanedPath.replace(/\\/backend(\\/*.*)?$/, \"/backend\")\n : `${cleanedPath}/backend`;\n\n const finalPath = normalizedPath.startsWith(\"/\")\n ? normalizedPath\n : `/${normalizedPath}`;\n\n const normalized = `${parsed.origin}${finalPath}`.replace(/\\/+$/, \"\");\n return normalized;\n } catch {\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, \"\");\n if (/\\/backend(\\/|$)/.test(withoutTrailingSlash)) {\n return withoutTrailingSlash.replace(/\\/backend(\\/*.*)?$/, \"/backend\");\n }\n return `${withoutTrailingSlash}/backend`;\n }\n};\n\n// Configuration globale pour l'URL de base\nlet globalBaseURL: string | null = null;\n\n// Fonction pour définir l'URL de base globalement\nexport const configureApiBaseURL = (baseURL: string): void => {\n const normalizedBaseURL = normalizeBaseURL(baseURL);\n globalBaseURL = normalizedBaseURL;\n // Mettre à jour l'instance existante si elle existe\n if (apiService) {\n apiService.updateBaseURL(normalizedBaseURL);\n }\n};\n\n// Fonction pour récupérer l'URL de base dynamiquement\nconst getBaseURL = (): string => {\n // Priorité 1: URL configurée dynamiquement\n if (globalBaseURL) {\n return globalBaseURL;\n }\n\n // Priorité 2: Variable d'environnement du projet hôte (si disponible via window)\n if (typeof window !== \"undefined\" && window.VITE_API_BASE_URL) {\n return normalizeBaseURL(window.VITE_API_BASE_URL);\n }\n\n // Priorité 3: Variable d'environnement du SDK via wrapper\n if (API_BASE_URL) {\n return normalizeBaseURL(API_BASE_URL);\n }\n\n // Priorité 4: URL par défaut (dev2 pour développement)\n return normalizeBaseURL(\"https://dev2.datakeen.co/backend\");\n};\n\n// Types pour la configuration de l'API\nexport interface ApiConfig {\n baseURL: string;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n// Types pour les réponses\nexport interface ApiResponse<T = any> {\n data: T;\n message?: string;\n success: boolean;\n status: number;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\nexport class ApiService {\n private client: AxiosInstance;\n private config: ApiConfig;\n\n constructor(config: ApiConfig) {\n this.config = config;\n\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout || 30000,\n headers: {\n Accept: \"application/json\",\n ...config.headers,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Intercepteur de requête\n this.client.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n return config;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n\n // Intercepteur de réponse pour gérer les erreurs\n this.client.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n }\n\n private handleError(error: AxiosError): ApiError {\n let apiError: ApiError = {\n message: \"Une erreur inattendue s'est produite\",\n status: 500,\n };\n\n if (error.response) {\n // Erreur de réponse du serveur\n const { status, data } = error.response;\n apiError = {\n message: (data as any)?.message || `Erreur ${status}`,\n status,\n code: (data as any)?.code,\n details: data,\n };\n } else if (error.code === \"ECONNABORTED\") {\n // Timeout\n apiError = {\n message: \"Délai d'attente dépassé\",\n code: \"TIMEOUT_ERROR\",\n };\n } else if (error.request) {\n // Erreur réseau - Log plus de détails pour debug\n console.error(\"❌ Network error details:\", {\n message: error.message,\n code: error.code,\n config: {\n url: error.config?.url,\n method: error.config?.method,\n baseURL: error.config?.baseURL,\n timeout: error.config?.timeout,\n },\n });\n \n // Vérifier si c'est une erreur CORS\n if (error.message.includes(\"Network Error\") || error.message.includes(\"CORS\")) {\n apiError = {\n message: \"Erreur CORS ou serveur inaccessible. Vérifiez que le serveur backend est démarré et autorise les requêtes depuis votre domaine.\",\n code: \"CORS_OR_NETWORK_ERROR\",\n };\n } else {\n apiError = {\n message: \"Erreur de connexion réseau\",\n code: \"NETWORK_ERROR\",\n };\n }\n }\n\n console.error(\"❌ API Error:\", apiError);\n return apiError;\n }\n\n // Plus de retryRequest, shouldRetry, ni delay : chaque appel Axios ne sera fait qu'une seule fois\n\n // Méthodes publiques pour les requêtes HTTP\n async get<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.get<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async post<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.post<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async put<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.put<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async patch<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.patch<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async delete<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.delete<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n // Méthodes utilitaires\n setDefaultHeader(key: string, value: string): void {\n this.client.defaults.headers.common[key] = value;\n }\n\n removeDefaultHeader(key: string): void {\n delete this.client.defaults.headers.common[key];\n }\n\n // Méthode pour créer une nouvelle instance avec une configuration différente\n createInstance(config: Partial<ApiConfig>): ApiService {\n return new ApiService({ ...this.config, ...config });\n }\n\n // Accès à l'instance Axios pour des cas spéciaux\n getRawClient(): AxiosInstance {\n return this.client;\n }\n\n // Méthode pour mettre à jour dynamiquement l'URL de base\n updateBaseURL(baseURL: string): void {\n this.config.baseURL = baseURL;\n this.client.defaults.baseURL = baseURL;\n }\n}\n\n// In test environment, mock axios to avoid real HTTP requests\nif (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.NODE_ENV === \"test\"\n) {\n // @ts-ignore\n global.axios = {\n create: () => ({\n get: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n post: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n put: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n patch: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n delete: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n defaults: { headers: { common: {} } },\n interceptors: {\n request: { use: jest.fn() },\n response: { use: jest.fn() },\n },\n }),\n };\n}\n\n// Factory pour créer une instance\nexport const createApiService = (config: ApiConfig): ApiService => {\n return new ApiService(config);\n};\n\n// Instance par défaut (à configurer selon vos besoins)\nexport const apiService = createApiService({\n baseURL: getBaseURL(),\n timeout: 30000,\n});\n\nexport { normalizeBaseURL };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sources":["../../../../src/services/api.ts"],"sourcesContent":["import axios, { AxiosError } from \"axios\";\nimport type {\n AxiosInstance,\n AxiosResponse,\n InternalAxiosRequestConfig,\n AxiosRequestConfig,\n} from \"axios\";\nimport { API_BASE_URL } from \"../config/env\";\n\n// Types pour window global\ndeclare global {\n interface Window {\n VITE_API_BASE_URL?: string;\n }\n}\n\n// Helpers\nconst normalizeBaseURL = (url: string | undefined | null): string => {\n const DEFAULT_BASE_URL = \"https://dev2.datakeen.co/backend\";\n if (!url) {\n return DEFAULT_BASE_URL;\n }\n\n const trimmed = url.trim();\n if (!trimmed) {\n return DEFAULT_BASE_URL;\n }\n\n try {\n const parsed = new URL(trimmed);\n const cleanedPath = parsed.pathname.replace(/\\/+$/, \"\");\n const hasBackendSegment = /\\/backend(\\/|$)/.test(cleanedPath);\n const normalizedPath = hasBackendSegment\n ? cleanedPath.replace(/\\/backend(\\/*.*)?$/, \"/backend\")\n : `${cleanedPath}/backend`;\n\n const finalPath = normalizedPath.startsWith(\"/\")\n ? normalizedPath\n : `/${normalizedPath}`;\n\n const normalized = `${parsed.origin}${finalPath}`.replace(/\\/+$/, \"\");\n return normalized;\n } catch {\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, \"\");\n if (/\\/backend(\\/|$)/.test(withoutTrailingSlash)) {\n return withoutTrailingSlash.replace(/\\/backend(\\/*.*)?$/, \"/backend\");\n }\n return `${withoutTrailingSlash}/backend`;\n }\n};\n\n// Configuration globale pour l'URL de base\nlet globalBaseURL: string | null = null;\n\n// Fonction pour définir l'URL de base globalement\nexport const configureApiBaseURL = (baseURL: string): void => {\n const normalizedBaseURL = normalizeBaseURL(baseURL);\n globalBaseURL = normalizedBaseURL;\n // Mettre à jour l'instance existante si elle existe\n if (apiService) {\n apiService.updateBaseURL(normalizedBaseURL);\n }\n};\n\n// Fonction pour récupérer l'URL de base dynamiquement\nexport const getBaseURL = (): string => {\n // Priorité 1: URL configurée dynamiquement\n if (globalBaseURL) {\n return globalBaseURL;\n }\n\n // Priorité 2: Variable d'environnement du projet hôte (si disponible via window)\n if (typeof window !== \"undefined\" && window.VITE_API_BASE_URL) {\n return normalizeBaseURL(window.VITE_API_BASE_URL);\n }\n\n // Priorité 3: Variable d'environnement du SDK via wrapper\n if (API_BASE_URL) {\n return normalizeBaseURL(API_BASE_URL);\n }\n\n // Priorité 4: URL par défaut (dev2 pour développement)\n return normalizeBaseURL(\"https://dev2.datakeen.co/backend\");\n};\n\n// Types pour la configuration de l'API\nexport interface ApiConfig {\n baseURL: string;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n// Types pour les réponses\nexport interface ApiResponse<T = any> {\n data: T;\n message?: string;\n success: boolean;\n status: number;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\nexport class ApiService {\n private client: AxiosInstance;\n private config: ApiConfig;\n\n constructor(config: ApiConfig) {\n this.config = config;\n\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout || 30000,\n headers: {\n Accept: \"application/json\",\n ...config.headers,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Intercepteur de requête\n this.client.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n return config;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n\n // Intercepteur de réponse pour gérer les erreurs\n this.client.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n }\n\n private handleError(error: AxiosError): ApiError {\n let apiError: ApiError = {\n message: \"Une erreur inattendue s'est produite\",\n status: 500,\n };\n\n if (error.response) {\n // Erreur de réponse du serveur\n const { status, data } = error.response;\n apiError = {\n message: (data as any)?.message || `Erreur ${status}`,\n status,\n code: (data as any)?.code,\n details: data,\n };\n } else if (error.code === \"ECONNABORTED\") {\n // Timeout\n apiError = {\n message: \"Délai d'attente dépassé\",\n code: \"TIMEOUT_ERROR\",\n };\n } else if (error.request) {\n // Erreur réseau - Log plus de détails pour debug\n console.error(\"❌ Network error details:\", {\n message: error.message,\n code: error.code,\n config: {\n url: error.config?.url,\n method: error.config?.method,\n baseURL: error.config?.baseURL,\n timeout: error.config?.timeout,\n },\n });\n \n // Vérifier si c'est une erreur CORS\n if (error.message.includes(\"Network Error\") || error.message.includes(\"CORS\")) {\n apiError = {\n message: \"Erreur CORS ou serveur inaccessible. Vérifiez que le serveur backend est démarré et autorise les requêtes depuis votre domaine.\",\n code: \"CORS_OR_NETWORK_ERROR\",\n };\n } else {\n apiError = {\n message: \"Erreur de connexion réseau\",\n code: \"NETWORK_ERROR\",\n };\n }\n }\n\n console.error(\"❌ API Error:\", apiError);\n return apiError;\n }\n\n // Plus de retryRequest, shouldRetry, ni delay : chaque appel Axios ne sera fait qu'une seule fois\n\n // Méthodes publiques pour les requêtes HTTP\n async get<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.get<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async post<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.post<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async put<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.put<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async patch<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.patch<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async delete<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.delete<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n // Méthodes utilitaires\n setDefaultHeader(key: string, value: string): void {\n this.client.defaults.headers.common[key] = value;\n }\n\n removeDefaultHeader(key: string): void {\n delete this.client.defaults.headers.common[key];\n }\n\n // Méthode pour créer une nouvelle instance avec une configuration différente\n createInstance(config: Partial<ApiConfig>): ApiService {\n return new ApiService({ ...this.config, ...config });\n }\n\n // Accès à l'instance Axios pour des cas spéciaux\n getRawClient(): AxiosInstance {\n return this.client;\n }\n\n // Méthode pour mettre à jour dynamiquement l'URL de base\n updateBaseURL(baseURL: string): void {\n this.config.baseURL = baseURL;\n this.client.defaults.baseURL = baseURL;\n }\n}\n\n// In test environment, mock axios to avoid real HTTP requests\nif (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.NODE_ENV === \"test\"\n) {\n // @ts-ignore\n global.axios = {\n create: () => ({\n get: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n post: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n put: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n patch: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n delete: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n defaults: { headers: { common: {} } },\n interceptors: {\n request: { use: jest.fn() },\n response: { use: jest.fn() },\n },\n }),\n };\n}\n\n// Factory pour créer une instance\nexport const createApiService = (config: ApiConfig): ApiService => {\n return new ApiService(config);\n};\n\n// Instance par défaut (à configurer selon vos besoins)\nexport const apiService = createApiService({\n baseURL: getBaseURL(),\n timeout: 30000,\n});\n\nexport { normalizeBaseURL };\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number) => void;\n goBack: () => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\";\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":"AA8DO,IAAM,2BAA2B,GAAsB;;;;"}
1
+ {"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number) => void;\n goBack: () => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n nfcEnabled?: boolean;\n nfcMode?: \"nfcOnly\" | \"nfcAndApi\";\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\";\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":"AA8DO,IAAM,2BAA2B,GAAsB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datakeen-session-react",
3
- "version": "1.1.140-dev.77",
3
+ "version": "1.1.140-dev.79",
4
4
  "description": "React SDK component to manage and render Datakeen session experiences easily.",
5
5
  "publishConfig": {
6
6
  "access": "public",