Files
ospab.host/ospabhost/frontend/src/components/header.tsx
2025-12-31 19:59:43 +03:00

142 lines
5.8 KiB
TypeScript

import { Link } from 'react-router-dom';
import { useState } from 'react';
import useAuth from '../context/useAuth';
import logo from '../assets/logo.svg';
import NotificationBell from './NotificationBell';
import { useTranslation } from '../i18n';
import { useLocalePath } from '../middleware';
const Header = () => {
const { isLoggedIn, logout } = useAuth();
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
const { t } = useTranslation();
const localePath = useLocalePath();
const handleLogout = () => {
logout();
setIsMobileMenuOpen(false);
};
return (
<header className="static bg-white shadow-md">
<div className="container mx-auto px-4 py-4">
<div className="flex justify-between items-center">
<div className="flex items-center gap-1">
<Link to={localePath('/')} className="flex items-center">
<img src={logo} alt="Logo" className="h-10 lg:h-14 w-auto mr-2" width="56" height="56" />
<span className="font-mono text-xl lg:text-2xl text-gray-800 font-bold">ospab.host</span>
</Link>
</div>
{/* Desktop Menu */}
<div className="hidden md:flex items-center space-x-4">
<Link to={localePath('/tariffs')} className="text-gray-600 hover:text-ospab-primary transition-colors">{t('nav.tariffs')}</Link>
<Link to={localePath('/blog')} className="text-gray-600 hover:text-ospab-primary transition-colors">{t('nav.blog')}</Link>
<Link to={localePath('/about')} className="text-gray-600 hover:text-ospab-primary transition-colors">{t('nav.about')}</Link>
{isLoggedIn ? (
<>
<Link to={localePath('/dashboard')} className="text-gray-600 hover:text-ospab-primary transition-colors">{t('nav.dashboard')}</Link>
<NotificationBell />
<button
onClick={handleLogout}
className="px-4 py-2 rounded-full text-white font-bold transition-colors transform hover:scale-105 bg-gray-500 hover:bg-red-500"
>
{t('nav.logout')}
</button>
</>
) : (
<>
<Link to={localePath('/login')} className="text-gray-600 hover:text-ospab-primary transition-colors">{t('nav.login')}</Link>
<Link
to={localePath('/register')}
className="px-4 py-2 rounded-full text-white font-bold transition-colors transform hover:scale-105 bg-ospab-primary hover:bg-ospab-accent"
>
{t('nav.register')}
</Link>
</>
)}
</div>
{/* Mobile Menu Button */}
<button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className="md:hidden p-2 text-gray-800"
aria-label={isMobileMenuOpen ? t('common.closeMenu') : t('common.openMenu')}
aria-expanded={isMobileMenuOpen}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
{isMobileMenuOpen ? (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
) : (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
)}
</svg>
</button>
</div>
{/* Mobile Menu */}
{isMobileMenuOpen && (
<div className="md:hidden mt-4 pb-4 space-y-2 border-t border-gray-200 pt-4">
<Link
to={localePath('/tariffs')}
className="block py-2 text-gray-600 hover:text-ospab-primary transition-colors"
onClick={() => setIsMobileMenuOpen(false)}
>
{t('nav.tariffs')}
</Link>
<Link
to={localePath('/blog')}
className="block py-2 text-gray-600 hover:text-ospab-primary transition-colors"
onClick={() => setIsMobileMenuOpen(false)}
>
{t('nav.blog')}
</Link>
<Link
to={localePath('/about')}
className="block py-2 text-gray-600 hover:text-ospab-primary transition-colors"
onClick={() => setIsMobileMenuOpen(false)}
>
{t('nav.about')}
</Link>
{isLoggedIn ? (
<>
<Link
to={localePath('/dashboard')}
className="block py-2 text-gray-600 hover:text-ospab-primary transition-colors"
onClick={() => setIsMobileMenuOpen(false)}
>
{t('nav.dashboard')}
</Link>
<button
onClick={handleLogout}
className="w-full text-left py-2 text-gray-600 hover:text-red-500 transition-colors"
>
{t('nav.logout')}
</button>
</>
) : (
<>
<Link
to={localePath('/login')}
className="block py-2 text-gray-600 hover:text-ospab-primary transition-colors"
onClick={() => setIsMobileMenuOpen(false)}
>
{t('nav.login')}
</Link>
<Link
to={localePath('/register')}
className="block w-full text-center mt-2 px-4 py-2 rounded-full text-white font-bold bg-ospab-primary hover:bg-ospab-accent"
onClick={() => setIsMobileMenuOpen(false)}
>
{t('nav.register')}
</Link>
</>
)}
</div>
)}
</div>
</header>
);
};
export default Header;