import { useState, ReactNode } from 'react'; import { Plus, LucideIcon } from 'lucide-react'; import { ScrollArea, Button, SearchInput, FeatureSidebarItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components'; interface FeatureSidebarProps { title: string; items: string[]; selectedItem?: string; onItemSelect: (itemName: string) => void; loading?: boolean; onNewItem?: () => void; onEditItem?: (itemName: string) => void; onDeleteItem?: (itemName: string) => void; searchPlaceholder?: string; newItemTooltip?: string; editLabel?: string; deleteLabel?: string; icon: LucideIcon; filterItems?: (itemNames: string[]) => string[]; renderSkeleton: () => ReactNode; renderEmptyState: (searchTerm: string) => ReactNode; } export function FeatureSidebar({ title, items, selectedItem, onItemSelect, loading, onNewItem, onEditItem, onDeleteItem, searchPlaceholder = 'Search...', newItemTooltip = 'Add new', editLabel = 'Edit', deleteLabel = 'Delete', icon, filterItems, renderSkeleton, renderEmptyState, }: FeatureSidebarProps) { const [searchTerm, setSearchTerm] = useState(''); let itemNames = items; if (filterItems) { itemNames = filterItems(itemNames); } const normalizedSearch = searchTerm.toLowerCase().replace(/\s+/g, ''); const filteredItems = itemNames.filter((name) => name.toLowerCase().replace(/\s+/g, '').includes(normalizedSearch) ); return (
{/* Header */}

{title}

{onNewItem && (

{newItemTooltip}

)}
{/* Add Button and Search */}
{/* Item List */} {loading ? ( renderSkeleton() ) : !filteredItems.length ? ( renderEmptyState(searchTerm) ) : (
{filteredItems.map((itemName) => ( onItemSelect(itemName)} onEdit={onEditItem ? () => onEditItem(itemName) : undefined} onDelete={onDeleteItem ? () => onDeleteItem(itemName) : undefined} editLabel={editLabel} deleteLabel={deleteLabel} /> ))}
)}
); }