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}`),
)}
))}
);
}