"use client" import { memo, useEffect, useLayoutEffect, useRef, useState } from "react" import { Icon } from "@iconify/react" import { inboxTabActiveAccentColor } from "@/lib/inbox-category-tabs" import { MAIL_INBOX_CATEGORY_TAB_CONTENT_DARK_CLASS, } from "@/lib/mail-chrome-classes" import { inboxTabShowsInactiveMeta } from "@/lib/mail-url" import { cn } from "@/lib/utils" export type CompactInboxCategoryTab = { id: string label: string icon: string badgeColor: string } const TAB_ICON_CLASS = "h-4 w-4 shrink-0" function inboxTabBadgeDotClass(badgeColor: string) { return cn( "absolute -right-0.5 -top-0.5 size-2 rounded-full ring-2 ring-mail-surface", badgeColor ) } type CompactInboxCategoryTabsProps = { tabs: readonly CompactInboxCategoryTab[] activeTabId: string unseenInTabById: Record onTabClick: (tabId: string) => void } export const CompactInboxCategoryTabs = memo(function CompactInboxCategoryTabs({ tabs, activeTabId, unseenInTabById, onTabClick, }: CompactInboxCategoryTabsProps) { const barRef = useRef(null) const [indicator, setIndicator] = useState({ x: 0, width: 0, ready: false }) const [optimisticTabId, setOptimisticTabId] = useState(null) const displayedTabId = optimisticTabId ?? activeTabId useEffect(() => { setOptimisticTabId(null) }, [activeTabId]) useLayoutEffect(() => { const bar = barRef.current if (!bar) return let raf = 0 const measure = () => { cancelAnimationFrame(raf) raf = requestAnimationFrame(() => { const activeBtn = bar.querySelector( `[data-inbox-tab="${displayedTabId}"]` ) if (!activeBtn) return const barRect = bar.getBoundingClientRect() const btnRect = activeBtn.getBoundingClientRect() const x = btnRect.left - barRect.left const width = btnRect.width setIndicator((prev) => prev.ready && prev.x === x && prev.width === width ? prev : { x, width, ready: true } ) }) } measure() const onResize = () => measure() window.addEventListener("resize", onResize, { passive: true }) const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(onResize) : null ro?.observe(bar) return () => { cancelAnimationFrame(raf) window.removeEventListener("resize", onResize) ro?.disconnect() } }, [displayedTabId, tabs]) const activeTab = tabs.find((t) => t.id === displayedTabId) const activeAccentColor = activeTab ? inboxTabActiveAccentColor(activeTab.id, activeTab.badgeColor) : "#0b57d0" return (
{tabs.map((tab) => { const isActive = displayedTabId === tab.id const accentColor = isActive ? inboxTabActiveAccentColor(tab.id, tab.badgeColor) : undefined const unseen = unseenInTabById[tab.id] ?? 0 const showMeta = inboxTabShowsInactiveMeta(tab.id) && !isActive && unseen > 0 return ( ) })}
) })