'use client'; import Link from 'next/link'; import Image from 'next/image'; import { useEffect, useRef, useState, type SVGProps } from 'react'; import { useI18n } from './I18nProvider'; import logo from '../../img/logo.png'; type SessionUser = { id: string; email: string; role: string; status: string }; function Icon({ name }: { name: string }) { const common: SVGProps = { width: 16, height: 16, stroke: 'currentColor', fill: 'none', strokeWidth: 1.6, strokeLinecap: 'round', strokeLinejoin: 'round', }; switch (name) { case 'profile': return ( ); case 'list': return ( ); case 'plus': return ( ); case 'logout': return ( ); case 'login': return ( ); case 'users': return ( ); case 'check': return ( ); case 'globe': return ( ); case 'monitor': return ( ); case 'admin': return ( ); default: return null; } } export default function NavBar() { const { t, locale, setLocale } = useI18n(); const [user, setUser] = useState(null); const [pendingCount, setPendingCount] = useState(0); const [adminMenuOpen, setAdminMenuOpen] = useState(false); const adminMenuRef = useRef(null); async function loadUser() { try { const res = await fetch('/api/auth/me', { cache: 'no-store' }); const data = await res.json(); if (data.user) setUser(data.user); else setUser(null); } catch (e) { setUser(null); } } useEffect(() => { loadUser(); }, []); useEffect(() => { if (!user) setAdminMenuOpen(false); }, [user]); useEffect(() => { const role = user?.role; const canSeeApprovals = role === 'ADMIN' || role === 'LISTING_MODERATOR' || role === 'USER_MODERATOR'; if (!canSeeApprovals) { setPendingCount(0); return; } fetch('/api/admin/pending/count', { cache: 'no-store' }) .then((res) => res.json()) .then((data) => { if (data && typeof data.total === 'number') setPendingCount(data.total); }) .catch(() => setPendingCount(0)); }, [user]); async function logout() { try { await fetch('/api/auth/logout', { method: 'POST' }); } catch (e) { // ignore } setUser(null); } const isAdmin = user?.role === 'ADMIN'; const isListingMod = user?.role === 'LISTING_MODERATOR'; const isUserMod = user?.role === 'USER_MODERATOR'; const showApprovals = Boolean(user && (isAdmin || isListingMod || isUserMod)); const showAdminMenu = Boolean(user && (showApprovals || isAdmin)); useEffect(() => { if (!adminMenuOpen) return; const onMouseDown = (e: MouseEvent) => { const target = e.target as Node | null; if (target && adminMenuRef.current && !adminMenuRef.current.contains(target)) { setAdminMenuOpen(false); } }; const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') setAdminMenuOpen(false); }; document.addEventListener('mousedown', onMouseDown); document.addEventListener('keydown', onKeyDown); return () => { document.removeEventListener('mousedown', onMouseDown); document.removeEventListener('keydown', onKeyDown); }; }, [adminMenuOpen]); return (
Lomavuokraus.fi logo {t('brand')} {t('navBrowse')}
); }