"use client"; import { cn } from "@/lib/utils"; import { Tab, tabs, useMediaPanelStore } from "./store"; import { Button } from "@/components/ui/button"; import { ChevronRight, ChevronLeft } from "lucide-react"; import { useRef, useState, useEffect } from "react"; export function TabBar() { const { activeTab, setActiveTab } = useMediaPanelStore(); const scrollContainerRef = useRef(null); const [isAtEnd, setIsAtEnd] = useState(false); const [isAtStart, setIsAtStart] = useState(true); const scrollToEnd = () => { if (scrollContainerRef.current) { scrollContainerRef.current.scrollTo({ left: scrollContainerRef.current.scrollWidth, }); setIsAtEnd(true); setIsAtStart(false); } }; const scrollToStart = () => { if (scrollContainerRef.current) { scrollContainerRef.current.scrollTo({ left: 0, }); setIsAtStart(true); setIsAtEnd(false); } }; const checkScrollPosition = () => { if (scrollContainerRef.current) { const { scrollLeft, scrollWidth, clientWidth } = scrollContainerRef.current; const isAtEndNow = scrollLeft + clientWidth >= scrollWidth - 1; const isAtStartNow = scrollLeft <= 1; setIsAtEnd(isAtEndNow); setIsAtStart(isAtStartNow); } }; // We're using useEffect because we need to sync with external DOM scroll events useEffect(() => { const container = scrollContainerRef.current; if (!container) return; checkScrollPosition(); container.addEventListener("scroll", checkScrollPosition); const resizeObserver = new ResizeObserver(checkScrollPosition); resizeObserver.observe(container); return () => { container.removeEventListener("scroll", checkScrollPosition); resizeObserver.disconnect(); }; }, []); return (
{(Object.keys(tabs) as Tab[]).map((tabKey) => { const tab = tabs[tabKey]; return (
setActiveTab(tabKey)} key={tabKey} > {tab.label}
); })}
); } function ScrollButton({ direction, onClick, isVisible, }: { direction: "left" | "right"; onClick: () => void; isVisible: boolean; }) { if (!isVisible) return null; const Icon = direction === "left" ? ChevronLeft : ChevronRight; return (
); }