guesstimate/client/src/components/tabs/index.tsx

50 lines
1.4 KiB
TypeScript
Raw Normal View History

2020-07-09 13:00:42 +02:00
import React, { FunctionComponent, useState, ReactNode } from "react";
2020-04-22 22:07:52 +02:00
import style from "./style.module.css";
2020-04-21 14:10:50 +02:00
export interface TabItem {
label: string
icon?: string
2020-07-09 13:00:42 +02:00
render: () => ReactNode
2020-04-21 14:10:50 +02:00
}
export interface TabsProps {
class?: string
items: TabItem[]
}
2020-07-09 13:00:42 +02:00
const Tabs: FunctionComponent<TabsProps> = ({ items, ...props }) => {
2020-04-21 14:10:50 +02:00
const [ selectedTabIndex, setSelectedTabIndex ] = useState(0);
const onTabClick = (tabIndex: number) => {
setSelectedTabIndex(tabIndex);
};
const selectedTab = items[selectedTabIndex];
return (
2020-07-09 13:00:42 +02:00
<div className={`${style.tabs} ${props.class}`}>
<div className="tabs">
<ul className={`noPrint`}>
2020-04-21 14:10:50 +02:00
{
items.map((tabItem, tabIndex) => (
<li key={`tab-${tabIndex}`}
onClick={onTabClick.bind(null, tabIndex)}
2020-07-09 13:00:42 +02:00
className={`${selectedTabIndex === tabIndex ? 'is-active' : ''}`}>
2020-04-21 14:10:50 +02:00
<a>
2020-07-09 13:00:42 +02:00
<span className="icon is-small">{tabItem.icon}</span>
2020-04-21 14:10:50 +02:00
{tabItem.label}
</a>
</li>
))
}
</ul>
</div>
2020-07-09 13:00:42 +02:00
<div className={style.tabContent}>
2020-04-21 14:10:50 +02:00
{ selectedTab.render() }
</div>
</div>
);
};
export default Tabs;