import { generateGuid } from '@vev/utils'; import React, { useMemo } from 'react'; import { SilkeBox } from '../silke-box'; import { SilkeDivider } from '../silke-divider'; import { SilkeTextSmall } from '../silke-text'; import type { SilkeListItemType } from './types'; import { groupSilkeListItems, isSilkeListItem } from './utils'; import { SilkeListItem } from './silke-list-item'; import { SilkeSortableItemWrapper } from '../silke-sortable-list/silke-sortable-item-wrapper'; import styles from './silke-list.scss'; type SilkeListProps = { items: SilkeListItemType[] | (() => SilkeListItemType[]); size?: 's' | 'base'; gap?: boolean; maxHeight?: number; /** Enable drag-and-drop reordering of items */ sortable?: boolean; disabled?: boolean; onSelect?: (item: SilkeListItemType) => void; /** Called with the reordered items array after a drag-and-drop sort */ onSort?: (items: SilkeListItemType[]) => void; }; export function SilkeList({ items, size, gap, maxHeight, sortable, disabled, onSelect, onSort }: SilkeListProps) { const resolvedItems = typeof items === 'function' ? items() : items; const groupedItems = groupSilkeListItems(resolvedItems); const hasGroups = groupedItems.some((g) => g.groupLabel); const listId = useMemo(() => generateGuid(), []); const renderItem = (item: SilkeListItemType, index: number, keyPrefix: string) => { const content = ( {isSilkeListItem(item) ? ( onSelect?.(item)} /> ) : item === 'divider' ? ( ) : ( React.isValidElement(item) && item )} ); if (sortable && !disabled && onSort && item !== 'divider') { return ( {content} ); } return content; }; return ( {groupedItems.map((group, groupIndex) => ( {group.groupLabel && ( {group.groupLabel} )} {group.items.map((item, index) => renderItem(item, index, group.groupLabel ?? `group-${groupIndex}`), )} ))} ); }