import { Box, Button, Fade, Flex, IconButton, Stack } from '@chakra-ui/react' import { TrashIcon, PlusIcon } from 'assets/icons' import cuid from 'cuid' import React, { useState } from 'react' type ItemWithId = T & { id: string } export type TableListItemProps = { item: T debounceTimeout?: number onItemChange: (item: T) => void } type Props = { initialItems: ItemWithId[] addLabel?: string debounceTimeout?: number onItemsChange: (items: ItemWithId[]) => void Item: (props: TableListItemProps) => JSX.Element ComponentBetweenItems?: (props: unknown) => JSX.Element } export const TableList = ({ initialItems, onItemsChange, addLabel = 'Add', debounceTimeout, Item, ComponentBetweenItems = () => <>, }: Props) => { const [items, setItems] = useState(initialItems) const [showDeleteIndex, setShowDeleteIndex] = useState(null) const createItem = () => { const id = cuid() const newItem = { id } as ItemWithId setItems([...items, newItem]) onItemsChange([...items, newItem]) } const updateItem = (itemIndex: number, updates: Partial) => { const newItems = items.map((item, idx) => idx === itemIndex ? { ...item, ...updates } : item ) setItems(newItems) onItemsChange(newItems) } const deleteItem = (itemIndex: number) => () => { const newItems = [...items] newItems.splice(itemIndex, 1) setItems([...newItems]) onItemsChange([...newItems]) } const handleMouseEnter = (itemIndex: number) => () => setShowDeleteIndex(itemIndex) const handleCellChange = (itemIndex: number) => (item: T) => updateItem(itemIndex, item) const handleMouseLeave = () => setShowDeleteIndex(null) return ( {items.map((item, itemIndex) => ( {itemIndex !== 0 && } } aria-label="Remove cell" onClick={deleteItem(itemIndex)} pos="absolute" left="-15px" top="-15px" size="sm" shadow="md" /> ))} ) }