import { useState, useMemo, type JSX } from 'react' import { Box, Button, Grid, ListItem, List, ListItemText } from '@mui/material' import { ListDataSkeleton } from './list-data-skeleton' import { NoDataAlert } from '../no-data-alert/no-data-alert' import { useSkeleton } from '../../hooks/use-skeleton' import type { ListDataProps } from './types' import { styles } from './styles' import { SmartTooltip } from '../smart-tooltip/smart-tooltip' const DEFAULT_LABELS = { showMore: 'Show More', showLess: 'Show Less', } as const const EMPTY_DATA: ListDataProps['data'] = [] /** * Displays structured data in an accessible list format with expandable views, interactive selection, tooltips, and loading states. * * @example * ```tsx * setSelectedId(item.id)} * selectedItemId={selectedId} * /> * ``` */ export function ListDataUI({ data = EMPTY_DATA, isLoading = false, maxItems = 5, labels = DEFAULT_LABELS, showDivider = true, selectedItemId, tooltipProps, onExpand, onItemClick, }: ListDataProps): JSX.Element { const [showAll, setShowAll] = useState(false) const showSkeleton = useSkeleton(isLoading) const items = useMemo(() => { return showAll ? data : data.slice(0, maxItems) }, [data, maxItems, showAll]) const handleToggle = () => { setShowAll(!showAll) onExpand?.(showAll) } if (showSkeleton) { return } if (items.length === 0) { return } return ( <> {items.map((item) => ( // Default tooltip props followCursor={false} key={item.id} placement='top' arrow title={item.tooltipTitle} enterDelay={10} // Custom tooltip props {...tooltipProps} > {({ ref }) => ( { if (item.disabled) return onItemClick?.(item) }} > )} ))} {data.length > maxItems && ( )} ) }