import { useRef, useState } from "react"; import { Home, LayoutGrid, List, LogOut, Moon, Palette, Search, Settings, Shield, Sun, Tv, } from "lucide-react"; import { SCHEMES, type Scheme, type ThemePrefs } from "../lib/theme"; import type { FeedFilters, Me } from "../lib/api"; import type { Page } from "../lib/urlState"; import SyncStatus from "./SyncStatus"; import NotificationCenter from "./NotificationCenter"; function IconBtn(props: React.ButtonHTMLAttributes) { const { className = "", ...rest } = props; return ( {page === "feed" ? (
setFilters({ ...filters, q: e.target.value })} placeholder="Search your subscriptions…" className="w-full bg-card border border-border rounded-full pl-9 pr-4 py-2 text-sm outline-none focus:border-accent" />
) : (
Channel manager
)}
{page === "feed" && ( setView(view === "grid" ? "list" : "grid")} title={view === "grid" ? "List view" : "Grid view"} > {view === "grid" ? : } )} setTheme({ ...theme, mode: theme.mode === "dark" ? "light" : "dark" })} title="Toggle dark / light" > {theme.mode === "dark" ? : }
setMenuOpen((o) => !o)} title="Theme"> {menuOpen && ( <>
setMenuOpen(false)} /> )}
); } function Avatar({ me, className = "" }: { me: Me; className?: string }) { return me.avatar_url ? ( ) : (
{(me.display_name?.[0] ?? me.email[0] ?? "?").toUpperCase()}
); } function AccountMenu({ me, logout, page, setPage, onOpenSettings, }: { me: Me; logout: () => void; page: Page; setPage: (p: Page) => void; onOpenSettings: () => void; }) { 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" && (
Admin
)}
{page === "channels" ? ( ) : ( )}
)}
); }