import React, { FunctionComponent, useState, useEffect } from "react"; import { Link } from "react-router-dom"; import { WithLoader } from "../WithLoader"; export interface Item { id: string [propName: string]: any; } export interface TabDefinition { label: string itemFilter?: (item: Item) => boolean } export interface ItemPanelProps { className?: string itemIconClassName?: string title?: string newItemUrl: string isLoading?: boolean items: Item[] tabs?: TabDefinition[], itemKey: (item: Item, index: number) => string itemLabel: (item: Item, index: number) => string itemUrl: (item: Item, index: number) => string } export const ItemPanel: FunctionComponent = (props) => { const { title, className, newItemUrl, itemKey, itemLabel, itemIconClassName, itemUrl } = props; const [ state, setState ] = useState({ selectedTab: 0, filteredItems: [] }); const filterItemsForTab = (tab: TabDefinition, items: Item[]) => { const itemFilter = tab && typeof tab.itemFilter === 'function' ? tab.itemFilter : () => true; return items.filter(itemFilter); }; const selectTab = (tabIndex: number) => { setState(state => { const { tabs, items } = props; const newTab = Array.isArray(tabs) && tabs.length > 0 ? tabs[tabIndex] : null; return { ...state, selectedTab: tabIndex, filteredItems: filterItemsForTab(newTab, items) }; }); }; useEffect(() => { setState(state => { const { tabs, items } = props; const newTab = Array.isArray(tabs) && tabs.length > 0 ? tabs[state.selectedTab] : null; return { ...state, filteredItems: filterItemsForTab(newTab, items), } }); }, [props.items, props.tabs]); const itemElements = state.filteredItems.map((item: Item, i: number) => { return ( {itemLabel(item, i)} ); }); const tabs = props.tabs || []; return ( ) };