blob: c254263624a719d7cb236e5c119f6a55faad96a9 [file] [log] [blame]
import { classNames } from "../../utils";
import { HiChevronDown, HiChevronUp } from "react-icons/hi";
export const Tabs = (props: {
allTabs: { name: string; displayName: string }[];
setCurrentTab: (tab: string) => void;
currentTab: string;
isMinimized: boolean;
setIsMinimized: (minimized: boolean) => void | null;
additionalElement?: JSX.Element;
}) => {
const Icon = props.isMinimized ? HiChevronDown : HiChevronUp;
return (
<div>
<div>
<div className="sm:hidden">
<label htmlFor="tabs" className="sr-only">
Select a tab
</label>
{/* Use an "onChange" listener to redirect the user to the selected tab URL. */}
<select
id="tabs"
name="tabs"
className="block w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-base focus:border-dwdarkblue focus:outline-none focus:ring-dwdarkblue sm:text-sm"
defaultValue={props.currentTab}
>
{props.allTabs.map((tab) => (
<option key={tab.name}>{tab.displayName}</option>
))}
</select>
</div>
<div className="hidden sm:block">
<div className="border-b border-gray-200">
<div className="flex flex-row justify-start">
{props.setIsMinimized && (
<div className="pt-4 pl-3 pr-5 text-2xl text-gray-500">
<Icon
className="hover:scale-125 hover:cursor-pointer"
onClick={() => props.setIsMinimized(!props.isMinimized)}
/>
</div>
)}
<nav className="-mb-px flex space-x-8" aria-label="Tabs">
{props.allTabs.map((tab) => (
<div
onClick={() => {
props.setCurrentTab(tab.name);
props.setIsMinimized(false);
}}
key={tab.name}
className={classNames(
tab.name === props.currentTab
? "border-dwdarkblue text-dwdarkblue"
: "border-transparent text-gray-400 hover:border-gray-300 hover:text-gray-700",
"whitespace-nowrap border-b-2 py-4 px-1 text-sm font-medium cursor-pointer"
)}
aria-current={
tab.name === props.currentTab ? "page" : undefined
}
>
{tab.displayName}
</div>
))}
</nav>
{props.additionalElement ? (
<div className="py-4 px-1 text-sm font-medium cursor-pointer">
{props.additionalElement}
</div>
) : (
<></>
)}
</div>
</div>
</div>
</div>
</div>
);
};