"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 "settings": return ( ); case "admin": return ( ); case "chevron-down": 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 [userMenuOpen, setUserMenuOpen] = useState(false); const adminMenuRef = useRef(null); const userMenuRef = 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); setUserMenuOpen(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 (!userMenuOpen && !adminMenuOpen) return; const onMouseDown = (e: MouseEvent) => { const target = e.target as Node | null; const insideAdmin = adminMenuRef.current && target && adminMenuRef.current.contains(target); const insideUser = userMenuRef.current && target && userMenuRef.current.contains(target); if (!insideAdmin) setAdminMenuOpen(false); if (!insideUser) setUserMenuOpen(false); }; const onKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { setAdminMenuOpen(false); setUserMenuOpen(false); } }; document.addEventListener("mousedown", onMouseDown); document.addEventListener("keydown", onKeyDown); return () => { document.removeEventListener("mousedown", onMouseDown); document.removeEventListener("keydown", onKeyDown); }; }, [adminMenuOpen, userMenuOpen]); return (
Lomavuokraus.fi logo {t("brand")} {t("navBrowse")}
); }