From 9930f40105e38d1b29bcec13ff9da8773f017e5e Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Thu, 11 Sep 2025 08:19:18 +0000 Subject: [PATCH] Introduce a mobile-friendly phone mode with a bottom navigation bar Add phone mode functionality with a new bottom navigation component and adjust layout styles for smaller screens. Includes logic for auto-detection and user preference saving for phone mode. Also, redirects authenticated users from `/auth` to the dashboard. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 95e8aab4-f39f-4b48-aa57-a759ec15ba3d Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/95e8aab4-f39f-4b48-aa57-a759ec15ba3d/oL3c3As --- .replit | 4 +- client/src/components/Layout.tsx | 79 +++++++++-- client/src/components/PhoneBottomNav.tsx | 148 +++++++++++++++++++++ client/src/components/RouterProduction.tsx | 11 ++ client/src/hooks/use-phone-mode.ts | 82 ++++++++++++ client/src/index.css | 89 +++++++++++++ 6 files changed, 397 insertions(+), 16 deletions(-) create mode 100644 client/src/components/PhoneBottomNav.tsx create mode 100644 client/src/hooks/use-phone-mode.ts 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 && (