'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()}
)}
))}
)
}