2025-09-16 08:29:07 +00:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
import React, { ReactNode } from "react";
|
|
|
|
|
import { ThemeProvider } from "./theme-context";
|
|
|
|
|
import { motion, AnimatePresence } from "framer-motion";
|
|
|
|
|
import { SidebarProvider } from "./sidebar-context";
|
2025-09-23 11:36:36 +00:00
|
|
|
import { ModernSidebar } from "./modern-sidebar";
|
|
|
|
|
import { ModernHeader } from "./modern-header";
|
2025-09-16 08:29:07 +00:00
|
|
|
|
|
|
|
|
export const AdminLayout = ({ children }: { children: ReactNode }) => {
|
2025-09-23 11:36:36 +00:00
|
|
|
const [sidebarOpen, setSidebarOpen] = useState(true);
|
2025-09-16 08:29:07 +00:00
|
|
|
const [hasMounted, setHasMounted] = useState(false);
|
|
|
|
|
|
2025-09-23 11:36:36 +00:00
|
|
|
const toggleSidebar = () => {
|
|
|
|
|
setSidebarOpen(!sidebarOpen);
|
2025-09-16 08:29:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Hooks
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setHasMounted(true);
|
2025-09-23 11:36:36 +00:00
|
|
|
// Auto-collapse sidebar on mobile
|
|
|
|
|
const handleResize = () => {
|
|
|
|
|
if (window.innerWidth < 1024) {
|
|
|
|
|
setSidebarOpen(false);
|
|
|
|
|
} else {
|
|
|
|
|
setSidebarOpen(true);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
handleResize();
|
|
|
|
|
window.addEventListener('resize', handleResize);
|
|
|
|
|
return () => window.removeEventListener('resize', handleResize);
|
2025-09-16 08:29:07 +00:00
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
// Render loading state until mounted
|
|
|
|
|
if (!hasMounted) {
|
|
|
|
|
return (
|
2025-09-23 11:36:36 +00:00
|
|
|
<div className="min-h-screen bg-gray-50 flex items-center justify-center">
|
2025-09-16 08:29:07 +00:00
|
|
|
<div className="animate-spin rounded-full h-32 w-32 border-b-2 border-blue-500"></div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<ThemeProvider>
|
|
|
|
|
<SidebarProvider>
|
2025-09-23 11:36:36 +00:00
|
|
|
<div className="min-h-screen bg-gray-50">
|
2025-09-16 08:29:07 +00:00
|
|
|
<div className="flex h-screen overflow-hidden">
|
2025-09-23 11:36:36 +00:00
|
|
|
{/* Modern Sidebar */}
|
|
|
|
|
<ModernSidebar isOpen={sidebarOpen} onToggle={toggleSidebar} />
|
2025-09-16 08:29:07 +00:00
|
|
|
|
2025-09-23 11:36:36 +00:00
|
|
|
{/* Main Content Area */}
|
|
|
|
|
<div
|
|
|
|
|
className={`flex-1 flex flex-col overflow-hidden transition-all duration-300 ml-0`}
|
|
|
|
|
>
|
|
|
|
|
{/* Modern Header */}
|
|
|
|
|
<ModernHeader
|
|
|
|
|
onMenuToggle={toggleSidebar}
|
|
|
|
|
sidebarOpen={sidebarOpen}
|
|
|
|
|
/>
|
2025-09-16 08:29:07 +00:00
|
|
|
|
2025-09-23 11:36:36 +00:00
|
|
|
{/* Main Content */}
|
|
|
|
|
<motion.main
|
|
|
|
|
className="flex-1 overflow-auto bg-gray-50"
|
|
|
|
|
initial={{ opacity: 0, y: 20 }}
|
|
|
|
|
animate={{ opacity: 1, y: 0 }}
|
|
|
|
|
transition={{ delay: 0.1, duration: 0.3 }}
|
|
|
|
|
>
|
|
|
|
|
<div className="p-6">
|
|
|
|
|
{children}
|
|
|
|
|
</div>
|
|
|
|
|
</motion.main>
|
|
|
|
|
</div>
|
2025-09-16 08:29:07 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</SidebarProvider>
|
|
|
|
|
</ThemeProvider>
|
|
|
|
|
);
|
|
|
|
|
};
|