import { useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { BarChart3, Home, Info, Library, ListVideo, LogOut, Search, Settings, Shield, Tv, User } from "lucide-react"; import type { FeedFilters, Me } from "../lib/api"; import type { Page } from "../lib/urlState"; import { type LangCode } from "../i18n"; import SyncStatus from "./SyncStatus"; import NotificationCenter from "./NotificationCenter"; import LanguageSwitcher from "./LanguageSwitcher"; import AvatarImg from "./Avatar"; export default function Header({ me, filters, setFilters, page, setPage, onOpenSettings, onOpenAbout, onChangeLanguage, onGoToFullHistory, }: { me: Me; filters: FeedFilters; setFilters: (f: FeedFilters) => void; page: Page; setPage: (p: Page) => void; onOpenSettings: () => void; onOpenAbout: () => void; onChangeLanguage: (code: LangCode) => void; onGoToFullHistory: () => void; }) { const { t, i18n } = useTranslation(); async function logout() { await fetch("/auth/logout", { method: "POST", credentials: "include" }); location.reload(); } return (
{page === "feed" && (
{(["my", "all"] as const).map((s) => ( ))}
)} {page === "feed" ? (
setFilters({ ...filters, q: e.target.value })} placeholder={t("header.searchPlaceholder")} className="w-full bg-card border border-border rounded-full pl-9 pr-4 py-2 text-sm outline-none focus:border-accent" />
) : (
{page === "stats" ? t("header.usageStats") : page === "playlists" ? t("header.account.playlists") : t("header.channelManager")}
)}
); } function Avatar({ me, className = "" }: { me: Me; className?: string }) { return ( ); } function AccountMenu({ me, logout, page, setPage, onOpenSettings, onOpenAbout, }: { me: Me; logout: () => void; page: Page; setPage: (p: Page) => void; onOpenSettings: () => void; onOpenAbout: () => void; }) { const { t } = useTranslation(); const [open, setOpen] = useState(false); const closeTimer = useRef | null>(null); function openNow() { if (closeTimer.current) clearTimeout(closeTimer.current); setOpen(true); } function closeSoon() { closeTimer.current = setTimeout(() => setOpen(false), 220); } const itemClass = "w-full flex items-center gap-2 text-sm px-2 py-2 rounded-lg text-muted hover:text-fg hover:bg-card transition"; return (
{open && (
{me.display_name ?? me.email.split("@")[0]}
{me.email}
{me.role === "admin" && (
{t("header.account.admin")}
)}
{page !== "feed" && ( )} {page !== "channels" && ( )} {page !== "playlists" && ( )} {me.role === "admin" && page !== "stats" && ( )}
)}
); }