"use client"; import { useEffect, useRef, useState } from "react"; import { megaMenuTabs, navLinks, type MegaTab } from "@/data/home"; import { fetchCurrentUser, firstNameFor, getAdminDashboardUrl, getBusinessDashboardUrl, getCustomerDashboardUrl, type WebsiteAuthUser, } from "@/lib/auth-user"; import { searchMeshkeeCategories } from "@/lib/meshkee-categories"; import { buildMegaMenuTabs } from "@/lib/mega-menu"; import { clearTokens, getCustomerLoginUrl } from "@/lib/session"; import MegaMenu from "./MegaMenu"; import styles from "./Header.module.css"; const languages = [ { code: "en", label: "en", dir: "ltr" as const }, { code: "ar", label: "ar", dir: "rtl" as const }, { code: "fa", label: "fa", dir: "rtl" as const }, ]; function pickDefaultTabId(tabs: MegaTab[]) { return ( tabs.find((tab) => tab.id === "stores")?.id ?? tabs[0]?.id ?? megaMenuTabs[0].id ); } export default function Header() { const [open, setOpen] = useState(false); const [megaOpen, setMegaOpen] = useState(false); const [langOpen, setLangOpen] = useState(false); const [accountOpen, setAccountOpen] = useState(false); const [language, setLanguage] = useState(languages[0]); const [tabs, setTabs] = useState(megaMenuTabs); const [menuImages, setMenuImages] = useState([]); const [activeTabId, setActiveTabId] = useState(pickDefaultTabId(megaMenuTabs)); const [user, setUser] = useState(null); const [authReady, setAuthReady] = useState(false); const closeTimer = useRef(undefined); const headerRef = useRef(null); const langRef = useRef(null); const accountRef = useRef(null); const activeTab = tabs.find((tab) => tab.id === activeTabId) ?? tabs[0] ?? megaMenuTabs[0]; const customerUrl = getCustomerDashboardUrl(); const adminUrl = getAdminDashboardUrl(); const businessUrl = getBusinessDashboardUrl(); const firstName = firstNameFor(user); const isSuperAdmin = user?.dashboard === "super_admin"; const ownsBusiness = Boolean( user?.businesses.some((item) => item.isOwner) || user?.dashboard === "business", ); const showMega = () => { window.clearTimeout(closeTimer.current); setMegaOpen(true); }; const hideMega = () => { closeTimer.current = window.setTimeout(() => setMegaOpen(false), 160); }; const closeMega = () => { window.clearTimeout(closeTimer.current); setMegaOpen(false); }; const selectLanguage = (code: string) => { const next = languages.find((item) => item.code === code) ?? languages[0]; setLanguage(next); setLangOpen(false); document.documentElement.lang = next.code; document.documentElement.dir = next.dir; }; useEffect(() => { const controller = new AbortController(); void (async () => { try { const categories = await searchMeshkeeCategories("", controller.signal); if (controller.signal.aborted) return; const nextTabs = buildMegaMenuTabs(categories); if (!nextTabs.length) return; setTabs(nextTabs); setActiveTabId((current) => nextTabs.some((tab) => tab.id === current) ? current : pickDefaultTabId(nextTabs), ); } catch { /* keep static fallback */ } })(); return () => controller.abort(); }, []); useEffect(() => { const controller = new AbortController(); const api = process.env.NEXT_PUBLIC_MARKETPLACE_API_URL?.replace(/\/$/, "") || "http://localhost:3001/api/v1"; void (async () => { try { const response = await fetch(`${api}/website/home-media`, { signal: controller.signal, cache: "no-store", }); if (!response.ok || controller.signal.aborted) return; const data = (await response.json()) as { menuImages?: { imageUrl?: string }[]; }; if (controller.signal.aborted) return; setMenuImages( (data.menuImages ?? []).map((item) => item.imageUrl?.trim() ?? ""), ); } catch { /* keep built-in menu photos */ } })(); return () => controller.abort(); }, []); useEffect(() => { const controller = new AbortController(); void (async () => { try { const next = await fetchCurrentUser(controller.signal); if (!controller.signal.aborted) setUser(next); } catch { if (!controller.signal.aborted) setUser(null); } finally { if (!controller.signal.aborted) setAuthReady(true); } })(); return () => controller.abort(); }, []); useEffect(() => { const onKey = (event: KeyboardEvent) => { if (event.key === "Escape") { closeMega(); setLangOpen(false); setAccountOpen(false); } }; const onPointerDown = (event: PointerEvent) => { const target = event.target as Node; if (!headerRef.current?.contains(target)) { setMegaOpen(false); } if (!langRef.current?.contains(target)) { setLangOpen(false); } if (!accountRef.current?.contains(target)) { setAccountOpen(false); } }; window.addEventListener("keydown", onKey); window.addEventListener("pointerdown", onPointerDown); return () => { window.removeEventListener("keydown", onKey); window.removeEventListener("pointerdown", onPointerDown); }; }, []); function logout() { clearTokens(); setUser(null); setAccountOpen(false); } return (
IranBay IranBay A gate to iran market
{authReady && user ? ( ) : ( )}
{langOpen ? (
    {languages.map((item) => (
  • ))}
) : null}
{megaOpen ? (
) : null} {open ? ( ) : null}
); }