import { Tab } from "@headlessui/react"; import React, { FC, Fragment, useEffect, useState } from "react"; // helpers import { useLocalStorage } from "@plane/hooks"; import { cn } from "../utils"; // types import { TabList, TabListItem } from "./tab-list"; export type TabContent = { content: React.ReactNode; }; export type TabItem = TabListItem & TabContent; type TTabsProps = { tabs: TabItem[]; storageKey?: string; actions?: React.ReactNode; defaultTab?: string; containerClassName?: string; tabListContainerClassName?: string; tabListClassName?: string; tabClassName?: string; tabPanelClassName?: string; size?: "sm" | "md" | "lg"; storeInLocalStorage?: boolean; }; export const Tabs: FC = (props: TTabsProps) => { const { tabs, storageKey, actions, defaultTab = tabs[0]?.key, containerClassName = "", tabListContainerClassName = "", tabListClassName = "", tabClassName = "", tabPanelClassName = "", size = "md", storeInLocalStorage = true, } = props; // local storage const { storedValue, setValue } = useLocalStorage( storeInLocalStorage && storageKey ? `tab-${storageKey}` : `tab-${tabs[0]?.key}`, defaultTab ); // state const [selectedTab, setSelectedTab] = useState(storedValue ?? defaultTab); useEffect(() => { if (storeInLocalStorage) { setValue(selectedTab); } }, [selectedTab, setValue, storeInLocalStorage, storageKey]); const currentTabIndex = (tabKey: string): number => tabs.findIndex((tab) => tab.key === tabKey); const handleTabChange = (key: string) => { setSelectedTab(key); }; return (
{actions &&
{actions}
}
{tabs.map((tab) => ( {tab.content} ))}
); };