// Copyright 2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { KeyboardEvent } from 'react'; import React, { useState } from 'react'; import classNames from 'classnames'; import { assertDev } from '../util/assert'; import { getClassNamesFor } from '../util/getClassNamesFor'; type Tab = { id: string; label: string; }; export type TabsOptionsType = { initialSelectedTab?: string; moduleClassName?: string; onTabChange?: (selectedTab: string) => unknown; tabs: Array<Tab>; }; export function useTabs({ initialSelectedTab, moduleClassName, onTabChange, tabs, }: TabsOptionsType): { selectedTab: string; tabsHeaderElement: JSX.Element; } { assertDev(tabs.length, 'Tabs needs more than 1 tab present'); const getClassName = getClassNamesFor('Tabs', moduleClassName); const [selectedTab, setSelectedTab] = useState<string>( initialSelectedTab || tabs[0].id ); const tabsHeaderElement = ( <div className={getClassName('')}> {tabs.map(({ id, label }) => ( <div className={classNames( getClassName('__tab'), selectedTab === id && getClassName('__tab--selected') )} key={id} onClick={() => { setSelectedTab(id); onTabChange?.(id); }} onKeyUp={(e: KeyboardEvent) => { if (e.target === e.currentTarget && e.keyCode === 13) { setSelectedTab(id); e.preventDefault(); e.stopPropagation(); } }} role="tab" tabIndex={0} > {label} </div> ))} </div> ); return { selectedTab, tabsHeaderElement, }; }