create-ex-den-kit
Version:
Create exam projects with Ex-Den-Kit
133 lines (118 loc) • 4.45 kB
JSX
import React from 'react';
import { Outlet, Link, useNavigate, useLocation } from 'react-router-dom';
import { motion } from 'framer-motion';
import { useAuth } from '../contexts/AuthContext';
import { useTheme } from '../contexts/ThemeContext';
import {
Home,
PlusCircle,
Archive,
LogOut,
Palette,
User
} from 'lucide-react';
const Layout = () => {
const { user, logout } = useAuth();
const { config } = useTheme();
const navigate = useNavigate();
const location = useLocation();
const handleLogout = () => {
logout();
navigate('/login');
};
const navItems = [
{ path: '/dashboard', label: 'Мои записи', icon: Home },
{ path: '/create', label: 'Создать запись', icon: PlusCircle },
];
if (config.features.archive) {
navItems.push({ path: '/archive', label: 'Архив', icon: Archive });
}
return (
<div className="min-h-screen bg-gray-50">
{/* Header */}
<motion.header
initial={{ y: -100 }}
animate={{ y: 0 }}
className="bg-white shadow-lg border-b border-gray-200"
>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between items-center h-16">
<div className="flex items-center space-x-4">
<span className="text-2xl">{config.icon}</span>
<h1 className="text-xl font-bold text-gray-900">{config.name}</h1>
</div>
<nav className="hidden md:flex space-x-8">
{navItems.map((item) => {
const Icon = item.icon;
const isActive = location.pathname === item.path;
return (
<Link
key={item.path}
to={item.path}
className={`flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium transition-all duration-200
${isActive
? 'text-primary bg-primary/10'
: 'text-gray-700 hover:text-primary hover:bg-gray-100'
}`}
>
<Icon size={18} />
<span>{item.label}</span>
</Link>
);
})}
</nav>
<div className="flex items-center space-x-4">
<Link
to="/theme"
className="p-2 rounded-lg hover:bg-gray-100 transition-colors"
title="Сменить тему"
>
<Palette size={20} className="text-gray-600" />
</Link>
<div className="flex items-center space-x-3">
<div className="flex items-center space-x-2">
<User size={18} className="text-gray-600" />
<span className="text-sm font-medium text-gray-700">
{user?.fullName}
</span>
</div>
<button
onClick={handleLogout}
className="flex items-center space-x-1 px-3 py-2 text-sm text-red-600 hover:bg-red-50 rounded-md transition-colors"
>
<LogOut size={18} />
<span>Выход</span>
</button>
</div>
</div>
</div>
</div>
</motion.header>
{/* Mobile Navigation */}
<div className="md:hidden fixed bottom-0 left-0 right-0 bg-white border-t border-gray-200 z-50">
<div className="flex justify-around items-center h-16">
{navItems.map((item) => {
const Icon = item.icon;
const isActive = location.pathname === item.path;
return (
<Link
key={item.path}
to={item.path}
className={`flex flex-col items-center justify-center flex-1 h-full
${isActive ? 'text-primary' : 'text-gray-600'}`}
>
<Icon size={24} />
<span className="text-xs mt-1">{item.label}</span>
</Link>
);
})}
</div>
</div>
{/* Main Content */}
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8 pb-20 md:pb-8">
<Outlet />
</main>
</div>
);
};
export default Layout;