import { Outlet, NavLink, useNavigate } from 'react-router-dom'; import { useEffect, useRef } from 'react'; import { useAuthStore } from '../store/auth'; import { useOnlineStatus } from '../hooks/useOnlineStatus'; import { useOfflineQueue } from '../hooks/useOfflineQueue'; import api from '../api/client'; import toast from 'react-hot-toast'; // ─── Icônes ───────────────────────────────────────────────── function IconPlus({ active }: { active: boolean }) { return ( ); } function IconList({ active }: { active: boolean }) { return ( ); } function IconSettings({ active }: { active: boolean }) { return ( ); } // ─── Layout principal ──────────────────────────────────────── export default function Layout() { const { user, refreshToken, logout } = useAuthStore(); const navigate = useNavigate(); const isOnline = useOnlineStatus(); const { count: queueCount, processing, processQueue } = useOfflineQueue(); // Auto-traitement de la file dès la reconnexion const wasOnline = useRef(isOnline); useEffect(() => { if (!wasOnline.current && isOnline) { // Petite temporisation pour laisser le réseau se stabiliser const timer = setTimeout(() => processQueue(), 2000); return () => clearTimeout(timer); } wasOnline.current = isOnline; }, [isOnline, processQueue]); async function handleLogout() { try { await api.post('/auth/logout', { refreshToken }); } catch { // Ignore silencieusement } logout(); navigate('/login', { replace: true }); } const navLinkClass = ({ isActive }: { isActive: boolean }) => `flex flex-col items-center gap-0.5 py-2 px-4 min-w-[64px] transition-colors ${ isActive ? 'text-indigo-600' : 'text-gray-400' }`; return (