import React, { useMemo, useState } from "react"; import { CSSProperties } from "react"; type RequireOnlyOne = Pick> & { [K in Keys]-?: Required> & Partial, undefined>> }[Keys] interface TabItem { id: string; title: string; content?: any; dropDown?: any[]; alignEnd?: boolean; } export interface TabsProps { className?: string; style?: CSSProperties; card?: boolean; fullWidth?: boolean; allCaps?: boolean; tabs: TabItem[] | 'dropDown' | 'content'; defaultActiveIndex?: number; } const Tabs = ({ className, style, tabs, card, fullWidth, allCaps, defaultActiveIndex, }: TabsProps) => { const rnd = (Math.random() * 10000).toFixed(); const [active, setActive] = useState(defaultActiveIndex || 0); const classes = useMemo(() => { return [ `card${card ? '-tabs' : ''}`, className ].filter(Boolean).join(' ') }, [card, className]); const generateTabContent = (tab: TabItem, i: number) => { if (tab.dropDown && tab.dropDown?.length > 0) { return (
  • {tab.dropDown?.map((d, di) => ( {d} ))}
  • ) } return (
  • setActive(i)} id={i.toString()} className={`nav-item ${tab.alignEnd ? 'ms-auto' : ''}`} role="presentation"> {tab.title}
  • ) } const navClasses = useMemo(() => { return [ 'nav', 'nav-tabs', fullWidth && 'nav-fill', allCaps && 'nav-tabs-alt', ].filter(Boolean).join(' '); }, [allCaps, fullWidth]); return (
      {typeof tabs !== 'string' && tabs.map((tab, i) => generateTabContent(tab, i))}
    {typeof tabs !== 'string' && tabs.map((tab, i) => (
    {tab.content}
    ))}
    ) } export default Tabs;