diff --git a/.replit b/.replit index 2014f31..9cb2881 100644 --- a/.replit +++ b/.replit @@ -16,8 +16,8 @@ localPort = 5000 externalPort = 80 [[ports]] -localPort = 45995 -externalPort = 3000 +localPort = 41343 +externalPort = 3001 [workflows] runButton = "Project" diff --git a/client/src/components/Layout.tsx b/client/src/components/Layout.tsx index ae6d6c4..4e35167 100644 --- a/client/src/components/Layout.tsx +++ b/client/src/components/Layout.tsx @@ -1,13 +1,16 @@ import { ReactNode, useState, useEffect } from "react"; import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useLocation } from "wouter"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; -import { LogOut, Store, Menu, AlertTriangle } from "lucide-react"; +import { LogOut, Store, Menu, AlertTriangle, Smartphone, Monitor } from "lucide-react"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { useIsMobile } from "@/hooks/use-mobile"; import { useScreenSize } from "@/hooks/use-screen-size"; +import { usePhoneMode } from "@/hooks/use-phone-mode"; import { StoreProvider } from "@/contexts/StoreContext"; import Sidebar from "./Sidebar"; +import PhoneBottomNav from "./PhoneBottomNav"; import WeatherWidget from "./WeatherWidget"; import DateWidget from "./DateWidget"; import type { Group } from "@shared/schema"; @@ -19,9 +22,11 @@ interface LayoutProps { export default function Layout({ children }: LayoutProps) { const { user } = useAuthUnified(); + const [location] = useLocation(); const queryClient = useQueryClient(); const isMobile = useIsMobile(); const { screenSize, isMobileOrTablet, isTablet } = useScreenSize(); + const { isPhoneMode, setPhoneMode, canUsePhoneMode } = usePhoneMode(); const [selectedStoreId, setSelectedStoreId] = useState(() => { // Restaurer le selectedStoreId depuis localStorage si disponible @@ -120,28 +125,35 @@ export default function Layout({ children }: LayoutProps) { return ( -
- {/* Mobile overlay */} - {isMobile && mobileMenuOpen && ( +
+ {/* Mobile overlay for normal mode */} + {!isPhoneMode && isMobile && mobileMenuOpen && (
setMobileMenuOpen(false)} /> )} - + {/* Sidebar for normal mode */} + {!isPhoneMode && }
{/* Header with mobile menu and store selector */} -
- {/* Mobile menu button */} - {isMobile && ( + {/* Mobile menu button (only in normal mode) */} + {!isPhoneMode && isMobile && ( +
+ ) : ( + <> + + {!isMobile && } + + {/* Phone mode toggle button */} + {canUsePhoneMode && ( + + )} + + )}
{/* Store selector for admin, directeur, and manager - responsive */} - {user && (user.role === 'admin' || user.role === 'directeur' || user.role === 'manager') && stores.length > 0 && ( + {!isPhoneMode && user && (user.role === 'admin' || user.role === 'directeur' || user.role === 'manager') && stores.length > 0 && (