146 lines · 5.1 KB · TypeScript
RawDownload
import { type ResolvedKeybindingsConfig } from "@t3tools/contracts";import { ChevronRightIcon } from "lucide-react";import { shortcutLabelForCommand } from "../keybindings";import {  type CommandPaletteActionItem,  type CommandPaletteGroup,  type CommandPaletteSubmenuItem,} from "./CommandPalette.logic";import {  CommandCollection,  CommandGroup,  CommandGroupLabel,  CommandItem,  CommandList,  CommandShortcut,} from "./ui/command";import { cn } from "~/lib/utils"; interface CommandPaletteResultsProps {  emptyStateMessage?: string;  groups: ReadonlyArray<CommandPaletteGroup>;  highlightedItemValue?: string | null;  isActionsOnly: boolean;  keybindings: ResolvedKeybindingsConfig;  onExecuteItem: (item: CommandPaletteActionItem | CommandPaletteSubmenuItem) => void;} export function CommandPaletteResults(props: CommandPaletteResultsProps) {  if (props.groups.length === 0) {    return (      <div className="py-10 text-center text-sm text-muted-foreground">        {props.emptyStateMessage ??          (props.isActionsOnly            ? "No matching actions."            : "No matching commands, projects, or threads.")}      </div>    );  }   return (    <CommandList>      {props.groups.map((group) => (        <CommandGroup items={group.items} key={group.value}>          <CommandGroupLabel>{group.label}</CommandGroupLabel>          <CommandCollection>            {(item) =>              item.disabled ? (                <DisabledCommandPaletteResultRow item={item} key={item.value} />              ) : (                <CommandPaletteResultRow                  item={item}                  key={item.value}                  keybindings={props.keybindings}                  isActive={props.highlightedItemValue === item.value}                  onExecuteItem={props.onExecuteItem}                />              )            }          </CommandCollection>        </CommandGroup>      ))}    </CommandList>  );} function DisabledCommandPaletteResultRow(props: {  item: CommandPaletteActionItem | CommandPaletteSubmenuItem;}) {  return (    <div className="flex min-h-8 select-none items-center gap-2 rounded-sm px-2 py-1.5 text-base opacity-64 sm:min-h-7 sm:text-sm">      {props.item.icon}      {props.item.description ? (        <span className="flex min-w-0 flex-1 flex-col">          <span className="flex min-w-0 items-center gap-1.5 text-sm text-foreground">            {props.item.titleLeadingContent}            <span className="truncate">{props.item.title}</span>          </span>          <span className="truncate text-muted-foreground/70 text-xs">            {props.item.description}          </span>        </span>      ) : (        <span className="flex min-w-0 flex-1 items-center gap-1.5 text-sm text-foreground">          {props.item.titleLeadingContent}          <span className="truncate">{props.item.title}</span>        </span>      )}      {props.item.titleTrailingContent}    </div>  );} function CommandPaletteResultRow(props: {  item: CommandPaletteActionItem | CommandPaletteSubmenuItem;  isActive: boolean;  keybindings: ResolvedKeybindingsConfig;  onExecuteItem: (item: CommandPaletteActionItem | CommandPaletteSubmenuItem) => void;}) {  const shortcutLabel = props.item.shortcutCommand    ? shortcutLabelForCommand(props.keybindings, props.item.shortcutCommand)    : null;   return (    <CommandItem      value={props.item.value}      className={cn(        "cursor-pointer gap-2 hover:bg-transparent hover:text-inherit data-highlighted:bg-transparent data-highlighted:text-inherit data-selected:bg-transparent data-selected:text-inherit [&[data-highlighted][data-selected]]:bg-transparent [&[data-highlighted][data-selected]]:text-inherit",        props.isActive && "bg-accent! text-accent-foreground!",      )}      onMouseDown={(event) => {        event.preventDefault();      }}      onClick={() => {        props.onExecuteItem(props.item);      }}    >      {props.item.icon}      {props.item.description ? (        <span className="flex min-w-0 flex-1 flex-col">          <span className="flex min-w-0 items-center gap-1.5 text-sm text-foreground">            {props.item.titleLeadingContent}            <span className="truncate">{props.item.title}</span>          </span>          <span className="truncate text-muted-foreground/70 text-xs">            {props.item.description}          </span>        </span>      ) : (        <span className="flex min-w-0 flex-1 items-center gap-1.5 text-sm text-foreground">          {props.item.titleLeadingContent}          <span className="truncate">{props.item.title}</span>        </span>      )}      {props.item.titleTrailingContent}      {props.item.timestamp ? (        <span className="min-w-12 shrink-0 text-right text-[10px] tabular-nums text-muted-foreground/70">          {props.item.timestamp}        </span>      ) : null}      {shortcutLabel ? <CommandShortcut>{shortcutLabel}</CommandShortcut> : null}      {props.item.kind === "submenu" ? (        <ChevronRightIcon className="ml-auto size-4 shrink-0 text-muted-foreground/50" />      ) : null}    </CommandItem>  );}