import React, { useState, useRef } from 'react'; import { Outlet, useLocation } from 'react-router-dom'; import { Moon, Sun, Globe, Menu } from 'lucide-react'; import { User } from '../types'; import PlatformSidebar from '../components/PlatformSidebar'; import UserProfileDropdown from '../components/UserProfileDropdown'; import NotificationDropdown from '../components/NotificationDropdown'; import LanguageSelector from '../components/LanguageSelector'; import TicketModal from '../components/TicketModal'; import HelpButton from '../components/HelpButton'; import { useTicket } from '../hooks/useTickets'; import { useScrollToTop } from '../hooks/useScrollToTop'; interface PlatformLayoutProps { user: User; darkMode: boolean; toggleTheme: () => void; onSignOut: () => void; } const PlatformLayout: React.FC = ({ user, darkMode, toggleTheme, onSignOut }) => { const [isCollapsed, setIsCollapsed] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [ticketModalId, setTicketModalId] = useState(null); const mainContentRef = useRef(null); const location = useLocation(); // Pages that need edge-to-edge rendering (no padding) const noPaddingRoutes = ['/help/api-docs', '/platform/email']; useScrollToTop(mainContentRef); // Fetch ticket data when modal is opened from notification const { data: ticketFromNotification } = useTicket(ticketModalId && ticketModalId !== 'undefined' ? ticketModalId : undefined); const handleTicketClick = (ticketId: string) => { setTicketModalId(ticketId); }; const closeTicketModal = () => { setTicketModalId(null); }; return (
{/* Mobile menu */}
{ }} />
{isMobileMenuOpen &&
setIsMobileMenuOpen(false)}>
} {/* Static sidebar for desktop */}
setIsCollapsed(!isCollapsed)} />
{/* Main Content Area */}
{/* Platform Top Bar */}
smoothschedule.com / Admin Console
{/* Ticket modal opened from notification */} {ticketModalId && ticketFromNotification && ( )}
); }; export default PlatformLayout;