/** * MobileLayout - Cadre de l'application sur téléphone * En-tête (titre de la page + magasin), contenu défilant, barre du bas et * menu complet, tous tirés de la même configuration que le menu PC * Note: Le StoreProvider est fourni par MobileApp au niveau supérieur */ import { ReactNode, useEffect, useState } from "react"; import { Link, useLocation } from "wouter"; import { Boxes, ChevronDown, LogOut } from "lucide-react"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { useStore } from "@/contexts/StoreContext"; import { Button } from "@/components/ui/button"; import { Sheet, SheetContent, SheetHeader, SheetTitle } from "@/components/ui/sheet"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { getNavItemForPath, getNavSections, getRoleLabel, isNavItemActive } from "@/lib/navigation"; import MobileBottomNav from "./MobileBottomNav"; import type { Group } from "@shared/schema"; interface MobileLayoutProps { children: ReactNode; title?: string; } export default function MobileLayout({ children, title }: MobileLayoutProps) { const { user } = useAuthUnified(); const [location] = useLocation(); const { selectedStoreId, setSelectedStoreId, stores } = useStore(); const [menuOpen, setMenuOpen] = useState(false); // Titre de l'onglet du navigateur tiré du menu, comme sur PC useEffect(() => { const navItem = getNavItemForPath(location); document.title = navItem ? `${navItem.label} — LogiFlow` : "LogiFlow"; }, [location]); const selectedStore = stores?.find((s: Group) => s.id === selectedStoreId); const storeName = selectedStore?.name || "Tous les magasins"; const handleLogout = async () => { try { await fetch('/api/logout', { method: 'POST', credentials: 'include' }); } catch (error) { console.error('Logout error:', error); } finally { window.location.href = "/auth"; } }; const handleStoreChange = (value: string) => { const newStoreId = value === "all" ? null : parseInt(value); if (newStoreId) { localStorage.setItem('selectedStoreId', newStoreId.toString()); } else { localStorage.removeItem('selectedStoreId'); } setSelectedStoreId(newStoreId); }; const sections = getNavSections(user?.role); const displayName = user && (user.firstName || user.lastName ? `${user.firstName || ''} ${user.lastName || ''}`.trim() : user.username); return (
{/* En-tête : logo + magasin actif (le titre est porté par chaque page) */}
LogiFlow
{/* Titre de page optionnel */} {title && (

{title}

)}
{/* Contenu principal - défilant, avec la place de la barre du bas */}
{children}
setMenuOpen(true)} /> {/* Menu complet : tous les modules autorisés, magasin, profil */} Menu
{user && (

{displayName}

{getRoleLabel(user.role)}

)}
); }