import React, { useCallback, useMemo, useState } from 'react'; import { usePage } from '@inertiajs/react'; import { Link, router } from '@inertiajs/react'; import { useTranslation } from 'react-i18next'; import i18n from '@/i18n'; import { useAppearance } from '@/hooks/use-appearance'; import { useLocalizedRoutes } from '@/hooks/useLocalizedRoutes'; import profileRoutes from '@/routes/profile'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { Sheet, SheetClose, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; import { Separator } from '@/components/ui/separator'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion'; import { Sun, Moon, Menu, X, Languages, UserRound } from 'lucide-react'; import { cn } from '@/lib/utils'; import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, navigationMenuTriggerStyle, } from '@/components/ui/navigation-menu'; const Header: React.FC = () => { const { auth } = usePage<{ auth: { user?: { name?: string; email?: string; avatar?: string } } }>().props; const { t } = useTranslation('auth'); const { appearance, updateAppearance } = useAppearance(); const { localizedPath } = useLocalizedRoutes(); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const setTheme = useCallback((mode: 'light' | 'dark') => { if (appearance !== mode) { updateAppearance(mode); } setMobileMenuOpen(false); }, [appearance, updateAppearance]); const toggleTheme = () => { setTheme(appearance === 'dark' ? 'light' : 'dark'); }; const handleLanguageChange = useCallback(async (value: string) => { //console.log('handleLanguageChange called with:', value); try { const response = await fetch('/set-locale', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '', }, body: JSON.stringify({ locale: value }), }); //console.log('fetch response:', response.status); if (response.ok) { //console.log('calling i18n.changeLanguage with:', value); i18n.changeLanguage(value); // Reload only the locale prop to update the page props router.reload({ only: ['locale'] }); setMobileMenuOpen(false); } } catch (error) { console.error('Failed to change locale:', error); } }, [setMobileMenuOpen]); const handleLogout = () => { router.post('/logout', {}, { onFinish: () => setMobileMenuOpen(false), }); }; const ctaHref = localizedPath('/demo'); const navItems = useMemo(() => { const howItWorksHref = localizedPath('/so-funktionierts'); return [ { key: 'howItWorks', label: t('header.how_it_works', "So geht's"), href: howItWorksHref, }, { key: 'packages', label: t('header.packages', 'Pakete'), href: localizedPath('/packages'), }, { key: 'occasions', label: t('header.occasions.label', 'Anlässe'), children: [ { key: 'wedding', label: t('header.occasions.wedding', 'Hochzeiten'), href: localizedPath('/anlaesse/hochzeit'), }, { key: 'birthday', label: t('header.occasions.birthday', 'Geburtstage'), href: localizedPath('/anlaesse/geburtstag'), }, { key: 'corporate', label: t('header.occasions.corporate', 'Firmenfeiern'), href: localizedPath('/anlaesse/firmenevent'), }, { key: 'confirmation', label: t('header.occasions.confirmation', 'Konfirmation/Jugendweihe'), href: localizedPath('/anlaesse/konfirmation'), }, ], }, { key: 'blog', label: t('header.blog', 'Blog'), href: localizedPath('/blog'), }, { key: 'contact', label: t('header.contact', 'Kontakt'), href: localizedPath('/kontakt'), }, ]; }, [localizedPath, t]); const handleNavSelect = useCallback(() => setMobileMenuOpen(false), []); return (
Fotospiel App Logo Die Fotospiel App {navItems.map((item) => ( {item.children ? ( <> {item.label}
    {item.children.map((child) => (
  • {child.label}
  • ))}
) : ( {item.label} )}
))}
{t('header.appearance', 'Darstellung')} setTheme('light')} className="font-sans-marketing"> {t('header.appearance_light', 'Hell')} setTheme('dark')} className="font-sans-marketing"> {t('header.appearance_dark', 'Dunkel')} {t('header.language', 'Sprache')} Deutsch English {auth.user ? (

{auth.user?.name || auth.user?.email || 'User'}

{auth.user?.email || ''}

Profil Bestellungen Abmelden
) : ( )}
Menü
Sprache
{t('header.cta', 'Jetzt ausprobieren')}
Darstellung
{auth.user ? ( <> Profil Bestellungen ) : (
{t('header.login')}
)}
); }; export default Header;