mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-08 19:28:17 +00:00
164 lines
5.8 KiB
TypeScript
164 lines
5.8 KiB
TypeScript
'use client';
|
|
|
|
import { Train, Menu, X, Moon, Sun, HelpCircle } from 'lucide-react';
|
|
import Link from 'next/link';
|
|
import { useState, useEffect } from 'react';
|
|
import { LanguageSwitcher } from './LanguageSwitcher';
|
|
import { getTranslation, Language } from '@/lib/i18n';
|
|
import { useLanguage } from '@/lib/i18n';
|
|
|
|
export function LandingNav() {
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
const [lang, setLang] = useState<Language>('en');
|
|
const [isDark, setIsDark] = useState(false);
|
|
const [mounted, setMounted] = useState(false);
|
|
const { getLang } = useLanguage();
|
|
const t = (key: string) => getTranslation(lang, key);
|
|
|
|
useEffect(() => {
|
|
setMounted(true);
|
|
setLang(getLang());
|
|
const handleLanguageChange = (e: any) => setLang(e.detail);
|
|
window.addEventListener('languageChange', handleLanguageChange);
|
|
return () => window.removeEventListener('languageChange', handleLanguageChange);
|
|
}, [getLang]);
|
|
|
|
useEffect(() => {
|
|
const isDarkMode = document.documentElement.classList.contains('dark');
|
|
setIsDark(isDarkMode);
|
|
}, []);
|
|
|
|
const toggleTheme = () => {
|
|
const html = document.documentElement;
|
|
const isDarkMode = html.classList.contains('dark');
|
|
if (isDarkMode) {
|
|
html.classList.remove('dark');
|
|
setIsDark(false);
|
|
localStorage.setItem('theme', 'light');
|
|
} else {
|
|
html.classList.add('dark');
|
|
setIsDark(true);
|
|
localStorage.setItem('theme', 'dark');
|
|
}
|
|
};
|
|
|
|
const menuItems = [
|
|
{ label: t('nav.home'), href: '/' },
|
|
{ label: t('nav.services'), href: '/services' },
|
|
{ label: t('nav.about'), href: '/about' },
|
|
{ label: t('nav.contact'), href: '/contact' },
|
|
];
|
|
|
|
if (!mounted) return null;
|
|
|
|
return (
|
|
<nav className="sticky top-0 z-40 bg-[rgb(20_113_76)] border-b border-[rgb(16_89_60)] shadow-sm">
|
|
<div className="container mx-auto px-4">
|
|
<div className="max-w-6xl mx-auto">
|
|
<div className="flex items-center justify-between h-16">
|
|
{/* Logo */}
|
|
<Link href="/" className="flex items-center gap-3 hover:opacity-80 transition-opacity">
|
|
<div className="w-10 h-10 bg-white rounded-lg flex items-center justify-center">
|
|
<Train className="w-6 h-6 text-[rgb(20_113_76)]" />
|
|
</div>
|
|
<div>
|
|
<h1 className="text-lg font-bold text-white">
|
|
Ethio-Djibouti Railway
|
|
</h1>
|
|
<p className="text-xs text-gray-100">
|
|
Book your train journey with us
|
|
</p>
|
|
</div>
|
|
</Link>
|
|
|
|
{/* Desktop Menu */}
|
|
<div className="hidden md:flex items-center gap-8">
|
|
{menuItems.map((item) => (
|
|
<Link
|
|
key={item.href}
|
|
href={item.href}
|
|
className="text-sm font-medium text-gray-100 hover:text-white transition-colors"
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
))}
|
|
</div>
|
|
|
|
{/* Right Actions */}
|
|
<div className="flex items-center gap-3">
|
|
<LanguageSwitcher />
|
|
|
|
{/* Help Link */}
|
|
<Link
|
|
href="/help"
|
|
className="hidden sm:flex items-center gap-1.5 px-3 py-2 text-gray-100 hover:bg-white hover:bg-opacity-10 rounded-lg transition-colors"
|
|
title="Help & FAQ"
|
|
>
|
|
<HelpCircle className="w-5 h-5" />
|
|
</Link>
|
|
|
|
{/* Theme Toggler */}
|
|
<button
|
|
onClick={toggleTheme}
|
|
className="p-2 text-gray-100 hover:bg-white hover:bg-opacity-10 rounded-lg transition-colors"
|
|
title={isDark ? 'Light mode' : 'Dark mode'}
|
|
>
|
|
{isDark ? (
|
|
<Sun className="w-5 h-5" />
|
|
) : (
|
|
<Moon className="w-5 h-5" />
|
|
)}
|
|
</button>
|
|
|
|
<Link
|
|
href="/booking/search"
|
|
className="hidden sm:block px-4 py-2 bg-white text-[rgb(20_113_76)] text-sm font-medium rounded-lg transition-all duration-200 transform hover:scale-105 hover:bg-gray-100"
|
|
>
|
|
{t('nav.bookNow')}
|
|
</Link>
|
|
|
|
{/* Mobile Menu Button */}
|
|
<button
|
|
onClick={() => setIsOpen(!isOpen)}
|
|
className="md:hidden p-2 text-gray-100 hover:bg-white hover:bg-opacity-10 rounded-lg"
|
|
>
|
|
{isOpen ? <X className="w-5 h-5" /> : <Menu className="w-5 h-5" />}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Mobile Menu */}
|
|
{isOpen && (
|
|
<div className="md:hidden border-t border-white border-opacity-20 py-4 space-y-2 animate-in slide-in-from-top-2 duration-200">
|
|
{menuItems.map((item) => (
|
|
<Link
|
|
key={item.href}
|
|
href={item.href}
|
|
className="block px-4 py-2 text-gray-100 hover:bg-white hover:bg-opacity-10 rounded-lg transition-colors"
|
|
onClick={() => setIsOpen(false)}
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
))}
|
|
<Link
|
|
href="/help"
|
|
className="block px-4 py-2 text-gray-100 hover:bg-white hover:bg-opacity-10 rounded-lg transition-colors"
|
|
onClick={() => setIsOpen(false)}
|
|
>
|
|
{t('nav.help')}
|
|
</Link>
|
|
<Link
|
|
href="/booking/search"
|
|
className="block px-4 py-2 bg-white text-[rgb(20_113_76)] font-medium rounded-lg transition-colors hover:bg-gray-100"
|
|
onClick={() => setIsOpen(false)}
|
|
>
|
|
{t('nav.bookNow')}
|
|
</Link>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
);
|
|
}
|