kontenhumas-fe/components/layout/admin-layout.tsx

81 lines
2.4 KiB
TypeScript
Raw Normal View History

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>
);
};