'use client' import { cn, CommandList } from 'ui' import { ShimmeringLoader } from 'ui-patterns' import { TextHighlighter } from 'ui-patterns/CommandMenu' import { CommandMenuGroup } from 'ui-patterns/CommandMenu/internal/CommandMenuGroup' import { CommandMenuItem } from 'ui-patterns/CommandMenu/internal/CommandMenuItem' import type { IActionCommand, IRouteCommand } from 'ui-patterns/CommandMenu/internal/types' export interface SearchResult { id: string name: string description?: string } export function SkeletonResults() { return (
{[0, 1, 2, 3].map((i) => (
))}
) } interface EmptyStateProps { icon: React.ComponentType> label: string query: string } export function EmptyState({ icon: Icon, label, query }: EmptyStateProps) { return (

{query ? `No results found for "${query}"` : `Type to search in ${label}`}

) } interface ResultsListProps { results: SearchResult[] icon: React.ComponentType> getIcon?: (result: SearchResult) => React.ComponentType> onResultClick?: (result: SearchResult) => void getRoute?: (result: SearchResult) => `/${string}` | `http${string}` className?: string } export function ResultsList({ results, icon: Icon, getIcon, onResultClick, getRoute, className, }: ResultsListProps) { const commands = results.map((result): IRouteCommand | IActionCommand => { const ResultIcon = getIcon ? getIcon(result) : Icon const baseCommand = { id: result.id, name: result.name, value: result.description ? `${result.name} ${result.description}` : result.name, icon: () => , } if (getRoute) { return { ...baseCommand, route: getRoute(result), } as IRouteCommand } return { ...baseCommand, action: () => onResultClick?.(result), } as IActionCommand }) return ( {commands.map((command) => (
{command.name} {command.value && command.value !== command.name && (

{command.value.replace(command.name, '').trim()}

)}
))}
) }