import { ReactNode, useState } from 'react'; import { BlockContext, useBlock } from '../../Provider'; import { BlocksDependenciesContext, useBlocks, } from '../../Provider/blocksContext'; import { ActionConfig, Action } from '../Action'; import { BaseBlock } from '../BaseBlock'; import { BlocksList, BlocksListConfig } from '../BlocksList'; import { BaseBlockConfig } from '../types'; interface TabsViewConfig extends BaseBlockConfig { tabs: ({ text: ReactNode; content: BlocksListConfig; } & ActionConfig)[]; } interface TabsViewProps extends TabsViewConfig { events: BlockContext['events']; Link: BlocksDependenciesContext['components']['Link']; } function isAction( action: Partial ): action is Omit { return !!(action.type && action.value); } export const TabsView = ({ tabs = [], className, events, Link, }: TabsViewProps) => { const [currentTab, setCurrentTab] = useState(0); return (
{tabs.map(({ text, ...action }, k) => { const navigate = () => setCurrentTab(k); if (isAction(action)) { return ( ); } return ( ); })}
{tabs[currentTab] && tabs[currentTab].content && ( )}
); }; const defaultStyles = `:block { display: flex; flex-direction: column; flex: 1; } .pr-block-tabs-view__tabs { display: flex; flex-direction: row; } .pr-block-tabs-view__tab { display: flex; padding: .5rem 1rem; margin: .5rem; border-radius: .5rem; border: 1px solid var(--accent-color); } .pr-block-tabs-view__tab--active { background: var(--accent-color); color: var(--accent-contrast-color); }`; export const TabsViewInContext = () => { const { config, events } = useBlock(); const { components: { Link }, } = useBlocks(); return ( ); }; TabsViewInContext.styles = defaultStyles; export default TabsViewInContext;