@ollaid/native-sso 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/ui.tsx","../src/components/OTPInput.tsx","../src/services/debugLogger.ts","../src/services/api.ts","../src/services/nativeAuth.ts","../src/services/mobilePassword.ts","../src/hooks/useMobilePassword.ts","../src/components/PasswordRecoveryModal.tsx","../src/hooks/useTokenHealthCheck.ts","../src/hooks/useNativeAuth.ts","../src/components/LoginModal.tsx","../src/utils/countries.ts","../src/components/PhoneInput.tsx","../src/components/AppsLogoSlider.tsx","../src/services/mobileRegistration.ts","../src/hooks/useMobileRegistration.ts","../src/components/SignupModal.tsx","../src/components/OnboardingModal.tsx","../src/components/DebugPanel.tsx","../src/logo/ollaid.png","../src/components/NativeSSOPage.tsx","../src/provider.tsx","../src/services/iamAccount.ts"],"sourcesContent":["/**\n * Embedded UI primitives for @ollaid/native-sso\n * Lightweight replacements for shadcn/ui components + inline SVG icons\n * No external dependencies required\n * \n * @version 1.0.0\n */\n\nimport React, { forwardRef, createContext, useContext, useEffect } from 'react';\n\n// ============================================\n// SVG Icons (inline, no lucide dependency)\n// ============================================\n\nconst iconProps = { width: '100%', height: '100%', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const };\n\nexport function IconShieldCheck(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconMail(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\n\nexport function IconPhone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\" />\n </svg>\n );\n}\n\nexport function IconLock(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function IconKeyRound(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function IconArrowLeft(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m12 19-7-7 7-7\" />\n <path d=\"M19 12H5\" />\n </svg>\n );\n}\n\nexport function IconEye(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconEyeOff(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function IconCheckCircle2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconLoader2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props} style={{ animation: 'spin 1s linear infinite', ...(props.style || {}) }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function IconAlertTriangle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nexport function IconSmartphone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\" />\n <path d=\"M12 18h.01\" />\n </svg>\n );\n}\n\nexport function IconHome(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n );\n}\n\nexport function IconCalendar(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M8 2v4\" /><path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n </svg>\n );\n}\n\nexport function IconBell(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" />\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" />\n </svg>\n );\n}\n\nexport function IconMessageCircle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22z\" />\n </svg>\n );\n}\n\nexport function IconUsers(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\nexport function IconSettings(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconGlobe(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\n// ============================================\n// Dialog\n// ============================================\n\ninterface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst DialogContext = createContext<DialogContextValue>({ open: false, onOpenChange: () => {} });\n\nexport function Dialog({ open, onOpenChange, children }: { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }) {\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <DialogContext.Provider value={{ open, onOpenChange }}>\n {children}\n </DialogContext.Provider>\n );\n}\n\nexport function DialogContent({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n const { onOpenChange } = useContext(DialogContext);\n\n return (\n <div style={{ position: 'fixed', inset: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div \n style={{ position: 'fixed', inset: 0, backgroundColor: 'rgba(0,0,0,0.5)' }}\n onClick={() => onOpenChange(false)} \n />\n <div \n className={className}\n style={{ \n position: 'relative', zIndex: 51, width: '100%', maxWidth: '28rem', \n margin: '1rem', padding: '1.5rem', borderRadius: '0.75rem',\n backgroundColor: 'white', boxShadow: '0 25px 50px -12px rgba(0,0,0,0.25)',\n maxHeight: '90vh', overflowY: 'auto',\n }}\n >\n <button\n onClick={() => onOpenChange(false)}\n style={{ position: 'absolute', right: '1rem', top: '1rem', background: 'none', border: 'none', cursor: 'pointer', fontSize: '1.25rem', color: '#9ca3af', lineHeight: 1 }}\n aria-label=\"Close\"\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\nexport function DialogHeader({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return <div className={className} style={{ marginBottom: '0.5rem', ...style }}>{children}</div>;\n}\n\nexport function DialogTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <h2 className={className} style={{ fontSize: '1.25rem', fontWeight: 600, color: '#111827' }}>{children}</h2>;\n}\n\nexport function DialogDescription({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <p className={className} style={{ fontSize: '0.875rem', color: '#6b7280', marginTop: '0.25rem' }}>{children}</p>;\n}\n\n// ============================================\n// Button\n// ============================================\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'default' | 'sm' | 'lg';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(({ \n variant = 'default', size = 'default', className = '', style, disabled, children, ...props \n}, ref) => {\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n borderRadius: '0.5rem', fontWeight: 500, cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.15s', border: 'none', opacity: disabled ? 0.5 : 1,\n fontSize: size === 'sm' ? '0.875rem' : '0.9375rem',\n padding: size === 'sm' ? '0.375rem 0.75rem' : size === 'lg' ? '0.75rem 1.5rem' : '0.625rem 1rem',\n height: size === 'sm' ? '2rem' : size === 'lg' ? '3rem' : '2.5rem',\n ...(variant === 'default' ? { backgroundColor: '#002147', color: 'white' } : {}),\n ...(variant === 'outline' ? { backgroundColor: 'transparent', border: '1px solid #d1d5db', color: '#374151' } : {}),\n ...(variant === 'ghost' ? { backgroundColor: 'transparent', color: '#374151' } : {}),\n ...style,\n };\n\n return (\n <button ref={ref} className={className} style={baseStyle} disabled={disabled} {...props}>\n {children}\n </button>\n );\n});\nButton.displayName = 'Button';\n\n// ============================================\n// Input\n// ============================================\n\nexport const Input = forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <input\n ref={ref}\n className={className}\n style={{\n width: '100%', padding: '0.5rem 0.75rem', borderRadius: '0.375rem',\n border: '1px solid #d1d5db', fontSize: '0.9375rem', outline: 'none',\n transition: 'border-color 0.15s', backgroundColor: '#f9fafb', color: '#111827',\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\n// ============================================\n// Label\n// ============================================\n\nexport const Label = forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement>>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={className}\n style={{ fontSize: '0.875rem', fontWeight: 500, color: '#374151', ...style }}\n {...props}\n />\n );\n }\n);\nLabel.displayName = 'Label';\n\n// ============================================\n// RadioGroup (simplified)\n// ============================================\n\ninterface RadioGroupProps {\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst RadioGroupContext = createContext<{ value: string; onValueChange: (v: string) => void }>({ value: '', onValueChange: () => {} });\n\nexport function RadioGroup({ value, onValueChange, children, className = '' }: RadioGroupProps) {\n return (\n <RadioGroupContext.Provider value={{ value, onValueChange }}>\n <div className={className}>{children}</div>\n </RadioGroupContext.Provider>\n );\n}\n\nexport function RadioGroupItem({ value, id }: { value: string; id: string }) {\n const { value: groupValue, onValueChange } = useContext(RadioGroupContext);\n return (\n <input\n type=\"radio\"\n id={id}\n checked={groupValue === value}\n onChange={() => onValueChange(value)}\n style={{ width: '1rem', height: '1rem', accentColor: '#002147' }}\n />\n );\n}\n\n// Global keyframes for spinner\nif (typeof document !== 'undefined') {\n const styleId = 'ollaid-sso-keyframes';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `@keyframes spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n }\n}\n","/**\n * OTP Input component for @ollaid/native-sso\n */\n\nimport { useRef, useState, useEffect, KeyboardEvent, ClipboardEvent } from 'react';\n\ninterface OTPInputProps {\n length?: 6 | 8;\n value: string;\n onChange: (value: string) => void;\n onComplete?: (value: string) => void;\n disabled?: boolean;\n autoFocus?: boolean;\n}\n\nexport function OTPInput({\n length = 6, value, onChange, onComplete, disabled = false, autoFocus = true,\n}: OTPInputProps) {\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const [activeIndex, setActiveIndex] = useState(0);\n\n useEffect(() => { inputRefs.current = inputRefs.current.slice(0, length); }, [length]);\n\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) inputRefs.current[0].focus();\n }, [autoFocus]);\n\n useEffect(() => {\n if (value.length === length && onComplete) onComplete(value);\n }, [value, length, onComplete]);\n\n const handleChange = (index: number, char: string) => {\n if (disabled) return;\n const digit = char.replace(/[^0-9]/g, '');\n if (!digit) return;\n const newValue = value.split('');\n newValue[index] = digit;\n onChange(newValue.join('').slice(0, length));\n if (index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (e.key === 'Backspace') {\n e.preventDefault();\n const newValue = value.split('');\n if (value[index]) {\n newValue[index] = '';\n onChange(newValue.join(''));\n } else if (index > 0) {\n newValue[index - 1] = '';\n onChange(newValue.join(''));\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/[^0-9]/g, '');\n if (pasted) {\n const newValue = pasted.slice(0, length);\n onChange(newValue);\n const focusIndex = Math.min(newValue.length, length - 1);\n inputRefs.current[focusIndex]?.focus();\n setActiveIndex(focusIndex);\n }\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem' }}>\n {Array.from({ length }).map((_, index) => (\n <input\n key={index}\n ref={(el) => (inputRefs.current[index] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value[index] || ''}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={() => setActiveIndex(index)}\n disabled={disabled}\n aria-label={`Digit ${index + 1}`}\n style={{\n width: '2.5rem', height: '3rem', textAlign: 'center', fontSize: '1.25rem',\n fontWeight: 600, borderRadius: '0.375rem', border: '2px solid',\n borderColor: activeIndex === index && !disabled ? 'hsl(var(--primary, 222 47% 11%))' : value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.5)' : '#d1d5db',\n backgroundColor: value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.05)' : 'white',\n outline: 'none', transition: 'all 0.2s',\n opacity: disabled ? 0.5 : 1, cursor: disabled ? 'not-allowed' : 'text',\n }}\n />\n ))}\n </div>\n );\n}\n\nexport default OTPInput;\n","/**\n * Debug Logger pour @ollaid/native-sso\n * Stocke l'historique des appels API en mémoire pour le DebugPanel\n * @version 1.0.0\n */\n\nexport interface ApiCallLog {\n id: string;\n timestamp: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n endpoint: string;\n requestBody: unknown;\n requestHeaders?: Record<string, string>;\n responseStatus: number | null;\n responseBody: unknown;\n duration: number;\n error?: string;\n}\n\nconst MAX_LOGS = 50;\nlet apiLogs: ApiCallLog[] = [];\nlet listeners: ((logs: ApiCallLog[]) => void)[] = [];\n\nfunction notifyListeners() {\n listeners.forEach(fn => fn([...apiLogs]));\n}\n\nexport function logApiCall(\n method: ApiCallLog['method'],\n endpoint: string,\n requestBody: unknown,\n requestHeaders?: Record<string, string>\n): string {\n const id = `${Date.now()}-${Math.random().toString(36).substring(2, 7)}`;\n const log: ApiCallLog = {\n id,\n timestamp: new Date().toISOString(),\n method,\n endpoint,\n requestBody,\n requestHeaders,\n responseStatus: null,\n responseBody: null,\n duration: 0,\n };\n\n apiLogs.unshift(log);\n if (apiLogs.length > MAX_LOGS) {\n apiLogs = apiLogs.slice(0, MAX_LOGS);\n }\n notifyListeners();\n return id;\n}\n\nexport function logApiResponse(\n logId: string,\n responseStatus: number,\n responseBody: unknown,\n startTime: number,\n error?: string\n): void {\n const log = apiLogs.find(l => l.id === logId);\n if (log) {\n log.responseStatus = responseStatus;\n log.responseBody = responseBody;\n log.duration = Date.now() - startTime;\n log.error = error;\n notifyListeners();\n }\n}\n\nexport function getApiLogs(): ApiCallLog[] {\n return [...apiLogs];\n}\n\nexport function clearApiLogs(): void {\n apiLogs = [];\n notifyListeners();\n}\n\nexport function subscribeToLogs(callback: (logs: ApiCallLog[]) => void): () => void {\n listeners.push(callback);\n return () => {\n listeners = listeners.filter(fn => fn !== callback);\n };\n}\n\nexport function exportLogsAsText(): string {\n if (apiLogs.length === 0) return 'Aucun appel API enregistré.';\n\n const lines: string[] = [\n '='.repeat(60),\n 'NATIVE SSO DEBUG LOGS',\n `Exporté le: ${new Date().toISOString()}`,\n '='.repeat(60),\n '',\n ];\n\n apiLogs.slice().reverse().forEach((log, index) => {\n const emoji = log.responseStatus === null ? '⏳' : (log.responseStatus >= 200 && log.responseStatus < 300 ? '✅' : '❌');\n lines.push(`[${index + 1}] ${emoji} ${log.method} ${log.endpoint}`);\n lines.push(` Status: ${log.responseStatus ?? 'En cours...'} | Durée: ${log.duration}ms`);\n if (log.requestBody) lines.push(` Request: ${JSON.stringify(log.requestBody)}`);\n if (log.responseBody) lines.push(` Response: ${JSON.stringify(log.responseBody)}`);\n if (log.error) lines.push(` ⚠️ Error: ${log.error}`);\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n","/**\n * Client API pour @ollaid/native-sso\n * Gestion des requêtes HTTP avec timeout, device ID, token storage\n * \n * @version 1.0.0\n */\n\nimport { logApiCall, logApiResponse } from './debugLogger';\n\n// ============================================\n// Types d'erreur\n// ============================================\n\nexport type ApiErrorType = 'network' | 'timeout' | 'server' | 'validation' | 'auth' | 'unknown';\n\nexport class ApiError extends Error {\n type: ApiErrorType;\n statusCode?: number;\n errorType?: string;\n response?: unknown;\n\n constructor(\n message: string,\n type: ApiErrorType,\n statusCode?: number,\n errorType?: string,\n response?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n this.type = type;\n this.statusCode = statusCode;\n this.errorType = errorType;\n this.response = response;\n }\n}\n\n// ============================================\n// Configuration\n// ============================================\n\nexport interface NativeAuthConfig {\n /** URL du Backend SaaS (pour config et exchange) */\n saasApiUrl: string;\n /** URL du Backend IAM (pour encrypt, init, validate, etc.) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n /** \n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant : chaque frontend envoie son préfixe\n * pour que le backend SaaS lise le bon bloc config/services.php.\n * Ex: 'iam', 'iam_vendor', 'iam_client', 'iam_admin'\n */\n configPrefix?: string;\n}\n\nlet config: NativeAuthConfig = {\n saasApiUrl: '',\n iamApiUrl: '',\n timeout: 30000,\n debug: false,\n configPrefix: 'iam',\n};\n\nexport const setNativeAuthConfig = (newConfig: Partial<NativeAuthConfig>): void => {\n config = { ...config, ...newConfig };\n \n if (config.debug) {\n console.log('🔐 @ollaid/native-sso Config:', {\n saasApiUrl: config.saasApiUrl,\n iamApiUrl: config.iamApiUrl,\n });\n }\n};\n\nexport const getNativeAuthConfig = (): NativeAuthConfig => ({ ...config });\n\nexport const isDebugMode = (): boolean => config.debug === true;\n\n// ============================================\n// Device ID\n// ============================================\n\nconst DEVICE_ID_KEY = 'native_sso_device_id';\n\nexport const getDeviceId = (): string => {\n if (typeof localStorage === 'undefined') return '';\n \n let deviceId = localStorage.getItem(DEVICE_ID_KEY);\n if (!deviceId) {\n deviceId = `nat_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\n }\n return deviceId;\n};\n\n// ============================================\n// Token storage (clés unifiées avec Web SSO)\n// ============================================\n\nconst STORAGE = {\n AUTH_TOKEN: 'auth_token',\n TOKEN: 'token',\n USER: 'user',\n ACCOUNT_TYPE: 'account_type',\n ALIAS_REFERENCE: 'alias_reference',\n} as const;\n\nexport const setAuthToken = (token: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.AUTH_TOKEN, token);\n localStorage.setItem(STORAGE.TOKEN, token);\n }\n};\n\nexport const getAuthToken = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.AUTH_TOKEN) || localStorage.getItem(STORAGE.TOKEN);\n};\n\nexport const clearAuthToken = (): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(STORAGE.AUTH_TOKEN);\n localStorage.removeItem(STORAGE.TOKEN);\n localStorage.removeItem(STORAGE.USER);\n localStorage.removeItem(STORAGE.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE.ALIAS_REFERENCE);\n }\n};\n\nexport const setAuthUser = (user: unknown): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.USER, JSON.stringify(user));\n }\n};\n\nexport const getAuthUser = <T>(): T | null => {\n if (typeof localStorage === 'undefined') return null;\n const user = localStorage.getItem(STORAGE.USER);\n if (!user) return null;\n try {\n return JSON.parse(user);\n } catch {\n localStorage.removeItem(STORAGE.USER);\n return null;\n }\n};\n\nexport const setAccountType = (type: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.ACCOUNT_TYPE, type);\n }\n};\n\nexport const getAccountType = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.ACCOUNT_TYPE);\n};\n\nexport { STORAGE as STORAGE_KEYS };\n\n// ============================================\n// Fetch helper\n// ============================================\n\nexport async function fetchWithTimeout<T>(\n url: string,\n options: RequestInit,\n timeout: number\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const method = (options.method as 'GET' | 'POST' | 'PUT' | 'DELETE') || 'GET';\n const logId = isDebugMode() ? logApiCall(method, url, options.body ? JSON.parse(options.body as string) : undefined) : null;\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n const text = await response.text();\n if (isDebugMode()) {\n console.error('❌ Réponse non-JSON:', text.substring(0, 500));\n if (logId) logApiResponse(logId, response.status, { raw: text.substring(0, 200) }, startTime, 'Non-JSON response');\n }\n throw new ApiError(`Erreur serveur (${response.status})`, 'server', response.status);\n }\n\n const data = await response.json();\n\n if (!response.ok) {\n if (logId) logApiResponse(logId, response.status, data, startTime, data.message);\n throw new ApiError(\n data.message || `Erreur ${response.status}`,\n response.status === 401 ? 'auth' : response.status >= 500 ? 'server' : 'validation',\n response.status,\n data.error_type,\n data\n );\n }\n\n if (logId) logApiResponse(logId, response.status, data, startTime);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Timeout');\n throw new ApiError('Délai d\\'attente dépassé', 'timeout');\n }\n if (error instanceof TypeError) {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Network error');\n throw new ApiError('Impossible de contacter le serveur', 'network');\n }\n }\n\n if (logId) logApiResponse(logId, 0, null, startTime, 'Unknown error');\n throw new ApiError('Erreur inattendue', 'unknown');\n }\n}\n\nexport function getHeaders(token?: string, includeConfigPrefix = false): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n const deviceId = getDeviceId();\n if (deviceId) {\n headers['X-Device-Id'] = deviceId;\n }\n\n // Multi-tenant: envoyer le préfixe de config au backend SaaS\n if (includeConfigPrefix && config.configPrefix) {\n headers['X-IAM-Config-Prefix'] = config.configPrefix;\n }\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n return headers;\n}\n\nexport default {\n getConfig: getNativeAuthConfig,\n setConfig: setNativeAuthConfig,\n};\n","/**\n * Service d'authentification Native Mobile SSO v1.0\n * Architecture Frontend-First : Direct IAM après encryption\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout,\n getHeaders,\n getDeviceId,\n setAuthToken,\n setAuthUser,\n clearAuthToken,\n getNativeAuthConfig,\n setNativeAuthConfig,\n isDebugMode,\n} from './api';\n\nimport type {\n NativeAuthType,\n NativeEncryptRequest,\n NativeEncryptResponse,\n NativeInitResponse,\n NativeValidateResponse,\n NativeGrantAccessResponse,\n NativeResendOtpResponse,\n NativeExchangeResponse,\n NativeConfigResponse,\n NativeCredentials,\n} from '../types/native';\n\n// ============================================\n// Credentials en mémoire (jamais persistés)\n// ============================================\n\nlet credentials: NativeCredentials | null = null;\nlet credentialsLoadedAt: number = 0;\nlet credentialsTtl: number = 300; // Default 5 minutes\n\nconst DEFAULT_TTL = 300;\nconst REFRESH_MARGIN = 30; // Refresh 30s before expiration\n\n// ============================================\n// Service Native Auth\n// ============================================\n\nexport const nativeAuthService = {\n hasCredentials(): boolean {\n return credentials !== null;\n },\n\n getCredentials(): NativeCredentials | null {\n return credentials ? { ...credentials } : null;\n },\n\n getCredentialsTtl(): number {\n return credentialsTtl;\n },\n\n getCredentialsAge(): number {\n if (!credentialsLoadedAt) return Infinity;\n return (Date.now() - credentialsLoadedAt) / 1000;\n },\n\n areCredentialsExpiringSoon(): boolean {\n if (!credentials || !credentialsLoadedAt) return true;\n const age = this.getCredentialsAge();\n return age >= (credentialsTtl - REFRESH_MARGIN);\n },\n\n async ensureFreshCredentials(): Promise<void> {\n if (!credentials || this.areCredentialsExpiringSoon()) {\n if (isDebugMode()) {\n console.log('🔄 [Native] Credentials expirés ou proches — auto-refresh');\n }\n await this.loadCredentials();\n }\n },\n\n async loadCredentials(): Promise<NativeCredentials> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] GET /native/config');\n }\n\n const response = await fetchWithTimeout<NativeConfigResponse>(\n `${config.saasApiUrl}/native/config`,\n { method: 'GET', headers: getHeaders(undefined, true) },\n config.timeout || 30000\n );\n\n if (!response.success || !response.encrypted_credentials || !response.app_key) {\n throw new ApiError('Configuration invalide reçue du SaaS (app_key ou encrypted_credentials manquant)', 'server');\n }\n\n credentials = {\n appKey: response.app_key,\n encryptedCredentials: response.encrypted_credentials,\n };\n\n credentialsLoadedAt = Date.now();\n credentialsTtl = response.credentials_ttl || DEFAULT_TTL;\n\n // Propager le debug mode depuis le backend (si défini)\n if (typeof response.debug === 'boolean') {\n const currentConfig = getNativeAuthConfig();\n if (currentConfig.debug !== true) {\n setNativeAuthConfig({ debug: response.debug });\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Credentials chargés (ttl:', credentialsTtl, 's, debug:', response.debug ?? 'non défini', ')');\n }\n\n return credentials;\n },\n\n async encrypt(\n type: NativeAuthType,\n data: Partial<NativeEncryptRequest>\n ): Promise<NativeEncryptResponse> {\n // Auto-refresh credentials if expiring soon\n await this.ensureFreshCredentials();\n\n if (!credentials) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n const payload: NativeEncryptRequest = {\n type,\n app_key: credentials.appKey,\n encrypted_credentials: credentials.encryptedCredentials,\n ...data,\n };\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/encrypt', { type, ...data });\n }\n\n const response = await fetchWithTimeout<NativeEncryptResponse>(\n `${config.iamApiUrl}/iam/native/encrypt`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(payload),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] native_token reçu, expire dans', response.expires_in, 's');\n }\n\n return response;\n },\n\n async init(nativeToken: string): Promise<NativeInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/init');\n }\n\n const response = await fetchWithTimeout<NativeInitResponse>(\n `${config.iamApiUrl}/iam/native/init`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ native_token: nativeToken }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init:', { status: response.status, hasProcessToken: !!response.process_token });\n }\n\n return response;\n },\n\n async validate(\n processToken: string,\n creds: { password?: string; otp_code?: string }\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate');\n }\n\n const response = await fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n ...creds,\n }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Validate:', { \n hasCallback: !!response.callback_token, \n requires2fa: response.requires_2fa \n });\n }\n\n return response;\n },\n\n async verifyTotp(\n processToken: string,\n totpCode: string\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/verify-totp');\n }\n\n return fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/verify-totp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n totp_code: totpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async grantAccess(processToken: string): Promise<NativeGrantAccessResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/grant-access');\n }\n\n return fetchWithTimeout<NativeGrantAccessResponse>(\n `${config.iamApiUrl}/iam/native/grant-access`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<NativeResendOtpResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/resend-otp');\n }\n\n return fetchWithTimeout<NativeResendOtpResponse>(\n `${config.iamApiUrl}/iam/native/resend-otp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async exchange(callbackToken: string): Promise<NativeExchangeResponse> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/exchange');\n }\n\n const response = await fetchWithTimeout<NativeExchangeResponse>(\n `${config.saasApiUrl}/native/exchange`,\n {\n method: 'POST',\n headers: getHeaders(undefined, true),\n body: JSON.stringify({ callback_token: callbackToken }),\n },\n config.timeout || 30000\n );\n\n if (response.success && response.token) {\n setAuthToken(response.token);\n if (response.user) {\n setAuthUser(response.user);\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Session établie:', { user: response.user?.name });\n }\n\n return response;\n },\n\n async checkToken(token: string): Promise<{ valid: boolean; user_infos?: import('../types/native').UserInfos }> {\n const cfg = getNativeAuthConfig();\n if (!cfg.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/check-token');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean; valid: boolean; user_infos?: import('../types/native').UserInfos }>(\n `${cfg.saasApiUrl}/native/check-token`,\n {\n method: 'POST',\n headers: getHeaders(token, true),\n },\n 10000\n );\n return { valid: response.valid !== false, user_infos: response.user_infos };\n } catch (err) {\n if (err instanceof ApiError && err.statusCode === 401) {\n return { valid: false };\n }\n throw err; // Network/timeout → re-throw (caller will keep session)\n }\n },\n\n async logout(token?: string): Promise<{ success: boolean }> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean }>(\n `${config.saasApiUrl}/native/logout`,\n {\n method: 'POST',\n headers: getHeaders(token, true),\n },\n config.timeout || 30000\n );\n\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return response;\n } catch {\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return { success: true };\n }\n },\n\n clearCredentials(): void {\n credentials = null;\n credentialsLoadedAt = 0;\n },\n\n // ============================================\n // High-level methods\n // ============================================\n\n async loginEmail(\n email: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_email', {\n email,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginPhone(\n ccphone: string,\n phone: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_phone', {\n ccphone,\n phone,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginAccessOtp(otpCode: string): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_access_otp', {\n otp_code: otpCode.replace(/[\\s-]/g, ''),\n });\n return this.init(native_token);\n },\n\n async register(data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n registration_type?: 'email' | 'phone';\n }): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('register', {\n ...data,\n registration_type: data.registration_type || 'email',\n });\n return this.init(native_token);\n },\n\n async registerPhoneOnly(data: {\n name: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }): Promise<NativeInitResponse> {\n if (data.ccphone !== '+221') {\n throw new ApiError(\n \"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\",\n 'validation',\n 422,\n 'invalid_country_code'\n );\n }\n\n const { native_token } = await this.encrypt('register', {\n ...data,\n email: '',\n registration_type: 'phone',\n });\n return this.init(native_token);\n },\n\n async recoverPassword(\n method: 'email' | 'phone',\n identifier: { email?: string; ccphone?: string; phone?: string }\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('recovery_password', {\n method,\n ...identifier,\n });\n return this.init(native_token);\n },\n};\n\nexport default nativeAuthService;\n","/**\n * Service de récupération de mot de passe v1.0\n * Architecture Frontend-First : Appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout, \n getNativeAuthConfig, \n isDebugMode,\n} from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n MobilePasswordInitResponse,\n MobilePasswordSelectMethodResponse,\n MobilePasswordResetResponse,\n MobilePasswordResendResponse,\n} from '../types/mobile';\n\n// ============================================\n// Credentials (shared with nativeAuth)\n// ============================================\n\nfunction getIAMHeaders(): HeadersInit {\n const creds = nativeAuthService.getCredentials();\n if (!creds) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n return {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const mobilePasswordService = {\n hasCredentials(): boolean {\n return nativeAuthService.hasCredentials();\n },\n\n async loadCredentials() {\n return nativeAuthService.loadCredentials();\n },\n\n async initRecovery(email: string): Promise<MobilePasswordInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/init', { email });\n }\n\n const response = await fetchWithTimeout<MobilePasswordInitResponse>(\n `${config.iamApiUrl}/iam/native/password/init`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ email }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init recovery:', { \n status: response.status, \n hasOtp: !!response.otp_code,\n });\n }\n\n return response;\n },\n\n async selectMethod(\n processToken: string, \n receiveChoice: 'email' | 'phone'\n ): Promise<MobilePasswordSelectMethodResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/select-method', { receiveChoice });\n }\n\n return fetchWithTimeout<MobilePasswordSelectMethodResponse>(\n `${config.iamApiUrl}/iam/native/password/select-method`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ \n process_token: processToken, \n receive_choice: receiveChoice,\n }),\n },\n config.timeout || 30000\n );\n },\n\n validateOtpLocally(inputCode: string, storedCode: string): boolean {\n return inputCode === storedCode;\n },\n\n async reset(\n processToken: string,\n password: string\n ): Promise<MobilePasswordResetResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/reset');\n }\n\n return fetchWithTimeout<MobilePasswordResetResponse>(\n `${config.iamApiUrl}/iam/native/password/reset`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<MobilePasswordResendResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/resend');\n }\n\n return fetchWithTimeout<MobilePasswordResendResponse>(\n `${config.iamApiUrl}/iam/native/password/resend`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n};\n\nexport { ApiError };\nexport default mobilePasswordService;\n","/**\n * Hook de récupération de mot de passe v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobilePasswordService } from '../services/mobilePassword';\nimport { setNativeAuthConfig, ApiError } from '../services/api';\nimport type { MobilePasswordState } from '../types/mobile';\n\nexport interface UseMobilePasswordOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n autoLoadCredentials?: boolean;\n \n}\n\ninterface MobilePasswordStateExtended extends MobilePasswordState {\n credentialsLoaded: boolean;\n errorType: string | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof ApiError) {\n return { message: err.message, type: err.type };\n }\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport function useMobilePassword(options: UseMobilePasswordOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true } = options;\n\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl]);\n\n const [state, setState] = useState<MobilePasswordStateExtended>({\n credentialsLoaded: false,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n await mobilePasswordService.loadCredentials();\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const initRecovery = useCallback(async (email: string) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!mobilePasswordService.hasCredentials()) {\n await mobilePasswordService.loadCredentials();\n }\n const response = await mobilePasswordService.initRecovery(email);\n\n if (response.success && response.process_token) {\n if (response.status === 'choice_required') {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'choice_required',\n maskedEmail: response.masked_email || null,\n maskedPhone: response.masked_phone || null,\n loading: false,\n }));\n return { success: true, status: 'choice_required' as const };\n } else {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: 'email',\n maskedEmail: response.masked_email || null,\n loading: false,\n }));\n return { success: true, status: 'pending_otp' as const };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Aucun compte trouvé avec cet email',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la recherche du compte');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const selectMethod = useCallback(async (choice: 'email' | 'phone') => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.selectMethod(state.processToken, choice);\n if (response.success) {\n setState(prev => ({\n ...prev,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: response.receive_mode || choice,\n loading: false,\n }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Impossible d\\'envoyer le code',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'envoi du code');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const verifyOtp = useCallback((inputCode: string): boolean => {\n if (!state.storedOtp) {\n setState(prev => ({ ...prev, error: 'Session invalide', errorType: 'invalid_session' }));\n return false;\n }\n const isValid = mobilePasswordService.validateOtpLocally(inputCode, state.storedOtp);\n if (isValid) {\n setState(prev => ({ ...prev, status: 'pending_password', error: null, errorType: null }));\n return true;\n }\n setState(prev => ({ ...prev, error: 'Code incorrect', errorType: 'invalid_otp' }));\n return false;\n }, [state.storedOtp]);\n\n const resetPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.reset(state.processToken, password);\n if (response.success) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la réinitialisation',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la réinitialisation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.resendOtp(state.processToken);\n if (response.success && response.otp_code) {\n setState(prev => ({ ...prev, storedOtp: response.otp_code!, loading: false }));\n return { success: true, cooldown: response.cooldown_remaining };\n }\n setState(prev => ({ ...prev, loading: false }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n credentialsLoaded: state.credentialsLoaded,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n }, [state.credentialsLoaded]);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n storedOtp: state.storedOtp,\n receiveMode: state.receiveMode,\n maskedEmail: state.maskedEmail,\n maskedPhone: state.maskedPhone,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n\n isCompleted: state.status === 'completed',\n isChoiceRequired: state.status === 'choice_required',\n isPendingOtp: state.status === 'pending_otp',\n isPendingPassword: state.status === 'pending_password',\n\n loadCredentials,\n initRecovery,\n selectMethod,\n verifyOtp,\n resetPassword,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobilePassword;\n","/**\n * Password Recovery Modal for @ollaid/native-sso\n * Flow: email → method-choice → OTP → new password → success\n * Design aligned with web SSO\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label, RadioGroup, RadioGroupItem,\n IconLock, IconCheckCircle2, IconArrowLeft, IconKeyRound, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport { useMobilePassword } from '../hooks/useMobilePassword';\n\nexport interface PasswordRecoveryModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess: () => void;\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\ntype RecoveryStep = 'email' | 'method-choice' | 'otp' | 'password' | 'success';\n\nconst C = {\n primary: '#002147',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nexport function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl }: PasswordRecoveryModalProps) {\n const {\n status, loading: pwLoading, error: pwError, receiveMode, maskedEmail, maskedPhone,\n initRecovery, selectMethod, verifyOtp, resetPassword, resendOtp, reset: resetHook, clearError,\n } = useMobilePassword({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<RecoveryStep>('email');\n const [email, setEmail] = useState('');\n const [otp, setOtp] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<'email' | 'phone'>('email');\n const [resendCooldown, setResendCooldown] = useState(0);\n\n const error = localError || pwError;\n\n useEffect(() => {\n if (status === 'choice_required') setStep('method-choice');\n else if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); }\n else if (status === 'pending_password') setStep('password');\n else if (status === 'completed') setStep('success');\n }, [status]);\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n const resetState = () => {\n setStep('email'); setEmail(''); setOtp(''); setPassword(''); setConfirmPassword('');\n setLocalError(null); setSelectedMethod('email'); setResendCooldown(0); resetHook();\n };\n\n const handleClose = () => { resetState(); onOpenChange(false); };\n const handleBackToLogin = () => { resetState(); onSuccess(); };\n\n const handleEmailSubmit = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim())) { setLocalError('Veuillez entrer une adresse email valide'); return; }\n await initRecovery(email.trim());\n };\n\n const handleMethodSubmit = async () => {\n setLocalError(null); clearError();\n await selectMethod(selectedMethod);\n };\n\n const handleOTPSubmit = () => {\n if (otp.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const isValid = verifyOtp(otp);\n if (!isValid) setLocalError('Code incorrect');\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) { setResendCooldown(result.cooldown || 60); setOtp(''); setLocalError(null); }\n };\n\n const handlePasswordSubmit = async () => {\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== confirmPassword) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setLocalError(null); clearError();\n await resetPassword(password);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n if (step === 'method-choice') { setStep('email'); resetHook(); }\n else if (step === 'otp') { setStep(maskedPhone ? 'method-choice' : 'email'); resetHook(); }\n else if (step === 'password') setStep('otp');\n };\n\n // ===== SUCCESS =====\n if (step === 'success') {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Mot de passe modifié !</DialogTitle>\n <DialogDescription>Votre mot de passe a été changé avec succès.</DialogDescription>\n </DialogHeader>\n <Button onClick={handleBackToLogin} style={{ width: '100%', marginTop: '1rem' }}>Retour à la connexion</Button>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n {step !== 'email' && (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n )}\n\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n {step === 'otp' ? (\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n ) : (\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>\n {step === 'email' && 'Récupération de mot de passe'}\n {step === 'method-choice' && 'Recevoir le code de vérification'}\n {step === 'otp' && 'Vérification'}\n {step === 'password' && 'Nouveau mot de passe'}\n </DialogTitle>\n <DialogDescription>\n {step === 'email' && 'Veuillez entrer votre adresse email'}\n {step === 'method-choice' && 'Comment souhaitez-vous recevoir le code ?'}\n {step === 'otp' && (receiveMode === 'phone' ? `Code envoyé par SMS au ${maskedPhone}` : `Code envoyé par email à ${maskedEmail}`)}\n {step === 'password' && 'Définissez votre nouveau mot de passe'}\n </DialogDescription>\n </DialogHeader>\n\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {error && <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div>}\n\n {step === 'email' && (\n <>\n <div><Label htmlFor=\"recovery-email\">Adresse email</Label><Input id=\"recovery-email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email} onChange={e => setEmail(e.target.value)} disabled={pwLoading} /></div>\n <Button onClick={handleEmailSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n <Button variant=\"ghost\" onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n </>\n )}\n\n {step === 'method-choice' && (\n <>\n <RadioGroup value={selectedMethod} onValueChange={v => setSelectedMethod(v as 'email' | 'phone')}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'email' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('email')}>\n <RadioGroupItem value=\"email\" id=\"method-email\" />\n <div><div style={{ fontWeight: 500 }}>Par email</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedEmail}</div></div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'phone' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('phone')}>\n <RadioGroupItem value=\"phone\" id=\"method-phone\" />\n <div><div style={{ fontWeight: 500 }}>Par SMS</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedPhone}</div></div>\n </div>\n </div>\n </RadioGroup>\n <Button onClick={handleMethodSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Envoi...\n </span>\n ) : 'Envoyer le code'}\n </Button>\n </>\n )}\n\n {step === 'otp' && (\n <>\n <OTPInput value={otp} onChange={setOtp} disabled={pwLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : (\n <button type=\"button\" style={{ color: C.primary, background: 'none', border: 'none', cursor: 'pointer', textDecoration: 'underline' }} onClick={handleResendOTP}>Code non reçu ? Renvoyer</button>\n )}\n </div>\n <Button onClick={handleOTPSubmit} disabled={otp.length !== 6} style={{ width: '100%' }}>Vérifier</Button>\n </>\n )}\n\n {step === 'password' && (\n <>\n <div><Label>Nouveau mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={pwLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"Retapez votre mot de passe\" value={confirmPassword} onChange={e => setConfirmPassword(e.target.value)} disabled={pwLoading} /></div>\n <Button onClick={handlePasswordSubmit} disabled={pwLoading || !password || !confirmPassword} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Modification...\n </span>\n ) : 'Modifier le mot de passe'}\n </Button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default PasswordRecoveryModal;\n","/**\n * Hook de vérification périodique du token Sanctum\n * \n * - Premier check 2 min après login\n * - Checks suivants toutes les 5 min\n * - Ne déconnecte PAS si offline ou serveur inaccessible\n * - Déconnecte UNIQUEMENT si le backend retourne 401 (token invalide)\n * \n * @version 1.0.0\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { STORAGE_KEYS } from '../services/api';\nimport type { UserInfos } from '../types/native';\n\nconst FIRST_CHECK_DELAY = 2 * 60 * 1000; // 2 minutes\nconst INTERVAL_DELAY = 5 * 60 * 1000; // 5 minutes\n\nexport interface UseTokenHealthCheckOptions {\n /** Whether to enable health checks (true when authenticated) */\n enabled: boolean;\n /** SaaS API base URL */\n saasApiUrl: string;\n /** Called when the backend explicitly invalidates the token (401) */\n onTokenInvalid: () => void;\n /** Called when fresh user_infos are received */\n onUserUpdated?: (userInfos: UserInfos) => void;\n /** Debug mode */\n debug?: boolean;\n}\n\nasync function checkTokenValidity(\n saasApiUrl: string,\n token: string,\n debug: boolean\n): Promise<{ valid: boolean; user_infos?: UserInfos }> {\n // 1. Check connectivity first\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n if (debug) console.log('🔄 [HealthCheck] Offline — skip');\n throw new Error('offline');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout\n\n try {\n const response = await fetch(`${saasApiUrl}/native/check-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 401 = token explicitly invalid/expired → the ONLY case we disconnect\n if (response.status === 401) {\n if (debug) console.log('🔄 [HealthCheck] Token invalide (401)');\n return { valid: false };\n }\n\n // Any other non-OK status = server issue, NOT token issue → keep session\n if (!response.ok) {\n if (debug) console.log(`🔄 [HealthCheck] Serveur erreur ${response.status} — session conservée`);\n throw new Error(`server_error_${response.status}`);\n }\n\n const data = await response.json();\n if (debug) console.log('🔄 [HealthCheck] Token valide ✅');\n\n return {\n valid: data.valid !== false,\n user_infos: data.user_infos,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Re-throw if it's our \"valid: false\" result wrapped in the return above\n if (error instanceof Error && error.message === 'offline') {\n throw error;\n }\n\n // Network errors, timeouts, server unreachable → do NOT invalidate\n if (debug) {\n const msg = error instanceof Error ? error.message : 'unknown';\n console.log(`🔄 [HealthCheck] Erreur réseau/serveur (${msg}) — session conservée`);\n }\n throw error;\n }\n}\n\nexport function useTokenHealthCheck(options: UseTokenHealthCheckOptions): void {\n const { enabled, saasApiUrl, onTokenInvalid, onUserUpdated, debug = false } = options;\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const enabledRef = useRef(enabled);\n const callbacksRef = useRef({ onTokenInvalid, onUserUpdated });\n\n // Keep refs up to date\n enabledRef.current = enabled;\n callbacksRef.current = { onTokenInvalid, onUserUpdated };\n\n const performCheck = useCallback(async () => {\n if (!enabledRef.current) return;\n\n const token = typeof localStorage !== 'undefined'\n ? localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN)\n : null;\n\n if (!token) {\n if (debug) console.log('🔄 [HealthCheck] Pas de token — arrêt');\n return;\n }\n\n try {\n const result = await checkTokenValidity(saasApiUrl, token, debug);\n\n if (!result.valid) {\n // Token explicitly rejected by backend → clear session\n callbacksRef.current.onTokenInvalid();\n return;\n }\n\n // Token valid — update user_infos if provided\n if (result.user_infos && callbacksRef.current.onUserUpdated) {\n callbacksRef.current.onUserUpdated(result.user_infos);\n }\n } catch {\n // Network/timeout/server error → silently keep session\n }\n }, [saasApiUrl, debug]);\n\n useEffect(() => {\n // Cleanup previous timers\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n if (!enabled || !saasApiUrl) return;\n\n if (debug) console.log('🔄 [HealthCheck] Activé — premier check dans 2 min');\n\n // First check after 2 minutes\n timerRef.current = setTimeout(() => {\n performCheck();\n\n // Then every 5 minutes\n intervalRef.current = setInterval(performCheck, INTERVAL_DELAY);\n }, FIRST_CHECK_DELAY);\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [enabled, saasApiUrl, performCheck, debug]);\n}\n\nexport default useTokenHealthCheck;\n","/**\n * Hook d'authentification Native SSO v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig, STORAGE_KEYS, isDebugMode } from '../services/api';\nimport { useTokenHealthCheck } from './useTokenHealthCheck';\nimport type {\n NativeAuthState,\n NativeAuthStatus,\n NativeExchangeResponse,\n AccountType,\n UserInfos,\n} from '../types/native';\n\n/** Helper: persist session to localStorage (unified keys) */\nfunction saveSession(exchangeResult: NativeExchangeResponse, accountType: AccountType | 'user' | 'client') {\n const sanctumToken = exchangeResult.auth_token || exchangeResult.token;\n localStorage.setItem(STORAGE_KEYS.AUTH_TOKEN, sanctumToken);\n localStorage.setItem(STORAGE_KEYS.TOKEN, sanctumToken);\n \n // Build user object from user_infos if available, otherwise from user\n const baseUser = exchangeResult.user_infos \n ? { ...exchangeResult.user, ...exchangeResult.user_infos }\n : exchangeResult.user;\n \n // Enrich user with iam_reference and alias_reference\n const aliasRef = exchangeResult.user?.alias_reference || (exchangeResult as any).alias_reference || '';\n const iamRef = exchangeResult.user?.reference || '';\n \n const userToStore = {\n ...baseUser,\n iam_reference: iamRef,\n alias_reference: aliasRef,\n };\n \n // Store alias_reference separately for quick access\n if (aliasRef) {\n localStorage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, aliasRef);\n }\n \n // account_type is stored SEPARATELY, never inside the user object\n // Use the accountType string directly (already resolved by the caller)\n const acctType = typeof accountType === 'string' ? accountType : 'user';\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(userToStore));\n localStorage.setItem(STORAGE_KEYS.ACCOUNT_TYPE, acctType);\n \n return { token: sanctumToken, user: userToStore };\n}\n\n/** Helper: clear session from localStorage */\nfunction clearSession() {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport interface UseNativeAuthOptions {\n /** URL du Backend SaaS */\n saasApiUrl: string;\n /** URL du Backend IAM */\n iamApiUrl: string;\n /** Charger les credentials automatiquement au montage */\n autoLoadCredentials?: boolean;\n /** Type de compte par défaut à persister (défaut: 'user') */\n defaultAccountType?: 'user' | 'client';\n /** \n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant dynamique : 'iam', 'iam_vendor', 'iam_client', etc.\n */\n configPrefix?: string;\n}\n\nexport function useNativeAuth(options: UseNativeAuthOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true, defaultAccountType = 'user', configPrefix = 'iam' } = options;\n \n const configuredRef = useRef(false);\n \n // Debug réactif : mis à jour après loadCredentials\n const [isDebug, setIsDebug] = useState(isDebugMode());\n \n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl, configPrefix });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl, configPrefix]);\n\n const [state, setState] = useState<NativeAuthState & { otpMethod?: string | null; otpSentTo?: string | null }>({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n // --- Token Health Check ---\n const handleTokenInvalid = useCallback(() => {\n if (isDebug) console.log('🔐 [HealthCheck] Token invalide — déconnexion locale');\n clearSession();\n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, [isDebug]);\n\n const handleUserUpdated = useCallback((userInfos: UserInfos) => {\n // Merge fresh user_infos into stored user\n const storedRaw = localStorage.getItem(STORAGE_KEYS.USER);\n if (storedRaw) {\n try {\n const stored = JSON.parse(storedRaw);\n const merged = { ...stored, ...userInfos };\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(merged));\n setState(prev => ({ ...prev, user: merged }));\n } catch { /* ignore */ }\n }\n }, []);\n\n useTokenHealthCheck({\n enabled: state.status === 'completed' && state.user !== null,\n saasApiUrl,\n onTokenInvalid: handleTokenInvalid,\n onUserUpdated: handleUserUpdated,\n debug: isDebug,\n });\n\n // Check existing session\n useEffect(() => {\n const storedToken = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const storedUser = localStorage.getItem(STORAGE_KEYS.USER);\n \n if (storedToken && storedUser) {\n try {\n const user = JSON.parse(storedUser);\n setState(prev => ({ ...prev, user, status: 'completed' }));\n } catch {\n clearSession();\n }\n }\n }, []);\n\n // Auto-load credentials\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded && !state.user) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded, state.user]);\n\n // Background auto-refresh of credentials before TTL expiration\n useEffect(() => {\n // Only refresh while user is NOT authenticated and credentials are loaded\n if (state.status === 'completed' || !state.credentialsLoaded) return;\n\n const ttl = nativeAuthService.getCredentialsTtl();\n const refreshInterval = Math.max((ttl - 30) * 1000, 30000); // At least 30s\n\n if (isDebug) {\n console.log(`🔄 [Native] Auto-refresh credentials every ${refreshInterval / 1000}s (TTL: ${ttl}s)`);\n }\n\n const timer = setInterval(async () => {\n try {\n await nativeAuthService.loadCredentials();\n // Re-check debug après refresh (le backend peut changer la valeur)\n setIsDebug(isDebugMode());\n if (isDebugMode()) console.log('✅ [Native] Credentials auto-refreshed');\n } catch (err) {\n if (isDebugMode()) console.warn('⚠️ [Native] Auto-refresh failed:', err);\n }\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [state.status, state.credentialsLoaded, isDebug]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n await nativeAuthService.loadCredentials();\n // Mettre à jour le debug réactif après chargement des credentials\n setIsDebug(isDebugMode());\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithEmail = useCallback(async (\n email: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginEmail(email, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n if (response.error_type === 'alias_disabled' && response.alternative_method) {\n setState(prev => ({\n ...prev,\n alternativeMethod: {\n type: response.alternative_method!,\n value: response.alternative_method === 'email' \n ? response.alternative_email! \n : response.alternative_phone!,\n },\n loading: false,\n error: 'Cette méthode de connexion est désactivée',\n errorType: 'alias_disabled',\n }));\n return { success: false, error_type: 'alias_disabled' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithPhone = useCallback(async (\n ccphone: string,\n phone: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginPhone(ccphone, phone, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithAccessOtp = useCallback(async (otpCode: string) => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginAccessOtp(otpCode);\n\n // v4.5: Handle needs_access (user needs to confirm access)\n if (response.success && response.needs_access && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n // v4.5: Handle direct callback_token (user already has access)\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, loading: false }));\n return { success: true, status: 'completed', callback_token: response.callback_token };\n }\n\n // Legacy: Handle process_token response\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code invalide',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const register = useCallback(async (\n data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const registrationType = accountType === 'phone-only' ? 'phone' : 'email';\n \n const response = await nativeAuthService.register({\n ...data,\n email: registrationType === 'phone' ? '' : data.email,\n registration_type: registrationType,\n });\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n otpMethod: response.otp_method || null,\n otpSentTo: response.otp_sent_to || null,\n conflict: response.conflict ? {\n type: response.conflict.type,\n maskedIdentifier: response.conflict.masked_identifier,\n options: {\n canLogin: response.conflict.options.can_login,\n canRecoverByEmail: response.conflict.options.can_recover_by_email,\n canRecoverBySms: response.conflict.options.can_recover_by_sms,\n maskedEmail: response.conflict.options.masked_email,\n maskedPhone: response.conflict.options.masked_phone,\n },\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [accountType]);\n\n const submitPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { password });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.requires_2fa) {\n setState(prev => ({ ...prev, status: 'pending_2fa', loading: false }));\n return { success: true, requires_2fa: true };\n }\n\n // needs_access after password validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Mot de passe incorrect',\n errorType: response.error_type || 'invalid_password',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la validation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { otp_code: otpCode });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.success && response.status === 'pending_registration') {\n setState(prev => ({ ...prev, status: 'pending_registration', loading: false }));\n return { success: true, status: 'pending_registration' };\n }\n\n // needs_access after OTP validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitTotp = useCallback(async (totpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.verifyTotp(state.processToken, totpCode);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code 2FA incorrect',\n errorType: response.error_type || 'invalid_totp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification 2FA');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const grantAccess = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.grantAccess(state.processToken);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'accès',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'accès');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n message: response.message,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const setSession = useCallback((data: NativeExchangeResponse) => {\n const { user: savedUser } = saveSession(data, defaultAccountType);\n setState(prev => ({\n ...prev,\n user: savedUser,\n status: 'completed',\n processToken: null,\n }));\n }, [defaultAccountType]);\n\n const logout = useCallback(async () => {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n try {\n if (token) {\n await nativeAuthService.logout(token);\n }\n } catch { /* ignore */ }\n\n clearSession();\n \n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, []);\n\n const reset = useCallback(() => {\n setState(prev => ({\n ...prev,\n processToken: null,\n status: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n error: null,\n errorType: null,\n }));\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n // State\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n user: state.user,\n application: state.application,\n prompt: state.prompt,\n alternativeMethod: state.alternativeMethod,\n conflict: state.conflict,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n isAuthenticated: state.status === 'completed' && state.user !== null,\n \n /** Debug réactif — mis à jour après loadCredentials */\n isDebug,\n \n accountType,\n isPhoneOnly: accountType === 'phone-only',\n otpMethod: state.otpMethod,\n otpSentTo: state.otpSentTo,\n\n // Methods\n loadCredentials,\n loginWithEmail,\n loginWithPhone,\n loginWithAccessOtp,\n submitPassword,\n submitOtp,\n submitTotp,\n grantAccess,\n resendOtp,\n setSession,\n logout,\n reset,\n clearError,\n register,\n setAccountType,\n };\n}\n\nexport default useNativeAuth;\n","/**\n * Login Modal for @ollaid/native-sso\n * Complete login flow aligned with web SSO /sso/auth design\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label,\n IconShieldCheck, IconMail, IconPhone, IconLock, IconKeyRound,\n IconArrowLeft, IconEye, IconEyeOff, IconCheckCircle2, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport type { UserInfos } from '../types/native';\n\ntype LoginStep = 'choice' | 'email-check' | 'email-password' | 'email-otp' | 'email-create-password' | 'phone-input' | 'phone-otp' | 'access-otp';\n\nexport interface LoginModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToSignup: () => void;\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n loading?: boolean;\n showSwitchToSignup?: boolean;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n}\n\n// Design tokens\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\n// Reusable style helpers\nconst iconCircle = (bg: string): React.CSSProperties => ({\n margin: '0 auto', width: '3rem', height: '3rem', backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst errorBoxStyle: React.CSSProperties = {\n padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg,\n color: C.red, fontSize: '0.875rem',\n};\n\nconst methodBtnStyle: React.CSSProperties = {\n width: '100%', height: '3.5rem', justifyContent: 'flex-start', gap: '0.75rem',\n textAlign: 'left' as const, backgroundColor: C.gray100, borderColor: C.gray200,\n};\n\nconst methodIconStyle = (bg: string): React.CSSProperties => ({\n width: '2.5rem', height: '2.5rem', backgroundColor: bg, borderRadius: '0.5rem',\n display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,\n});\n\nexport function LoginModal({\n open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, loading, showSwitchToSignup = true, defaultAccountType,\n}: LoginModalProps) {\n const {\n status, user, application, alternativeMethod, loading: authLoading, error: authError,\n loginWithEmail, loginWithPhone, submitPassword, submitOtp, grantAccess, loginWithAccessOtp,\n resendOtp, setSession, reset: resetAuth, clearError,\n } = useNativeAuth({ saasApiUrl, iamApiUrl, defaultAccountType });\n\n const [step, setStep] = useState<LoginStep>('choice');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [userName, setUserName] = useState<string | null>(null);\n const [phone, setPhone] = useState('');\n const [phoneOtpCode, setPhoneOtpCode] = useState('');\n const [emailOtpCode, setEmailOtpCode] = useState('');\n const [accessOtpCode, setAccessOtpCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [loginSuccess, setLoginSuccess] = useState(false);\n const [loginData, setLoginData] = useState<{ token: string; user: UserInfos } | null>(null);\n const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n\n const CCPHONE = '+221';\n const isSubmitting = authLoading || loading;\n const error = localError || authError;\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(p => p - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n useEffect(() => {\n if (status === 'pending_password') setStep('email-password');\n else if (status === 'pending_otp') {\n if (step === 'email-check' || step === 'email-password') setStep('email-otp');\n else if (step === 'phone-input') setStep('phone-otp');\n setResendCooldown(60);\n }\n }, [status, step]);\n\n useEffect(() => {\n if (loginSuccess && loginData) {\n const timer = setTimeout(() => {\n setSession({ success: true, token: loginData.token, expires_at: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), user: loginData.user as any });\n onLoginSuccess?.(loginData.token, loginData.user);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [loginSuccess, loginData]);\n\n const resetState = () => {\n setStep('choice'); setEmail(''); setPassword('');\n setShowPassword(false); setUserName(null); setPhone(''); setPhoneOtpCode(''); setEmailOtpCode('');\n setAccessOtpCode(''); setLocalError(null); setLoginSuccess(false); setLoginData(null);\n setResendCooldown(0); resetAuth();\n };\n\n useEffect(() => { if (!open) resetState(); }, [open]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setLoginData({ token: response.token, user: response.user as UserInfos });\n setLoginSuccess(true);\n } else {\n setLocalError('Erreur lors de la finalisation de la connexion');\n }\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleEmailCheck = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) { setLocalError('Adresse email invalide'); return; }\n const result = await loginWithEmail(email.trim());\n if (result.success && user?.name) setUserName(user.name);\n };\n\n const handleEmailPasswordSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!password) { setLocalError('Le mot de passe est requis'); return; }\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n const result = await submitPassword(password);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleEmailOtpVerify = async () => {\n setLocalError(null); clearError();\n if (emailOtpCode.length !== 6) { setLocalError('Le code doit contenir 6 chiffres'); return; }\n const result = await submitOtp(emailOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handlePhoneInit = async () => {\n setLocalError(null); clearError();\n const cleanPhone = phone.replace(/\\s/g, '');\n if (cleanPhone.length !== 9) { setLocalError('Le numéro doit contenir exactement 9 chiffres'); return; }\n await loginWithPhone(CCPHONE, cleanPhone);\n };\n\n const handlePhoneVerify = async () => {\n setLocalError(null); clearError();\n if (phoneOtpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n const result = await submitOtp(phoneOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleAccessOtpSubmit = async () => {\n setLocalError(null); clearError();\n if (accessOtpCode.length !== 8) { setLocalError('Veuillez entrer le code à 8 chiffres'); return; }\n const result = await loginWithAccessOtp(accessOtpCode);\n if (result.success) {\n if ((result as any).callback_token) {\n await exchangeCallbackToken((result as any).callback_token);\n }\n // needs_access is handled by status effect\n }\n };\n\n const handleGrantAccess = async () => {\n setLocalError(null); clearError();\n const result = await grantAccess();\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) setResendCooldown(result.cooldown || 60);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n switch (step) {\n case 'email-check': case 'phone-input': case 'access-otp': setStep('choice'); resetAuth(); break;\n case 'email-password': case 'email-otp': setStep('email-check'); resetAuth(); break;\n case 'phone-otp': setStep('phone-input'); resetAuth(); break;\n default: setStep('choice'); resetAuth();\n }\n };\n\n // Render helpers\n const renderError = () => error ? <div style={errorBoxStyle}>{error}</div> : null;\n\n const renderBackBtn = () => (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n );\n\n const renderResendLink = () => (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? (\n <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span>\n ) : (\n <button type=\"button\" style={linkStyle} onClick={handleResendOTP}>\n Code non reçu ? Renvoyer\n </button>\n )}\n </div>\n );\n\n const renderLoaderBtn = (text: string, loadingText: string, onClick: () => void, disabled: boolean, extraStyle?: React.CSSProperties) => (\n <Button onClick={onClick} disabled={isSubmitting || disabled} style={{ width: '100%', ...extraStyle }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n {loadingText}\n </span>\n ) : text}\n </Button>\n );\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {loginSuccess && loginData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Connexion réussie</DialogTitle>\n <DialogDescription>\n <span style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n Redirection en cours...\n </span>\n </DialogDescription>\n </DialogHeader>\n\n /* ===================== NEEDS ACCESS ===================== */\n ) : status === 'needs_access' && user && application ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.primary + '1a'), width: '4rem', height: '4rem' }}>\n {(application as any).logo ? (\n <img src={(application as any).logo} alt={(application as any).name} style={{ width: '2.5rem', height: '2.5rem', borderRadius: '0.5rem' }} />\n ) : (\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>Bienvenue sur {(application as any).name} !</DialogTitle>\n <DialogDescription>\n Bonjour <strong style={{ color: C.gray900 }}>{user.name}</strong>, vous n'avez pas encore de compte sur <strong style={{ color: C.primary }}>{(application as any).name}</strong>.\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem' }}>\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', marginBottom: '1rem', fontSize: '0.875rem', color: C.gray500 }}>\n Votre compte <strong style={{ color: C.primary }}>iam.ollaid.com</strong> existe déjà. Cliquez sur Confirmer pour créer votre accès à <strong style={{ color: C.gray900 }}>{(application as any).name}</strong>.\n </div>\n {renderError()}\n <Button onClick={handleGrantAccess} disabled={isSubmitting} style={{ width: '100%', marginTop: '0.75rem' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Création en cours...\n </span>\n ) : 'Confirmer la création de mon compte'}\n </Button>\n <Button variant=\"outline\" onClick={() => { resetAuth(); setStep('choice'); }} disabled={isSubmitting} style={{ width: '100%', marginTop: '0.5rem' }}>\n Annuler\n </Button>\n </div>\n </>\n\n /* ===================== ALIAS DISABLED ===================== */\n ) : alternativeMethod ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.amberBg), width: '4rem', height: '4rem' }}>\n {alternativeMethod.type === 'email' ? (\n <IconMail style={{ width: '2rem', height: '2rem', color: C.amber }} />\n ) : (\n <IconPhone style={{ width: '2rem', height: '2rem', color: C.amber }} />\n )}\n </div>\n <DialogTitle>Moyen de connexion désactivé</DialogTitle>\n <DialogDescription>\n Vos identifiants sont corrects, mais vous avez désactivé ce moyen de connexion depuis votre compte IAM.\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem' }}>\n {alternativeMethod.value && (\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', marginBottom: '1rem' }}>\n <p style={{ fontSize: '0.875rem', color: C.gray500, marginBottom: '0.75rem' }}>Vous pouvez vous connecter avec :</p>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.875rem', fontWeight: 500, color: C.gray900 }}>\n {alternativeMethod.type === 'phone' ? (\n <IconPhone style={{ width: '1rem', height: '1rem', color: C.primary }} />\n ) : (\n <IconMail style={{ width: '1rem', height: '1rem', color: C.primary }} />\n )}\n <span>{alternativeMethod.value}</span>\n </div>\n </div>\n )}\n <Button onClick={() => {\n if (alternativeMethod.type === 'phone') setStep('phone-input');\n else setStep('email-check');\n resetAuth();\n }} style={{ width: '100%' }}>\n {alternativeMethod.type === 'phone' ? 'Se connecter par téléphone' : 'Se connecter par email'}\n </Button>\n <Button variant=\"outline\" onClick={() => window.open('https://iam.ollaid.com', '_blank')} style={{ width: '100%', marginTop: '0.5rem' }}>\n Réactiver depuis iam.ollaid.com\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} style={{ width: '100%', marginTop: '0.5rem' }}>\n Annuler\n </Button>\n </div>\n </>\n\n /* ===================== MAIN STEPS ===================== */\n ) : (\n <>\n {step !== 'choice' && renderBackBtn()}\n\n {/* ===== CHOICE ===== */}\n {step === 'choice' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Connexion</DialogTitle>\n <DialogDescription>Choisissez votre méthode de connexion</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n {/* Email */}\n <Button variant=\"outline\" onClick={() => setStep('email-check')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Adresse email</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec email</div>\n </div>\n </Button>\n {/* Phone */}\n <Button variant=\"outline\" onClick={() => setStep('phone-input')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>\n Numéro de téléphone <span style={{ color: C.gray500 }}>(Sénégal)</span>\n </div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec code SMS</div>\n </div>\n </Button>\n {/* Access OTP */}\n <Button variant=\"outline\" onClick={() => setStep('access-otp')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.primary)}>\n <IconKeyRound style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Accès OTP</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Disponible sur le backoffice IAM</div>\n </div>\n </Button>\n\n {/* Forgot password */}\n <div style={{ textAlign: 'center', fontSize: '0.875rem', paddingTop: '0.5rem' }}>\n <span style={{ color: C.gray500 }}>Mot de passe oublié ? </span>\n <button type=\"button\" style={linkStyle} onClick={() => setShowPasswordRecovery(true)}>Récupérer</button>\n </div>\n\n {/* Separator */}\n <div style={{ position: 'relative', padding: '0.5rem 0' }}>\n <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center' }}>\n <span style={{ width: '100%', borderTop: `1px solid ${C.gray200}` }} />\n </div>\n </div>\n\n {/* Signup link */}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== EMAIL CHECK ===== */}\n {step === 'email-check' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconMail style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par email</DialogTitle>\n <DialogDescription>Entrez votre adresse email</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"email\">Adresse email</Label>\n <Input id=\"email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email}\n onChange={e => setEmail(e.target.value)} disabled={isSubmitting}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handleEmailCheck(); } }}\n />\n </div>\n <div style={{ textAlign: 'right' }}>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n {renderLoaderBtn('Continuer', 'Vérification...', handleEmailCheck, !email.trim())}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== EMAIL PASSWORD ===== */}\n {step === 'email-password' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n {userName && <DialogTitle>Bonjour {userName} 👋</DialogTitle>}\n <DialogDescription>{email}</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleEmailPasswordSubmit} style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Label htmlFor=\"password\">Mot de passe</Label>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n <div style={{ position: 'relative' }}>\n <Input id=\"password\" type={showPassword ? 'text' : 'password'} placeholder=\"••••••••\" value={password}\n onChange={e => setPassword(e.target.value)} disabled={isSubmitting}\n style={{ paddingRight: '2.5rem' }}\n />\n <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n style={{ position: 'absolute', right: 0, top: 0, height: '100%', padding: '0 0.75rem', background: 'none', border: 'none', cursor: 'pointer' }}>\n {showPassword ? (\n <IconEyeOff style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n ) : (\n <IconEye style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n )}\n </button>\n </div>\n </div>\n <Button type=\"submit\" disabled={isSubmitting || !password} style={{ width: '100%' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion...\n </span>\n ) : 'Se connecter'}\n </Button>\n </form>\n </>\n )}\n\n {/* ===== EMAIL OTP ===== */}\n {step === 'email-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code de vérification a été envoyé à<br />\n <strong style={{ color: C.gray900 }}>{email}</strong>\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={emailOtpCode} onChange={setEmailOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n {renderLoaderBtn('Vérifier', 'Vérification...', handleEmailOtpVerify, emailOtpCode.length !== 6)}\n </div>\n </>\n )}\n\n {/* ===== PHONE INPUT ===== */}\n {step === 'phone-input' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par téléphone</DialogTitle>\n <DialogDescription>Entrez votre numéro pour recevoir un code SMS</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Indicatif</Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem' }}>\n <span style={{ fontSize: '1.125rem' }}>🇸🇳</span>\n <span style={{ fontWeight: 500, color: C.gray900 }}>Sénégal (+221)</span>\n </div>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"login-phone\">Numéro de téléphone</Label>\n <Input id=\"login-phone\" type=\"tel\" placeholder=\"77 123 45 67\" value={phone}\n onChange={e => { const val = e.target.value.replace(/\\D/g, '').slice(0, 9); setPhone(val); }}\n disabled={isSubmitting} maxLength={9}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handlePhoneInit(); } }}\n />\n <p style={{ fontSize: '0.75rem', color: C.gray500 }}>9 chiffres requis ({phone.replace(/\\D/g, '').length}/9)</p>\n </div>\n {renderLoaderBtn('Recevoir le code SMS', 'Envoi en cours...', handlePhoneInit, phone.replace(/\\D/g, '').length !== 9)}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== PHONE OTP ===== */}\n {step === 'phone-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code a été envoyé au{' '}\n <strong style={{ color: C.gray900 }}>+221 {phone.slice(0, 2)}***{phone.slice(-2)}</strong>\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={phoneOtpCode} onChange={setPhoneOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n {renderLoaderBtn('Se connecter', 'Vérification...', handlePhoneVerify, phoneOtpCode.length !== 6)}\n </div>\n </>\n )}\n\n {/* ===== ACCESS OTP ===== */}\n {step === 'access-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Code d'accès</DialogTitle>\n <DialogDescription>Entrez le code d'accès à 8 chiffres</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Code d'accès (8 chiffres)</Label>\n <Input type=\"text\" inputMode=\"numeric\" placeholder=\"0000-0000\" value={accessOtpCode}\n onChange={e => setAccessOtpCode(e.target.value.replace(/\\D/g, '').slice(0, 8))}\n disabled={isSubmitting}\n style={{ textAlign: 'center', fontSize: '1.5rem', letterSpacing: '0.15em', fontFamily: 'monospace' }}\n maxLength={8}\n />\n </div>\n {renderLoaderBtn('Se connecter', 'Vérification...', handleAccessOtpSubmit, accessOtpCode.length !== 8)}\n </div>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n\n <PasswordRecoveryModal\n open={showPasswordRecovery}\n onOpenChange={setShowPasswordRecovery}\n onSuccess={() => setShowPasswordRecovery(false)}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n \n />\n </>\n );\n}\n\nexport default LoginModal;\n","/**\n * Complete world countries list for @ollaid/native-sso\n * Default: Sénégal (+221, SN)\n */\n\nexport interface Country {\n code: string; // ISO 2-letter (e.g. \"SN\")\n name: string; // Display name\n dialCode: string; // Phone prefix (e.g. \"+221\")\n flag: string; // Emoji flag\n digits: number; // Expected phone number length (without prefix)\n}\n\n// West Africa prioritized at top, then rest of Africa, Europe, Americas, Asia, Oceania\nexport const COUNTRIES: Country[] = [\n // ── Afrique de l'Ouest (prioritaires) ──\n { code: \"SN\", name: \"Sénégal\", dialCode: \"+221\", flag: \"🇸🇳\", digits: 9 },\n { code: \"CI\", name: \"Côte d'Ivoire\", dialCode: \"+225\", flag: \"🇨🇮\", digits: 10 },\n { code: \"ML\", name: \"Mali\", dialCode: \"+223\", flag: \"🇲🇱\", digits: 8 },\n { code: \"BF\", name: \"Burkina Faso\", dialCode: \"+226\", flag: \"🇧🇫\", digits: 8 },\n { code: \"GN\", name: \"Guinée\", dialCode: \"+224\", flag: \"🇬🇳\", digits: 9 },\n { code: \"TG\", name: \"Togo\", dialCode: \"+228\", flag: \"🇹🇬\", digits: 8 },\n { code: \"BJ\", name: \"Bénin\", dialCode: \"+229\", flag: \"🇧🇯\", digits: 8 },\n { code: \"NE\", name: \"Niger\", dialCode: \"+227\", flag: \"🇳🇪\", digits: 8 },\n { code: \"MR\", name: \"Mauritanie\", dialCode: \"+222\", flag: \"🇲🇷\", digits: 8 },\n { code: \"GW\", name: \"Guinée-Bissau\", dialCode: \"+245\", flag: \"🇬🇼\", digits: 7 },\n { code: \"GM\", name: \"Gambie\", dialCode: \"+220\", flag: \"🇬🇲\", digits: 7 },\n { code: \"CV\", name: \"Cap-Vert\", dialCode: \"+238\", flag: \"🇨🇻\", digits: 7 },\n { code: \"SL\", name: \"Sierra Leone\", dialCode: \"+232\", flag: \"🇸🇱\", digits: 8 },\n { code: \"LR\", name: \"Liberia\", dialCode: \"+231\", flag: \"🇱🇷\", digits: 7 },\n { code: \"GH\", name: \"Ghana\", dialCode: \"+233\", flag: \"🇬🇭\", digits: 9 },\n { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"🇳🇬\", digits: 10 },\n\n // ── Afrique Centrale ──\n { code: \"CM\", name: \"Cameroun\", dialCode: \"+237\", flag: \"🇨🇲\", digits: 9 },\n { code: \"GA\", name: \"Gabon\", dialCode: \"+241\", flag: \"🇬🇦\", digits: 7 },\n { code: \"CG\", name: \"Congo\", dialCode: \"+242\", flag: \"🇨🇬\", digits: 9 },\n { code: \"CD\", name: \"RD Congo\", dialCode: \"+243\", flag: \"🇨🇩\", digits: 9 },\n { code: \"TD\", name: \"Tchad\", dialCode: \"+235\", flag: \"🇹🇩\", digits: 8 },\n { code: \"CF\", name: \"Centrafrique\", dialCode: \"+236\", flag: \"🇨🇫\", digits: 8 },\n { code: \"GQ\", name: \"Guinée équatoriale\", dialCode: \"+240\", flag: \"🇬🇶\", digits: 9 },\n { code: \"ST\", name: \"São Tomé-et-Príncipe\", dialCode: \"+239\", flag: \"🇸🇹\", digits: 7 },\n { code: \"BI\", name: \"Burundi\", dialCode: \"+257\", flag: \"🇧🇮\", digits: 8 },\n { code: \"RW\", name: \"Rwanda\", dialCode: \"+250\", flag: \"🇷🇼\", digits: 9 },\n\n // ── Afrique de l'Est ──\n { code: \"KE\", name: \"Kenya\", dialCode: \"+254\", flag: \"🇰🇪\", digits: 9 },\n { code: \"TZ\", name: \"Tanzanie\", dialCode: \"+255\", flag: \"🇹🇿\", digits: 9 },\n { code: \"UG\", name: \"Ouganda\", dialCode: \"+256\", flag: \"🇺🇬\", digits: 9 },\n { code: \"ET\", name: \"Éthiopie\", dialCode: \"+251\", flag: \"🇪🇹\", digits: 9 },\n { code: \"SO\", name: \"Somalie\", dialCode: \"+252\", flag: \"🇸🇴\", digits: 8 },\n { code: \"DJ\", name: \"Djibouti\", dialCode: \"+253\", flag: \"🇩🇯\", digits: 8 },\n { code: \"ER\", name: \"Érythrée\", dialCode: \"+291\", flag: \"🇪🇷\", digits: 7 },\n { code: \"SS\", name: \"Soudan du Sud\", dialCode: \"+211\", flag: \"🇸🇸\", digits: 9 },\n { code: \"MG\", name: \"Madagascar\", dialCode: \"+261\", flag: \"🇲🇬\", digits: 9 },\n { code: \"MU\", name: \"Maurice\", dialCode: \"+230\", flag: \"🇲🇺\", digits: 8 },\n { code: \"SC\", name: \"Seychelles\", dialCode: \"+248\", flag: \"🇸🇨\", digits: 7 },\n { code: \"KM\", name: \"Comores\", dialCode: \"+269\", flag: \"🇰🇲\", digits: 7 },\n\n // ── Afrique Australe ──\n { code: \"ZA\", name: \"Afrique du Sud\", dialCode: \"+27\", flag: \"🇿🇦\", digits: 9 },\n { code: \"MZ\", name: \"Mozambique\", dialCode: \"+258\", flag: \"🇲🇿\", digits: 9 },\n { code: \"ZW\", name: \"Zimbabwe\", dialCode: \"+263\", flag: \"🇿🇼\", digits: 9 },\n { code: \"ZM\", name: \"Zambie\", dialCode: \"+260\", flag: \"🇿🇲\", digits: 9 },\n { code: \"MW\", name: \"Malawi\", dialCode: \"+265\", flag: \"🇲🇼\", digits: 9 },\n { code: \"BW\", name: \"Botswana\", dialCode: \"+267\", flag: \"🇧🇼\", digits: 8 },\n { code: \"NA\", name: \"Namibie\", dialCode: \"+264\", flag: \"🇳🇦\", digits: 9 },\n { code: \"AO\", name: \"Angola\", dialCode: \"+244\", flag: \"🇦🇴\", digits: 9 },\n { code: \"SZ\", name: \"Eswatini\", dialCode: \"+268\", flag: \"🇸🇿\", digits: 8 },\n { code: \"LS\", name: \"Lesotho\", dialCode: \"+266\", flag: \"🇱🇸\", digits: 8 },\n\n // ── Afrique du Nord ──\n { code: \"MA\", name: \"Maroc\", dialCode: \"+212\", flag: \"🇲🇦\", digits: 9 },\n { code: \"DZ\", name: \"Algérie\", dialCode: \"+213\", flag: \"🇩🇿\", digits: 9 },\n { code: \"TN\", name: \"Tunisie\", dialCode: \"+216\", flag: \"🇹🇳\", digits: 8 },\n { code: \"LY\", name: \"Libye\", dialCode: \"+218\", flag: \"🇱🇾\", digits: 9 },\n { code: \"EG\", name: \"Égypte\", dialCode: \"+20\", flag: \"🇪🇬\", digits: 10 },\n { code: \"SD\", name: \"Soudan\", dialCode: \"+249\", flag: \"🇸🇩\", digits: 9 },\n\n // ── Europe ──\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\", digits: 9 },\n { code: \"BE\", name: \"Belgique\", dialCode: \"+32\", flag: \"🇧🇪\", digits: 9 },\n { code: \"CH\", name: \"Suisse\", dialCode: \"+41\", flag: \"🇨🇭\", digits: 9 },\n { code: \"DE\", name: \"Allemagne\", dialCode: \"+49\", flag: \"🇩🇪\", digits: 10 },\n { code: \"GB\", name: \"Royaume-Uni\", dialCode: \"+44\", flag: \"🇬🇧\", digits: 10 },\n { code: \"ES\", name: \"Espagne\", dialCode: \"+34\", flag: \"🇪🇸\", digits: 9 },\n { code: \"IT\", name: \"Italie\", dialCode: \"+39\", flag: \"🇮🇹\", digits: 10 },\n { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"🇵🇹\", digits: 9 },\n { code: \"NL\", name: \"Pays-Bas\", dialCode: \"+31\", flag: \"🇳🇱\", digits: 9 },\n { code: \"SE\", name: \"Suède\", dialCode: \"+46\", flag: \"🇸🇪\", digits: 9 },\n { code: \"NO\", name: \"Norvège\", dialCode: \"+47\", flag: \"🇳🇴\", digits: 8 },\n { code: \"DK\", name: \"Danemark\", dialCode: \"+45\", flag: \"🇩🇰\", digits: 8 },\n { code: \"FI\", name: \"Finlande\", dialCode: \"+358\", flag: \"🇫🇮\", digits: 10 },\n { code: \"PL\", name: \"Pologne\", dialCode: \"+48\", flag: \"🇵🇱\", digits: 9 },\n { code: \"AT\", name: \"Autriche\", dialCode: \"+43\", flag: \"🇦🇹\", digits: 10 },\n { code: \"IE\", name: \"Irlande\", dialCode: \"+353\", flag: \"🇮🇪\", digits: 9 },\n { code: \"GR\", name: \"Grèce\", dialCode: \"+30\", flag: \"🇬🇷\", digits: 10 },\n { code: \"CZ\", name: \"Tchéquie\", dialCode: \"+420\", flag: \"🇨🇿\", digits: 9 },\n { code: \"RO\", name: \"Roumanie\", dialCode: \"+40\", flag: \"🇷🇴\", digits: 9 },\n { code: \"HU\", name: \"Hongrie\", dialCode: \"+36\", flag: \"🇭🇺\", digits: 9 },\n { code: \"BG\", name: \"Bulgarie\", dialCode: \"+359\", flag: \"🇧🇬\", digits: 9 },\n { code: \"HR\", name: \"Croatie\", dialCode: \"+385\", flag: \"🇭🇷\", digits: 9 },\n { code: \"SK\", name: \"Slovaquie\", dialCode: \"+421\", flag: \"🇸🇰\", digits: 9 },\n { code: \"SI\", name: \"Slovénie\", dialCode: \"+386\", flag: \"🇸🇮\", digits: 8 },\n { code: \"RS\", name: \"Serbie\", dialCode: \"+381\", flag: \"🇷🇸\", digits: 9 },\n { code: \"UA\", name: \"Ukraine\", dialCode: \"+380\", flag: \"🇺🇦\", digits: 9 },\n { code: \"RU\", name: \"Russie\", dialCode: \"+7\", flag: \"🇷🇺\", digits: 10 },\n { code: \"TR\", name: \"Turquie\", dialCode: \"+90\", flag: \"🇹🇷\", digits: 10 },\n { code: \"LU\", name: \"Luxembourg\", dialCode: \"+352\", flag: \"🇱🇺\", digits: 9 },\n { code: \"MC\", name: \"Monaco\", dialCode: \"+377\", flag: \"🇲🇨\", digits: 8 },\n { code: \"IS\", name: \"Islande\", dialCode: \"+354\", flag: \"🇮🇸\", digits: 7 },\n { code: \"AL\", name: \"Albanie\", dialCode: \"+355\", flag: \"🇦🇱\", digits: 9 },\n { code: \"ME\", name: \"Monténégro\", dialCode: \"+382\", flag: \"🇲🇪\", digits: 8 },\n { code: \"MK\", name: \"Macédoine du Nord\", dialCode: \"+389\", flag: \"🇲🇰\", digits: 8 },\n { code: \"BA\", name: \"Bosnie-Herzégovine\", dialCode: \"+387\", flag: \"🇧🇦\", digits: 8 },\n { code: \"LT\", name: \"Lituanie\", dialCode: \"+370\", flag: \"🇱🇹\", digits: 8 },\n { code: \"LV\", name: \"Lettonie\", dialCode: \"+371\", flag: \"🇱🇻\", digits: 8 },\n { code: \"EE\", name: \"Estonie\", dialCode: \"+372\", flag: \"🇪🇪\", digits: 8 },\n { code: \"MT\", name: \"Malte\", dialCode: \"+356\", flag: \"🇲🇹\", digits: 8 },\n { code: \"CY\", name: \"Chypre\", dialCode: \"+357\", flag: \"🇨🇾\", digits: 8 },\n { code: \"MD\", name: \"Moldavie\", dialCode: \"+373\", flag: \"🇲🇩\", digits: 8 },\n { code: \"GE\", name: \"Géorgie\", dialCode: \"+995\", flag: \"🇬🇪\", digits: 9 },\n { code: \"AM\", name: \"Arménie\", dialCode: \"+374\", flag: \"🇦🇲\", digits: 8 },\n { code: \"AZ\", name: \"Azerbaïdjan\", dialCode: \"+994\", flag: \"🇦🇿\", digits: 9 },\n { code: \"BY\", name: \"Biélorussie\", dialCode: \"+375\", flag: \"🇧🇾\", digits: 9 },\n\n // ── Amérique du Nord ──\n { code: \"US\", name: \"États-Unis\", dialCode: \"+1\", flag: \"🇺🇸\", digits: 10 },\n { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"🇨🇦\", digits: 10 },\n { code: \"MX\", name: \"Mexique\", dialCode: \"+52\", flag: \"🇲🇽\", digits: 10 },\n\n // ── Amérique Centrale & Caraïbes ──\n { code: \"HT\", name: \"Haïti\", dialCode: \"+509\", flag: \"🇭🇹\", digits: 8 },\n { code: \"DO\", name: \"République dominicaine\", dialCode: \"+1809\", flag: \"🇩🇴\", digits: 10 },\n { code: \"CU\", name: \"Cuba\", dialCode: \"+53\", flag: \"🇨🇺\", digits: 8 },\n { code: \"JM\", name: \"Jamaïque\", dialCode: \"+1876\", flag: \"🇯🇲\", digits: 7 },\n { code: \"GT\", name: \"Guatemala\", dialCode: \"+502\", flag: \"🇬🇹\", digits: 8 },\n { code: \"HN\", name: \"Honduras\", dialCode: \"+504\", flag: \"🇭🇳\", digits: 8 },\n { code: \"SV\", name: \"El Salvador\", dialCode: \"+503\", flag: \"🇸🇻\", digits: 8 },\n { code: \"NI\", name: \"Nicaragua\", dialCode: \"+505\", flag: \"🇳🇮\", digits: 8 },\n { code: \"CR\", name: \"Costa Rica\", dialCode: \"+506\", flag: \"🇨🇷\", digits: 8 },\n { code: \"PA\", name: \"Panama\", dialCode: \"+507\", flag: \"🇵🇦\", digits: 8 },\n { code: \"TT\", name: \"Trinité-et-Tobago\", dialCode: \"+1868\", flag: \"🇹🇹\", digits: 7 },\n\n // ── Amérique du Sud ──\n { code: \"BR\", name: \"Brésil\", dialCode: \"+55\", flag: \"🇧🇷\", digits: 11 },\n { code: \"AR\", name: \"Argentine\", dialCode: \"+54\", flag: \"🇦🇷\", digits: 10 },\n { code: \"CO\", name: \"Colombie\", dialCode: \"+57\", flag: \"🇨🇴\", digits: 10 },\n { code: \"CL\", name: \"Chili\", dialCode: \"+56\", flag: \"🇨🇱\", digits: 9 },\n { code: \"PE\", name: \"Pérou\", dialCode: \"+51\", flag: \"🇵🇪\", digits: 9 },\n { code: \"VE\", name: \"Venezuela\", dialCode: \"+58\", flag: \"🇻🇪\", digits: 10 },\n { code: \"EC\", name: \"Équateur\", dialCode: \"+593\", flag: \"🇪🇨\", digits: 9 },\n { code: \"BO\", name: \"Bolivie\", dialCode: \"+591\", flag: \"🇧🇴\", digits: 8 },\n { code: \"PY\", name: \"Paraguay\", dialCode: \"+595\", flag: \"🇵🇾\", digits: 9 },\n { code: \"UY\", name: \"Uruguay\", dialCode: \"+598\", flag: \"🇺🇾\", digits: 8 },\n { code: \"GY\", name: \"Guyana\", dialCode: \"+592\", flag: \"🇬🇾\", digits: 7 },\n { code: \"SR\", name: \"Suriname\", dialCode: \"+597\", flag: \"🇸🇷\", digits: 7 },\n\n // ── Moyen-Orient ──\n { code: \"AE\", name: \"Émirats arabes unis\", dialCode: \"+971\", flag: \"🇦🇪\", digits: 9 },\n { code: \"SA\", name: \"Arabie saoudite\", dialCode: \"+966\", flag: \"🇸🇦\", digits: 9 },\n { code: \"QA\", name: \"Qatar\", dialCode: \"+974\", flag: \"🇶🇦\", digits: 8 },\n { code: \"KW\", name: \"Koweït\", dialCode: \"+965\", flag: \"🇰🇼\", digits: 8 },\n { code: \"BH\", name: \"Bahreïn\", dialCode: \"+973\", flag: \"🇧🇭\", digits: 8 },\n { code: \"OM\", name: \"Oman\", dialCode: \"+968\", flag: \"🇴🇲\", digits: 8 },\n { code: \"JO\", name: \"Jordanie\", dialCode: \"+962\", flag: \"🇯🇴\", digits: 9 },\n { code: \"LB\", name: \"Liban\", dialCode: \"+961\", flag: \"🇱🇧\", digits: 8 },\n { code: \"IQ\", name: \"Irak\", dialCode: \"+964\", flag: \"🇮🇶\", digits: 10 },\n { code: \"IR\", name: \"Iran\", dialCode: \"+98\", flag: \"🇮🇷\", digits: 10 },\n { code: \"IL\", name: \"Israël\", dialCode: \"+972\", flag: \"🇮🇱\", digits: 9 },\n { code: \"PS\", name: \"Palestine\", dialCode: \"+970\", flag: \"🇵🇸\", digits: 9 },\n { code: \"YE\", name: \"Yémen\", dialCode: \"+967\", flag: \"🇾🇪\", digits: 9 },\n { code: \"SY\", name: \"Syrie\", dialCode: \"+963\", flag: \"🇸🇾\", digits: 9 },\n\n // ── Asie ──\n { code: \"CN\", name: \"Chine\", dialCode: \"+86\", flag: \"🇨🇳\", digits: 11 },\n { code: \"JP\", name: \"Japon\", dialCode: \"+81\", flag: \"🇯🇵\", digits: 10 },\n { code: \"KR\", name: \"Corée du Sud\", dialCode: \"+82\", flag: \"🇰🇷\", digits: 10 },\n { code: \"IN\", name: \"Inde\", dialCode: \"+91\", flag: \"🇮🇳\", digits: 10 },\n { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"🇵🇰\", digits: 10 },\n { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"🇧🇩\", digits: 10 },\n { code: \"ID\", name: \"Indonésie\", dialCode: \"+62\", flag: \"🇮🇩\", digits: 10 },\n { code: \"MY\", name: \"Malaisie\", dialCode: \"+60\", flag: \"🇲🇾\", digits: 10 },\n { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"🇵🇭\", digits: 10 },\n { code: \"TH\", name: \"Thaïlande\", dialCode: \"+66\", flag: \"🇹🇭\", digits: 9 },\n { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"🇻🇳\", digits: 9 },\n { code: \"SG\", name: \"Singapour\", dialCode: \"+65\", flag: \"🇸🇬\", digits: 8 },\n { code: \"HK\", name: \"Hong Kong\", dialCode: \"+852\", flag: \"🇭🇰\", digits: 8 },\n { code: \"TW\", name: \"Taïwan\", dialCode: \"+886\", flag: \"🇹🇼\", digits: 9 },\n { code: \"MM\", name: \"Myanmar\", dialCode: \"+95\", flag: \"🇲🇲\", digits: 9 },\n { code: \"KH\", name: \"Cambodge\", dialCode: \"+855\", flag: \"🇰🇭\", digits: 9 },\n { code: \"LA\", name: \"Laos\", dialCode: \"+856\", flag: \"🇱🇦\", digits: 10 },\n { code: \"NP\", name: \"Népal\", dialCode: \"+977\", flag: \"🇳🇵\", digits: 10 },\n { code: \"LK\", name: \"Sri Lanka\", dialCode: \"+94\", flag: \"🇱🇰\", digits: 9 },\n { code: \"AF\", name: \"Afghanistan\", dialCode: \"+93\", flag: \"🇦🇫\", digits: 9 },\n { code: \"UZ\", name: \"Ouzbékistan\", dialCode: \"+998\", flag: \"🇺🇿\", digits: 9 },\n { code: \"KZ\", name: \"Kazakhstan\", dialCode: \"+7\", flag: \"🇰🇿\", digits: 10 },\n { code: \"MN\", name: \"Mongolie\", dialCode: \"+976\", flag: \"🇲🇳\", digits: 8 },\n\n // ── Océanie ──\n { code: \"AU\", name: \"Australie\", dialCode: \"+61\", flag: \"🇦🇺\", digits: 9 },\n { code: \"NZ\", name: \"Nouvelle-Zélande\", dialCode: \"+64\", flag: \"🇳🇿\", digits: 9 },\n { code: \"FJ\", name: \"Fidji\", dialCode: \"+679\", flag: \"🇫🇯\", digits: 7 },\n { code: \"PG\", name: \"Papouasie-Nouvelle-Guinée\", dialCode: \"+675\", flag: \"🇵🇬\", digits: 8 },\n];\n\n// ── Defaults ──\nexport const DEFAULT_COUNTRY_CODE = \"SN\";\nexport const DEFAULT_DIAL_CODE = \"+221\";\n\n// ── Helpers ──\nexport const getCountryByCode = (code: string): Country | undefined =>\n COUNTRIES.find(c => c.code.toLowerCase() === code.toLowerCase());\n\nexport const getCountryByDialCode = (dialCode: string): Country | undefined =>\n COUNTRIES.find(c => c.dialCode === dialCode);\n\nexport const getDefaultCountry = (): Country =>\n COUNTRIES.find(c => c.code === DEFAULT_COUNTRY_CODE)!;\n\nexport const searchCountries = (query: string): Country[] => {\n const q = query.toLowerCase().trim();\n if (!q) return COUNTRIES;\n return COUNTRIES.filter(c =>\n c.name.toLowerCase().includes(q) ||\n c.dialCode.includes(q) ||\n c.code.toLowerCase().includes(q)\n );\n};\n","/**\n * Phone Input component for @ollaid/native-sso\n * Uses complete world countries list\n */\n\nimport React from 'react';\nimport { COUNTRIES, getCountryByDialCode, DEFAULT_DIAL_CODE } from '../utils/countries';\n\ninterface PhoneInputProps {\n value: string;\n onChange: (value: string) => void;\n ccphone?: string;\n onCcphoneChange?: (value: string) => void;\n disabled?: boolean;\n error?: string;\n placeholder?: string;\n lockCcphone?: boolean;\n}\n\nexport function PhoneInput({\n value, onChange, ccphone = DEFAULT_DIAL_CODE, onCcphoneChange, disabled = false, error, placeholder = '77 123 45 67', lockCcphone = false,\n}: PhoneInputProps) {\n const selectedCountry = getCountryByDialCode(ccphone) || COUNTRIES[0];\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const cleaned = e.target.value.replace(/\\D/g, '');\n onChange(cleaned.slice(0, selectedCountry.digits));\n };\n\n const formatPhone = (phone: string): string => {\n if (phone.length <= 2) return phone;\n if (phone.length <= 5) return `${phone.slice(0, 2)} ${phone.slice(2)}`;\n if (phone.length <= 7) return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5)}`;\n return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5, 7)} ${phone.slice(7)}`;\n };\n\n return (\n <div>\n <div style={{\n display: 'flex', alignItems: 'center', border: `2px solid ${error ? '#ef4444' : '#d1d5db'}`,\n borderRadius: '0.5rem', overflow: 'hidden', opacity: disabled ? 0.5 : 1,\n backgroundColor: disabled ? '#f3f4f6' : 'white',\n }}>\n {onCcphoneChange && !lockCcphone ? (\n <select\n value={ccphone}\n onChange={(e) => onCcphoneChange(e.target.value)}\n disabled={disabled}\n style={{ padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb', fontWeight: 500, color: '#374151', outline: 'none', border: 'none', maxWidth: '7rem' }}\n >\n {COUNTRIES.map((c) => (\n <option key={`${c.code}-${c.dialCode}`} value={c.dialCode}>{c.flag} {c.dialCode}</option>\n ))}\n </select>\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb' }}>\n <span style={{ fontSize: '1.125rem' }}>{selectedCountry.flag}</span>\n <span style={{ fontWeight: 500, color: '#374151' }}>{selectedCountry.dialCode}</span>\n </div>\n )}\n <input\n type=\"tel\"\n inputMode=\"numeric\"\n value={formatPhone(value)}\n onChange={handleChange}\n disabled={disabled}\n placeholder={placeholder}\n style={{ flex: 1, padding: '0.75rem', fontSize: '1.125rem', border: 'none', outline: 'none', backgroundColor: 'transparent' }}\n />\n </div>\n {error && <p style={{ fontSize: '0.875rem', color: '#ef4444', marginTop: '0.25rem' }}>{error}</p>}\n <p style={{ fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }}>\n {selectedCountry.digits} chiffres requis ({value.length}/{selectedCountry.digits})\n </p>\n </div>\n );\n}\n\nexport default PhoneInput;\n","/**\n * Apps Logo Slider for @ollaid/native-sso\n * Matches Web SSO badge style: horizontal marquee, small icons, no app names\n */\n\nimport { useEffect, useState } from 'react';\nimport { getNativeAuthConfig } from '../services/api';\n\ninterface AppsLogoSliderProps {\n speed?: 'slow' | 'normal' | 'fast';\n className?: string;\n iamApiUrl?: string;\n}\n\ninterface AppInfo { id: number; name: string; logo: string | null; }\n\nexport function AppsLogoSlider({ className = '', iamApiUrl: iamApiUrlProp }: AppsLogoSliderProps) {\n const [applications, setApplications] = useState<AppInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const resolvedIamApiUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n if (!resolvedIamApiUrl) return;\n const fetchApps = async () => {\n try {\n const iamBaseUrl = resolvedIamApiUrl.replace('/api', '');\n const response = await fetch(`${iamBaseUrl}/api/public/applications`, { headers: { 'Accept': 'application/json' } });\n if (response.ok) {\n const data = await response.json();\n if (data.success && Array.isArray(data.data)) setApplications(data.data);\n }\n } catch { /* ignore */ } finally { setIsLoading(false); }\n };\n fetchApps();\n }, [iamApiUrlProp]);\n\n const getLogoUrl = (logo: string | null): string | null => {\n if (!logo) return null;\n if (logo.startsWith('http')) return logo;\n const resolvedUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n return `${resolvedUrl.replace('/api', '')}/storage/applications/${logo}`;\n };\n\n if (isLoading) {\n return (\n <div className={className} style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div style={{ display: 'flex', gap: '0.75rem', padding: '0 0.75rem' }}>\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} style={{ width: '2rem', height: '2rem', borderRadius: '0.5rem', backgroundColor: '#e5e7eb', flexShrink: 0 }} />\n ))}\n </div>\n </div>\n );\n }\n\n if (applications.length === 0) return null;\n\n // Triple for smooth infinite loop (same as web SSO)\n const displayApps = [...applications, ...applications, ...applications];\n\n return (\n <div\n className={className}\n style={{ position: 'relative', width: '100%', height: '100%', overflow: 'hidden' }}\n >\n {/* Left gradient mask */}\n <div style={{\n position: 'absolute', left: 0, top: 0, bottom: 0, width: '1.5rem',\n background: 'linear-gradient(to right, #ffffff, transparent)',\n zIndex: 10, pointerEvents: 'none',\n }} />\n\n {/* Marquee content */}\n <div style={{\n display: 'flex',\n animation: 'ollaid-marquee 20s linear infinite',\n height: '100%',\n alignItems: 'center',\n }}>\n {displayApps.map((app, index) => {\n const logoUrl = getLogoUrl(app.logo);\n return (\n <div\n key={`${app.id}-${index}`}\n style={{ flexShrink: 0, padding: '0 0.75rem', display: 'flex', alignItems: 'center', height: '100%' }}\n >\n {logoUrl ? (\n <img\n src={logoUrl}\n alt={app.name}\n style={{ width: '2rem', height: '2rem', objectFit: 'contain' }}\n onError={(e) => {\n const target = e.currentTarget;\n target.style.display = 'none';\n if (target.nextElementSibling) {\n (target.nextElementSibling as HTMLElement).style.display = 'flex';\n }\n }}\n />\n ) : null}\n <div\n style={{\n width: '2rem',\n height: '2rem',\n borderRadius: '0.5rem',\n backgroundColor: '#f3f4f6',\n alignItems: 'center',\n justifyContent: 'center',\n display: logoUrl ? 'none' : 'flex',\n }}\n >\n <span style={{ fontSize: '0.75rem', fontWeight: 700, color: '#6b7280' }}>\n {app.name?.charAt(0)?.toUpperCase() || 'A'}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Right gradient mask */}\n <div style={{\n position: 'absolute', right: 0, top: 0, bottom: 0, width: '1.5rem',\n background: 'linear-gradient(to left, #ffffff, transparent)',\n zIndex: 10, pointerEvents: 'none',\n }} />\n </div>\n );\n}\n\nexport default AppsLogoSlider;\n","/**\n * Service d'inscription Mobile SSO v1.0\n * Architecture Frontend-First : Appels directs à l'IAM via nativeAuth\n * \n * @version 1.0.0\n */\n\nimport { nativeAuthService } from './nativeAuth';\nimport { \n ApiError, \n fetchWithTimeout, \n getHeaders,\n getNativeAuthConfig, \n isDebugMode,\n} from './api';\n\nimport type {\n MobileRegistrationFormData,\n MobileVerifyOtpResponse,\n MobileRegistrationCompleteResponse,\n MobileResendOtpResponse,\n} from '../types/mobile';\nimport type { NativeInitResponse } from '../types/native';\n\nexport const mobileRegistrationService = {\n /**\n * Init registration via nativeAuth.register() (Frontend-First)\n */\n async init(\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ): Promise<NativeInitResponse> {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n return nativeAuthService.register({\n name: data.name,\n email: data.email,\n ccphone: data.ccphone,\n phone: data.phone,\n town: data.town,\n country: data.country,\n registration_type: data.registration_type,\n });\n },\n\n /**\n * Verify OTP via nativeAuth.validate()\n */\n async verifyOtp(\n processToken: string,\n otpCode: string\n ): Promise<MobileVerifyOtpResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration OTP)');\n }\n\n return fetchWithTimeout<MobileVerifyOtpResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n otp_code: otpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete registration with password\n */\n async complete(\n processToken: string,\n password: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete phone-only registration (no password)\n */\n async completePhoneOnly(\n processToken: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (phone-only complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Resend OTP\n */\n async resendOtp(processToken: string): Promise<MobileResendOtpResponse> {\n return nativeAuthService.resendOtp(processToken) as unknown as MobileResendOtpResponse;\n },\n};\n\nexport default mobileRegistrationService;\n","/**\n * Hook d'inscription Mobile SSO v1.0\n * Gère le flow: init → verify-otp → complete\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobileRegistrationService } from '../services/mobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig } from '../services/api';\nimport type { \n MobileRegistrationFormData,\n AccountType,\n} from '../types/mobile';\n\ninterface RegistrationConflict {\n type: 'email' | 'phone';\n masked_identifier: string;\n options: {\n can_login: boolean;\n can_recover_by_email: boolean;\n can_recover_by_sms: boolean;\n masked_email?: string;\n masked_phone?: string;\n };\n}\n\ninterface RegistrationState {\n processToken: string | null;\n status: 'idle' | 'pending_otp' | 'pending_password' | 'pending_registration' | 'completed';\n loading: boolean;\n error: string | null;\n conflict: RegistrationConflict | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): string {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return 'Vérifiez votre connexion Internet';\n }\n if (err.message.includes('timeout')) {\n return 'Le serveur met trop de temps à répondre';\n }\n return err.message;\n }\n return `Erreur lors de ${context}`;\n}\n\nexport interface UseMobileRegistrationOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\nexport function useMobileRegistration(options?: UseMobileRegistrationOptions) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (options && !configuredRef.current) {\n setNativeAuthConfig({ \n saasApiUrl: options.saasApiUrl, \n iamApiUrl: options.iamApiUrl,\n });\n configuredRef.current = true;\n }\n }, [options]);\n\n const [state, setState] = useState<RegistrationState>({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n\n const [formData, setFormData] = useState<Partial<MobileRegistrationFormData>>({});\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n const updateFormData = useCallback((data: Partial<MobileRegistrationFormData>) => {\n setFormData(prev => ({ ...prev, ...data }));\n }, []);\n\n const initRegistration = useCallback(async (\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, conflict: null }));\n \n const enrichedData = {\n ...data,\n email: accountType === 'phone-only' ? '' : data.email,\n registration_type: accountType === 'phone-only' ? 'phone' as const : 'email' as const,\n };\n \n setFormData(enrichedData);\n\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n const response = await mobileRegistrationService.init(enrichedData);\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'pending_otp',\n loading: false,\n conflict: null,\n }));\n return { \n success: true, \n otp_code_dev: response.otp_code_dev,\n otp_method: response.otp_method,\n otp_sent_to: response.otp_sent_to,\n };\n }\n\n if (response.conflict) {\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Ce compte existe déjà',\n conflict: response.conflict!,\n }));\n return { success: false, error_type: response.error_type };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n conflict: null,\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, conflict: null }));\n return { success: false };\n }\n }, [accountType]);\n\n const verifyOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.verifyOtp(state.processToken, otpCode);\n\n if (response.success) {\n if (response.status === 'completed' && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, completed: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({ ...prev, status: 'pending_password', loading: false }));\n return { success: true, completed: false };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completeRegistration = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.complete(state.processToken, password);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completePhoneOnlyRegistration = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.completePhoneOnly(state.processToken);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const message = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n setFormData({});\n setAccountType('email');\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, conflict: null }));\n }, []);\n\n return {\n processToken: state.processToken,\n status: state.status,\n formData,\n loading: state.loading,\n error: state.error,\n conflict: state.conflict,\n isCompleted: state.status === 'completed',\n hasConflict: state.conflict !== null,\n \n accountType,\n setAccountType,\n isPhoneOnly: accountType === 'phone-only',\n\n updateFormData,\n initRegistration,\n verifyOtp,\n completeRegistration,\n completePhoneOnlyRegistration,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobileRegistration;\n","/**\n * Signup Modal for @ollaid/native-sso — Design aligned with web SSO\n * Full signup flow: intro → account-type → info → OTP → password → confirm → success\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label,\n IconShieldCheck, IconCheckCircle2, IconMail, IconSmartphone, IconArrowLeft,\n IconKeyRound, IconLock, IconLoader2,\n IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings,\n} from './ui';\nimport PhoneInput from './PhoneInput';\nimport OTPInput from './OTPInput';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { useMobileRegistration } from '../hooks/useMobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { COUNTRIES, getCountryByCode, DEFAULT_COUNTRY_CODE } from '../utils/countries';\nimport type { UserInfos } from '../types/native';\n\ntype SignupStep = 'intro' | 'account-type' | 'info' | 'otp' | 'password' | 'confirm';\n\nexport interface SignupModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToLogin: () => void;\n onSignupSuccess: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n}\n\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst TOTAL_STEPS = 6;\n\nfunction StepIndicator({ current }: { current: number }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.75rem' }}>\n {Array.from({ length: TOTAL_STEPS }, (_, i) => (\n <div key={i} style={{\n width: i + 1 === current ? '1.5rem' : '0.5rem',\n height: '0.5rem',\n borderRadius: '9999px',\n backgroundColor: i + 1 <= current ? C.accent : C.gray200,\n transition: 'all 0.2s',\n }} />\n ))}\n <span style={{ fontSize: '0.75rem', color: C.gray500, marginLeft: '0.5rem' }}>Étape {current}/{TOTAL_STEPS}</span>\n </div>\n );\n}\n\n// Orbit success animation\nfunction SuccessOrbit() {\n const orbitIcons = [IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings];\n return (\n <div style={{ position: 'relative', width: '10rem', height: '10rem', margin: '0 auto' }}>\n {/* Center shield */}\n <div style={{\n position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',\n width: '4rem', height: '4rem', backgroundColor: C.greenBg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 2,\n }}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.green }} />\n </div>\n {/* Orbiting icons */}\n {orbitIcons.map((Icon, i) => {\n const angle = (i * 360) / orbitIcons.length;\n return (\n <div key={i} style={{\n position: 'absolute', top: '50%', left: '50%', width: '2rem', height: '2rem',\n transform: `rotate(${angle}deg) translate(4rem) rotate(-${angle}deg)`,\n transformOrigin: '0 0',\n animation: `spin ${8 + i}s linear infinite`,\n }}>\n <div style={{\n width: '2rem', height: '2rem', backgroundColor: C.gray100, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}>\n <Icon style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl, defaultAccountType }: SignupModalProps) {\n const {\n status, formData, loading: regLoading, error: regError, accountType, setAccountType, isPhoneOnly,\n updateFormData, initRegistration, verifyOtp, completeRegistration, resendOtp, reset: resetReg, clearError,\n } = useMobileRegistration({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<SignupStep>('intro');\n const [otpCode, setOtpCode] = useState('');\n const [password, setPassword] = useState('');\n const [passwordConfirm, setPasswordConfirm] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [signupSuccess, setSignupSuccess] = useState(false);\n const [signupData, setSignupData] = useState<{ token: string; user: UserInfos } | null>(null);\n\n const error = localError || regError;\n\n useEffect(() => { if (!open) { setStep('intro'); setOtpCode(''); setPassword(''); setPasswordConfirm(''); setLocalError(null); setSignupSuccess(false); setSignupData(null); setResendCooldown(0); resetReg(); } }, [open]);\n useEffect(() => { if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); } else if (status === 'pending_password') setStep('password'); }, [status]);\n useEffect(() => { if (resendCooldown > 0) { const t = setTimeout(() => setResendCooldown(r => r - 1), 1000); return () => clearTimeout(t); } }, [resendCooldown]);\n useEffect(() => { if (signupSuccess && signupData) { const t = setTimeout(() => onSignupSuccess(signupData.token, signupData.user), 2000); return () => clearTimeout(t); } }, [signupSuccess, signupData]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setSignupData({ token: response.token, user: response.user as UserInfos });\n setSignupSuccess(true);\n } else setLocalError(\"Erreur lors de la finalisation de l'inscription\");\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleInfoSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!formData.name?.trim()) { setLocalError('Le nom est requis'); return; }\n if (!isPhoneOnly && !formData.email?.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!formData.phone?.trim() || (formData.phone?.length || 0) < 6) { setLocalError('Numéro de téléphone invalide'); return; }\n if (isPhoneOnly && formData.ccphone !== '+221') { setLocalError(\"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\"); return; }\n if (!formData.town?.trim()) { setLocalError('La ville est requise'); return; }\n if (!formData.country?.trim()) { setLocalError('Le pays est requis'); return; }\n await initRegistration({ name: formData.name || '', email: formData.email || '', ccphone: formData.ccphone || '+221', phone: formData.phone || '', town: formData.town, country: formData.country } as any);\n };\n\n const handleOTPSubmit = async () => {\n if (otpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const result = await verifyOtp(otpCode);\n if (result.success && result.completed && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handlePasswordSubmit = (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null);\n if (!password || password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== passwordConfirm) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setStep('confirm');\n };\n\n const handleConfirm = async () => {\n setLocalError(null); clearError();\n const result = await completeRegistration(password);\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => { if (resendCooldown > 0) return; const r = await resendOtp(); if (r.success) setResendCooldown(r.cooldown || 60); };\n\n const goToStep = (s: SignupStep) => { setLocalError(null); clearError(); setStep(s); };\n\n const handleAccountTypeSelect = (type: 'email' | 'phone-only') => {\n setAccountType(type);\n if (type === 'phone-only') updateFormData({ ccphone: '+221', country: 'SN', email: '' });\n else if (!formData.country) updateFormData({ country: DEFAULT_COUNTRY_CODE });\n goToStep('info');\n };\n\n const stepNumber = { intro: 1, 'account-type': 2, info: 3, otp: 4, password: 5, confirm: 6 }[step];\n\n const renderError = () => error ? <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div> : null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {signupSuccess && signupData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <SuccessOrbit />\n <DialogTitle>Félicitations !</DialogTitle>\n <DialogDescription>\n Votre compte a été créé avec succès. Bienvenue {formData.name} !\n </DialogDescription>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', fontSize: '0.875rem', color: C.gray500, marginTop: '1rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion automatique en cours...\n </div>\n </DialogHeader>\n ) : (\n <>\n {/* ===== INTRO ===== */}\n {step === 'intro' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent + '1a', '4rem')}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.accent }} />\n </div>\n <DialogTitle>Ouvrez un compte Ollaid</DialogTitle>\n <DialogDescription>Un compte unique qui vous donne accès à toutes les applications</DialogDescription>\n </DialogHeader>\n <AppsLogoSlider iamApiUrl={iamApiUrl} />\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', fontSize: '0.875rem', color: C.gray500, margin: '1rem 0' }}>\n {['Un seul compte pour toutes les applications', 'Plus besoin de multiples mots de passe', 'Connexion simplifiée et sécurisée'].map(text => (\n <div key={text} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <IconCheckCircle2 style={{ width: '1.25rem', height: '1.25rem', color: C.green, flexShrink: 0 }} />\n {text}\n </div>\n ))}\n </div>\n <StepIndicator current={1} />\n <Button onClick={() => goToStep('account-type')} style={{ width: '100%', marginTop: '1rem' }}>Suivant →</Button>\n <div style={{ textAlign: 'center', fontSize: '0.875rem', marginTop: '1rem' }}>\n <span style={{ color: C.gray500 }}>Déjà un compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToLogin}>Connectez-vous</button>\n </div>\n </>\n )}\n\n {/* ===== ACCOUNT TYPE ===== */}\n {step === 'account-type' && (\n <>\n <button onClick={() => goToStep('intro')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Choisissez votre type de compte</DialogTitle>\n </DialogHeader>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '1rem' }}>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('email')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Email + Téléphone</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>Compte complet</div>\n </div>\n </button>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('phone-only')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconSmartphone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Téléphone uniquement</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>🇸🇳 Sénégal uniquement</div>\n </div>\n </button>\n </div>\n <StepIndicator current={2} />\n </>\n )}\n\n {/* ===== INFO ===== */}\n {step === 'info' && (\n <>\n <button onClick={() => goToStep('account-type')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Créer votre compte</DialogTitle>\n </DialogHeader>\n {isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.accent + '1a', color: C.accent, fontSize: '0.8125rem', marginTop: '0.5rem', textAlign: 'center' }}>\n 📱 Inscription par téléphone — 🇸🇳 Sénégal uniquement\n </div>\n )}\n {!isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.amberBg, color: '#92400e', fontSize: '0.8125rem', marginTop: '0.5rem', textAlign: 'center' }}>\n ⚠️ Un code OTP sera envoyé par email pour vérification\n </div>\n )}\n <form onSubmit={handleInfoSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '0.75rem' }}>\n {renderError()}\n <div><Label>Nom complet</Label><Input placeholder=\"Jean Dupont\" value={formData.name || ''} onChange={e => updateFormData({ name: e.target.value })} disabled={regLoading} /></div>\n {!isPhoneOnly && <div><Label>Adresse email</Label><Input type=\"email\" placeholder=\"vous@exemple.com\" value={formData.email || ''} onChange={e => updateFormData({ email: e.target.value })} disabled={regLoading} /></div>}\n <div><Label>Numéro de téléphone</Label><PhoneInput value={formData.phone || ''} onChange={p => updateFormData({ phone: p })} ccphone={formData.ccphone || '+221'} onCcphoneChange={c => updateFormData({ ccphone: c })} disabled={regLoading} lockCcphone={isPhoneOnly} /></div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\n <div><Label>Ville</Label><Input placeholder=\"Dakar\" value={formData.town || ''} onChange={e => updateFormData({ town: e.target.value })} disabled={regLoading} /></div>\n <div>\n <Label>Pays</Label>\n <select\n value={formData.country || DEFAULT_COUNTRY_CODE}\n onChange={e => {\n const country = getCountryByCode(e.target.value);\n updateFormData({ country: e.target.value, ccphone: country?.dialCode || '+221' });\n }}\n disabled={regLoading || isPhoneOnly}\n style={{ width: '100%', padding: '0.5rem', borderRadius: '0.375rem', border: '1px solid #d1d5db', backgroundColor: (regLoading || isPhoneOnly) ? '#f3f4f6' : 'white', fontSize: '0.875rem' }}\n >\n {COUNTRIES.map(c => (\n <option key={c.code} value={c.code}>{c.flag} {c.name}</option>\n ))}\n </select>\n </div>\n </div>\n <StepIndicator current={3} />\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n </form>\n </>\n )}\n\n {/* ===== OTP ===== */}\n {step === 'otp' && (\n <>\n <button onClick={() => goToStep('info')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>Entrez le code envoyé {isPhoneOnly ? `au ${formData.ccphone} ${formData.phone}` : `à ${formData.email}`}</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={otpCode} onChange={setOtpCode} disabled={regLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : <button type=\"button\" onClick={handleResendOTP} style={linkStyle}>Code non reçu ? Renvoyer</button>}\n </div>\n <StepIndicator current={4} />\n <Button onClick={handleOTPSubmit} disabled={regLoading || otpCode.length !== 6} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Vérifier'}\n </Button>\n </div>\n </>\n )}\n\n {/* ===== PASSWORD ===== */}\n {step === 'password' && (\n <>\n <button onClick={() => goToStep('otp')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Créer un mot de passe</DialogTitle>\n </DialogHeader>\n <form onSubmit={handlePasswordSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '0.75rem' }}>\n {renderError()}\n <div><Label>Mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={regLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"••••••••\" value={passwordConfirm} onChange={e => setPasswordConfirm(e.target.value)} disabled={regLoading} /></div>\n <StepIndicator current={5} />\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>Continuer</Button>\n </form>\n </>\n )}\n\n {/* ===== CONFIRM ===== */}\n {step === 'confirm' && (\n <>\n <button onClick={() => goToStep('password')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Confirmer votre inscription</DialogTitle>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <div style={{ backgroundColor: C.gray100, borderRadius: '0.5rem', padding: '1rem' }}>\n {[['Nom', formData.name], ...(!isPhoneOnly ? [['Email', formData.email]] : []), ['Téléphone', `${formData.ccphone} ${formData.phone}`], ['Ville', formData.town], ['Pays', formData.country]].map(([label, value]) => (\n <div key={label as string} style={{ display: 'flex', justifyContent: 'space-between', padding: '0.375rem 0' }}>\n <span style={{ fontSize: '0.875rem', color: C.gray500 }}>{label}</span>\n <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>{value as string}</span>\n </div>\n ))}\n </div>\n <StepIndicator current={6} />\n <Button onClick={handleConfirm} disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Création du compte...\n </span>\n ) : 'Créer mon compte'}\n </Button>\n </div>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default SignupModal;\n","/**\n * OnboardingModal — Post-login modal for missing profile info\n * Asks for photo + phone if not present in user_infos\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Button, Label } from './ui';\nimport { PhoneInput } from './PhoneInput';\nimport type { NativeUser } from '../types/native';\n\n// Design tokens matching package modals\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n white: '#ffffff',\n} as const;\n\nexport interface OnboardingModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: NativeUser;\n /** Called with updated data when user submits */\n onComplete: (data: { image_url?: string; ccphone?: string; phone?: string; email?: string }) => void;\n /** Called when user skips onboarding */\n onSkip: () => void;\n}\n\nexport function OnboardingModal({ open, onOpenChange, user, onComplete, onSkip }: OnboardingModalProps) {\n const needsPhoto = !user.image_url;\n const needsPhone = !user.phone;\n const needsEmail = !user.email;\n\n const [photoPreview, setPhotoPreview] = useState<string>('');\n const [photoFile, setPhotoFile] = useState<File | null>(null);\n const [ccphone, setCcphone] = useState(user.ccphone || '+221');\n const [phone, setPhone] = useState(user.phone || '');\n const [email, setEmail] = useState('');\n const [confirmed, setConfirmed] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n\n const [fileError, setFileError] = useState('');\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validation taille max 2 Mo\n if (file.size > 2 * 1024 * 1024) {\n setFileError('Le fichier dépasse 2 Mo. Veuillez choisir une image plus légère.');\n e.target.value = '';\n return;\n }\n setFileError('');\n setPhotoFile(file);\n const reader = new FileReader();\n reader.onload = () => setPhotoPreview(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n const canSubmit = confirmed && (\n (needsPhoto ? !!photoPreview : true) &&\n (needsPhone ? phone.length >= 7 : true)\n );\n\n const handleSubmit = useCallback(() => {\n if (!canSubmit) return;\n setSubmitting(true);\n \n const data: { image_url?: string; ccphone?: string; phone?: string; email?: string } = {};\n if (needsPhoto && photoPreview) {\n data.image_url = photoPreview;\n }\n if (needsPhone && phone) {\n data.ccphone = ccphone;\n data.phone = phone;\n }\n if (needsEmail && email.trim()) {\n data.email = email.trim();\n }\n \n onComplete(data);\n }, [canSubmit, needsPhoto, needsPhone, needsEmail, photoPreview, ccphone, phone, email, onComplete]);\n\n // Shield check icon inline\n const ShieldIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.25rem' }}>\n <ShieldIcon />\n <DialogTitle>Complétez votre profil</DialogTitle>\n </div>\n <DialogDescription>\n Ajoutez les informations manquantes pour finaliser votre compte.\n </DialogDescription>\n </DialogHeader>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem', marginTop: '1rem' }}>\n {/* Photo upload */}\n {needsPhoto && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Photo de profil\n </Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n {/* Preview circle */}\n <div style={{\n width: '4rem',\n height: '4rem',\n borderRadius: '50%',\n backgroundColor: C.gray100,\n border: `2px dashed ${C.gray200}`,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n {photoPreview ? (\n <img src={photoPreview} alt=\"Preview\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.gray500} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M5.5 21a8.38 8.38 0 0 1 13 0\" />\n </svg>\n )}\n </div>\n {/* File input */}\n <div style={{ flex: 1 }}>\n <label style={{\n display: 'inline-block',\n padding: '0.5rem 1rem',\n backgroundColor: C.gray100,\n border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '0.875rem',\n color: C.gray700,\n fontWeight: 500,\n }}>\n Choisir une photo\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n </label>\n <p style={{ fontSize: '0.75rem', color: fileError ? '#dc2626' : C.gray500, marginTop: '0.25rem' }}>\n {fileError || 'JPG, PNG. Max 2 Mo.'}\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* Phone input */}\n {needsPhone && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Numéro de téléphone\n </Label>\n <PhoneInput\n value={phone}\n onChange={setPhone}\n ccphone={ccphone}\n onCcphoneChange={setCcphone}\n />\n </div>\n )}\n\n {/* Email input — optional, not blocking */}\n {needsEmail && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Adresse email <span style={{ color: C.gray500, fontWeight: 400 }}>(optionnel)</span>\n </Label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"email@exemple.com\"\n style={{\n width: '100%',\n height: '2.5rem',\n padding: '0 0.75rem',\n border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem',\n fontSize: '0.875rem',\n color: C.gray700,\n backgroundColor: C.white,\n outline: 'none',\n }}\n />\n </div>\n )}\n\n {/* Confirmation checkbox */}\n <label style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.5rem',\n cursor: 'pointer',\n fontSize: '0.875rem',\n color: C.gray700,\n }}>\n <input\n type=\"checkbox\"\n checked={confirmed}\n onChange={(e) => setConfirmed(e.target.checked)}\n style={{\n width: '1rem',\n height: '1rem',\n marginTop: '0.125rem',\n accentColor: C.primary,\n cursor: 'pointer',\n }}\n />\n <span>Je confirme que ces informations sont exactes</span>\n </label>\n\n {/* Actions */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <Button\n onClick={handleSubmit}\n disabled={!canSubmit || submitting}\n style={{ width: '100%', height: '2.75rem', opacity: canSubmit && !submitting ? 1 : 0.5 }}\n >\n {submitting ? 'Enregistrement...' : 'Valider'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={submitting}\n style={{ width: '100%', height: '2.75rem' }}\n >\n Passer pour l'instant\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default OnboardingModal;\n","/**\n * DebugPanel — Panneau de debug flottant pour @ollaid/native-sso\n * Affiche l'historique des appels API en temps réel (style terminal)\n * N'apparaît que quand debug=true\n * @version 1.0.0\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { subscribeToLogs, clearApiLogs, exportLogsAsText, type ApiCallLog } from '../services/debugLogger';\n\ninterface DebugPanelProps {\n saasApiUrl: string;\n iamApiUrl: string;\n}\n\nexport function DebugPanel({ saasApiUrl, iamApiUrl }: DebugPanelProps) {\n const [logs, setLogs] = useState<ApiCallLog[]>([]);\n const [expanded, setExpanded] = useState(true);\n const [selectedLog, setSelectedLog] = useState<string | null>(null);\n\n useEffect(() => {\n return subscribeToLogs(setLogs);\n }, []);\n\n const handleCopy = useCallback(() => {\n const text = exportLogsAsText();\n navigator.clipboard?.writeText(text).catch(() => {});\n }, []);\n\n const handleClear = useCallback(() => {\n clearApiLogs();\n setSelectedLog(null);\n }, []);\n\n const statusColor = (status: number | null) => {\n if (status === null) return '#f59e0b';\n if (status >= 200 && status < 300) return '#22c55e';\n return '#ef4444';\n };\n\n const statusEmoji = (status: number | null) => {\n if (status === null) return '⏳';\n if (status >= 200 && status < 300) return '✅';\n return '❌';\n };\n\n const selected = selectedLog ? logs.find(l => l.id === selectedLog) : null;\n\n return (\n <div style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 99999,\n fontFamily: 'monospace',\n fontSize: '12px',\n }}>\n {/* Header bar */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n background: '#1a1a2e',\n color: '#e2e8f0',\n padding: '6px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n borderTop: '2px solid #6366f1',\n }}\n >\n <span>🔐 Debug SSO — {logs.length} appel{logs.length > 1 ? 's' : ''}</span>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n {expanded && (\n <>\n <button onClick={(e) => { e.stopPropagation(); handleCopy(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 📋 Copier\n </button>\n <button onClick={(e) => { e.stopPropagation(); handleClear(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 🗑️ Effacer\n </button>\n </>\n )}\n <span>{expanded ? '▼' : '▲'}</span>\n </div>\n </div>\n\n {/* Body */}\n {expanded && (\n <div style={{\n background: '#0f0f23',\n color: '#e2e8f0',\n maxHeight: '300px',\n overflowY: 'auto',\n }}>\n {/* Config bar */}\n <div style={{ padding: '4px 12px', background: '#1e1e3f', fontSize: '10px', color: '#94a3b8', display: 'flex', gap: '16px' }}>\n <span>SaaS: <span style={{ color: '#6366f1' }}>{saasApiUrl}</span></span>\n <span>IAM: <span style={{ color: '#6366f1' }}>{iamApiUrl}</span></span>\n </div>\n\n {logs.length === 0 ? (\n <div style={{ padding: '20px', textAlign: 'center', color: '#64748b' }}>\n Aucun appel API. Tentez une connexion pour voir les logs.\n </div>\n ) : (\n <div>\n {logs.map(log => (\n <div key={log.id}>\n <div\n onClick={() => setSelectedLog(selectedLog === log.id ? null : log.id)}\n style={{\n padding: '4px 12px',\n borderBottom: '1px solid #1e293b',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n background: selectedLog === log.id ? '#1e293b' : 'transparent',\n }}\n >\n <span>{statusEmoji(log.responseStatus)}</span>\n <span style={{\n background: log.method === 'GET' ? '#22c55e' : '#3b82f6',\n color: '#fff',\n padding: '0 4px',\n borderRadius: '2px',\n fontSize: '10px',\n fontWeight: 'bold',\n }}>{log.method}</span>\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {log.endpoint}\n </span>\n <span style={{ color: statusColor(log.responseStatus), minWidth: '30px' }}>\n {log.responseStatus ?? '...'}\n </span>\n <span style={{ color: '#64748b', minWidth: '50px', textAlign: 'right' }}>\n {log.duration ? `${log.duration}ms` : '...'}\n </span>\n </div>\n\n {/* Detail view */}\n {selectedLog === log.id && selected && (\n <div style={{ padding: '8px 12px 8px 32px', background: '#111827', borderBottom: '1px solid #1e293b' }}>\n <div style={{ color: '#94a3b8', marginBottom: '4px' }}>\n ⏰ {new Date(log.timestamp).toLocaleTimeString()}\n </div>\n {log.requestBody ? (\n <div style={{ marginBottom: '4px' }}>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>REQUEST:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '80px', overflow: 'auto' }}>\n {JSON.stringify(log.requestBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.responseBody ? (\n <div>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>RESPONSE:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '120px', overflow: 'auto' }}>\n {JSON.stringify(log.responseBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.error && (\n <div style={{ color: '#ef4444', marginTop: '4px' }}>⚠️ {log.error}</div>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default DebugPanel;\n","export default \"data:image/png;base64,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\"","/**\n * NativeSSOPage — Page autonome complète pour @ollaid/native-sso\n * Design aligné sur /sso/auth (fond primary, card blanche, ShieldCheck branding)\n * \n * @version 2.0.0\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { LoginModal } from './LoginModal';\nimport { SignupModal } from './SignupModal';\nimport { OnboardingModal } from './OnboardingModal';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { DebugPanel } from './DebugPanel';\nimport ollaidLogo from '../logo/ollaid.png';\nimport { Button } from './ui';\nimport { STORAGE_KEYS } from '../services/api';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport type { UserInfos, NativeUser } from '../types/native';\n\nexport interface NativeSSOPageProps {\n saasApiUrl: string;\n iamApiUrl: string;\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n onLogout?: () => void;\n onOnboardingComplete?: (data: { image_url?: string; ccphone?: string; phone?: string }) => void;\n accountType?: 'user' | 'client';\n configPrefix?: string;\n title?: string;\n description?: string;\n logoUrl?: string;\n hideFooter?: boolean;\n redirectAfterLogin?: string;\n redirectAfterLogout?: string;\n}\n\ntype ModalState = 'none' | 'login' | 'signup';\n\nconst COLORS = {\n primary: '#002147',\n primaryForeground: '#ffffff',\n accent: '#e8430a',\n card: '#ffffff',\n cardForeground: '#1a2332',\n muted: '#6b7280',\n border: '#e5e7eb',\n shadow: '0 10px 25px -5px rgba(0,0,0,0.2)',\n} as const;\n\nconst LIGHT_VARS: Record<string, string> = {\n \"--background\": \"40 20% 96%\",\n \"--foreground\": \"220 15% 15%\",\n \"--card\": \"0 0% 100%\",\n \"--card-foreground\": \"220 15% 15%\",\n \"--popover\": \"0 0% 100%\",\n \"--popover-foreground\": \"220 15% 15%\",\n \"--primary\": \"209 100% 13%\",\n \"--primary-foreground\": \"0 0% 100%\",\n \"--secondary\": \"40 15% 92%\",\n \"--secondary-foreground\": \"220 15% 25%\",\n \"--muted\": \"40 10% 90%\",\n \"--muted-foreground\": \"220 10% 50%\",\n \"--accent\": \"16 99% 52%\",\n \"--accent-foreground\": \"0 0% 100%\",\n \"--destructive\": \"0 84.2% 60.2%\",\n \"--destructive-foreground\": \"210 40% 98%\",\n \"--border\": \"40 15% 88%\",\n \"--input\": \"40 15% 88%\",\n \"--ring\": \"209 100% 13%\",\n};\n\n// Shield check SVG inline\nconst ShieldCheckIcon = ({ size = 24, color = COLORS.accent }: { size?: number; color?: string }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n);\n\nfunction needsOnboarding(user: NativeUser | UserInfos): boolean {\n return !user.image_url || !user.phone;\n}\n\n// Gradient border animation keyframes (injected once)\nconst GRADIENT_STYLE_ID = 'ollaid-sso-gradient-anim';\nfunction injectGradientAnimation() {\n if (document.getElementById(GRADIENT_STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = GRADIENT_STYLE_ID;\n style.textContent = `\n @keyframes ollaid-border-gradient {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n @keyframes ollaid-marquee {\n 0% { transform: translateX(0); }\n 100% { transform: translateX(-50%); }\n }\n `;\n document.head.appendChild(style);\n}\n\n/** Top branding: ShieldCheck + iam.ollaid.com + subtitle */\nconst TopBranding = ({ subtitle }: { subtitle: string }) => (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginBottom: '0.5rem' }}>\n <ShieldCheckIcon size={28} color={COLORS.accent} />\n <span style={{ fontSize: '1.25rem', fontWeight: 700, color: COLORS.primaryForeground }}>\n iam.<span style={{ color: COLORS.accent }}>ollaid</span>.com\n </span>\n </div>\n <p style={{ fontSize: '1rem', fontWeight: 600, color: 'rgba(255,255,255,0.85)' }}>\n {subtitle}\n </p>\n </div>\n);\n\n/** Footer: Ollaid logo + copyright */\nconst Footer = ({ hideFooter }: { hideFooter: boolean }) => (\n <div style={{ marginTop: '1.5rem', textAlign: 'center' }}>\n <img src={ollaidLogo} alt=\"Ollaid\" style={{ height: '28px', margin: '0 auto 0.5rem' }} />\n {!hideFooter && (\n <p style={{ fontSize: '0.75rem', color: 'rgba(255,255,255,0.5)' }}>\n © 2026 iam.ollaid.com propulsé par <span style={{ fontWeight: 500 }}>ollaid</span>\n </p>\n )}\n </div>\n);\n\nexport function NativeSSOPage({\n saasApiUrl,\n iamApiUrl,\n onLoginSuccess,\n onLogout,\n onOnboardingComplete,\n accountType = 'user',\n configPrefix = 'iam',\n title = 'Un compte pour toutes vos applications',\n description = 'Connectez-vous avec votre compte Ollaid pour accéder à toutes les applications partenaires.',\n logoUrl,\n hideFooter = false,\n redirectAfterLogin,\n redirectAfterLogout,\n}: NativeSSOPageProps) {\n const [modal, setModal] = useState<ModalState>('none');\n const [showOnboarding, setShowOnboarding] = useState(false);\n const [pendingSession, setPendingSession] = useState<{ token: string; user: NativeUser } | null>(null);\n const [session, setSession] = useState<{ token: string; user: NativeUser } | null>(() => {\n try {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const userStr = localStorage.getItem(STORAGE_KEYS.USER);\n if (token && userStr) return { token, user: JSON.parse(userStr) };\n } catch {}\n return null;\n });\n\n const { isDebug: resolvedDebug } = useNativeAuth({ saasApiUrl, iamApiUrl, configPrefix, autoLoadCredentials: true });\n\n // Force light mode + inject gradient animation\n useEffect(() => {\n injectGradientAnimation();\n const root = document.documentElement;\n const originalValues: Record<string, string> = {};\n Object.keys(LIGHT_VARS).forEach((key) => { originalValues[key] = root.style.getPropertyValue(key); });\n Object.entries(LIGHT_VARS).forEach(([key, value]) => { root.style.setProperty(key, value); });\n root.classList.add('light');\n root.classList.remove('dark');\n root.style.colorScheme = 'light';\n const meta = document.createElement('meta');\n meta.name = 'color-scheme';\n meta.content = 'light';\n document.head.appendChild(meta);\n return () => {\n Object.entries(originalValues).forEach(([key, value]) => {\n if (value) root.style.setProperty(key, value);\n else root.style.removeProperty(key);\n });\n root.classList.remove('light');\n root.style.colorScheme = '';\n meta.remove();\n };\n }, []);\n\n const openLogin = useCallback(() => setModal('login'), []);\n const openSignup = useCallback(() => setModal('signup'), []);\n const closeModal = useCallback(() => setModal('none'), []);\n const switchToSignup = useCallback(() => { setModal('none'); setTimeout(() => setModal('signup'), 150); }, []);\n const switchToLogin = useCallback(() => { setModal('none'); setTimeout(() => setModal('login'), 150); }, []);\n\n const handleLoginSuccess = useCallback((token: string, user: UserInfos) => {\n const userObj: NativeUser = {\n reference: '',\n name: user.name,\n email: user.email || undefined,\n phone: user.phone,\n ccphone: user.ccphone,\n image_url: user.image_url,\n account_type: (user as any).account_type || 'user',\n };\n setModal('none');\n if (needsOnboarding(userObj)) {\n setPendingSession({ token, user: userObj });\n setShowOnboarding(true);\n } else {\n setSession({ token, user: userObj });\n onLoginSuccess?.(token, user);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }\n }, [onLoginSuccess, redirectAfterLogin]);\n\n const handleOnboardingComplete = useCallback((data: { image_url?: string; ccphone?: string; phone?: string }) => {\n if (!pendingSession) return;\n const updatedUser = { ...pendingSession.user, ...data };\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(updatedUser));\n setShowOnboarding(false);\n setSession({ token: pendingSession.token, user: updatedUser });\n setPendingSession(null);\n onOnboardingComplete?.(data);\n onLoginSuccess?.(pendingSession.token, updatedUser as unknown as UserInfos);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }, [pendingSession, onLoginSuccess, onOnboardingComplete, redirectAfterLogin]);\n\n const handleOnboardingSkip = useCallback(() => {\n if (!pendingSession) return;\n setShowOnboarding(false);\n setSession(pendingSession);\n setPendingSession(null);\n onLoginSuccess?.(pendingSession.token, pendingSession.user as unknown as UserInfos);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }, [pendingSession, onLoginSuccess, redirectAfterLogin]);\n\n const handleLogout = useCallback(() => {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n setSession(null);\n onLogout?.();\n if (redirectAfterLogout) window.location.href = redirectAfterLogout;\n }, [onLogout, redirectAfterLogout]);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n minHeight: '100vh',\n backgroundColor: COLORS.primary,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1.5rem 1rem',\n };\n\n const cardStyle: React.CSSProperties = {\n width: '100%',\n maxWidth: '28rem',\n backgroundColor: COLORS.card,\n border: `1px solid ${COLORS.border}`,\n borderRadius: '0.75rem',\n boxShadow: COLORS.shadow,\n overflow: 'hidden',\n };\n\n // Badge-style slider wrapper (shield circle + animated gradient pill)\n const SliderBadge = () => (\n <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" style={{ height: '3rem', margin: '0 auto' }} />\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n {/* Shield circle */}\n <div style={{\n width: '3rem',\n height: '3rem',\n borderRadius: '50%',\n backgroundColor: '#ffffff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n border: `1px solid ${COLORS.border}`,\n }}>\n <ShieldCheckIcon size={22} color={COLORS.accent} />\n </div>\n {/* Animated gradient pill with slider */}\n <div style={{\n flex: 1,\n minWidth: 0,\n position: 'relative',\n borderRadius: '9999px',\n padding: '2px',\n background: `linear-gradient(90deg, ${COLORS.primary}, ${COLORS.accent}, ${COLORS.primary})`,\n backgroundSize: '200% 100%',\n animation: 'ollaid-border-gradient 3s ease infinite',\n }}>\n <div style={{\n backgroundColor: '#ffffff',\n borderRadius: '9999px',\n height: '3rem',\n overflow: 'hidden',\n }}>\n <AppsLogoSlider iamApiUrl={iamApiUrl} speed=\"normal\" />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n // Auto-redirect if already authenticated and redirectAfterLogin is set\n if (session) {\n if (redirectAfterLogin) {\n // Redirect immediately — don't show authenticated view\n window.location.href = redirectAfterLogin;\n return (\n <div style={containerStyle}>\n <TopBranding subtitle={title} />\n <p style={{ color: 'rgba(255,255,255,0.7)', fontSize: '0.875rem' }}>Redirection en cours...</p>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <TopBranding subtitle={title} />\n <SliderBadge />\n\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground }}>\n Bienvenue, {session.user.name}\n </h2>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginTop: '0.25rem' }}>\n Vous êtes connecté à votre compte Ollaid SSO\n </p>\n <div style={{ marginTop: '1.5rem' }}>\n <Button variant=\"outline\" onClick={handleLogout} style={{ width: '100%' }}>\n Déconnexion\n </Button>\n </div>\n </div>\n </div>\n\n <Footer hideFooter={hideFooter} />\n </div>\n );\n }\n\n // Unauthenticated view\n return (\n <div style={containerStyle}>\n <TopBranding subtitle={title} />\n <SliderBadge />\n\n {/* Main card */}\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginBottom: '1.5rem' }}>\n {description}\n </p>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <Button onClick={openLogin} style={{ width: '100%', height: '2.75rem' }}>\n Connexion\n </Button>\n <Button\n variant=\"outline\"\n onClick={openSignup}\n style={{ width: '100%', height: '2.75rem', borderColor: COLORS.cardForeground, color: COLORS.cardForeground }}\n >\n Inscription\n </Button>\n </div>\n </div>\n </div>\n\n <Footer hideFooter={hideFooter} />\n\n <LoginModal\n open={modal === 'login'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToSignup={switchToSignup}\n onLoginSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n <SignupModal\n open={modal === 'signup'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToLogin={switchToLogin}\n onSignupSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n {pendingSession && (\n <OnboardingModal\n open={showOnboarding}\n onOpenChange={(open) => { if (!open) handleOnboardingSkip(); }}\n user={pendingSession.user}\n onComplete={handleOnboardingComplete}\n onSkip={handleOnboardingSkip}\n />\n )}\n\n {resolvedDebug && <DebugPanel saasApiUrl={saasApiUrl} iamApiUrl={iamApiUrl} />}\n </div>\n );\n}\n\nexport default NativeSSOPage;\n","/**\n * NativeSSOProvider — React Context pour @ollaid/native-sso\n * Centralise la configuration pour les hooks et composants individuels\n * \n * @version 1.0.0\n */\n\nimport { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport { setNativeAuthConfig, type NativeAuthConfig } from './services/api';\n\nexport interface NativeSSOConfig {\n /** URL du Backend SaaS (ex: https://mon-saas.com/api) */\n saasApiUrl: string;\n /** URL du Backend IAM (ex: https://identityam.ollaid.com/api) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n}\n\nconst NativeSSOContext = createContext<NativeSSOConfig | null>(null);\n\nexport interface NativeSSOProviderProps {\n config: NativeSSOConfig;\n children: ReactNode;\n}\n\n/**\n * Provider React pour centraliser la config SSO.\n * \n * Usage :\n * ```tsx\n * <NativeSSOProvider config={{ saasApiUrl: '...', iamApiUrl: '...' }}>\n * <App />\n * </NativeSSOProvider>\n * ```\n */\nexport function NativeSSOProvider({ config, children }: NativeSSOProviderProps) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig(config);\n configuredRef.current = true;\n }\n }, [config]);\n\n return (\n <NativeSSOContext.Provider value={config}>\n {children}\n </NativeSSOContext.Provider>\n );\n}\n\n/**\n * Hook pour accéder à la config SSO depuis le Provider.\n * Optionnel : les hooks acceptent aussi la config en paramètre.\n */\nexport function useNativeSSOConfig(): NativeSSOConfig {\n const ctx = useContext(NativeSSOContext);\n if (!ctx) {\n throw new Error('useNativeSSOConfig doit être utilisé dans un <NativeSSOProvider>');\n }\n return ctx;\n}\n\nexport default NativeSSOProvider;\n","/**\n * Service IAM Account — APIs server-to-server\n * link-phone, link-email, refresh-user-info, update-avatar, reset-avatar\n * \n * ⚠️ ATTENTION — SERVER-TO-SERVER UNIQUEMENT\n * Ces APIs utilisent la `secret_key` de votre application IAM.\n * Elles doivent être appelées EXCLUSIVEMENT depuis un backend (Node.js, PHP, etc.).\n * Ne JAMAIS appeler ces méthodes depuis du code frontend/navigateur car la\n * secret_key serait exposée dans les DevTools réseau.\n * \n * @version 1.0.0\n */\n\nimport { fetchWithTimeout, getHeaders, getNativeAuthConfig } from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n LinkPhoneRequest,\n LinkPhoneResponse,\n LinkEmailRequest,\n LinkEmailResponse,\n RefreshUserInfoSingleRequest,\n RefreshUserInfoSingleResponse,\n RefreshUserInfoBulkRequest,\n RefreshUserInfoBulkResponse,\n UpdateAvatarRequest,\n UpdateAvatarResponse,\n ResetAvatarRequest,\n ResetAvatarResponse,\n} from '../types/native';\n\n// ============================================\n// Helper — auto-fill credentials if available\n// ============================================\n\nfunction getCredentialsOrThrow(params: { app_key?: string; secret_key?: string }) {\n const app_key = params.app_key;\n const secret_key = params.secret_key;\n\n if (!app_key || !secret_key) {\n throw new Error('app_key et secret_key sont requis en paramètre. Ces APIs sont server-to-server et ne peuvent pas utiliser les encrypted_credentials.');\n }\n\n return { app_key, secret_key };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const iamAccountService = {\n\n /**\n * Lier un numéro de téléphone à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-phone\n */\n async linkPhone(params: Partial<Pick<LinkPhoneRequest, 'app_key' | 'secret_key'>> & Omit<LinkPhoneRequest, 'app_key' | 'secret_key'>): Promise<LinkPhoneResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkPhoneResponse>(\n `${config.iamApiUrl}/iam/link-phone`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n ccphone: params.ccphone,\n phone: params.phone,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Lier une adresse email à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-email\n */\n async linkEmail(params: Partial<Pick<LinkEmailRequest, 'app_key' | 'secret_key'>> & Omit<LinkEmailRequest, 'app_key' | 'secret_key'>): Promise<LinkEmailResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkEmailResponse>(\n `${config.iamApiUrl}/iam/link-email`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n email: params.email,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos d'un utilisateur (mode single)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfo(params: Partial<Pick<RefreshUserInfoSingleRequest, 'secret_key'>> & Omit<RefreshUserInfoSingleRequest, 'secret_key'>): Promise<RefreshUserInfoSingleResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n return fetchWithTimeout<RefreshUserInfoSingleResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos en bulk (max 100 alias_references)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfoBulk(params: Partial<Pick<RefreshUserInfoBulkRequest, 'secret_key'>> & Omit<RefreshUserInfoBulkRequest, 'secret_key'>): Promise<RefreshUserInfoBulkResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n if (params.alias_references.length > 100) {\n throw new Error('Maximum 100 alias_references par requête bulk.');\n }\n\n return fetchWithTimeout<RefreshUserInfoBulkResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_references: params.alias_references,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Mettre à jour l'avatar d'un utilisateur pour une application spécifique\n * POST {iamApiUrl}/iam/update-avatar\n */\n async updateAvatar(params: Partial<Pick<UpdateAvatarRequest, 'app_key' | 'secret_key'>> & Omit<UpdateAvatarRequest, 'app_key' | 'secret_key'>): Promise<UpdateAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<UpdateAvatarResponse>(\n `${config.iamApiUrl}/iam/update-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n avatar_url: params.avatar_url,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Réinitialiser l'avatar d'un utilisateur (remettre à null pour utiliser l'image globale)\n * POST {iamApiUrl}/iam/reset-avatar\n */\n async resetAvatar(params: Partial<Pick<ResetAvatarRequest, 'app_key' | 'secret_key'>> & Omit<ResetAvatarRequest, 'app_key' | 'secret_key'>): Promise<ResetAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<ResetAvatarResponse>(\n `${config.iamApiUrl}/iam/reset-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n};\n"],"names":["jsxs","jsx","createContext","useEffect","useContext","forwardRef","useRef","useState","config","getErrorMessage","useCallback","C","iconCircle","backBtnStyle","Fragment","STORAGE_KEYS","linkStyle"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/ui.tsx","../src/components/OTPInput.tsx","../src/services/debugLogger.ts","../src/services/api.ts","../src/services/nativeAuth.ts","../src/services/mobilePassword.ts","../src/hooks/useMobilePassword.ts","../src/components/PasswordRecoveryModal.tsx","../src/hooks/useTokenHealthCheck.ts","../src/hooks/useNativeAuth.ts","../src/components/LoginModal.tsx","../src/utils/countries.ts","../src/components/PhoneInput.tsx","../src/components/AppsLogoSlider.tsx","../src/services/mobileRegistration.ts","../src/hooks/useMobileRegistration.ts","../src/components/SignupModal.tsx","../src/components/OnboardingModal.tsx","../src/components/DebugPanel.tsx","../src/logo/ollaid.png","../src/components/NativeSSOPage.tsx","../src/provider.tsx","../src/services/iamAccount.ts"],"sourcesContent":["/**\n * Embedded UI primitives for @ollaid/native-sso\n * Lightweight replacements for shadcn/ui components + inline SVG icons\n * No external dependencies required\n * \n * @version 1.0.0\n */\n\nimport React, { forwardRef, createContext, useContext, useEffect } from 'react';\n\n// ============================================\n// SVG Icons (inline, no lucide dependency)\n// ============================================\n\nconst iconProps = { width: '100%', height: '100%', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const };\n\nexport function IconShieldCheck(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconMail(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\n\nexport function IconPhone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\" />\n </svg>\n );\n}\n\nexport function IconLock(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function IconKeyRound(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function IconArrowLeft(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m12 19-7-7 7-7\" />\n <path d=\"M19 12H5\" />\n </svg>\n );\n}\n\nexport function IconEye(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconEyeOff(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function IconCheckCircle2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconLoader2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props} style={{ animation: 'spin 1s linear infinite', ...(props.style || {}) }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function IconAlertTriangle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nexport function IconSmartphone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\" />\n <path d=\"M12 18h.01\" />\n </svg>\n );\n}\n\nexport function IconHome(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n );\n}\n\nexport function IconCalendar(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M8 2v4\" /><path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n </svg>\n );\n}\n\nexport function IconBell(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" />\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" />\n </svg>\n );\n}\n\nexport function IconMessageCircle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22z\" />\n </svg>\n );\n}\n\nexport function IconUsers(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\nexport function IconSettings(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconGlobe(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\n// ============================================\n// Dialog\n// ============================================\n\ninterface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst DialogContext = createContext<DialogContextValue>({ open: false, onOpenChange: () => {} });\n\nexport function Dialog({ open, onOpenChange, children }: { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }) {\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <DialogContext.Provider value={{ open, onOpenChange }}>\n {children}\n </DialogContext.Provider>\n );\n}\n\nexport function DialogContent({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n const { onOpenChange } = useContext(DialogContext);\n\n return (\n <div style={{ position: 'fixed', inset: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div \n style={{ \n position: 'fixed', inset: 0, \n backgroundColor: 'rgba(0,0,0,0.5)', \n backdropFilter: 'blur(4px)',\n animation: 'ollaid-overlay-in 0.25s ease-out',\n }}\n />\n <div \n className={className}\n style={{ \n position: 'relative', zIndex: 51, width: '100%', maxWidth: '28rem', \n margin: '1rem', padding: '1rem', borderRadius: '0.75rem',\n backgroundColor: 'white', boxShadow: '0 25px 50px -12px rgba(0,0,0,0.25)',\n maxHeight: '90vh',\n display: 'flex', flexDirection: 'column',\n animation: 'ollaid-modal-in 0.3s ease-out',\n }}\n >\n <button\n onClick={() => onOpenChange(false)}\n style={{ position: 'absolute', right: '0.75rem', top: '0.75rem', background: 'none', border: 'none', cursor: 'pointer', fontSize: '1.25rem', color: '#9ca3af', lineHeight: 1, zIndex: 2 }}\n aria-label=\"Close\"\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\nexport function DialogBody({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return (\n <div className={className} style={{ flex: 1, overflowY: 'auto', paddingBottom: '0.5rem', minHeight: 0, ...style }}>\n {children}\n </div>\n );\n}\n\nexport function DialogFooter({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return (\n <div className={className} style={{ flexShrink: 0, paddingTop: '0.75rem', borderTop: '1px solid #e5e7eb', display: 'flex', flexDirection: 'column', gap: '0.5rem', ...style }}>\n {children}\n </div>\n );\n}\n\nexport function DialogHeader({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return <div className={className} style={{ marginBottom: '0.5rem', flexShrink: 0, ...style }}>{children}</div>;\n}\n\nexport function DialogTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <h2 className={className} style={{ fontSize: '1.25rem', fontWeight: 600, color: '#111827' }}>{children}</h2>;\n}\n\nexport function DialogDescription({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <p className={className} style={{ fontSize: '0.875rem', color: '#6b7280', marginTop: '0.25rem' }}>{children}</p>;\n}\n\n// ============================================\n// Button\n// ============================================\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'default' | 'sm' | 'lg';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(({ \n variant = 'default', size = 'default', className = '', style, disabled, children, ...props \n}, ref) => {\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n borderRadius: '0.5rem', fontWeight: 500, cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.15s', border: 'none', opacity: disabled ? 0.5 : 1,\n fontSize: size === 'sm' ? '0.875rem' : '0.9375rem',\n padding: size === 'sm' ? '0.375rem 0.75rem' : size === 'lg' ? '0.75rem 1.5rem' : '0.625rem 1rem',\n height: size === 'sm' ? '2rem' : size === 'lg' ? '3rem' : '2.5rem',\n ...(variant === 'default' ? { backgroundColor: '#002147', color: 'white' } : {}),\n ...(variant === 'outline' ? { backgroundColor: 'transparent', border: '1px solid #d1d5db', color: '#374151' } : {}),\n ...(variant === 'ghost' ? { backgroundColor: 'transparent', color: '#374151' } : {}),\n ...style,\n };\n\n return (\n <button ref={ref} className={className} style={baseStyle} disabled={disabled} {...props}>\n {children}\n </button>\n );\n});\nButton.displayName = 'Button';\n\n// ============================================\n// Input\n// ============================================\n\nexport const Input = forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <input\n ref={ref}\n className={className}\n style={{\n width: '100%', padding: '0.5rem 0.75rem', borderRadius: '0.375rem',\n border: '1px solid #d1d5db', fontSize: '0.9375rem', outline: 'none',\n transition: 'border-color 0.15s', backgroundColor: '#f9fafb', color: '#111827',\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\n// ============================================\n// Label\n// ============================================\n\nexport const Label = forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement>>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={className}\n style={{ fontSize: '0.875rem', fontWeight: 500, color: '#374151', ...style }}\n {...props}\n />\n );\n }\n);\nLabel.displayName = 'Label';\n\n// ============================================\n// RadioGroup (simplified)\n// ============================================\n\ninterface RadioGroupProps {\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst RadioGroupContext = createContext<{ value: string; onValueChange: (v: string) => void }>({ value: '', onValueChange: () => {} });\n\nexport function RadioGroup({ value, onValueChange, children, className = '' }: RadioGroupProps) {\n return (\n <RadioGroupContext.Provider value={{ value, onValueChange }}>\n <div className={className}>{children}</div>\n </RadioGroupContext.Provider>\n );\n}\n\nexport function RadioGroupItem({ value, id }: { value: string; id: string }) {\n const { value: groupValue, onValueChange } = useContext(RadioGroupContext);\n return (\n <input\n type=\"radio\"\n id={id}\n checked={groupValue === value}\n onChange={() => onValueChange(value)}\n style={{ width: '1rem', height: '1rem', accentColor: '#002147' }}\n />\n );\n}\n\n// Global keyframes for spinner\nif (typeof document !== 'undefined') {\n const styleId = 'ollaid-sso-keyframes';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `@keyframes spin { to { transform: rotate(360deg); } } @keyframes ollaid-overlay-in { from { opacity: 0; } to { opacity: 1; } } @keyframes ollaid-modal-in { from { opacity: 0; transform: translateY(20px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } }`;\n document.head.appendChild(style);\n }\n}\n","/**\n * OTP Input component for @ollaid/native-sso\n */\n\nimport { useRef, useState, useEffect, KeyboardEvent, ClipboardEvent } from 'react';\n\ninterface OTPInputProps {\n length?: 6 | 8;\n value: string;\n onChange: (value: string) => void;\n onComplete?: (value: string) => void;\n disabled?: boolean;\n autoFocus?: boolean;\n}\n\nexport function OTPInput({\n length = 6, value, onChange, onComplete, disabled = false, autoFocus = true,\n}: OTPInputProps) {\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const [activeIndex, setActiveIndex] = useState(0);\n\n useEffect(() => { inputRefs.current = inputRefs.current.slice(0, length); }, [length]);\n\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) inputRefs.current[0].focus();\n }, [autoFocus]);\n\n useEffect(() => {\n if (value.length === length && onComplete) onComplete(value);\n }, [value, length, onComplete]);\n\n const handleChange = (index: number, char: string) => {\n if (disabled) return;\n const digit = char.replace(/[^0-9]/g, '');\n if (!digit) return;\n const newValue = value.split('');\n newValue[index] = digit;\n onChange(newValue.join('').slice(0, length));\n if (index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (e.key === 'Backspace') {\n e.preventDefault();\n const newValue = value.split('');\n if (value[index]) {\n newValue[index] = '';\n onChange(newValue.join(''));\n } else if (index > 0) {\n newValue[index - 1] = '';\n onChange(newValue.join(''));\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/[^0-9]/g, '');\n if (pasted) {\n const newValue = pasted.slice(0, length);\n onChange(newValue);\n const focusIndex = Math.min(newValue.length, length - 1);\n inputRefs.current[focusIndex]?.focus();\n setActiveIndex(focusIndex);\n }\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem' }}>\n {Array.from({ length }).map((_, index) => (\n <input\n key={index}\n ref={(el) => (inputRefs.current[index] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value[index] || ''}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={() => setActiveIndex(index)}\n disabled={disabled}\n aria-label={`Digit ${index + 1}`}\n style={{\n width: '2.5rem', height: '3rem', textAlign: 'center', fontSize: '1.25rem',\n fontWeight: 600, borderRadius: '0.375rem', border: '2px solid',\n borderColor: activeIndex === index && !disabled ? 'hsl(var(--primary, 222 47% 11%))' : value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.5)' : '#d1d5db',\n backgroundColor: value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.05)' : 'white',\n outline: 'none', transition: 'all 0.2s',\n opacity: disabled ? 0.5 : 1, cursor: disabled ? 'not-allowed' : 'text',\n }}\n />\n ))}\n </div>\n );\n}\n\nexport default OTPInput;\n","/**\n * Debug Logger pour @ollaid/native-sso\n * Stocke l'historique des appels API en mémoire pour le DebugPanel\n * @version 1.0.0\n */\n\nexport interface ApiCallLog {\n id: string;\n timestamp: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n endpoint: string;\n requestBody: unknown;\n requestHeaders?: Record<string, string>;\n responseStatus: number | null;\n responseBody: unknown;\n duration: number;\n error?: string;\n}\n\nconst MAX_LOGS = 50;\nlet apiLogs: ApiCallLog[] = [];\nlet listeners: ((logs: ApiCallLog[]) => void)[] = [];\n\nfunction notifyListeners() {\n listeners.forEach(fn => fn([...apiLogs]));\n}\n\nexport function logApiCall(\n method: ApiCallLog['method'],\n endpoint: string,\n requestBody: unknown,\n requestHeaders?: Record<string, string>\n): string {\n const id = `${Date.now()}-${Math.random().toString(36).substring(2, 7)}`;\n const log: ApiCallLog = {\n id,\n timestamp: new Date().toISOString(),\n method,\n endpoint,\n requestBody,\n requestHeaders,\n responseStatus: null,\n responseBody: null,\n duration: 0,\n };\n\n apiLogs.unshift(log);\n if (apiLogs.length > MAX_LOGS) {\n apiLogs = apiLogs.slice(0, MAX_LOGS);\n }\n notifyListeners();\n return id;\n}\n\nexport function logApiResponse(\n logId: string,\n responseStatus: number,\n responseBody: unknown,\n startTime: number,\n error?: string\n): void {\n const log = apiLogs.find(l => l.id === logId);\n if (log) {\n log.responseStatus = responseStatus;\n log.responseBody = responseBody;\n log.duration = Date.now() - startTime;\n log.error = error;\n notifyListeners();\n }\n}\n\nexport function getApiLogs(): ApiCallLog[] {\n return [...apiLogs];\n}\n\nexport function clearApiLogs(): void {\n apiLogs = [];\n notifyListeners();\n}\n\nexport function subscribeToLogs(callback: (logs: ApiCallLog[]) => void): () => void {\n listeners.push(callback);\n return () => {\n listeners = listeners.filter(fn => fn !== callback);\n };\n}\n\nexport function exportLogsAsText(): string {\n if (apiLogs.length === 0) return 'Aucun appel API enregistré.';\n\n const lines: string[] = [\n '='.repeat(60),\n 'NATIVE SSO DEBUG LOGS',\n `Exporté le: ${new Date().toISOString()}`,\n '='.repeat(60),\n '',\n ];\n\n apiLogs.slice().reverse().forEach((log, index) => {\n const emoji = log.responseStatus === null ? '⏳' : (log.responseStatus >= 200 && log.responseStatus < 300 ? '✅' : '❌');\n lines.push(`[${index + 1}] ${emoji} ${log.method} ${log.endpoint}`);\n lines.push(` Status: ${log.responseStatus ?? 'En cours...'} | Durée: ${log.duration}ms`);\n if (log.requestBody) lines.push(` Request: ${JSON.stringify(log.requestBody)}`);\n if (log.responseBody) lines.push(` Response: ${JSON.stringify(log.responseBody)}`);\n if (log.error) lines.push(` ⚠️ Error: ${log.error}`);\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n","/**\n * Client API pour @ollaid/native-sso\n * Gestion des requêtes HTTP avec timeout, device ID, token storage\n * \n * @version 1.0.0\n */\n\nimport { logApiCall, logApiResponse } from './debugLogger';\n\n// ============================================\n// Types d'erreur\n// ============================================\n\nexport type ApiErrorType = 'network' | 'timeout' | 'server' | 'validation' | 'auth' | 'unknown';\n\nexport class ApiError extends Error {\n type: ApiErrorType;\n statusCode?: number;\n errorType?: string;\n response?: unknown;\n\n constructor(\n message: string,\n type: ApiErrorType,\n statusCode?: number,\n errorType?: string,\n response?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n this.type = type;\n this.statusCode = statusCode;\n this.errorType = errorType;\n this.response = response;\n }\n}\n\n// ============================================\n// Configuration\n// ============================================\n\nexport interface NativeAuthConfig {\n /** URL du Backend SaaS (pour config et exchange) */\n saasApiUrl: string;\n /** URL du Backend IAM (pour encrypt, init, validate, etc.) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n /** \n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant : chaque frontend envoie son préfixe\n * pour que le backend SaaS lise le bon bloc config/services.php.\n * Ex: 'iam', 'iam_vendor', 'iam_client', 'iam_admin'\n */\n configPrefix?: string;\n}\n\nlet config: NativeAuthConfig = {\n saasApiUrl: '',\n iamApiUrl: '',\n timeout: 30000,\n debug: false,\n configPrefix: 'iam',\n};\n\nexport const setNativeAuthConfig = (newConfig: Partial<NativeAuthConfig>): void => {\n config = { ...config, ...newConfig };\n \n if (config.debug) {\n console.log('🔐 @ollaid/native-sso Config:', {\n saasApiUrl: config.saasApiUrl,\n iamApiUrl: config.iamApiUrl,\n });\n }\n};\n\nexport const getNativeAuthConfig = (): NativeAuthConfig => ({ ...config });\n\nexport const isDebugMode = (): boolean => config.debug === true;\n\n// ============================================\n// Device ID\n// ============================================\n\nconst DEVICE_ID_KEY = 'native_sso_device_id';\n\nexport const getDeviceId = (): string => {\n if (typeof localStorage === 'undefined') return '';\n \n let deviceId = localStorage.getItem(DEVICE_ID_KEY);\n if (!deviceId) {\n deviceId = `nat_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\n }\n return deviceId;\n};\n\n// ============================================\n// Token storage (clés unifiées avec Web SSO)\n// ============================================\n\nconst STORAGE = {\n AUTH_TOKEN: 'auth_token',\n TOKEN: 'token',\n USER: 'user',\n ACCOUNT_TYPE: 'account_type',\n ALIAS_REFERENCE: 'alias_reference',\n} as const;\n\nexport const setAuthToken = (token: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.AUTH_TOKEN, token);\n localStorage.setItem(STORAGE.TOKEN, token);\n }\n};\n\nexport const getAuthToken = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.AUTH_TOKEN) || localStorage.getItem(STORAGE.TOKEN);\n};\n\nexport const clearAuthToken = (): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(STORAGE.AUTH_TOKEN);\n localStorage.removeItem(STORAGE.TOKEN);\n localStorage.removeItem(STORAGE.USER);\n localStorage.removeItem(STORAGE.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE.ALIAS_REFERENCE);\n }\n};\n\nexport const setAuthUser = (user: unknown): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.USER, JSON.stringify(user));\n }\n};\n\nexport const getAuthUser = <T>(): T | null => {\n if (typeof localStorage === 'undefined') return null;\n const user = localStorage.getItem(STORAGE.USER);\n if (!user) return null;\n try {\n return JSON.parse(user);\n } catch {\n localStorage.removeItem(STORAGE.USER);\n return null;\n }\n};\n\nexport const setAccountType = (type: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.ACCOUNT_TYPE, type);\n }\n};\n\nexport const getAccountType = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.ACCOUNT_TYPE);\n};\n\nexport { STORAGE as STORAGE_KEYS };\n\n// ============================================\n// Fetch helper\n// ============================================\n\nexport async function fetchWithTimeout<T>(\n url: string,\n options: RequestInit,\n timeout: number\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const method = (options.method as 'GET' | 'POST' | 'PUT' | 'DELETE') || 'GET';\n const logId = isDebugMode() ? logApiCall(method, url, options.body ? JSON.parse(options.body as string) : undefined) : null;\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n const text = await response.text();\n if (isDebugMode()) {\n console.error('❌ Réponse non-JSON:', text.substring(0, 500));\n if (logId) logApiResponse(logId, response.status, { raw: text.substring(0, 200) }, startTime, 'Non-JSON response');\n }\n throw new ApiError(`Erreur serveur (${response.status})`, 'server', response.status);\n }\n\n const data = await response.json();\n\n if (!response.ok) {\n if (logId) logApiResponse(logId, response.status, data, startTime, data.message);\n throw new ApiError(\n data.message || `Erreur ${response.status}`,\n response.status === 401 ? 'auth' : response.status >= 500 ? 'server' : 'validation',\n response.status,\n data.error_type,\n data\n );\n }\n\n if (logId) logApiResponse(logId, response.status, data, startTime);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Timeout');\n throw new ApiError('Délai d\\'attente dépassé', 'timeout');\n }\n if (error instanceof TypeError) {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Network error');\n throw new ApiError('Impossible de contacter le serveur', 'network');\n }\n }\n\n if (logId) logApiResponse(logId, 0, null, startTime, 'Unknown error');\n throw new ApiError('Erreur inattendue', 'unknown');\n }\n}\n\nexport function getHeaders(token?: string, includeConfigPrefix = false): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n const deviceId = getDeviceId();\n if (deviceId) {\n headers['X-Device-Id'] = deviceId;\n }\n\n // Multi-tenant: envoyer le préfixe de config au backend SaaS\n if (includeConfigPrefix && config.configPrefix) {\n headers['X-IAM-Config-Prefix'] = config.configPrefix;\n }\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n return headers;\n}\n\nexport default {\n getConfig: getNativeAuthConfig,\n setConfig: setNativeAuthConfig,\n};\n","/**\n * Service d'authentification Native Mobile SSO v1.0\n * Architecture Frontend-First : Direct IAM après encryption\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout,\n getHeaders,\n getDeviceId,\n setAuthToken,\n setAuthUser,\n clearAuthToken,\n getNativeAuthConfig,\n setNativeAuthConfig,\n isDebugMode,\n} from './api';\n\nimport type {\n NativeAuthType,\n NativeEncryptRequest,\n NativeEncryptResponse,\n NativeInitResponse,\n NativeValidateResponse,\n NativeGrantAccessResponse,\n NativeResendOtpResponse,\n NativeExchangeResponse,\n NativeConfigResponse,\n NativeCredentials,\n} from '../types/native';\n\n// ============================================\n// Credentials en mémoire (jamais persistés)\n// ============================================\n\nlet credentials: NativeCredentials | null = null;\nlet credentialsLoadedAt: number = 0;\nlet credentialsTtl: number = 300; // Default 5 minutes\n\nconst DEFAULT_TTL = 300;\nconst REFRESH_MARGIN = 30; // Refresh 30s before expiration\n\n// ============================================\n// Service Native Auth\n// ============================================\n\nexport const nativeAuthService = {\n hasCredentials(): boolean {\n return credentials !== null;\n },\n\n getCredentials(): NativeCredentials | null {\n return credentials ? { ...credentials } : null;\n },\n\n getCredentialsTtl(): number {\n return credentialsTtl;\n },\n\n getCredentialsAge(): number {\n if (!credentialsLoadedAt) return Infinity;\n return (Date.now() - credentialsLoadedAt) / 1000;\n },\n\n areCredentialsExpiringSoon(): boolean {\n if (!credentials || !credentialsLoadedAt) return true;\n const age = this.getCredentialsAge();\n return age >= (credentialsTtl - REFRESH_MARGIN);\n },\n\n async ensureFreshCredentials(): Promise<void> {\n if (!credentials || this.areCredentialsExpiringSoon()) {\n if (isDebugMode()) {\n console.log('🔄 [Native] Credentials expirés ou proches — auto-refresh');\n }\n await this.loadCredentials();\n }\n },\n\n async loadCredentials(): Promise<NativeCredentials> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] GET /native/config');\n }\n\n const response = await fetchWithTimeout<NativeConfigResponse>(\n `${config.saasApiUrl}/native/config`,\n { method: 'GET', headers: getHeaders(undefined, true) },\n config.timeout || 30000\n );\n\n if (!response.success || !response.encrypted_credentials || !response.app_key) {\n throw new ApiError('Configuration invalide reçue du SaaS (app_key ou encrypted_credentials manquant)', 'server');\n }\n\n credentials = {\n appKey: response.app_key,\n encryptedCredentials: response.encrypted_credentials,\n };\n\n credentialsLoadedAt = Date.now();\n credentialsTtl = response.credentials_ttl || DEFAULT_TTL;\n\n // Propager le debug mode depuis le backend (si défini)\n if (typeof response.debug === 'boolean') {\n const currentConfig = getNativeAuthConfig();\n if (currentConfig.debug !== true) {\n setNativeAuthConfig({ debug: response.debug });\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Credentials chargés (ttl:', credentialsTtl, 's, debug:', response.debug ?? 'non défini', ')');\n }\n\n return credentials;\n },\n\n async encrypt(\n type: NativeAuthType,\n data: Partial<NativeEncryptRequest>\n ): Promise<NativeEncryptResponse> {\n // Auto-refresh credentials if expiring soon\n await this.ensureFreshCredentials();\n\n if (!credentials) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n const payload: NativeEncryptRequest = {\n type,\n app_key: credentials.appKey,\n encrypted_credentials: credentials.encryptedCredentials,\n ...data,\n };\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/encrypt', { type, ...data });\n }\n\n const response = await fetchWithTimeout<NativeEncryptResponse>(\n `${config.iamApiUrl}/iam/native/encrypt`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(payload),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] native_token reçu, expire dans', response.expires_in, 's');\n }\n\n return response;\n },\n\n async init(nativeToken: string): Promise<NativeInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/init');\n }\n\n const response = await fetchWithTimeout<NativeInitResponse>(\n `${config.iamApiUrl}/iam/native/init`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ native_token: nativeToken }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init:', { status: response.status, hasProcessToken: !!response.process_token });\n }\n\n return response;\n },\n\n async validate(\n processToken: string,\n creds: { password?: string; otp_code?: string }\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate');\n }\n\n const response = await fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n ...creds,\n }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Validate:', { \n hasCallback: !!response.callback_token, \n requires2fa: response.requires_2fa \n });\n }\n\n return response;\n },\n\n async verifyTotp(\n processToken: string,\n totpCode: string\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/verify-totp');\n }\n\n return fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/verify-totp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n totp_code: totpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async grantAccess(processToken: string): Promise<NativeGrantAccessResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/grant-access');\n }\n\n return fetchWithTimeout<NativeGrantAccessResponse>(\n `${config.iamApiUrl}/iam/native/grant-access`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<NativeResendOtpResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/resend-otp');\n }\n\n return fetchWithTimeout<NativeResendOtpResponse>(\n `${config.iamApiUrl}/iam/native/resend-otp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async exchange(callbackToken: string): Promise<NativeExchangeResponse> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/exchange');\n }\n\n const response = await fetchWithTimeout<NativeExchangeResponse>(\n `${config.saasApiUrl}/native/exchange`,\n {\n method: 'POST',\n headers: getHeaders(undefined, true),\n body: JSON.stringify({ callback_token: callbackToken }),\n },\n config.timeout || 30000\n );\n\n if (response.success && response.token) {\n setAuthToken(response.token);\n if (response.user) {\n setAuthUser(response.user);\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Session établie:', { user: response.user?.name });\n }\n\n return response;\n },\n\n async checkToken(token: string): Promise<{ valid: boolean; user_infos?: import('../types/native').UserInfos }> {\n const cfg = getNativeAuthConfig();\n if (!cfg.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/check-token');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean; valid: boolean; user_infos?: import('../types/native').UserInfos }>(\n `${cfg.saasApiUrl}/native/check-token`,\n {\n method: 'POST',\n headers: getHeaders(token, true),\n },\n 10000\n );\n return { valid: response.valid !== false, user_infos: response.user_infos };\n } catch (err) {\n if (err instanceof ApiError && err.statusCode === 401) {\n return { valid: false };\n }\n throw err; // Network/timeout → re-throw (caller will keep session)\n }\n },\n\n async logout(token?: string): Promise<{ success: boolean }> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean }>(\n `${config.saasApiUrl}/native/logout`,\n {\n method: 'POST',\n headers: getHeaders(token, true),\n },\n config.timeout || 30000\n );\n\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return response;\n } catch {\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return { success: true };\n }\n },\n\n clearCredentials(): void {\n credentials = null;\n credentialsLoadedAt = 0;\n },\n\n // ============================================\n // High-level methods\n // ============================================\n\n async loginEmail(\n email: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_email', {\n email,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginPhone(\n ccphone: string,\n phone: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_phone', {\n ccphone,\n phone,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginAccessOtp(otpCode: string): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_access_otp', {\n otp_code: otpCode.replace(/[\\s-]/g, ''),\n });\n return this.init(native_token);\n },\n\n async register(data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n registration_type?: 'email' | 'phone';\n }): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('register', {\n ...data,\n registration_type: data.registration_type || 'email',\n });\n return this.init(native_token);\n },\n\n async registerPhoneOnly(data: {\n name: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }): Promise<NativeInitResponse> {\n if (data.ccphone !== '+221') {\n throw new ApiError(\n \"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\",\n 'validation',\n 422,\n 'invalid_country_code'\n );\n }\n\n const { native_token } = await this.encrypt('register', {\n ...data,\n email: '',\n registration_type: 'phone',\n });\n return this.init(native_token);\n },\n\n async recoverPassword(\n method: 'email' | 'phone',\n identifier: { email?: string; ccphone?: string; phone?: string }\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('recovery_password', {\n method,\n ...identifier,\n });\n return this.init(native_token);\n },\n};\n\nexport default nativeAuthService;\n","/**\n * Service de récupération de mot de passe v1.0\n * Architecture Frontend-First : Appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout, \n getNativeAuthConfig, \n isDebugMode,\n} from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n MobilePasswordInitResponse,\n MobilePasswordSelectMethodResponse,\n MobilePasswordResetResponse,\n MobilePasswordResendResponse,\n} from '../types/mobile';\n\n// ============================================\n// Credentials (shared with nativeAuth)\n// ============================================\n\nfunction getIAMHeaders(): HeadersInit {\n const creds = nativeAuthService.getCredentials();\n if (!creds) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n return {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-IAM-App-Key': creds.appKey,\n };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const mobilePasswordService = {\n hasCredentials(): boolean {\n return nativeAuthService.hasCredentials();\n },\n\n async loadCredentials() {\n return nativeAuthService.loadCredentials();\n },\n\n async initRecovery(email: string): Promise<MobilePasswordInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/init', { email });\n }\n\n const response = await fetchWithTimeout<MobilePasswordInitResponse>(\n `${config.iamApiUrl}/iam/native/password/init`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ email }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init recovery:', { \n status: response.status, \n hasOtp: !!response.otp_code,\n });\n }\n\n return response;\n },\n\n async selectMethod(\n processToken: string, \n receiveChoice: 'email' | 'phone'\n ): Promise<MobilePasswordSelectMethodResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/select-method', { receiveChoice });\n }\n\n return fetchWithTimeout<MobilePasswordSelectMethodResponse>(\n `${config.iamApiUrl}/iam/native/password/select-method`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ \n process_token: processToken, \n receive_choice: receiveChoice,\n }),\n },\n config.timeout || 30000\n );\n },\n\n validateOtpLocally(inputCode: string, storedCode: string): boolean {\n return inputCode === storedCode;\n },\n\n async reset(\n processToken: string,\n password: string\n ): Promise<MobilePasswordResetResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/reset');\n }\n\n return fetchWithTimeout<MobilePasswordResetResponse>(\n `${config.iamApiUrl}/iam/native/password/reset`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<MobilePasswordResendResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/resend');\n }\n\n return fetchWithTimeout<MobilePasswordResendResponse>(\n `${config.iamApiUrl}/iam/native/password/resend`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n};\n\nexport { ApiError };\nexport default mobilePasswordService;\n","/**\n * Hook de récupération de mot de passe v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobilePasswordService } from '../services/mobilePassword';\nimport { setNativeAuthConfig, ApiError } from '../services/api';\nimport type { MobilePasswordState } from '../types/mobile';\n\nexport interface UseMobilePasswordOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n autoLoadCredentials?: boolean;\n \n}\n\ninterface MobilePasswordStateExtended extends MobilePasswordState {\n credentialsLoaded: boolean;\n errorType: string | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof ApiError) {\n return { message: err.message, type: err.type };\n }\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport function useMobilePassword(options: UseMobilePasswordOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true } = options;\n\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl]);\n\n const [state, setState] = useState<MobilePasswordStateExtended>({\n credentialsLoaded: false,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n await mobilePasswordService.loadCredentials();\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const initRecovery = useCallback(async (email: string) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!mobilePasswordService.hasCredentials()) {\n await mobilePasswordService.loadCredentials();\n }\n const response = await mobilePasswordService.initRecovery(email);\n\n if (response.success && response.process_token) {\n if (response.status === 'choice_required') {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'choice_required',\n maskedEmail: response.masked_email || null,\n maskedPhone: response.masked_phone || null,\n loading: false,\n }));\n return { success: true, status: 'choice_required' as const };\n } else {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: 'email',\n maskedEmail: response.masked_email || null,\n loading: false,\n }));\n return { success: true, status: 'pending_otp' as const };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Aucun compte trouvé avec cet email',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la recherche du compte');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const selectMethod = useCallback(async (choice: 'email' | 'phone') => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.selectMethod(state.processToken, choice);\n if (response.success) {\n setState(prev => ({\n ...prev,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: response.receive_mode || choice,\n loading: false,\n }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Impossible d\\'envoyer le code',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'envoi du code');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const verifyOtp = useCallback((inputCode: string): boolean => {\n if (!state.storedOtp) {\n setState(prev => ({ ...prev, error: 'Session invalide', errorType: 'invalid_session' }));\n return false;\n }\n const isValid = mobilePasswordService.validateOtpLocally(inputCode, state.storedOtp);\n if (isValid) {\n setState(prev => ({ ...prev, status: 'pending_password', error: null, errorType: null }));\n return true;\n }\n setState(prev => ({ ...prev, error: 'Code incorrect', errorType: 'invalid_otp' }));\n return false;\n }, [state.storedOtp]);\n\n const resetPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.reset(state.processToken, password);\n if (response.success) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la réinitialisation',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la réinitialisation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.resendOtp(state.processToken);\n if (response.success && response.otp_code) {\n setState(prev => ({ ...prev, storedOtp: response.otp_code!, loading: false }));\n return { success: true, cooldown: response.cooldown_remaining };\n }\n setState(prev => ({ ...prev, loading: false }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n credentialsLoaded: state.credentialsLoaded,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n }, [state.credentialsLoaded]);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n storedOtp: state.storedOtp,\n receiveMode: state.receiveMode,\n maskedEmail: state.maskedEmail,\n maskedPhone: state.maskedPhone,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n\n isCompleted: state.status === 'completed',\n isChoiceRequired: state.status === 'choice_required',\n isPendingOtp: state.status === 'pending_otp',\n isPendingPassword: state.status === 'pending_password',\n\n loadCredentials,\n initRecovery,\n selectMethod,\n verifyOtp,\n resetPassword,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobilePassword;\n","/**\n * Password Recovery Modal for @ollaid/native-sso\n * Flow: email → method-choice → OTP → new password → success\n * Design aligned with web SSO\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter,\n Button, Input, Label, RadioGroup, RadioGroupItem,\n IconLock, IconCheckCircle2, IconArrowLeft, IconKeyRound, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport { useMobilePassword } from '../hooks/useMobilePassword';\n\nexport interface PasswordRecoveryModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess: () => void;\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\ntype RecoveryStep = 'email' | 'method-choice' | 'otp' | 'password' | 'success';\n\nconst C = {\n primary: '#002147',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nexport function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl }: PasswordRecoveryModalProps) {\n const {\n status, loading: pwLoading, error: pwError, receiveMode, maskedEmail, maskedPhone,\n initRecovery, selectMethod, verifyOtp, resetPassword, resendOtp, reset: resetHook, clearError,\n } = useMobilePassword({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<RecoveryStep>('email');\n const [email, setEmail] = useState('');\n const [otp, setOtp] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<'email' | 'phone'>('email');\n const [resendCooldown, setResendCooldown] = useState(0);\n\n const error = localError || pwError;\n\n useEffect(() => {\n if (status === 'choice_required') setStep('method-choice');\n else if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); }\n else if (status === 'pending_password') setStep('password');\n else if (status === 'completed') setStep('success');\n }, [status]);\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n const resetState = () => {\n setStep('email'); setEmail(''); setOtp(''); setPassword(''); setConfirmPassword('');\n setLocalError(null); setSelectedMethod('email'); setResendCooldown(0); resetHook();\n };\n\n const handleClose = () => { resetState(); onOpenChange(false); };\n const handleBackToLogin = () => { resetState(); onSuccess(); };\n\n const handleEmailSubmit = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim())) { setLocalError('Veuillez entrer une adresse email valide'); return; }\n await initRecovery(email.trim());\n };\n\n const handleMethodSubmit = async () => {\n setLocalError(null); clearError();\n await selectMethod(selectedMethod);\n };\n\n const handleOTPSubmit = () => {\n if (otp.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const isValid = verifyOtp(otp);\n if (!isValid) setLocalError('Code incorrect');\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) { setResendCooldown(result.cooldown || 60); setOtp(''); setLocalError(null); }\n };\n\n const handlePasswordSubmit = async () => {\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== confirmPassword) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setLocalError(null); clearError();\n await resetPassword(password);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n if (step === 'method-choice') { setStep('email'); resetHook(); }\n else if (step === 'otp') { setStep(maskedPhone ? 'method-choice' : 'email'); resetHook(); }\n else if (step === 'password') setStep('otp');\n };\n\n // ===== SUCCESS =====\n if (step === 'success') {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Mot de passe modifié !</DialogTitle>\n <DialogDescription>Votre mot de passe a été changé avec succès.</DialogDescription>\n </DialogHeader>\n <DialogFooter style={{ borderTop: 'none' }}>\n <Button onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n {step !== 'email' && (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n )}\n\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n {step === 'otp' ? (\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n ) : (\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>\n {step === 'email' && 'Récupération de mot de passe'}\n {step === 'method-choice' && 'Recevoir le code de vérification'}\n {step === 'otp' && 'Vérification'}\n {step === 'password' && 'Nouveau mot de passe'}\n </DialogTitle>\n <DialogDescription>\n {step === 'email' && 'Veuillez entrer votre adresse email'}\n {step === 'method-choice' && 'Comment souhaitez-vous recevoir le code ?'}\n {step === 'otp' && (receiveMode === 'phone' ? `Code envoyé par SMS au ${maskedPhone}` : `Code envoyé par email à ${maskedEmail}`)}\n {step === 'password' && 'Définissez votre nouveau mot de passe'}\n </DialogDescription>\n </DialogHeader>\n\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {error && <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div>}\n\n {step === 'email' && (\n <div><Label htmlFor=\"recovery-email\">Adresse email</Label><Input id=\"recovery-email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email} onChange={e => setEmail(e.target.value)} disabled={pwLoading} /></div>\n )}\n\n {step === 'method-choice' && (\n <RadioGroup value={selectedMethod} onValueChange={v => setSelectedMethod(v as 'email' | 'phone')}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'email' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('email')}>\n <RadioGroupItem value=\"email\" id=\"method-email\" />\n <div><div style={{ fontWeight: 500 }}>Par email</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedEmail}</div></div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'phone' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('phone')}>\n <RadioGroupItem value=\"phone\" id=\"method-phone\" />\n <div><div style={{ fontWeight: 500 }}>Par SMS</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedPhone}</div></div>\n </div>\n </div>\n </RadioGroup>\n )}\n\n {step === 'otp' && (\n <>\n <OTPInput value={otp} onChange={setOtp} disabled={pwLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : (\n <button type=\"button\" style={{ color: C.primary, background: 'none', border: 'none', cursor: 'pointer', textDecoration: 'underline' }} onClick={handleResendOTP}>Code non reçu ? Renvoyer</button>\n )}\n </div>\n </>\n )}\n\n {step === 'password' && (\n <>\n <div><Label>Nouveau mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={pwLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"Retapez votre mot de passe\" value={confirmPassword} onChange={e => setConfirmPassword(e.target.value)} disabled={pwLoading} /></div>\n </>\n )}\n </div>\n </DialogBody>\n\n <DialogFooter>\n {step === 'email' && (\n <>\n <Button onClick={handleEmailSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n <Button variant=\"ghost\" onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n </>\n )}\n {step === 'method-choice' && (\n <Button onClick={handleMethodSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Envoi...\n </span>\n ) : 'Envoyer le code'}\n </Button>\n )}\n {step === 'otp' && (\n <Button onClick={handleOTPSubmit} disabled={otp.length !== 6} style={{ width: '100%' }}>Vérifier</Button>\n )}\n {step === 'password' && (\n <Button onClick={handlePasswordSubmit} disabled={pwLoading || !password || !confirmPassword} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Modification...\n </span>\n ) : 'Modifier le mot de passe'}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default PasswordRecoveryModal;\n","/**\n * Hook de vérification périodique du token Sanctum\n * \n * - Premier check 2 min après login\n * - Checks suivants toutes les 5 min\n * - Ne déconnecte PAS si offline ou serveur inaccessible\n * - Déconnecte UNIQUEMENT si le backend retourne 401 (token invalide)\n * \n * @version 1.0.0\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { STORAGE_KEYS } from '../services/api';\nimport type { UserInfos } from '../types/native';\n\nconst FIRST_CHECK_DELAY = 2 * 60 * 1000; // 2 minutes\nconst INTERVAL_DELAY = 5 * 60 * 1000; // 5 minutes\n\nexport interface UseTokenHealthCheckOptions {\n /** Whether to enable health checks (true when authenticated) */\n enabled: boolean;\n /** SaaS API base URL */\n saasApiUrl: string;\n /** Called when the backend explicitly invalidates the token (401) */\n onTokenInvalid: () => void;\n /** Called when fresh user_infos are received */\n onUserUpdated?: (userInfos: UserInfos) => void;\n /** Debug mode */\n debug?: boolean;\n}\n\nasync function checkTokenValidity(\n saasApiUrl: string,\n token: string,\n debug: boolean\n): Promise<{ valid: boolean; user_infos?: UserInfos }> {\n // 1. Check connectivity first\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n if (debug) console.log('🔄 [HealthCheck] Offline — skip');\n throw new Error('offline');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout\n\n try {\n const response = await fetch(`${saasApiUrl}/native/check-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 401 = token explicitly invalid/expired → the ONLY case we disconnect\n if (response.status === 401) {\n if (debug) console.log('🔄 [HealthCheck] Token invalide (401)');\n return { valid: false };\n }\n\n // Any other non-OK status = server issue, NOT token issue → keep session\n if (!response.ok) {\n if (debug) console.log(`🔄 [HealthCheck] Serveur erreur ${response.status} — session conservée`);\n throw new Error(`server_error_${response.status}`);\n }\n\n const data = await response.json();\n if (debug) console.log('🔄 [HealthCheck] Token valide ✅');\n\n return {\n valid: data.valid !== false,\n user_infos: data.user_infos,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Re-throw if it's our \"valid: false\" result wrapped in the return above\n if (error instanceof Error && error.message === 'offline') {\n throw error;\n }\n\n // Network errors, timeouts, server unreachable → do NOT invalidate\n if (debug) {\n const msg = error instanceof Error ? error.message : 'unknown';\n console.log(`🔄 [HealthCheck] Erreur réseau/serveur (${msg}) — session conservée`);\n }\n throw error;\n }\n}\n\nexport function useTokenHealthCheck(options: UseTokenHealthCheckOptions): void {\n const { enabled, saasApiUrl, onTokenInvalid, onUserUpdated, debug = false } = options;\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const enabledRef = useRef(enabled);\n const callbacksRef = useRef({ onTokenInvalid, onUserUpdated });\n\n // Keep refs up to date\n enabledRef.current = enabled;\n callbacksRef.current = { onTokenInvalid, onUserUpdated };\n\n const performCheck = useCallback(async () => {\n if (!enabledRef.current) return;\n\n const token = typeof localStorage !== 'undefined'\n ? localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN)\n : null;\n\n if (!token) {\n if (debug) console.log('🔄 [HealthCheck] Pas de token — arrêt');\n return;\n }\n\n try {\n const result = await checkTokenValidity(saasApiUrl, token, debug);\n\n if (!result.valid) {\n // Token explicitly rejected by backend → clear session\n callbacksRef.current.onTokenInvalid();\n return;\n }\n\n // Token valid — update user_infos if provided\n if (result.user_infos && callbacksRef.current.onUserUpdated) {\n callbacksRef.current.onUserUpdated(result.user_infos);\n }\n } catch {\n // Network/timeout/server error → silently keep session\n }\n }, [saasApiUrl, debug]);\n\n useEffect(() => {\n // Cleanup previous timers\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n if (!enabled || !saasApiUrl) return;\n\n if (debug) console.log('🔄 [HealthCheck] Activé — premier check dans 2 min');\n\n // First check after 2 minutes\n timerRef.current = setTimeout(() => {\n performCheck();\n\n // Then every 5 minutes\n intervalRef.current = setInterval(performCheck, INTERVAL_DELAY);\n }, FIRST_CHECK_DELAY);\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [enabled, saasApiUrl, performCheck, debug]);\n}\n\nexport default useTokenHealthCheck;\n","/**\n * Hook d'authentification Native SSO v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig, STORAGE_KEYS, isDebugMode } from '../services/api';\nimport { useTokenHealthCheck } from './useTokenHealthCheck';\nimport type {\n NativeAuthState,\n NativeAuthStatus,\n NativeExchangeResponse,\n AccountType,\n UserInfos,\n} from '../types/native';\n\n/** Helper: persist session to localStorage (unified keys) */\nfunction saveSession(exchangeResult: NativeExchangeResponse, accountType: AccountType | 'user' | 'client') {\n const sanctumToken = exchangeResult.auth_token || exchangeResult.token;\n localStorage.setItem(STORAGE_KEYS.AUTH_TOKEN, sanctumToken);\n localStorage.setItem(STORAGE_KEYS.TOKEN, sanctumToken);\n \n // Build user object from user_infos if available, otherwise from user\n const baseUser = exchangeResult.user_infos \n ? { ...exchangeResult.user, ...exchangeResult.user_infos }\n : exchangeResult.user;\n \n // Enrich user with iam_reference and alias_reference\n const aliasRef = exchangeResult.user?.alias_reference || (exchangeResult as any).alias_reference || '';\n const iamRef = exchangeResult.user?.reference || '';\n \n const userToStore = {\n ...baseUser,\n iam_reference: iamRef,\n alias_reference: aliasRef,\n };\n \n // Store alias_reference separately for quick access\n if (aliasRef) {\n localStorage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, aliasRef);\n }\n \n // account_type is stored SEPARATELY, never inside the user object\n // Use the accountType string directly (already resolved by the caller)\n const acctType = typeof accountType === 'string' ? accountType : 'user';\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(userToStore));\n localStorage.setItem(STORAGE_KEYS.ACCOUNT_TYPE, acctType);\n \n return { token: sanctumToken, user: userToStore };\n}\n\n/** Helper: clear session from localStorage */\nfunction clearSession() {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport interface UseNativeAuthOptions {\n /** URL du Backend SaaS */\n saasApiUrl: string;\n /** URL du Backend IAM */\n iamApiUrl: string;\n /** Charger les credentials automatiquement au montage */\n autoLoadCredentials?: boolean;\n /** Type de compte par défaut à persister (défaut: 'user') */\n defaultAccountType?: 'user' | 'client';\n /** \n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant dynamique : 'iam', 'iam_vendor', 'iam_client', etc.\n */\n configPrefix?: string;\n}\n\nexport function useNativeAuth(options: UseNativeAuthOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true, defaultAccountType = 'user', configPrefix = 'iam' } = options;\n \n const configuredRef = useRef(false);\n \n // Debug réactif : mis à jour après loadCredentials\n const [isDebug, setIsDebug] = useState(isDebugMode());\n \n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl, configPrefix });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl, configPrefix]);\n\n const [state, setState] = useState<NativeAuthState & { otpMethod?: string | null; otpSentTo?: string | null }>({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n // --- Token Health Check ---\n const handleTokenInvalid = useCallback(() => {\n if (isDebug) console.log('🔐 [HealthCheck] Token invalide — déconnexion locale');\n clearSession();\n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, [isDebug]);\n\n const handleUserUpdated = useCallback((userInfos: UserInfos) => {\n // Merge fresh user_infos into stored user\n const storedRaw = localStorage.getItem(STORAGE_KEYS.USER);\n if (storedRaw) {\n try {\n const stored = JSON.parse(storedRaw);\n const merged = { ...stored, ...userInfos };\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(merged));\n setState(prev => ({ ...prev, user: merged }));\n } catch { /* ignore */ }\n }\n }, []);\n\n useTokenHealthCheck({\n enabled: state.status === 'completed' && state.user !== null,\n saasApiUrl,\n onTokenInvalid: handleTokenInvalid,\n onUserUpdated: handleUserUpdated,\n debug: isDebug,\n });\n\n // Check existing session\n useEffect(() => {\n const storedToken = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const storedUser = localStorage.getItem(STORAGE_KEYS.USER);\n \n if (storedToken && storedUser) {\n try {\n const user = JSON.parse(storedUser);\n setState(prev => ({ ...prev, user, status: 'completed' }));\n } catch {\n clearSession();\n }\n }\n }, []);\n\n // Auto-load credentials\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded && !state.user) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded, state.user]);\n\n // Background auto-refresh of credentials before TTL expiration\n useEffect(() => {\n // Only refresh while user is NOT authenticated and credentials are loaded\n if (state.status === 'completed' || !state.credentialsLoaded) return;\n\n const ttl = nativeAuthService.getCredentialsTtl();\n const refreshInterval = Math.max((ttl - 30) * 1000, 30000); // At least 30s\n\n if (isDebug) {\n console.log(`🔄 [Native] Auto-refresh credentials every ${refreshInterval / 1000}s (TTL: ${ttl}s)`);\n }\n\n const timer = setInterval(async () => {\n try {\n await nativeAuthService.loadCredentials();\n // Re-check debug après refresh (le backend peut changer la valeur)\n setIsDebug(isDebugMode());\n if (isDebugMode()) console.log('✅ [Native] Credentials auto-refreshed');\n } catch (err) {\n if (isDebugMode()) console.warn('⚠️ [Native] Auto-refresh failed:', err);\n }\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [state.status, state.credentialsLoaded, isDebug]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n await nativeAuthService.loadCredentials();\n // Mettre à jour le debug réactif après chargement des credentials\n setIsDebug(isDebugMode());\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithEmail = useCallback(async (\n email: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginEmail(email, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n if (response.error_type === 'alias_disabled' && response.alternative_method) {\n setState(prev => ({\n ...prev,\n alternativeMethod: {\n type: response.alternative_method!,\n value: response.alternative_method === 'email' \n ? response.alternative_email! \n : response.alternative_phone!,\n },\n loading: false,\n error: 'Cette méthode de connexion est désactivée',\n errorType: 'alias_disabled',\n }));\n return { success: false, error_type: 'alias_disabled' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithPhone = useCallback(async (\n ccphone: string,\n phone: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginPhone(ccphone, phone, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithAccessOtp = useCallback(async (otpCode: string) => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginAccessOtp(otpCode);\n\n // v4.5: Handle needs_access (user needs to confirm access)\n // Tolère success:true ou success:false avec needs_access\n if ((response.needs_access || response.status === 'needs_access') && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n // v4.5: Handle direct callback_token (user already has access)\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, loading: false }));\n return { success: true, status: 'completed', callback_token: response.callback_token };\n }\n\n // Legacy: Handle process_token response\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code invalide',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const register = useCallback(async (\n data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const registrationType = accountType === 'phone-only' ? 'phone' : 'email';\n \n const response = await nativeAuthService.register({\n ...data,\n email: registrationType === 'phone' ? '' : data.email,\n registration_type: registrationType,\n });\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n otpMethod: response.otp_method || null,\n otpSentTo: response.otp_sent_to || null,\n conflict: response.conflict ? {\n type: response.conflict.type,\n maskedIdentifier: response.conflict.masked_identifier,\n options: {\n canLogin: response.conflict.options.can_login,\n canRecoverByEmail: response.conflict.options.can_recover_by_email,\n canRecoverBySms: response.conflict.options.can_recover_by_sms,\n maskedEmail: response.conflict.options.masked_email,\n maskedPhone: response.conflict.options.masked_phone,\n },\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [accountType]);\n\n const submitPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { password });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.requires_2fa) {\n setState(prev => ({ ...prev, status: 'pending_2fa', loading: false }));\n return { success: true, requires_2fa: true };\n }\n\n // needs_access after password validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Mot de passe incorrect',\n errorType: response.error_type || 'invalid_password',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la validation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { otp_code: otpCode });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.success && response.status === 'pending_registration') {\n setState(prev => ({ ...prev, status: 'pending_registration', loading: false }));\n return { success: true, status: 'pending_registration' };\n }\n\n // needs_access after OTP validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitTotp = useCallback(async (totpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.verifyTotp(state.processToken, totpCode);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code 2FA incorrect',\n errorType: response.error_type || 'invalid_totp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification 2FA');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const grantAccess = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.grantAccess(state.processToken);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'accès',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'accès');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n message: response.message,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const setSession = useCallback((data: NativeExchangeResponse) => {\n const { user: savedUser } = saveSession(data, defaultAccountType);\n setState(prev => ({\n ...prev,\n user: savedUser,\n status: 'completed',\n processToken: null,\n }));\n }, [defaultAccountType]);\n\n const logout = useCallback(async () => {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n try {\n if (token) {\n await nativeAuthService.logout(token);\n }\n } catch { /* ignore */ }\n\n clearSession();\n \n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, []);\n\n const reset = useCallback(() => {\n setState(prev => ({\n ...prev,\n processToken: null,\n status: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n error: null,\n errorType: null,\n }));\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n // State\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n user: state.user,\n application: state.application,\n prompt: state.prompt,\n alternativeMethod: state.alternativeMethod,\n conflict: state.conflict,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n isAuthenticated: state.status === 'completed' && state.user !== null,\n \n /** Debug réactif — mis à jour après loadCredentials */\n isDebug,\n \n accountType,\n isPhoneOnly: accountType === 'phone-only',\n otpMethod: state.otpMethod,\n otpSentTo: state.otpSentTo,\n\n // Methods\n loadCredentials,\n loginWithEmail,\n loginWithPhone,\n loginWithAccessOtp,\n submitPassword,\n submitOtp,\n submitTotp,\n grantAccess,\n resendOtp,\n setSession,\n logout,\n reset,\n clearError,\n register,\n setAccountType,\n };\n}\n\nexport default useNativeAuth;\n","/**\n * Login Modal for @ollaid/native-sso\n * Complete login flow aligned with web SSO /sso/auth design\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter,\n Button, Input, Label,\n IconShieldCheck, IconMail, IconPhone, IconLock, IconKeyRound,\n IconArrowLeft, IconEye, IconEyeOff, IconCheckCircle2, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport type { UserInfos } from '../types/native';\n\ntype LoginStep = 'choice' | 'email-check' | 'email-password' | 'email-otp' | 'email-create-password' | 'phone-input' | 'phone-otp' | 'access-otp';\n\nexport interface LoginModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToSignup: () => void;\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n loading?: boolean;\n showSwitchToSignup?: boolean;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n /** Pre-fill phone number and go directly to phone-input step */\n initialPhone?: string;\n}\n\n// Design tokens\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\n// Reusable style helpers\nconst iconCircle = (bg: string): React.CSSProperties => ({\n margin: '0 auto', width: '3rem', height: '3rem', backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst errorBoxStyle: React.CSSProperties = {\n padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg,\n color: C.red, fontSize: '0.875rem',\n};\n\nconst methodBtnStyle: React.CSSProperties = {\n width: '100%', height: '3.5rem', justifyContent: 'flex-start', gap: '0.75rem',\n textAlign: 'left' as const, backgroundColor: C.gray100, borderColor: C.gray200,\n};\n\nconst methodIconStyle = (bg: string): React.CSSProperties => ({\n width: '2.5rem', height: '2.5rem', backgroundColor: bg, borderRadius: '0.5rem',\n display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,\n});\n\nexport function LoginModal({\n open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, loading, showSwitchToSignup = true, defaultAccountType, initialPhone,\n}: LoginModalProps) {\n const {\n status, user, application, alternativeMethod, loading: authLoading, error: authError,\n loginWithEmail, loginWithPhone, submitPassword, submitOtp, grantAccess, loginWithAccessOtp,\n resendOtp, setSession, reset: resetAuth, clearError,\n } = useNativeAuth({ saasApiUrl, iamApiUrl, defaultAccountType });\n\n const [step, setStep] = useState<LoginStep>('choice');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [userName, setUserName] = useState<string | null>(null);\n const [phone, setPhone] = useState('');\n const [phoneOtpCode, setPhoneOtpCode] = useState('');\n const [emailOtpCode, setEmailOtpCode] = useState('');\n const [accessOtpCode, setAccessOtpCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [loginSuccess, setLoginSuccess] = useState(false);\n const [loginData, setLoginData] = useState<{ token: string; user: UserInfos } | null>(null);\n const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n\n const CCPHONE = '+221';\n const isSubmitting = authLoading || loading;\n const error = localError || authError;\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(p => p - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n useEffect(() => {\n if (status === 'pending_password') setStep('email-password');\n else if (status === 'pending_otp') {\n if (step === 'email-check' || step === 'email-password') setStep('email-otp');\n else if (step === 'phone-input') setStep('phone-otp');\n setResendCooldown(60);\n }\n }, [status, step]);\n\n useEffect(() => {\n if (loginSuccess && loginData) {\n const timer = setTimeout(() => {\n setSession({ success: true, token: loginData.token, expires_at: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), user: loginData.user as any });\n onLoginSuccess?.(loginData.token, loginData.user);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [loginSuccess, loginData]);\n\n const resetState = () => {\n setStep('choice'); setEmail(''); setPassword('');\n setShowPassword(false); setUserName(null); setPhone(''); setPhoneOtpCode(''); setEmailOtpCode('');\n setAccessOtpCode(''); setLocalError(null); setLoginSuccess(false); setLoginData(null);\n setResendCooldown(0); resetAuth();\n };\n\n useEffect(() => { if (!open) resetState(); }, [open]);\n\n // Pre-fill phone from conflict resolution\n useEffect(() => {\n if (open && initialPhone) {\n setStep('phone-input');\n setPhone(initialPhone);\n }\n }, [open, initialPhone]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setLoginData({ token: response.token, user: response.user as UserInfos });\n setLoginSuccess(true);\n } else {\n setLocalError('Erreur lors de la finalisation de la connexion');\n }\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleEmailCheck = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) { setLocalError('Adresse email invalide'); return; }\n const result = await loginWithEmail(email.trim());\n if (result.success && user?.name) setUserName(user.name);\n };\n\n const handleEmailPasswordSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!password) { setLocalError('Le mot de passe est requis'); return; }\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n const result = await submitPassword(password);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleEmailOtpVerify = async () => {\n setLocalError(null); clearError();\n if (emailOtpCode.length !== 6) { setLocalError('Le code doit contenir 6 chiffres'); return; }\n const result = await submitOtp(emailOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handlePhoneInit = async () => {\n setLocalError(null); clearError();\n const cleanPhone = phone.replace(/\\s/g, '');\n if (cleanPhone.length !== 9) { setLocalError('Le numéro doit contenir exactement 9 chiffres'); return; }\n await loginWithPhone(CCPHONE, cleanPhone);\n };\n\n const handlePhoneVerify = async () => {\n setLocalError(null); clearError();\n if (phoneOtpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n const result = await submitOtp(phoneOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleAccessOtpSubmit = async () => {\n setLocalError(null); clearError();\n if (accessOtpCode.length !== 8) { setLocalError('Veuillez entrer le code à 8 chiffres'); return; }\n const result = await loginWithAccessOtp(accessOtpCode);\n if (result.success) {\n if ((result as any).callback_token) {\n await exchangeCallbackToken((result as any).callback_token);\n }\n // needs_access is handled by status effect\n }\n };\n\n const handleGrantAccess = async () => {\n setLocalError(null); clearError();\n const result = await grantAccess();\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) setResendCooldown(result.cooldown || 60);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n switch (step) {\n case 'email-check': case 'phone-input': case 'access-otp': setStep('choice'); resetAuth(); break;\n case 'email-password': case 'email-otp': setStep('email-check'); resetAuth(); break;\n case 'phone-otp': setStep('phone-input'); resetAuth(); break;\n default: setStep('choice'); resetAuth();\n }\n };\n\n // Render helpers\n const renderError = () => error ? <div style={errorBoxStyle}>{error}</div> : null;\n\n const renderBackBtn = () => (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n );\n\n const renderResendLink = () => (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? (\n <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span>\n ) : (\n <button type=\"button\" style={linkStyle} onClick={handleResendOTP}>\n Code non reçu ? Renvoyer\n </button>\n )}\n </div>\n );\n\n const renderLoaderBtn = (text: string, loadingText: string, onClick: () => void, disabled: boolean, extraStyle?: React.CSSProperties) => (\n <Button onClick={onClick} disabled={isSubmitting || disabled} style={{ width: '100%', ...extraStyle }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n {loadingText}\n </span>\n ) : text}\n </Button>\n );\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {loginSuccess && loginData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Connexion réussie</DialogTitle>\n <DialogDescription>\n <span style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n Redirection en cours...\n </span>\n </DialogDescription>\n </DialogHeader>\n\n /* ===================== NEEDS ACCESS ===================== */\n ) : status === 'needs_access' && user && application ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.primary + '1a'), width: '4rem', height: '4rem' }}>\n {(application as any).logo ? (\n <img src={(application as any).logo} alt={(application as any).name} style={{ width: '2.5rem', height: '2.5rem', borderRadius: '0.5rem' }} />\n ) : (\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>Bienvenue sur {(application as any).name} !</DialogTitle>\n <DialogDescription>\n Bonjour <strong style={{ color: C.gray900 }}>{user.name}</strong>, vous n'avez pas encore de compte sur <strong style={{ color: C.primary }}>{(application as any).name}</strong>.\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', fontSize: '0.875rem', color: C.gray500 }}>\n Votre compte <strong style={{ color: C.primary }}>iam.ollaid.com</strong> existe déjà. Cliquez sur Confirmer pour créer votre accès à <strong style={{ color: C.gray900 }}>{(application as any).name}</strong>.\n </div>\n {renderError()}\n </DialogBody>\n <DialogFooter>\n <Button onClick={handleGrantAccess} disabled={isSubmitting} style={{ width: '100%' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Création en cours...\n </span>\n ) : 'Confirmer la création de mon compte'}\n </Button>\n <Button variant=\"outline\" onClick={() => { resetAuth(); setStep('choice'); }} disabled={isSubmitting} style={{ width: '100%' }}>\n Annuler\n </Button>\n </DialogFooter>\n </>\n\n /* ===================== ALIAS DISABLED ===================== */\n ) : alternativeMethod ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.amberBg), width: '4rem', height: '4rem' }}>\n {alternativeMethod.type === 'email' ? (\n <IconMail style={{ width: '2rem', height: '2rem', color: C.amber }} />\n ) : (\n <IconPhone style={{ width: '2rem', height: '2rem', color: C.amber }} />\n )}\n </div>\n <DialogTitle>Moyen de connexion désactivé</DialogTitle>\n <DialogDescription>\n Vos identifiants sont corrects, mais vous avez désactivé ce moyen de connexion depuis votre compte IAM.\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n {alternativeMethod.value && (\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem' }}>\n <p style={{ fontSize: '0.875rem', color: C.gray500, marginBottom: '0.75rem' }}>Vous pouvez vous connecter avec :</p>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.875rem', fontWeight: 500, color: C.gray900 }}>\n {alternativeMethod.type === 'phone' ? (\n <IconPhone style={{ width: '1rem', height: '1rem', color: C.primary }} />\n ) : (\n <IconMail style={{ width: '1rem', height: '1rem', color: C.primary }} />\n )}\n <span>{alternativeMethod.value}</span>\n </div>\n </div>\n )}\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => {\n if (alternativeMethod.type === 'phone') setStep('phone-input');\n else setStep('email-check');\n resetAuth();\n }} style={{ width: '100%' }}>\n {alternativeMethod.type === 'phone' ? 'Se connecter par téléphone' : 'Se connecter par email'}\n </Button>\n <Button variant=\"outline\" onClick={() => window.open('https://iam.ollaid.com', '_blank')} style={{ width: '100%' }}>\n Réactiver depuis iam.ollaid.com\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} style={{ width: '100%' }}>\n Annuler\n </Button>\n </DialogFooter>\n </>\n\n /* ===================== MAIN STEPS ===================== */\n ) : (\n <>\n {step !== 'choice' && renderBackBtn()}\n\n {/* ===== CHOICE ===== */}\n {step === 'choice' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Connexion</DialogTitle>\n <DialogDescription>Choisissez votre méthode de connexion</DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <Button variant=\"outline\" onClick={() => setStep('email-check')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Adresse email</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec email</div>\n </div>\n </Button>\n <Button variant=\"outline\" onClick={() => setStep('phone-input')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>\n Numéro de téléphone <span style={{ color: C.gray500 }}>(Sénégal)</span>\n </div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec code SMS</div>\n </div>\n </Button>\n <Button variant=\"outline\" onClick={() => setStep('access-otp')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.primary)}>\n <IconKeyRound style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Accès OTP</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Disponible sur le backoffice IAM</div>\n </div>\n </Button>\n <div style={{ textAlign: 'center', fontSize: '0.875rem', paddingTop: '0.5rem' }}>\n <span style={{ color: C.gray500 }}>Mot de passe oublié ? </span>\n <button type=\"button\" style={linkStyle} onClick={() => setShowPasswordRecovery(true)}>Récupérer</button>\n </div>\n <div style={{ position: 'relative', padding: '0.5rem 0' }}>\n <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center' }}>\n <span style={{ width: '100%', borderTop: `1px solid ${C.gray200}` }} />\n </div>\n </div>\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </DialogBody>\n </>\n )}\n\n {/* ===== EMAIL CHECK ===== */}\n {step === 'email-check' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconMail style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par email</DialogTitle>\n <DialogDescription>Entrez votre adresse email</DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"email\">Adresse email</Label>\n <Input id=\"email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email}\n onChange={e => setEmail(e.target.value)} disabled={isSubmitting}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handleEmailCheck(); } }}\n />\n </div>\n <div style={{ textAlign: 'right' }}>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n </div>\n </DialogBody>\n <DialogFooter>\n {renderLoaderBtn('Continuer', 'Vérification...', handleEmailCheck, !email.trim())}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </DialogFooter>\n </>\n )}\n\n {/* ===== EMAIL PASSWORD ===== */}\n {step === 'email-password' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n {userName && <DialogTitle>Bonjour {userName} 👋</DialogTitle>}\n <DialogDescription>{email}</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleEmailPasswordSubmit} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Label htmlFor=\"password\">Mot de passe</Label>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n <div style={{ position: 'relative' }}>\n <Input id=\"password\" type={showPassword ? 'text' : 'password'} placeholder=\"••••••••\" value={password}\n onChange={e => setPassword(e.target.value)} disabled={isSubmitting}\n style={{ paddingRight: '2.5rem' }}\n />\n <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n style={{ position: 'absolute', right: 0, top: 0, height: '100%', padding: '0 0.75rem', background: 'none', border: 'none', cursor: 'pointer' }}>\n {showPassword ? (\n <IconEyeOff style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n ) : (\n <IconEye style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n )}\n </button>\n </div>\n </div>\n </div>\n </DialogBody>\n <DialogFooter>\n <Button type=\"submit\" disabled={isSubmitting || !password} style={{ width: '100%' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion...\n </span>\n ) : 'Se connecter'}\n </Button>\n </DialogFooter>\n </form>\n </>\n )}\n\n {/* ===== EMAIL OTP ===== */}\n {step === 'email-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code de vérification a été envoyé à<br />\n <strong style={{ color: C.gray900 }}>{email}</strong>\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={emailOtpCode} onChange={setEmailOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n </div>\n </DialogBody>\n <DialogFooter>\n {renderLoaderBtn('Vérifier', 'Vérification...', handleEmailOtpVerify, emailOtpCode.length !== 6)}\n </DialogFooter>\n </>\n )}\n\n {/* ===== PHONE INPUT ===== */}\n {step === 'phone-input' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par téléphone</DialogTitle>\n <DialogDescription>Entrez votre numéro pour recevoir un code SMS</DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Indicatif</Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem' }}>\n <span style={{ fontSize: '1.125rem' }}>🇸🇳</span>\n <span style={{ fontWeight: 500, color: C.gray900 }}>Sénégal (+221)</span>\n </div>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"login-phone\">Numéro de téléphone</Label>\n <Input id=\"login-phone\" type=\"tel\" placeholder=\"77 123 45 67\" value={phone}\n onChange={e => { const val = e.target.value.replace(/\\D/g, '').slice(0, 9); setPhone(val); }}\n disabled={isSubmitting} maxLength={9}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handlePhoneInit(); } }}\n />\n <p style={{ fontSize: '0.75rem', color: C.gray500 }}>9 chiffres requis ({phone.replace(/\\D/g, '').length}/9)</p>\n </div>\n </div>\n </DialogBody>\n <DialogFooter>\n {renderLoaderBtn('Recevoir le code SMS', 'Envoi en cours...', handlePhoneInit, phone.replace(/\\D/g, '').length !== 9)}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </DialogFooter>\n </>\n )}\n\n {/* ===== PHONE OTP ===== */}\n {step === 'phone-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code a été envoyé au{' '}\n <strong style={{ color: C.gray900 }}>+221 {phone.slice(0, 2)}***{phone.slice(-2)}</strong>\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={phoneOtpCode} onChange={setPhoneOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n </div>\n </DialogBody>\n <DialogFooter>\n {renderLoaderBtn('Se connecter', 'Vérification...', handlePhoneVerify, phoneOtpCode.length !== 6)}\n </DialogFooter>\n </>\n )}\n\n {/* ===== ACCESS OTP ===== */}\n {step === 'access-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Code d'accès</DialogTitle>\n <DialogDescription>Entrez le code d'accès à 8 chiffres</DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Code d'accès (8 chiffres)</Label>\n <Input type=\"text\" inputMode=\"numeric\" placeholder=\"0000-0000\" value={accessOtpCode}\n onChange={e => setAccessOtpCode(e.target.value.replace(/\\D/g, '').slice(0, 8))}\n disabled={isSubmitting}\n style={{ textAlign: 'center', fontSize: '1.5rem', letterSpacing: '0.15em', fontFamily: 'monospace' }}\n maxLength={8}\n />\n </div>\n </div>\n </DialogBody>\n <DialogFooter>\n {renderLoaderBtn('Se connecter', 'Vérification...', handleAccessOtpSubmit, accessOtpCode.length !== 8)}\n </DialogFooter>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n\n <PasswordRecoveryModal\n open={showPasswordRecovery}\n onOpenChange={setShowPasswordRecovery}\n onSuccess={() => setShowPasswordRecovery(false)}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n \n />\n </>\n );\n}\n\nexport default LoginModal;\n","/**\n * Complete world countries list for @ollaid/native-sso\n * Default: Sénégal (+221, SN)\n */\n\nexport interface Country {\n code: string; // ISO 2-letter (e.g. \"SN\")\n name: string; // Display name\n dialCode: string; // Phone prefix (e.g. \"+221\")\n flag: string; // Emoji flag\n digits: number; // Expected phone number length (without prefix)\n}\n\n// West Africa prioritized at top, then rest of Africa, Europe, Americas, Asia, Oceania\nexport const COUNTRIES: Country[] = [\n // ── Afrique de l'Ouest (prioritaires) ──\n { code: \"SN\", name: \"Sénégal\", dialCode: \"+221\", flag: \"🇸🇳\", digits: 9 },\n { code: \"CI\", name: \"Côte d'Ivoire\", dialCode: \"+225\", flag: \"🇨🇮\", digits: 10 },\n { code: \"ML\", name: \"Mali\", dialCode: \"+223\", flag: \"🇲🇱\", digits: 8 },\n { code: \"BF\", name: \"Burkina Faso\", dialCode: \"+226\", flag: \"🇧🇫\", digits: 8 },\n { code: \"GN\", name: \"Guinée\", dialCode: \"+224\", flag: \"🇬🇳\", digits: 9 },\n { code: \"TG\", name: \"Togo\", dialCode: \"+228\", flag: \"🇹🇬\", digits: 8 },\n { code: \"BJ\", name: \"Bénin\", dialCode: \"+229\", flag: \"🇧🇯\", digits: 8 },\n { code: \"NE\", name: \"Niger\", dialCode: \"+227\", flag: \"🇳🇪\", digits: 8 },\n { code: \"MR\", name: \"Mauritanie\", dialCode: \"+222\", flag: \"🇲🇷\", digits: 8 },\n { code: \"GW\", name: \"Guinée-Bissau\", dialCode: \"+245\", flag: \"🇬🇼\", digits: 7 },\n { code: \"GM\", name: \"Gambie\", dialCode: \"+220\", flag: \"🇬🇲\", digits: 7 },\n { code: \"CV\", name: \"Cap-Vert\", dialCode: \"+238\", flag: \"🇨🇻\", digits: 7 },\n { code: \"SL\", name: \"Sierra Leone\", dialCode: \"+232\", flag: \"🇸🇱\", digits: 8 },\n { code: \"LR\", name: \"Liberia\", dialCode: \"+231\", flag: \"🇱🇷\", digits: 7 },\n { code: \"GH\", name: \"Ghana\", dialCode: \"+233\", flag: \"🇬🇭\", digits: 9 },\n { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"🇳🇬\", digits: 10 },\n\n // ── Afrique Centrale ──\n { code: \"CM\", name: \"Cameroun\", dialCode: \"+237\", flag: \"🇨🇲\", digits: 9 },\n { code: \"GA\", name: \"Gabon\", dialCode: \"+241\", flag: \"🇬🇦\", digits: 7 },\n { code: \"CG\", name: \"Congo\", dialCode: \"+242\", flag: \"🇨🇬\", digits: 9 },\n { code: \"CD\", name: \"RD Congo\", dialCode: \"+243\", flag: \"🇨🇩\", digits: 9 },\n { code: \"TD\", name: \"Tchad\", dialCode: \"+235\", flag: \"🇹🇩\", digits: 8 },\n { code: \"CF\", name: \"Centrafrique\", dialCode: \"+236\", flag: \"🇨🇫\", digits: 8 },\n { code: \"GQ\", name: \"Guinée équatoriale\", dialCode: \"+240\", flag: \"🇬🇶\", digits: 9 },\n { code: \"ST\", name: \"São Tomé-et-Príncipe\", dialCode: \"+239\", flag: \"🇸🇹\", digits: 7 },\n { code: \"BI\", name: \"Burundi\", dialCode: \"+257\", flag: \"🇧🇮\", digits: 8 },\n { code: \"RW\", name: \"Rwanda\", dialCode: \"+250\", flag: \"🇷🇼\", digits: 9 },\n\n // ── Afrique de l'Est ──\n { code: \"KE\", name: \"Kenya\", dialCode: \"+254\", flag: \"🇰🇪\", digits: 9 },\n { code: \"TZ\", name: \"Tanzanie\", dialCode: \"+255\", flag: \"🇹🇿\", digits: 9 },\n { code: \"UG\", name: \"Ouganda\", dialCode: \"+256\", flag: \"🇺🇬\", digits: 9 },\n { code: \"ET\", name: \"Éthiopie\", dialCode: \"+251\", flag: \"🇪🇹\", digits: 9 },\n { code: \"SO\", name: \"Somalie\", dialCode: \"+252\", flag: \"🇸🇴\", digits: 8 },\n { code: \"DJ\", name: \"Djibouti\", dialCode: \"+253\", flag: \"🇩🇯\", digits: 8 },\n { code: \"ER\", name: \"Érythrée\", dialCode: \"+291\", flag: \"🇪🇷\", digits: 7 },\n { code: \"SS\", name: \"Soudan du Sud\", dialCode: \"+211\", flag: \"🇸🇸\", digits: 9 },\n { code: \"MG\", name: \"Madagascar\", dialCode: \"+261\", flag: \"🇲🇬\", digits: 9 },\n { code: \"MU\", name: \"Maurice\", dialCode: \"+230\", flag: \"🇲🇺\", digits: 8 },\n { code: \"SC\", name: \"Seychelles\", dialCode: \"+248\", flag: \"🇸🇨\", digits: 7 },\n { code: \"KM\", name: \"Comores\", dialCode: \"+269\", flag: \"🇰🇲\", digits: 7 },\n\n // ── Afrique Australe ──\n { code: \"ZA\", name: \"Afrique du Sud\", dialCode: \"+27\", flag: \"🇿🇦\", digits: 9 },\n { code: \"MZ\", name: \"Mozambique\", dialCode: \"+258\", flag: \"🇲🇿\", digits: 9 },\n { code: \"ZW\", name: \"Zimbabwe\", dialCode: \"+263\", flag: \"🇿🇼\", digits: 9 },\n { code: \"ZM\", name: \"Zambie\", dialCode: \"+260\", flag: \"🇿🇲\", digits: 9 },\n { code: \"MW\", name: \"Malawi\", dialCode: \"+265\", flag: \"🇲🇼\", digits: 9 },\n { code: \"BW\", name: \"Botswana\", dialCode: \"+267\", flag: \"🇧🇼\", digits: 8 },\n { code: \"NA\", name: \"Namibie\", dialCode: \"+264\", flag: \"🇳🇦\", digits: 9 },\n { code: \"AO\", name: \"Angola\", dialCode: \"+244\", flag: \"🇦🇴\", digits: 9 },\n { code: \"SZ\", name: \"Eswatini\", dialCode: \"+268\", flag: \"🇸🇿\", digits: 8 },\n { code: \"LS\", name: \"Lesotho\", dialCode: \"+266\", flag: \"🇱🇸\", digits: 8 },\n\n // ── Afrique du Nord ──\n { code: \"MA\", name: \"Maroc\", dialCode: \"+212\", flag: \"🇲🇦\", digits: 9 },\n { code: \"DZ\", name: \"Algérie\", dialCode: \"+213\", flag: \"🇩🇿\", digits: 9 },\n { code: \"TN\", name: \"Tunisie\", dialCode: \"+216\", flag: \"🇹🇳\", digits: 8 },\n { code: \"LY\", name: \"Libye\", dialCode: \"+218\", flag: \"🇱🇾\", digits: 9 },\n { code: \"EG\", name: \"Égypte\", dialCode: \"+20\", flag: \"🇪🇬\", digits: 10 },\n { code: \"SD\", name: \"Soudan\", dialCode: \"+249\", flag: \"🇸🇩\", digits: 9 },\n\n // ── Europe ──\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\", digits: 9 },\n { code: \"BE\", name: \"Belgique\", dialCode: \"+32\", flag: \"🇧🇪\", digits: 9 },\n { code: \"CH\", name: \"Suisse\", dialCode: \"+41\", flag: \"🇨🇭\", digits: 9 },\n { code: \"DE\", name: \"Allemagne\", dialCode: \"+49\", flag: \"🇩🇪\", digits: 10 },\n { code: \"GB\", name: \"Royaume-Uni\", dialCode: \"+44\", flag: \"🇬🇧\", digits: 10 },\n { code: \"ES\", name: \"Espagne\", dialCode: \"+34\", flag: \"🇪🇸\", digits: 9 },\n { code: \"IT\", name: \"Italie\", dialCode: \"+39\", flag: \"🇮🇹\", digits: 10 },\n { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"🇵🇹\", digits: 9 },\n { code: \"NL\", name: \"Pays-Bas\", dialCode: \"+31\", flag: \"🇳🇱\", digits: 9 },\n { code: \"SE\", name: \"Suède\", dialCode: \"+46\", flag: \"🇸🇪\", digits: 9 },\n { code: \"NO\", name: \"Norvège\", dialCode: \"+47\", flag: \"🇳🇴\", digits: 8 },\n { code: \"DK\", name: \"Danemark\", dialCode: \"+45\", flag: \"🇩🇰\", digits: 8 },\n { code: \"FI\", name: \"Finlande\", dialCode: \"+358\", flag: \"🇫🇮\", digits: 10 },\n { code: \"PL\", name: \"Pologne\", dialCode: \"+48\", flag: \"🇵🇱\", digits: 9 },\n { code: \"AT\", name: \"Autriche\", dialCode: \"+43\", flag: \"🇦🇹\", digits: 10 },\n { code: \"IE\", name: \"Irlande\", dialCode: \"+353\", flag: \"🇮🇪\", digits: 9 },\n { code: \"GR\", name: \"Grèce\", dialCode: \"+30\", flag: \"🇬🇷\", digits: 10 },\n { code: \"CZ\", name: \"Tchéquie\", dialCode: \"+420\", flag: \"🇨🇿\", digits: 9 },\n { code: \"RO\", name: \"Roumanie\", dialCode: \"+40\", flag: \"🇷🇴\", digits: 9 },\n { code: \"HU\", name: \"Hongrie\", dialCode: \"+36\", flag: \"🇭🇺\", digits: 9 },\n { code: \"BG\", name: \"Bulgarie\", dialCode: \"+359\", flag: \"🇧🇬\", digits: 9 },\n { code: \"HR\", name: \"Croatie\", dialCode: \"+385\", flag: \"🇭🇷\", digits: 9 },\n { code: \"SK\", name: \"Slovaquie\", dialCode: \"+421\", flag: \"🇸🇰\", digits: 9 },\n { code: \"SI\", name: \"Slovénie\", dialCode: \"+386\", flag: \"🇸🇮\", digits: 8 },\n { code: \"RS\", name: \"Serbie\", dialCode: \"+381\", flag: \"🇷🇸\", digits: 9 },\n { code: \"UA\", name: \"Ukraine\", dialCode: \"+380\", flag: \"🇺🇦\", digits: 9 },\n { code: \"RU\", name: \"Russie\", dialCode: \"+7\", flag: \"🇷🇺\", digits: 10 },\n { code: \"TR\", name: \"Turquie\", dialCode: \"+90\", flag: \"🇹🇷\", digits: 10 },\n { code: \"LU\", name: \"Luxembourg\", dialCode: \"+352\", flag: \"🇱🇺\", digits: 9 },\n { code: \"MC\", name: \"Monaco\", dialCode: \"+377\", flag: \"🇲🇨\", digits: 8 },\n { code: \"IS\", name: \"Islande\", dialCode: \"+354\", flag: \"🇮🇸\", digits: 7 },\n { code: \"AL\", name: \"Albanie\", dialCode: \"+355\", flag: \"🇦🇱\", digits: 9 },\n { code: \"ME\", name: \"Monténégro\", dialCode: \"+382\", flag: \"🇲🇪\", digits: 8 },\n { code: \"MK\", name: \"Macédoine du Nord\", dialCode: \"+389\", flag: \"🇲🇰\", digits: 8 },\n { code: \"BA\", name: \"Bosnie-Herzégovine\", dialCode: \"+387\", flag: \"🇧🇦\", digits: 8 },\n { code: \"LT\", name: \"Lituanie\", dialCode: \"+370\", flag: \"🇱🇹\", digits: 8 },\n { code: \"LV\", name: \"Lettonie\", dialCode: \"+371\", flag: \"🇱🇻\", digits: 8 },\n { code: \"EE\", name: \"Estonie\", dialCode: \"+372\", flag: \"🇪🇪\", digits: 8 },\n { code: \"MT\", name: \"Malte\", dialCode: \"+356\", flag: \"🇲🇹\", digits: 8 },\n { code: \"CY\", name: \"Chypre\", dialCode: \"+357\", flag: \"🇨🇾\", digits: 8 },\n { code: \"MD\", name: \"Moldavie\", dialCode: \"+373\", flag: \"🇲🇩\", digits: 8 },\n { code: \"GE\", name: \"Géorgie\", dialCode: \"+995\", flag: \"🇬🇪\", digits: 9 },\n { code: \"AM\", name: \"Arménie\", dialCode: \"+374\", flag: \"🇦🇲\", digits: 8 },\n { code: \"AZ\", name: \"Azerbaïdjan\", dialCode: \"+994\", flag: \"🇦🇿\", digits: 9 },\n { code: \"BY\", name: \"Biélorussie\", dialCode: \"+375\", flag: \"🇧🇾\", digits: 9 },\n\n // ── Amérique du Nord ──\n { code: \"US\", name: \"États-Unis\", dialCode: \"+1\", flag: \"🇺🇸\", digits: 10 },\n { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"🇨🇦\", digits: 10 },\n { code: \"MX\", name: \"Mexique\", dialCode: \"+52\", flag: \"🇲🇽\", digits: 10 },\n\n // ── Amérique Centrale & Caraïbes ──\n { code: \"HT\", name: \"Haïti\", dialCode: \"+509\", flag: \"🇭🇹\", digits: 8 },\n { code: \"DO\", name: \"République dominicaine\", dialCode: \"+1809\", flag: \"🇩🇴\", digits: 10 },\n { code: \"CU\", name: \"Cuba\", dialCode: \"+53\", flag: \"🇨🇺\", digits: 8 },\n { code: \"JM\", name: \"Jamaïque\", dialCode: \"+1876\", flag: \"🇯🇲\", digits: 7 },\n { code: \"GT\", name: \"Guatemala\", dialCode: \"+502\", flag: \"🇬🇹\", digits: 8 },\n { code: \"HN\", name: \"Honduras\", dialCode: \"+504\", flag: \"🇭🇳\", digits: 8 },\n { code: \"SV\", name: \"El Salvador\", dialCode: \"+503\", flag: \"🇸🇻\", digits: 8 },\n { code: \"NI\", name: \"Nicaragua\", dialCode: \"+505\", flag: \"🇳🇮\", digits: 8 },\n { code: \"CR\", name: \"Costa Rica\", dialCode: \"+506\", flag: \"🇨🇷\", digits: 8 },\n { code: \"PA\", name: \"Panama\", dialCode: \"+507\", flag: \"🇵🇦\", digits: 8 },\n { code: \"TT\", name: \"Trinité-et-Tobago\", dialCode: \"+1868\", flag: \"🇹🇹\", digits: 7 },\n\n // ── Amérique du Sud ──\n { code: \"BR\", name: \"Brésil\", dialCode: \"+55\", flag: \"🇧🇷\", digits: 11 },\n { code: \"AR\", name: \"Argentine\", dialCode: \"+54\", flag: \"🇦🇷\", digits: 10 },\n { code: \"CO\", name: \"Colombie\", dialCode: \"+57\", flag: \"🇨🇴\", digits: 10 },\n { code: \"CL\", name: \"Chili\", dialCode: \"+56\", flag: \"🇨🇱\", digits: 9 },\n { code: \"PE\", name: \"Pérou\", dialCode: \"+51\", flag: \"🇵🇪\", digits: 9 },\n { code: \"VE\", name: \"Venezuela\", dialCode: \"+58\", flag: \"🇻🇪\", digits: 10 },\n { code: \"EC\", name: \"Équateur\", dialCode: \"+593\", flag: \"🇪🇨\", digits: 9 },\n { code: \"BO\", name: \"Bolivie\", dialCode: \"+591\", flag: \"🇧🇴\", digits: 8 },\n { code: \"PY\", name: \"Paraguay\", dialCode: \"+595\", flag: \"🇵🇾\", digits: 9 },\n { code: \"UY\", name: \"Uruguay\", dialCode: \"+598\", flag: \"🇺🇾\", digits: 8 },\n { code: \"GY\", name: \"Guyana\", dialCode: \"+592\", flag: \"🇬🇾\", digits: 7 },\n { code: \"SR\", name: \"Suriname\", dialCode: \"+597\", flag: \"🇸🇷\", digits: 7 },\n\n // ── Moyen-Orient ──\n { code: \"AE\", name: \"Émirats arabes unis\", dialCode: \"+971\", flag: \"🇦🇪\", digits: 9 },\n { code: \"SA\", name: \"Arabie saoudite\", dialCode: \"+966\", flag: \"🇸🇦\", digits: 9 },\n { code: \"QA\", name: \"Qatar\", dialCode: \"+974\", flag: \"🇶🇦\", digits: 8 },\n { code: \"KW\", name: \"Koweït\", dialCode: \"+965\", flag: \"🇰🇼\", digits: 8 },\n { code: \"BH\", name: \"Bahreïn\", dialCode: \"+973\", flag: \"🇧🇭\", digits: 8 },\n { code: \"OM\", name: \"Oman\", dialCode: \"+968\", flag: \"🇴🇲\", digits: 8 },\n { code: \"JO\", name: \"Jordanie\", dialCode: \"+962\", flag: \"🇯🇴\", digits: 9 },\n { code: \"LB\", name: \"Liban\", dialCode: \"+961\", flag: \"🇱🇧\", digits: 8 },\n { code: \"IQ\", name: \"Irak\", dialCode: \"+964\", flag: \"🇮🇶\", digits: 10 },\n { code: \"IR\", name: \"Iran\", dialCode: \"+98\", flag: \"🇮🇷\", digits: 10 },\n { code: \"IL\", name: \"Israël\", dialCode: \"+972\", flag: \"🇮🇱\", digits: 9 },\n { code: \"PS\", name: \"Palestine\", dialCode: \"+970\", flag: \"🇵🇸\", digits: 9 },\n { code: \"YE\", name: \"Yémen\", dialCode: \"+967\", flag: \"🇾🇪\", digits: 9 },\n { code: \"SY\", name: \"Syrie\", dialCode: \"+963\", flag: \"🇸🇾\", digits: 9 },\n\n // ── Asie ──\n { code: \"CN\", name: \"Chine\", dialCode: \"+86\", flag: \"🇨🇳\", digits: 11 },\n { code: \"JP\", name: \"Japon\", dialCode: \"+81\", flag: \"🇯🇵\", digits: 10 },\n { code: \"KR\", name: \"Corée du Sud\", dialCode: \"+82\", flag: \"🇰🇷\", digits: 10 },\n { code: \"IN\", name: \"Inde\", dialCode: \"+91\", flag: \"🇮🇳\", digits: 10 },\n { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"🇵🇰\", digits: 10 },\n { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"🇧🇩\", digits: 10 },\n { code: \"ID\", name: \"Indonésie\", dialCode: \"+62\", flag: \"🇮🇩\", digits: 10 },\n { code: \"MY\", name: \"Malaisie\", dialCode: \"+60\", flag: \"🇲🇾\", digits: 10 },\n { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"🇵🇭\", digits: 10 },\n { code: \"TH\", name: \"Thaïlande\", dialCode: \"+66\", flag: \"🇹🇭\", digits: 9 },\n { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"🇻🇳\", digits: 9 },\n { code: \"SG\", name: \"Singapour\", dialCode: \"+65\", flag: \"🇸🇬\", digits: 8 },\n { code: \"HK\", name: \"Hong Kong\", dialCode: \"+852\", flag: \"🇭🇰\", digits: 8 },\n { code: \"TW\", name: \"Taïwan\", dialCode: \"+886\", flag: \"🇹🇼\", digits: 9 },\n { code: \"MM\", name: \"Myanmar\", dialCode: \"+95\", flag: \"🇲🇲\", digits: 9 },\n { code: \"KH\", name: \"Cambodge\", dialCode: \"+855\", flag: \"🇰🇭\", digits: 9 },\n { code: \"LA\", name: \"Laos\", dialCode: \"+856\", flag: \"🇱🇦\", digits: 10 },\n { code: \"NP\", name: \"Népal\", dialCode: \"+977\", flag: \"🇳🇵\", digits: 10 },\n { code: \"LK\", name: \"Sri Lanka\", dialCode: \"+94\", flag: \"🇱🇰\", digits: 9 },\n { code: \"AF\", name: \"Afghanistan\", dialCode: \"+93\", flag: \"🇦🇫\", digits: 9 },\n { code: \"UZ\", name: \"Ouzbékistan\", dialCode: \"+998\", flag: \"🇺🇿\", digits: 9 },\n { code: \"KZ\", name: \"Kazakhstan\", dialCode: \"+7\", flag: \"🇰🇿\", digits: 10 },\n { code: \"MN\", name: \"Mongolie\", dialCode: \"+976\", flag: \"🇲🇳\", digits: 8 },\n\n // ── Océanie ──\n { code: \"AU\", name: \"Australie\", dialCode: \"+61\", flag: \"🇦🇺\", digits: 9 },\n { code: \"NZ\", name: \"Nouvelle-Zélande\", dialCode: \"+64\", flag: \"🇳🇿\", digits: 9 },\n { code: \"FJ\", name: \"Fidji\", dialCode: \"+679\", flag: \"🇫🇯\", digits: 7 },\n { code: \"PG\", name: \"Papouasie-Nouvelle-Guinée\", dialCode: \"+675\", flag: \"🇵🇬\", digits: 8 },\n];\n\n// ── Defaults ──\nexport const DEFAULT_COUNTRY_CODE = \"SN\";\nexport const DEFAULT_DIAL_CODE = \"+221\";\n\n// ── Sorted by ISO code (alphabetical) ──\nexport const COUNTRIES_SORTED_BY_CODE: Country[] = [...COUNTRIES].sort((a, b) => a.code.localeCompare(b.code));\n\n// ── Helpers ──\nexport const getCountryByCode = (code: string): Country | undefined =>\n COUNTRIES.find(c => c.code.toLowerCase() === code.toLowerCase());\n\nexport const getCountryByDialCode = (dialCode: string): Country | undefined =>\n COUNTRIES.find(c => c.dialCode === dialCode);\n\nexport const getDefaultCountry = (): Country =>\n COUNTRIES.find(c => c.code === DEFAULT_COUNTRY_CODE)!;\n\nexport const searchCountries = (query: string): Country[] => {\n const q = query.toLowerCase().trim();\n if (!q) return COUNTRIES;\n return COUNTRIES.filter(c =>\n c.name.toLowerCase().includes(q) ||\n c.dialCode.includes(q) ||\n c.code.toLowerCase().includes(q)\n );\n};\n","/**\n * Phone Input component for @ollaid/native-sso\n * Custom select overlay: dropdown shows ISO code, selected display shows only flag + dialCode\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { COUNTRIES_SORTED_BY_CODE, getCountryByDialCode, DEFAULT_DIAL_CODE } from '../utils/countries';\n\ninterface PhoneInputProps {\n value: string;\n onChange: (value: string) => void;\n ccphone?: string;\n onCcphoneChange?: (value: string) => void;\n disabled?: boolean;\n error?: string;\n placeholder?: string;\n lockCcphone?: boolean;\n}\n\nexport function PhoneInput({\n value, onChange, ccphone = DEFAULT_DIAL_CODE, onCcphoneChange, disabled = false, error, placeholder = '77 123 45 67', lockCcphone = false,\n}: PhoneInputProps) {\n const selectedCountry = getCountryByDialCode(ccphone) || COUNTRIES_SORTED_BY_CODE[0];\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown on outside click\n useEffect(() => {\n if (!dropdownOpen) return;\n const handler = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) setDropdownOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [dropdownOpen]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const cleaned = e.target.value.replace(/\\D/g, '');\n onChange(cleaned.slice(0, selectedCountry.digits));\n };\n\n const formatPhone = (phone: string): string => {\n if (phone.length <= 2) return phone;\n if (phone.length <= 5) return `${phone.slice(0, 2)} ${phone.slice(2)}`;\n if (phone.length <= 7) return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5)}`;\n return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5, 7)} ${phone.slice(7)}`;\n };\n\n const handleSelect = (dialCode: string) => {\n if (onCcphoneChange) onCcphoneChange(dialCode);\n setDropdownOpen(false);\n };\n\n return (\n <div>\n <div style={{\n display: 'flex', alignItems: 'center', border: `2px solid ${error ? '#ef4444' : '#d1d5db'}`,\n borderRadius: '0.5rem', overflow: 'visible', opacity: disabled ? 0.5 : 1,\n backgroundColor: disabled ? '#f3f4f6' : 'white', position: 'relative',\n }}>\n {onCcphoneChange && !lockCcphone ? (\n <div ref={dropdownRef} style={{ position: 'relative' }}>\n {/* Display button: only flag + dialCode */}\n <button\n type=\"button\"\n onClick={() => !disabled && setDropdownOpen(!dropdownOpen)}\n disabled={disabled}\n style={{\n display: 'flex', alignItems: 'center', gap: '0.375rem', padding: '0.75rem',\n backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb', border: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer', fontWeight: 500, color: '#374151',\n fontSize: '0.9375rem', whiteSpace: 'nowrap',\n }}\n >\n <span style={{ fontSize: '1.125rem' }}>{selectedCountry.flag}</span>\n <span>{selectedCountry.dialCode}</span>\n <span style={{ fontSize: '0.625rem', marginLeft: '0.125rem' }}>▼</span>\n </button>\n\n {/* Dropdown list: shows CODE FLAG DIALCODE */}\n {dropdownOpen && (\n <div style={{\n position: 'absolute', top: '100%', left: 0, zIndex: 50,\n backgroundColor: 'white', border: '1px solid #d1d5db', borderRadius: '0.375rem',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)', maxHeight: '15rem', overflowY: 'auto',\n minWidth: '12rem', marginTop: '0.25rem',\n }}>\n {COUNTRIES_SORTED_BY_CODE.map((c) => (\n <button\n key={`${c.code}-${c.dialCode}`}\n type=\"button\"\n onClick={() => handleSelect(c.dialCode)}\n style={{\n display: 'flex', alignItems: 'center', gap: '0.5rem', width: '100%',\n padding: '0.5rem 0.75rem', border: 'none', cursor: 'pointer', fontSize: '0.875rem',\n backgroundColor: c.dialCode === ccphone ? '#f3f4f6' : 'transparent',\n textAlign: 'left',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f3f4f6')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = c.dialCode === ccphone ? '#f3f4f6' : 'transparent')}\n >\n <span style={{ fontWeight: 600, color: '#374151', minWidth: '1.75rem' }}>{c.code}</span>\n <span>{c.flag}</span>\n <span style={{ color: '#6b7280' }}>{c.dialCode}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n /* Locked view: only flag + dialCode */\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem', padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb' }}>\n <span style={{ fontSize: '1.125rem' }}>{selectedCountry.flag}</span>\n <span style={{ fontWeight: 500, color: '#374151' }}>{selectedCountry.dialCode}</span>\n </div>\n )}\n <input\n type=\"tel\"\n inputMode=\"numeric\"\n value={formatPhone(value)}\n onChange={handleChange}\n disabled={disabled}\n placeholder={placeholder}\n style={{ flex: 1, padding: '0.75rem', fontSize: '1.125rem', border: 'none', outline: 'none', backgroundColor: 'transparent' }}\n />\n </div>\n {error && <p style={{ fontSize: '0.875rem', color: '#ef4444', marginTop: '0.25rem' }}>{error}</p>}\n <p style={{ fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }}>\n {selectedCountry.digits} chiffres requis ({value.length}/{selectedCountry.digits})\n </p>\n </div>\n );\n}\n\nexport default PhoneInput;\n","/**\n * Apps Logo Slider for @ollaid/native-sso\n * Matches Web SSO badge style: horizontal marquee, small icons, no app names\n */\n\nimport { useEffect, useState } from 'react';\nimport { getNativeAuthConfig } from '../services/api';\n\ninterface AppsLogoSliderProps {\n speed?: 'slow' | 'normal' | 'fast';\n className?: string;\n iamApiUrl?: string;\n}\n\ninterface AppInfo { id: number; name: string; logo: string | null; }\n\nexport function AppsLogoSlider({ className = '', iamApiUrl: iamApiUrlProp }: AppsLogoSliderProps) {\n const [applications, setApplications] = useState<AppInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const resolvedIamApiUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n if (!resolvedIamApiUrl) return;\n const fetchApps = async () => {\n try {\n const iamBaseUrl = resolvedIamApiUrl.replace('/api', '');\n const response = await fetch(`${iamBaseUrl}/api/public/applications`, { headers: { 'Accept': 'application/json' } });\n if (response.ok) {\n const data = await response.json();\n if (data.success && Array.isArray(data.data)) setApplications(data.data);\n }\n } catch { /* ignore */ } finally { setIsLoading(false); }\n };\n fetchApps();\n }, [iamApiUrlProp]);\n\n const getLogoUrl = (logo: string | null): string | null => {\n if (!logo) return null;\n if (logo.startsWith('http')) return logo;\n const resolvedUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n return `${resolvedUrl.replace('/api', '')}/storage/applications/${logo}`;\n };\n\n if (isLoading) {\n return (\n <div className={className} style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div style={{ display: 'flex', gap: '0.75rem', padding: '0 0.75rem' }}>\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} style={{ width: '2rem', height: '2rem', borderRadius: '0.5rem', backgroundColor: '#e5e7eb', flexShrink: 0 }} />\n ))}\n </div>\n </div>\n );\n }\n\n if (applications.length === 0) return null;\n\n // Triple for smooth infinite loop (same as web SSO)\n const displayApps = [...applications, ...applications, ...applications];\n\n return (\n <div\n className={className}\n style={{ position: 'relative', width: '100%', height: '100%', overflow: 'hidden' }}\n >\n {/* Left gradient mask */}\n <div style={{\n position: 'absolute', left: 0, top: 0, bottom: 0, width: '1.5rem',\n background: 'linear-gradient(to right, #ffffff, transparent)',\n zIndex: 10, pointerEvents: 'none',\n }} />\n\n {/* Marquee content */}\n <div style={{\n display: 'flex',\n animation: 'ollaid-marquee 20s linear infinite',\n height: '100%',\n alignItems: 'center',\n }}>\n {displayApps.map((app, index) => {\n const logoUrl = getLogoUrl(app.logo);\n return (\n <div\n key={`${app.id}-${index}`}\n style={{ flexShrink: 0, padding: '0 0.75rem', display: 'flex', alignItems: 'center', height: '100%' }}\n >\n {logoUrl ? (\n <img\n src={logoUrl}\n alt={app.name}\n style={{ width: '2rem', height: '2rem', objectFit: 'contain' }}\n onError={(e) => {\n const target = e.currentTarget;\n target.style.display = 'none';\n if (target.nextElementSibling) {\n (target.nextElementSibling as HTMLElement).style.display = 'flex';\n }\n }}\n />\n ) : null}\n <div\n style={{\n width: '2rem',\n height: '2rem',\n borderRadius: '0.5rem',\n backgroundColor: '#f3f4f6',\n alignItems: 'center',\n justifyContent: 'center',\n display: logoUrl ? 'none' : 'flex',\n }}\n >\n <span style={{ fontSize: '0.75rem', fontWeight: 700, color: '#6b7280' }}>\n {app.name?.charAt(0)?.toUpperCase() || 'A'}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Right gradient mask */}\n <div style={{\n position: 'absolute', right: 0, top: 0, bottom: 0, width: '1.5rem',\n background: 'linear-gradient(to left, #ffffff, transparent)',\n zIndex: 10, pointerEvents: 'none',\n }} />\n </div>\n );\n}\n\nexport default AppsLogoSlider;\n","/**\n * Service d'inscription Mobile SSO v1.0\n * Architecture Frontend-First : Appels directs à l'IAM via nativeAuth\n * \n * @version 1.0.0\n */\n\nimport { nativeAuthService } from './nativeAuth';\nimport { \n ApiError, \n fetchWithTimeout, \n getHeaders,\n getNativeAuthConfig, \n isDebugMode,\n} from './api';\n\nimport type {\n MobileRegistrationFormData,\n MobileVerifyOtpResponse,\n MobileRegistrationCompleteResponse,\n MobileResendOtpResponse,\n} from '../types/mobile';\nimport type { NativeInitResponse } from '../types/native';\n\nexport const mobileRegistrationService = {\n /**\n * Init registration via nativeAuth.register() (Frontend-First)\n */\n async init(\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ): Promise<NativeInitResponse> {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n return nativeAuthService.register({\n name: data.name,\n email: data.email,\n ccphone: data.ccphone,\n phone: data.phone,\n town: data.town,\n country: data.country,\n registration_type: data.registration_type,\n });\n },\n\n /**\n * Verify OTP via nativeAuth.validate()\n */\n async verifyOtp(\n processToken: string,\n otpCode: string\n ): Promise<MobileVerifyOtpResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration OTP)');\n }\n\n return fetchWithTimeout<MobileVerifyOtpResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n otp_code: otpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete registration with password\n */\n async complete(\n processToken: string,\n password: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete phone-only registration (no password)\n */\n async completePhoneOnly(\n processToken: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (phone-only complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Resend OTP\n */\n async resendOtp(processToken: string): Promise<MobileResendOtpResponse> {\n return nativeAuthService.resendOtp(processToken) as unknown as MobileResendOtpResponse;\n },\n};\n\nexport default mobileRegistrationService;\n","/**\n * Hook d'inscription Mobile SSO v1.0\n * Gère le flow: init → verify-otp → complete\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobileRegistrationService } from '../services/mobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig, ApiError } from '../services/api';\nimport type { \n MobileRegistrationFormData,\n AccountType,\n} from '../types/mobile';\n\ninterface RegistrationConflict {\n type: 'email' | 'phone';\n masked_identifier: string;\n options: {\n can_login: boolean;\n can_recover_by_email: boolean;\n can_recover_by_sms: boolean;\n masked_email?: string;\n masked_phone?: string;\n };\n}\n\ninterface RegistrationState {\n processToken: string | null;\n status: 'idle' | 'pending_otp' | 'pending_password' | 'pending_registration' | 'completed';\n loading: boolean;\n error: string | null;\n conflict: RegistrationConflict | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): string {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return 'Vérifiez votre connexion Internet';\n }\n if (err.message.includes('timeout')) {\n return 'Le serveur met trop de temps à répondre';\n }\n return err.message;\n }\n return `Erreur lors de ${context}`;\n}\n\nexport interface UseMobileRegistrationOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\nexport function useMobileRegistration(options?: UseMobileRegistrationOptions) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (options && !configuredRef.current) {\n setNativeAuthConfig({ \n saasApiUrl: options.saasApiUrl, \n iamApiUrl: options.iamApiUrl,\n });\n configuredRef.current = true;\n }\n }, [options]);\n\n const [state, setState] = useState<RegistrationState>({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n\n const [formData, setFormData] = useState<Partial<MobileRegistrationFormData>>({});\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n const updateFormData = useCallback((data: Partial<MobileRegistrationFormData>) => {\n setFormData(prev => ({ ...prev, ...data }));\n }, []);\n\n const initRegistration = useCallback(async (\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, conflict: null }));\n \n const enrichedData = {\n ...data,\n email: accountType === 'phone-only' ? '' : data.email,\n registration_type: accountType === 'phone-only' ? 'phone' as const : 'email' as const,\n };\n \n setFormData(enrichedData);\n\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n const response = await mobileRegistrationService.init(enrichedData);\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'pending_otp',\n loading: false,\n conflict: null,\n }));\n return { \n success: true, \n otp_code_dev: response.otp_code_dev,\n otp_method: response.otp_method,\n otp_sent_to: response.otp_sent_to,\n };\n }\n\n if (response.conflict) {\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Ce compte existe déjà',\n conflict: response.conflict!,\n }));\n return { success: false, error_type: response.error_type };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n conflict: null,\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n // Extract conflict data from 409 responses\n if (err instanceof ApiError && err.statusCode === 409 && err.response) {\n const resp = err.response as any;\n if (resp.conflict) {\n setState(prev => ({\n ...prev,\n loading: false,\n error: resp.message || 'Ce compte existe déjà',\n conflict: resp.conflict,\n }));\n return { success: false, error_type: resp.error_type };\n }\n }\n\n const message = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, conflict: null }));\n return { success: false };\n }\n }, [accountType]);\n\n const verifyOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.verifyOtp(state.processToken, otpCode);\n\n if (response.success) {\n if (response.status === 'completed' && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, completed: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({ ...prev, status: 'pending_password', loading: false }));\n return { success: true, completed: false };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completeRegistration = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.complete(state.processToken, password);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completePhoneOnlyRegistration = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.completePhoneOnly(state.processToken);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const message = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n setFormData({});\n setAccountType('email');\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, conflict: null }));\n }, []);\n\n return {\n processToken: state.processToken,\n status: state.status,\n formData,\n loading: state.loading,\n error: state.error,\n conflict: state.conflict,\n isCompleted: state.status === 'completed',\n hasConflict: state.conflict !== null,\n \n accountType,\n setAccountType,\n isPhoneOnly: accountType === 'phone-only',\n\n updateFormData,\n initRegistration,\n verifyOtp,\n completeRegistration,\n completePhoneOnlyRegistration,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobileRegistration;\n","/**\n * Signup Modal for @ollaid/native-sso — Design aligned with web SSO\n * Full signup flow: intro → account-type → info → OTP → password → confirm → success\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter,\n Button, Input, Label,\n IconShieldCheck, IconCheckCircle2, IconMail, IconSmartphone, IconArrowLeft,\n IconKeyRound, IconLock, IconLoader2,\n IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings,\n} from './ui';\nimport PhoneInput from './PhoneInput';\nimport OTPInput from './OTPInput';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useMobileRegistration } from '../hooks/useMobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { COUNTRIES_SORTED_BY_CODE, getCountryByCode, DEFAULT_COUNTRY_CODE } from '../utils/countries';\nimport type { UserInfos } from '../types/native';\n\ntype SignupStep = 'intro' | 'account-type' | 'info' | 'otp' | 'password' | 'confirm';\n\nexport interface SignupModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToLogin: () => void;\n onSignupSuccess: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n /** Called when conflict resolution wants to switch to login with a pre-filled phone */\n onSwitchToLoginWithPhone?: (phone: string) => void;\n}\n\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst TOTAL_STEPS = 6;\n\nfunction StepIndicator({ current }: { current: number }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.75rem' }}>\n {Array.from({ length: TOTAL_STEPS }, (_, i) => (\n <div key={i} style={{\n width: i + 1 === current ? '1.5rem' : '0.5rem',\n height: '0.5rem',\n borderRadius: '9999px',\n backgroundColor: i + 1 <= current ? C.accent : C.gray200,\n transition: 'all 0.2s',\n }} />\n ))}\n <span style={{ fontSize: '0.75rem', color: C.gray500, marginLeft: '0.5rem' }}>Étape {current}/{TOTAL_STEPS}</span>\n </div>\n );\n}\n\n// Orbit success animation\nfunction SuccessOrbit() {\n const orbitIcons = [IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings];\n return (\n <div style={{ position: 'relative', width: '10rem', height: '10rem', margin: '0 auto' }}>\n {/* Center shield */}\n <div style={{\n position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',\n width: '4rem', height: '4rem', backgroundColor: C.greenBg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 2,\n }}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.green }} />\n </div>\n {/* Orbiting icons */}\n {orbitIcons.map((Icon, i) => {\n const angle = (i * 360) / orbitIcons.length;\n return (\n <div key={i} style={{\n position: 'absolute', top: '50%', left: '50%', width: '2rem', height: '2rem',\n transform: `rotate(${angle}deg) translate(4rem) rotate(-${angle}deg)`,\n transformOrigin: '0 0',\n animation: `spin ${8 + i}s linear infinite`,\n }}>\n <div style={{\n width: '2rem', height: '2rem', backgroundColor: C.gray100, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}>\n <Icon style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl, defaultAccountType, onSwitchToLoginWithPhone }: SignupModalProps) {\n const {\n status, formData, loading: regLoading, error: regError, conflict, accountType, setAccountType, isPhoneOnly,\n updateFormData, initRegistration, verifyOtp, completeRegistration, resendOtp, reset: resetReg, clearError,\n } = useMobileRegistration({ saasApiUrl, iamApiUrl });\n\n const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n\n const [step, setStep] = useState<SignupStep>('intro');\n const [otpCode, setOtpCode] = useState('');\n const [password, setPassword] = useState('');\n const [passwordConfirm, setPasswordConfirm] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [signupSuccess, setSignupSuccess] = useState(false);\n const [signupData, setSignupData] = useState<{ token: string; user: UserInfos } | null>(null);\n\n const error = localError || regError;\n\n useEffect(() => { if (!open) { setStep('intro'); setOtpCode(''); setPassword(''); setPasswordConfirm(''); setLocalError(null); setSignupSuccess(false); setSignupData(null); setResendCooldown(0); resetReg(); } }, [open]);\n useEffect(() => { if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); } else if (status === 'pending_password') setStep('password'); }, [status]);\n useEffect(() => { if (resendCooldown > 0) { const t = setTimeout(() => setResendCooldown(r => r - 1), 1000); return () => clearTimeout(t); } }, [resendCooldown]);\n useEffect(() => { if (signupSuccess && signupData) { const t = setTimeout(() => onSignupSuccess(signupData.token, signupData.user), 2000); return () => clearTimeout(t); } }, [signupSuccess, signupData]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setSignupData({ token: response.token, user: response.user as UserInfos });\n setSignupSuccess(true);\n } else setLocalError(\"Erreur lors de la finalisation de l'inscription\");\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleInfoSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!formData.name?.trim()) { setLocalError('Le nom est requis'); return; }\n if (!isPhoneOnly && !formData.email?.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!formData.phone?.trim() || (formData.phone?.length || 0) < 6) { setLocalError('Numéro de téléphone invalide'); return; }\n if (formData.ccphone === '+221' && formData.phone?.length !== 9) { setLocalError('Le numéro sénégalais doit contenir exactement 9 chiffres'); return; }\n if (isPhoneOnly && formData.ccphone !== '+221') { setLocalError(\"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\"); return; }\n if (!formData.town?.trim()) { setLocalError('La ville est requise'); return; }\n if (!formData.country?.trim()) { setLocalError('Le pays est requis'); return; }\n await initRegistration({ name: formData.name || '', email: formData.email || '', ccphone: formData.ccphone || '+221', phone: formData.phone || '', town: formData.town, country: formData.country } as any);\n };\n\n const handleOTPSubmit = async () => {\n if (otpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const result = await verifyOtp(otpCode);\n if (result.success && result.completed && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handlePasswordSubmit = (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null);\n if (!password || password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== passwordConfirm) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setStep('confirm');\n };\n\n const handleConfirm = async () => {\n setLocalError(null); clearError();\n const result = await completeRegistration(password);\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => { if (resendCooldown > 0) return; const r = await resendOtp(); if (r.success) setResendCooldown(r.cooldown || 60); };\n\n const goToStep = (s: SignupStep) => { setLocalError(null); clearError(); setStep(s); };\n\n const handleAccountTypeSelect = (type: 'email' | 'phone-only') => {\n setAccountType(type);\n if (type === 'phone-only') updateFormData({ ccphone: '+221', country: 'SN', email: '' });\n else if (!formData.country) updateFormData({ country: DEFAULT_COUNTRY_CODE });\n goToStep('info');\n };\n\n const stepNumber = { intro: 1, 'account-type': 2, info: 3, otp: 4, password: 5, confirm: 6 }[step];\n\n const renderError = () => error ? <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div> : null;\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {signupSuccess && signupData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <SuccessOrbit />\n <DialogTitle>Félicitations !</DialogTitle>\n <DialogDescription>\n Votre compte a été créé avec succès. Bienvenue {formData.name} !\n </DialogDescription>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', fontSize: '0.875rem', color: C.gray500, marginTop: '1rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion automatique en cours...\n </div>\n </DialogHeader>\n ) : (\n <>\n {/* ===== INTRO ===== */}\n {step === 'intro' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent + '1a', '4rem')}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.accent }} />\n </div>\n <DialogTitle>Ouvrez un compte Ollaid</DialogTitle>\n <DialogDescription>Un compte unique qui vous donne accès à toutes les applications</DialogDescription>\n </DialogHeader>\n <DialogBody>\n <AppsLogoSlider iamApiUrl={iamApiUrl} />\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', fontSize: '0.875rem', color: C.gray500, margin: '0.75rem 0' }}>\n {['Un seul compte pour toutes les applications', 'Plus besoin de multiples mots de passe', 'Connexion simplifiée et sécurisée'].map(text => (\n <div key={text} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <IconCheckCircle2 style={{ width: '1.25rem', height: '1.25rem', color: C.green, flexShrink: 0 }} />\n {text}\n </div>\n ))}\n </div>\n <StepIndicator current={1} />\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => goToStep('account-type')} style={{ width: '100%' }}>Suivant →</Button>\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Déjà un compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToLogin}>Connectez-vous</button>\n </div>\n </DialogFooter>\n </>\n )}\n\n {/* ===== ACCOUNT TYPE ===== */}\n {step === 'account-type' && (\n <>\n <button onClick={() => goToStep('intro')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Choisissez votre type de compte</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('email')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Email + Téléphone</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>Compte complet</div>\n </div>\n </button>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('phone-only')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconSmartphone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Téléphone uniquement</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>🇸🇳 Sénégal uniquement</div>\n </div>\n </button>\n </div>\n <StepIndicator current={2} />\n </DialogBody>\n </>\n )}\n\n {/* ===== INFO (with conflict resolution) ===== */}\n {step === 'info' && (\n <>\n <button onClick={() => goToStep('account-type')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n\n {/* ---- CONFLICT VIEW ---- */}\n {conflict ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.amberBg)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.amber }} />\n </div>\n <DialogTitle>\n {conflict.type === 'phone' ? 'Numéro déjà utilisé' : 'Email déjà utilisé'}\n </DialogTitle>\n <DialogDescription>\n {conflict.type === 'phone'\n ? `Le numéro ${formData.ccphone || ''} ${formData.phone || ''} est déjà associé à un compte.`\n : `L'adresse ${formData.email || ''} est déjà associée à un compte.`}\n {' '}S'il s'agit du vôtre, connectez-vous.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter style={{ borderTop: 'none' }}>\n {conflict.type === 'phone' && formData.ccphone === '+221' && conflict.options?.can_login && (\n <Button\n onClick={() => {\n const fullPhone = formData.phone || '';\n if (onSwitchToLoginWithPhone) onSwitchToLoginWithPhone(fullPhone);\n else onSwitchToLogin();\n }}\n style={{ width: '100%' }}\n >\n <IconSmartphone style={{ width: '1rem', height: '1rem' }} />\n Se connecter par téléphone\n </Button>\n )}\n {(conflict.type === 'email' || (conflict.type === 'phone' && formData.ccphone !== '+221')) && conflict.options?.can_login && (\n <Button onClick={onSwitchToLogin} style={{ width: '100%' }}>\n Se connecter\n </Button>\n )}\n {!isPhoneOnly && (conflict.options?.can_recover_by_email || conflict.options?.can_recover_by_sms) && (\n <Button variant=\"outline\" onClick={() => setShowPasswordRecovery(true)} style={{ width: '100%' }}>\n Récupérer mon compte\n </Button>\n )}\n <Button variant=\"outline\" onClick={() => clearError()} style={{ width: '100%' }}>\n {conflict.type === 'phone' ? 'Changer le numéro' : \"Changer l'email\"}\n </Button>\n {conflict.options?.masked_email && (\n <div style={{ padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem', fontSize: '0.8125rem', color: C.gray500, textAlign: 'center' }}>\n Email lié : <strong style={{ color: C.gray900 }}>{conflict.options.masked_email}</strong>\n </div>\n )}\n {conflict.options?.masked_phone && (\n <div style={{ padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem', fontSize: '0.8125rem', color: C.gray500, textAlign: 'center' }}>\n Téléphone lié : <strong style={{ color: C.gray900 }}>{conflict.options.masked_phone}</strong>\n </div>\n )}\n </DialogFooter>\n </>\n ) : (\n /* ---- NORMAL INFO FORM ---- */\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Créer votre compte</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleInfoSubmit} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>\n <DialogBody>\n {isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.accent + '1a', color: C.accent, fontSize: '0.8125rem', marginBottom: '0.5rem', textAlign: 'center' }}>\n 📱 Inscription par téléphone — 🇸🇳 Sénégal uniquement\n </div>\n )}\n {!isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.amberBg, color: '#92400e', fontSize: '0.8125rem', marginBottom: '0.5rem', textAlign: 'center' }}>\n ⚠️ Un code OTP sera envoyé par email pour vérification\n </div>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <div><Label>Nom complet <span style={{ color: C.red }}>*</span></Label><Input placeholder=\"Jean Dupont\" value={formData.name || ''} onChange={e => updateFormData({ name: e.target.value })} disabled={regLoading} /></div>\n {!isPhoneOnly && <div><Label>Adresse email <span style={{ color: C.red }}>*</span></Label><Input type=\"email\" placeholder=\"vous@exemple.com\" value={formData.email || ''} onChange={e => updateFormData({ email: e.target.value })} disabled={regLoading} /></div>}\n <div><Label>Numéro de téléphone <span style={{ color: C.red }}>*</span></Label><PhoneInput value={formData.phone || ''} onChange={p => updateFormData({ phone: p })} ccphone={formData.ccphone || '+221'} onCcphoneChange={c => updateFormData({ ccphone: c })} disabled={regLoading} lockCcphone={isPhoneOnly} /></div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\n <div><Label>Ville <span style={{ color: C.red }}>*</span></Label><Input placeholder=\"Dakar\" value={formData.town || ''} onChange={e => updateFormData({ town: e.target.value })} disabled={regLoading} /></div>\n <div>\n <Label>Pays <span style={{ color: C.red }}>*</span></Label>\n <select\n value={formData.country || DEFAULT_COUNTRY_CODE}\n onChange={e => {\n const country = getCountryByCode(e.target.value);\n updateFormData({ country: e.target.value, ccphone: country?.dialCode || '+221' });\n }}\n disabled={regLoading || isPhoneOnly}\n style={{ width: '100%', padding: '0.5rem', borderRadius: '0.375rem', border: '1px solid #d1d5db', backgroundColor: (regLoading || isPhoneOnly) ? '#f3f4f6' : 'white', fontSize: '0.875rem' }}\n >\n {COUNTRIES_SORTED_BY_CODE.map(c => (\n <option key={c.code} value={c.code}>{c.code} {c.flag} {c.name}</option>\n ))}\n </select>\n </div>\n </div>\n <StepIndicator current={3} />\n </div>\n </DialogBody>\n <DialogFooter>\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n </DialogFooter>\n </form>\n </>\n )}\n </>\n )}\n\n {/* ===== OTP ===== */}\n {step === 'otp' && (\n <>\n <button onClick={() => goToStep('info')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>Entrez le code envoyé {isPhoneOnly ? `au ${formData.ccphone} ${formData.phone}` : `à ${formData.email}`}</DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={otpCode} onChange={setOtpCode} disabled={regLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : <button type=\"button\" onClick={handleResendOTP} style={linkStyle}>Code non reçu ? Renvoyer</button>}\n </div>\n <StepIndicator current={4} />\n </div>\n </DialogBody>\n <DialogFooter>\n <Button onClick={handleOTPSubmit} disabled={regLoading || otpCode.length !== 6} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Vérifier'}\n </Button>\n </DialogFooter>\n </>\n )}\n\n {/* ===== PASSWORD ===== */}\n {step === 'password' && (\n <>\n <button onClick={() => goToStep('otp')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Créer un mot de passe</DialogTitle>\n </DialogHeader>\n <form onSubmit={handlePasswordSubmit} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <div><Label>Mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={regLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"••••••••\" value={passwordConfirm} onChange={e => setPasswordConfirm(e.target.value)} disabled={regLoading} /></div>\n <StepIndicator current={5} />\n </div>\n </DialogBody>\n <DialogFooter>\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>Continuer</Button>\n </DialogFooter>\n </form>\n </>\n )}\n\n {/* ===== CONFIRM ===== */}\n {step === 'confirm' && (\n <>\n <button onClick={() => goToStep('password')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Confirmer votre inscription</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <div style={{ backgroundColor: C.gray100, borderRadius: '0.5rem', padding: '1rem' }}>\n {[['Nom', formData.name], ...(!isPhoneOnly ? [['Email', formData.email]] : []), ['Téléphone', `${formData.ccphone} ${formData.phone}`], ['Ville', formData.town], ['Pays', formData.country]].map(([label, value]) => (\n <div key={label as string} style={{ display: 'flex', justifyContent: 'space-between', padding: '0.375rem 0' }}>\n <span style={{ fontSize: '0.875rem', color: C.gray500 }}>{label}</span>\n <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>{value as string}</span>\n </div>\n ))}\n </div>\n <StepIndicator current={6} />\n </div>\n </DialogBody>\n <DialogFooter>\n <Button onClick={handleConfirm} disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Création du compte...\n </span>\n ) : 'Créer mon compte'}\n </Button>\n </DialogFooter>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n\n <PasswordRecoveryModal\n open={showPasswordRecovery}\n onOpenChange={setShowPasswordRecovery}\n onSuccess={() => setShowPasswordRecovery(false)}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n />\n </>\n );\n}\n\nexport default SignupModal;\n","/**\n * OnboardingModal — Post-login modal for missing profile info\n * Asks for photo + phone if not present in user_infos\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter, Button, Label } from './ui';\nimport { PhoneInput } from './PhoneInput';\nimport type { NativeUser } from '../types/native';\n\n// Design tokens matching package modals\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n white: '#ffffff',\n} as const;\n\nexport interface OnboardingModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: NativeUser;\n /** Called with updated data when user submits */\n onComplete: (data: { image_url?: string; ccphone?: string; phone?: string; email?: string }) => void;\n /** Called when user skips onboarding */\n onSkip: () => void;\n}\n\nexport function OnboardingModal({ open, onOpenChange, user, onComplete, onSkip }: OnboardingModalProps) {\n const needsPhoto = !user.image_url;\n const needsPhone = !user.phone;\n const needsEmail = !user.email;\n\n const [photoPreview, setPhotoPreview] = useState<string>('');\n const [photoFile, setPhotoFile] = useState<File | null>(null);\n const [ccphone, setCcphone] = useState(user.ccphone || '+221');\n const [phone, setPhone] = useState(user.phone || '');\n const [email, setEmail] = useState('');\n const [confirmed, setConfirmed] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n\n const [fileError, setFileError] = useState('');\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validation taille max 2 Mo\n if (file.size > 2 * 1024 * 1024) {\n setFileError('Le fichier dépasse 2 Mo. Veuillez choisir une image plus légère.');\n e.target.value = '';\n return;\n }\n setFileError('');\n setPhotoFile(file);\n const reader = new FileReader();\n reader.onload = () => setPhotoPreview(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n const canSubmit = confirmed && (\n (needsPhoto ? !!photoPreview : true) &&\n (needsPhone ? phone.length >= 7 : true)\n );\n\n const handleSubmit = useCallback(() => {\n if (!canSubmit) return;\n setSubmitting(true);\n \n const data: { image_url?: string; ccphone?: string; phone?: string; email?: string } = {};\n if (needsPhoto && photoPreview) {\n data.image_url = photoPreview;\n }\n if (needsPhone && phone) {\n data.ccphone = ccphone;\n data.phone = phone;\n }\n if (needsEmail && email.trim()) {\n data.email = email.trim();\n }\n \n onComplete(data);\n }, [canSubmit, needsPhoto, needsPhone, needsEmail, photoPreview, ccphone, phone, email, onComplete]);\n\n // Shield check icon inline\n const ShieldIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.25rem' }}>\n <ShieldIcon />\n <DialogTitle>Complétez votre profil</DialogTitle>\n </div>\n <DialogDescription>\n Ajoutez les informations manquantes pour finaliser votre compte.\n </DialogDescription>\n </DialogHeader>\n\n <DialogBody>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem', marginTop: '0.75rem' }}>\n {/* Photo upload */}\n {needsPhoto && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Photo de profil\n </Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n <div style={{\n width: '4rem', height: '4rem', borderRadius: '50%',\n backgroundColor: C.gray100, border: `2px dashed ${C.gray200}`,\n overflow: 'hidden', display: 'flex', alignItems: 'center',\n justifyContent: 'center', flexShrink: 0,\n }}>\n {photoPreview ? (\n <img src={photoPreview} alt=\"Preview\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.gray500} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M5.5 21a8.38 8.38 0 0 1 13 0\" />\n </svg>\n )}\n </div>\n <div style={{ flex: 1 }}>\n <label style={{\n display: 'inline-block', padding: '0.5rem 1rem',\n backgroundColor: C.gray100, border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem', cursor: 'pointer',\n fontSize: '0.875rem', color: C.gray700, fontWeight: 500,\n }}>\n Choisir une photo\n <input type=\"file\" accept=\"image/*\" onChange={handleFileChange} style={{ display: 'none' }} />\n </label>\n <p style={{ fontSize: '0.75rem', color: fileError ? '#dc2626' : C.gray500, marginTop: '0.25rem' }}>\n {fileError || 'JPG, PNG. Max 2 Mo.'}\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* Phone input */}\n {needsPhone && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Numéro de téléphone\n </Label>\n <PhoneInput value={phone} onChange={setPhone} ccphone={ccphone} onCcphoneChange={setCcphone} />\n </div>\n )}\n\n {/* Email input */}\n {needsEmail && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Adresse email <span style={{ color: C.gray500, fontWeight: 400 }}>(optionnel)</span>\n </Label>\n <input\n type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)}\n placeholder=\"email@exemple.com\"\n style={{\n width: '100%', height: '2.5rem', padding: '0 0.75rem',\n border: `1px solid ${C.gray200}`, borderRadius: '0.375rem',\n fontSize: '0.875rem', color: C.gray700, backgroundColor: C.white, outline: 'none',\n }}\n />\n </div>\n )}\n\n {/* Confirmation checkbox */}\n <label style={{\n display: 'flex', alignItems: 'flex-start', gap: '0.5rem',\n cursor: 'pointer', fontSize: '0.875rem', color: C.gray700,\n }}>\n <input\n type=\"checkbox\" checked={confirmed} onChange={(e) => setConfirmed(e.target.checked)}\n style={{ width: '1rem', height: '1rem', marginTop: '0.125rem', accentColor: C.primary, cursor: 'pointer' }}\n />\n <span>Je confirme que ces informations sont exactes</span>\n </label>\n </div>\n </DialogBody>\n\n <DialogFooter>\n <Button\n onClick={handleSubmit}\n disabled={!canSubmit || submitting}\n style={{ width: '100%', height: '2.75rem', opacity: canSubmit && !submitting ? 1 : 0.5 }}\n >\n {submitting ? 'Enregistrement...' : 'Valider'}\n </Button>\n <Button\n variant=\"outline\" onClick={onSkip} disabled={submitting}\n style={{ width: '100%', height: '2.75rem' }}\n >\n Passer pour l'instant\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default OnboardingModal;\n","/**\n * DebugPanel — Panneau de debug flottant pour @ollaid/native-sso\n * Affiche l'historique des appels API en temps réel (style terminal)\n * N'apparaît que quand debug=true\n * @version 1.0.0\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { subscribeToLogs, clearApiLogs, exportLogsAsText, type ApiCallLog } from '../services/debugLogger';\n\ninterface DebugPanelProps {\n saasApiUrl: string;\n iamApiUrl: string;\n}\n\nexport function DebugPanel({ saasApiUrl, iamApiUrl }: DebugPanelProps) {\n const [logs, setLogs] = useState<ApiCallLog[]>([]);\n const [expanded, setExpanded] = useState(true);\n const [selectedLog, setSelectedLog] = useState<string | null>(null);\n\n useEffect(() => {\n return subscribeToLogs(setLogs);\n }, []);\n\n const handleCopy = useCallback(() => {\n const text = exportLogsAsText();\n navigator.clipboard?.writeText(text).catch(() => {});\n }, []);\n\n const handleClear = useCallback(() => {\n clearApiLogs();\n setSelectedLog(null);\n }, []);\n\n const statusColor = (status: number | null) => {\n if (status === null) return '#f59e0b';\n if (status >= 200 && status < 300) return '#22c55e';\n return '#ef4444';\n };\n\n const statusEmoji = (status: number | null) => {\n if (status === null) return '⏳';\n if (status >= 200 && status < 300) return '✅';\n return '❌';\n };\n\n const selected = selectedLog ? logs.find(l => l.id === selectedLog) : null;\n\n return (\n <div style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 99999,\n fontFamily: 'monospace',\n fontSize: '12px',\n }}>\n {/* Header bar */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n background: '#1a1a2e',\n color: '#e2e8f0',\n padding: '6px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n borderTop: '2px solid #6366f1',\n }}\n >\n <span>🔐 Debug SSO — {logs.length} appel{logs.length > 1 ? 's' : ''}</span>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n {expanded && (\n <>\n <button onClick={(e) => { e.stopPropagation(); handleCopy(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 📋 Copier\n </button>\n <button onClick={(e) => { e.stopPropagation(); handleClear(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 🗑️ Effacer\n </button>\n </>\n )}\n <span>{expanded ? '▼' : '▲'}</span>\n </div>\n </div>\n\n {/* Body */}\n {expanded && (\n <div style={{\n background: '#0f0f23',\n color: '#e2e8f0',\n maxHeight: '300px',\n overflowY: 'auto',\n }}>\n {/* Config bar */}\n <div style={{ padding: '4px 12px', background: '#1e1e3f', fontSize: '10px', color: '#94a3b8', display: 'flex', gap: '16px' }}>\n <span>SaaS: <span style={{ color: '#6366f1' }}>{saasApiUrl}</span></span>\n <span>IAM: <span style={{ color: '#6366f1' }}>{iamApiUrl}</span></span>\n </div>\n\n {logs.length === 0 ? (\n <div style={{ padding: '20px', textAlign: 'center', color: '#64748b' }}>\n Aucun appel API. Tentez une connexion pour voir les logs.\n </div>\n ) : (\n <div>\n {logs.map(log => (\n <div key={log.id}>\n <div\n onClick={() => setSelectedLog(selectedLog === log.id ? null : log.id)}\n style={{\n padding: '4px 12px',\n borderBottom: '1px solid #1e293b',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n background: selectedLog === log.id ? '#1e293b' : 'transparent',\n }}\n >\n <span>{statusEmoji(log.responseStatus)}</span>\n <span style={{\n background: log.method === 'GET' ? '#22c55e' : '#3b82f6',\n color: '#fff',\n padding: '0 4px',\n borderRadius: '2px',\n fontSize: '10px',\n fontWeight: 'bold',\n }}>{log.method}</span>\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {log.endpoint}\n </span>\n <span style={{ color: statusColor(log.responseStatus), minWidth: '30px' }}>\n {log.responseStatus ?? '...'}\n </span>\n <span style={{ color: '#64748b', minWidth: '50px', textAlign: 'right' }}>\n {log.duration ? `${log.duration}ms` : '...'}\n </span>\n </div>\n\n {/* Detail view */}\n {selectedLog === log.id && selected && (\n <div style={{ padding: '8px 12px 8px 32px', background: '#111827', borderBottom: '1px solid #1e293b' }}>\n <div style={{ color: '#94a3b8', marginBottom: '4px' }}>\n ⏰ {new Date(log.timestamp).toLocaleTimeString()}\n </div>\n {log.requestBody ? (\n <div style={{ marginBottom: '4px' }}>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>REQUEST:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '80px', overflow: 'auto' }}>\n {JSON.stringify(log.requestBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.responseBody ? (\n <div>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>RESPONSE:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '120px', overflow: 'auto' }}>\n {JSON.stringify(log.responseBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.error && (\n <div style={{ color: '#ef4444', marginTop: '4px' }}>⚠️ {log.error}</div>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default DebugPanel;\n","export default \"data:image/png;base64,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\"","/**\n * NativeSSOPage — Page autonome complète pour @ollaid/native-sso\n * Design aligné sur /sso/auth (fond primary, card blanche, ShieldCheck branding)\n * \n * @version 2.0.0\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { LoginModal } from './LoginModal';\nimport { SignupModal } from './SignupModal';\nimport { OnboardingModal } from './OnboardingModal';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { DebugPanel } from './DebugPanel';\nimport ollaidLogo from '../logo/ollaid.png';\nimport { Button } from './ui';\nimport { STORAGE_KEYS } from '../services/api';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport type { UserInfos, NativeUser } from '../types/native';\n\nexport interface NativeSSOPageProps {\n saasApiUrl: string;\n iamApiUrl: string;\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n onLogout?: () => void;\n onOnboardingComplete?: (data: { image_url?: string; ccphone?: string; phone?: string }) => void;\n accountType?: 'user' | 'client';\n configPrefix?: string;\n title?: string;\n description?: string;\n logoUrl?: string;\n hideFooter?: boolean;\n redirectAfterLogin?: string;\n redirectAfterLogout?: string;\n}\n\ntype ModalState = 'none' | 'login' | 'signup';\n\nconst COLORS = {\n primary: '#002147',\n primaryForeground: '#ffffff',\n accent: '#e8430a',\n card: '#ffffff',\n cardForeground: '#1a2332',\n muted: '#6b7280',\n border: '#e5e7eb',\n shadow: '0 10px 25px -5px rgba(0,0,0,0.2)',\n} as const;\n\nconst LIGHT_VARS: Record<string, string> = {\n \"--background\": \"40 20% 96%\",\n \"--foreground\": \"220 15% 15%\",\n \"--card\": \"0 0% 100%\",\n \"--card-foreground\": \"220 15% 15%\",\n \"--popover\": \"0 0% 100%\",\n \"--popover-foreground\": \"220 15% 15%\",\n \"--primary\": \"209 100% 13%\",\n \"--primary-foreground\": \"0 0% 100%\",\n \"--secondary\": \"40 15% 92%\",\n \"--secondary-foreground\": \"220 15% 25%\",\n \"--muted\": \"40 10% 90%\",\n \"--muted-foreground\": \"220 10% 50%\",\n \"--accent\": \"16 99% 52%\",\n \"--accent-foreground\": \"0 0% 100%\",\n \"--destructive\": \"0 84.2% 60.2%\",\n \"--destructive-foreground\": \"210 40% 98%\",\n \"--border\": \"40 15% 88%\",\n \"--input\": \"40 15% 88%\",\n \"--ring\": \"209 100% 13%\",\n};\n\n// Shield check SVG inline\nconst ShieldCheckIcon = ({ size = 24, color = COLORS.accent }: { size?: number; color?: string }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n);\n\nfunction needsOnboarding(user: NativeUser | UserInfos): boolean {\n return !user.image_url || !user.phone;\n}\n\n// Gradient border animation keyframes (injected once)\nconst GRADIENT_STYLE_ID = 'ollaid-sso-gradient-anim';\nfunction injectGradientAnimation() {\n if (document.getElementById(GRADIENT_STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = GRADIENT_STYLE_ID;\n style.textContent = `\n @keyframes ollaid-border-gradient {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n @keyframes ollaid-marquee {\n 0% { transform: translateX(0); }\n 100% { transform: translateX(-50%); }\n }\n `;\n document.head.appendChild(style);\n}\n\n/** Top branding: ShieldCheck + iam.ollaid.com + subtitle */\nconst TopBranding = ({ subtitle }: { subtitle: string }) => (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginBottom: '0.5rem' }}>\n <ShieldCheckIcon size={28} color={COLORS.accent} />\n <span style={{ fontSize: '1.25rem', fontWeight: 700, color: COLORS.primaryForeground }}>\n iam.<span style={{ color: COLORS.accent }}>ollaid</span>.com\n </span>\n </div>\n <p style={{ fontSize: '1rem', fontWeight: 600, color: 'rgba(255,255,255,0.85)' }}>\n {subtitle}\n </p>\n </div>\n);\n\n/** Footer: Ollaid logo + copyright */\nconst Footer = ({ hideFooter }: { hideFooter: boolean }) => (\n <div style={{ marginTop: '1.5rem', textAlign: 'center' }}>\n <img src={ollaidLogo} alt=\"Ollaid\" style={{ height: '28px', margin: '0 auto 0.5rem' }} />\n {!hideFooter && (\n <p style={{ fontSize: '0.75rem', color: 'rgba(255,255,255,0.5)' }}>\n © 2026 iam.ollaid.com propulsé par <span style={{ fontWeight: 500 }}>ollaid</span>\n </p>\n )}\n </div>\n);\n\nexport function NativeSSOPage({\n saasApiUrl,\n iamApiUrl,\n onLoginSuccess,\n onLogout,\n onOnboardingComplete,\n accountType = 'user',\n configPrefix = 'iam',\n title = 'Un compte pour toutes vos applications',\n description = 'Connectez-vous avec votre compte Ollaid pour accéder à toutes les applications partenaires.',\n logoUrl,\n hideFooter = false,\n redirectAfterLogin,\n redirectAfterLogout,\n}: NativeSSOPageProps) {\n const [modal, setModal] = useState<ModalState>('none');\n const [loginInitialPhone, setLoginInitialPhone] = useState<string | undefined>();\n const [showOnboarding, setShowOnboarding] = useState(false);\n const [pendingSession, setPendingSession] = useState<{ token: string; user: NativeUser } | null>(null);\n const [session, setSession] = useState<{ token: string; user: NativeUser } | null>(() => {\n try {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const userStr = localStorage.getItem(STORAGE_KEYS.USER);\n if (token && userStr) return { token, user: JSON.parse(userStr) };\n } catch {}\n return null;\n });\n\n const { isDebug: resolvedDebug } = useNativeAuth({ saasApiUrl, iamApiUrl, configPrefix, autoLoadCredentials: true });\n\n // Force light mode + inject gradient animation\n useEffect(() => {\n injectGradientAnimation();\n const root = document.documentElement;\n const originalValues: Record<string, string> = {};\n Object.keys(LIGHT_VARS).forEach((key) => { originalValues[key] = root.style.getPropertyValue(key); });\n Object.entries(LIGHT_VARS).forEach(([key, value]) => { root.style.setProperty(key, value); });\n root.classList.add('light');\n root.classList.remove('dark');\n root.style.colorScheme = 'light';\n const meta = document.createElement('meta');\n meta.name = 'color-scheme';\n meta.content = 'light';\n document.head.appendChild(meta);\n return () => {\n Object.entries(originalValues).forEach(([key, value]) => {\n if (value) root.style.setProperty(key, value);\n else root.style.removeProperty(key);\n });\n root.classList.remove('light');\n root.style.colorScheme = '';\n meta.remove();\n };\n }, []);\n\n const openLogin = useCallback(() => setModal('login'), []);\n const openSignup = useCallback(() => setModal('signup'), []);\n const closeModal = useCallback(() => { setModal('none'); setLoginInitialPhone(undefined); }, []);\n const switchToSignup = useCallback(() => { setModal('none'); setLoginInitialPhone(undefined); setTimeout(() => setModal('signup'), 150); }, []);\n const switchToLogin = useCallback(() => { setModal('none'); setLoginInitialPhone(undefined); setTimeout(() => setModal('login'), 150); }, []);\n const switchToLoginWithPhone = useCallback((phone: string) => {\n setModal('none');\n setLoginInitialPhone(phone);\n setTimeout(() => setModal('login'), 150);\n }, []);\n\n const handleLoginSuccess = useCallback((token: string, user: UserInfos) => {\n const userObj: NativeUser = {\n reference: '',\n name: user.name,\n email: user.email || undefined,\n phone: user.phone,\n ccphone: user.ccphone,\n image_url: user.image_url,\n account_type: (user as any).account_type || 'user',\n };\n setModal('none');\n if (needsOnboarding(userObj)) {\n setPendingSession({ token, user: userObj });\n setShowOnboarding(true);\n } else {\n setSession({ token, user: userObj });\n onLoginSuccess?.(token, user);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }\n }, [onLoginSuccess, redirectAfterLogin]);\n\n const handleOnboardingComplete = useCallback((data: { image_url?: string; ccphone?: string; phone?: string }) => {\n if (!pendingSession) return;\n const updatedUser = { ...pendingSession.user, ...data };\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(updatedUser));\n setShowOnboarding(false);\n setSession({ token: pendingSession.token, user: updatedUser });\n setPendingSession(null);\n onOnboardingComplete?.(data);\n onLoginSuccess?.(pendingSession.token, updatedUser as unknown as UserInfos);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }, [pendingSession, onLoginSuccess, onOnboardingComplete, redirectAfterLogin]);\n\n const handleOnboardingSkip = useCallback(() => {\n if (!pendingSession) return;\n setShowOnboarding(false);\n setSession(pendingSession);\n setPendingSession(null);\n onLoginSuccess?.(pendingSession.token, pendingSession.user as unknown as UserInfos);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }, [pendingSession, onLoginSuccess, redirectAfterLogin]);\n\n const handleLogout = useCallback(() => {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n setSession(null);\n onLogout?.();\n if (redirectAfterLogout) window.location.href = redirectAfterLogout;\n }, [onLogout, redirectAfterLogout]);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n minHeight: '100vh',\n backgroundColor: COLORS.primary,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1.5rem 1rem',\n };\n\n const cardStyle: React.CSSProperties = {\n width: '100%',\n maxWidth: '28rem',\n backgroundColor: COLORS.card,\n border: `1px solid ${COLORS.border}`,\n borderRadius: '0.75rem',\n boxShadow: COLORS.shadow,\n overflow: 'hidden',\n };\n\n // Badge-style slider wrapper (shield circle + animated gradient pill)\n const SliderBadge = () => (\n <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" style={{ height: '3rem', margin: '0 auto' }} />\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n {/* Shield circle */}\n <div style={{\n width: '3rem',\n height: '3rem',\n borderRadius: '50%',\n backgroundColor: '#ffffff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n border: `1px solid ${COLORS.border}`,\n }}>\n <ShieldCheckIcon size={22} color={COLORS.accent} />\n </div>\n {/* Animated gradient pill with slider */}\n <div style={{\n flex: 1,\n minWidth: 0,\n position: 'relative',\n borderRadius: '9999px',\n padding: '2px',\n background: `linear-gradient(90deg, ${COLORS.primary}, ${COLORS.accent}, ${COLORS.primary})`,\n backgroundSize: '200% 100%',\n animation: 'ollaid-border-gradient 3s ease infinite',\n }}>\n <div style={{\n backgroundColor: '#ffffff',\n borderRadius: '9999px',\n height: '3rem',\n overflow: 'hidden',\n }}>\n <AppsLogoSlider iamApiUrl={iamApiUrl} speed=\"normal\" />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n // Auto-redirect if already authenticated and redirectAfterLogin is set\n if (session) {\n if (redirectAfterLogin) {\n // Redirect immediately — don't show authenticated view\n window.location.href = redirectAfterLogin;\n return (\n <div style={containerStyle}>\n <TopBranding subtitle={title} />\n <p style={{ color: 'rgba(255,255,255,0.7)', fontSize: '0.875rem' }}>Redirection en cours...</p>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <TopBranding subtitle={title} />\n <SliderBadge />\n\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground }}>\n Bienvenue, {session.user.name}\n </h2>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginTop: '0.25rem' }}>\n Vous êtes connecté à votre compte Ollaid SSO\n </p>\n <div style={{ marginTop: '1.5rem' }}>\n <Button variant=\"outline\" onClick={handleLogout} style={{ width: '100%' }}>\n Déconnexion\n </Button>\n </div>\n </div>\n </div>\n\n <Footer hideFooter={hideFooter} />\n </div>\n );\n }\n\n // Unauthenticated view\n return (\n <div style={containerStyle}>\n <TopBranding subtitle={title} />\n <SliderBadge />\n\n {/* Main card */}\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginBottom: '1.5rem' }}>\n {description}\n </p>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <Button onClick={openLogin} style={{ width: '100%', height: '2.75rem' }}>\n Connexion\n </Button>\n <Button\n variant=\"outline\"\n onClick={openSignup}\n style={{ width: '100%', height: '2.75rem', borderColor: COLORS.cardForeground, color: COLORS.cardForeground }}\n >\n Inscription\n </Button>\n </div>\n </div>\n </div>\n\n <Footer hideFooter={hideFooter} />\n\n <LoginModal\n open={modal === 'login'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToSignup={switchToSignup}\n onLoginSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n initialPhone={loginInitialPhone}\n />\n\n <SignupModal\n open={modal === 'signup'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToLogin={switchToLogin}\n onSwitchToLoginWithPhone={switchToLoginWithPhone}\n onSignupSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n {pendingSession && (\n <OnboardingModal\n open={showOnboarding}\n onOpenChange={(open) => { if (!open) handleOnboardingSkip(); }}\n user={pendingSession.user}\n onComplete={handleOnboardingComplete}\n onSkip={handleOnboardingSkip}\n />\n )}\n\n {resolvedDebug && <DebugPanel saasApiUrl={saasApiUrl} iamApiUrl={iamApiUrl} />}\n </div>\n );\n}\n\nexport default NativeSSOPage;\n","/**\n * NativeSSOProvider — React Context pour @ollaid/native-sso\n * Centralise la configuration pour les hooks et composants individuels\n * \n * @version 1.0.0\n */\n\nimport { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport { setNativeAuthConfig, type NativeAuthConfig } from './services/api';\n\nexport interface NativeSSOConfig {\n /** URL du Backend SaaS (ex: https://mon-saas.com/api) */\n saasApiUrl: string;\n /** URL du Backend IAM (ex: https://identityam.ollaid.com/api) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n}\n\nconst NativeSSOContext = createContext<NativeSSOConfig | null>(null);\n\nexport interface NativeSSOProviderProps {\n config: NativeSSOConfig;\n children: ReactNode;\n}\n\n/**\n * Provider React pour centraliser la config SSO.\n * \n * Usage :\n * ```tsx\n * <NativeSSOProvider config={{ saasApiUrl: '...', iamApiUrl: '...' }}>\n * <App />\n * </NativeSSOProvider>\n * ```\n */\nexport function NativeSSOProvider({ config, children }: NativeSSOProviderProps) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig(config);\n configuredRef.current = true;\n }\n }, [config]);\n\n return (\n <NativeSSOContext.Provider value={config}>\n {children}\n </NativeSSOContext.Provider>\n );\n}\n\n/**\n * Hook pour accéder à la config SSO depuis le Provider.\n * Optionnel : les hooks acceptent aussi la config en paramètre.\n */\nexport function useNativeSSOConfig(): NativeSSOConfig {\n const ctx = useContext(NativeSSOContext);\n if (!ctx) {\n throw new Error('useNativeSSOConfig doit être utilisé dans un <NativeSSOProvider>');\n }\n return ctx;\n}\n\nexport default NativeSSOProvider;\n","/**\n * Service IAM Account — APIs server-to-server\n * link-phone, link-email, refresh-user-info, update-avatar, reset-avatar\n * \n * ⚠️ ATTENTION — SERVER-TO-SERVER UNIQUEMENT\n * Ces APIs utilisent la `secret_key` de votre application IAM.\n * Elles doivent être appelées EXCLUSIVEMENT depuis un backend (Node.js, PHP, etc.).\n * Ne JAMAIS appeler ces méthodes depuis du code frontend/navigateur car la\n * secret_key serait exposée dans les DevTools réseau.\n * \n * @version 1.0.0\n */\n\nimport { fetchWithTimeout, getHeaders, getNativeAuthConfig } from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n LinkPhoneRequest,\n LinkPhoneResponse,\n LinkEmailRequest,\n LinkEmailResponse,\n RefreshUserInfoSingleRequest,\n RefreshUserInfoSingleResponse,\n RefreshUserInfoBulkRequest,\n RefreshUserInfoBulkResponse,\n UpdateAvatarRequest,\n UpdateAvatarResponse,\n ResetAvatarRequest,\n ResetAvatarResponse,\n} from '../types/native';\n\n// ============================================\n// Helper — auto-fill credentials if available\n// ============================================\n\nfunction getCredentialsOrThrow(params: { app_key?: string; secret_key?: string }) {\n const app_key = params.app_key;\n const secret_key = params.secret_key;\n\n if (!app_key || !secret_key) {\n throw new Error('app_key et secret_key sont requis en paramètre. Ces APIs sont server-to-server et ne peuvent pas utiliser les encrypted_credentials.');\n }\n\n return { app_key, secret_key };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const iamAccountService = {\n\n /**\n * Lier un numéro de téléphone à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-phone\n */\n async linkPhone(params: Partial<Pick<LinkPhoneRequest, 'app_key' | 'secret_key'>> & Omit<LinkPhoneRequest, 'app_key' | 'secret_key'>): Promise<LinkPhoneResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkPhoneResponse>(\n `${config.iamApiUrl}/iam/link-phone`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n ccphone: params.ccphone,\n phone: params.phone,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Lier une adresse email à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-email\n */\n async linkEmail(params: Partial<Pick<LinkEmailRequest, 'app_key' | 'secret_key'>> & Omit<LinkEmailRequest, 'app_key' | 'secret_key'>): Promise<LinkEmailResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkEmailResponse>(\n `${config.iamApiUrl}/iam/link-email`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n email: params.email,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos d'un utilisateur (mode single)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfo(params: Partial<Pick<RefreshUserInfoSingleRequest, 'secret_key'>> & Omit<RefreshUserInfoSingleRequest, 'secret_key'>): Promise<RefreshUserInfoSingleResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n return fetchWithTimeout<RefreshUserInfoSingleResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos en bulk (max 100 alias_references)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfoBulk(params: Partial<Pick<RefreshUserInfoBulkRequest, 'secret_key'>> & Omit<RefreshUserInfoBulkRequest, 'secret_key'>): Promise<RefreshUserInfoBulkResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n if (params.alias_references.length > 100) {\n throw new Error('Maximum 100 alias_references par requête bulk.');\n }\n\n return fetchWithTimeout<RefreshUserInfoBulkResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_references: params.alias_references,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Mettre à jour l'avatar d'un utilisateur pour une application spécifique\n * POST {iamApiUrl}/iam/update-avatar\n */\n async updateAvatar(params: Partial<Pick<UpdateAvatarRequest, 'app_key' | 'secret_key'>> & Omit<UpdateAvatarRequest, 'app_key' | 'secret_key'>): Promise<UpdateAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<UpdateAvatarResponse>(\n `${config.iamApiUrl}/iam/update-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n avatar_url: params.avatar_url,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Réinitialiser l'avatar d'un utilisateur (remettre à null pour utiliser l'image globale)\n * POST {iamApiUrl}/iam/reset-avatar\n */\n async resetAvatar(params: Partial<Pick<ResetAvatarRequest, 'app_key' | 'secret_key'>> & Omit<ResetAvatarRequest, 'app_key' | 'secret_key'>): Promise<ResetAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<ResetAvatarResponse>(\n `${config.iamApiUrl}/iam/reset-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n};\n"],"names":["jsxs","jsx","createContext","useEffect","useContext","forwardRef","useRef","useState","config","getErrorMessage","useCallback","C","iconCircle","backBtnStyle","Fragment","STORAGE_KEYS","linkStyle","_a","_b","_c","_d","_e","_f"],"mappings":"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"}