Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Dax Raad <d@ironbay.co>
50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
import { createMemo } from "solid-js"
|
|
import { DialogSelect, type DialogSelectRef } from "../ui/dialog-select"
|
|
import { type DialogContext } from "../ui/dialog"
|
|
import { COMMAND_PALETTE_COMMAND, Keymap, type KeymapCommand } from "../context/keymap"
|
|
|
|
function isSuggestedPaletteCommand(command: KeymapCommand) {
|
|
const suggested = command.suggested
|
|
if (typeof suggested === "boolean") return suggested
|
|
if (typeof suggested === "function") return suggested() === true
|
|
return false
|
|
}
|
|
|
|
export function CommandPaletteDialog() {
|
|
const commands = Keymap.useCommands()
|
|
const shortcuts = Keymap.useShortcuts()
|
|
const options = createMemo(() =>
|
|
commands().flatMap((command) => {
|
|
if (!command.id || !command.palette || command.id === COMMAND_PALETTE_COMMAND) return []
|
|
return {
|
|
title: command.title ?? command.id,
|
|
description: command.description,
|
|
category: command.group,
|
|
footer: shortcuts.all(command.id),
|
|
value: command.id,
|
|
suggested: isSuggestedPaletteCommand(command),
|
|
onSelect: (dialog: DialogContext) => {
|
|
dialog.clear()
|
|
command.run()
|
|
},
|
|
}
|
|
}),
|
|
)
|
|
|
|
let ref: DialogSelectRef<string>
|
|
const list = () => {
|
|
if (ref?.filter) return options()
|
|
return [
|
|
...options()
|
|
.filter((option) => option.suggested)
|
|
.map((option) => ({
|
|
...option,
|
|
value: `suggested:${option.value}`,
|
|
category: "Suggested",
|
|
})),
|
|
...options(),
|
|
]
|
|
}
|
|
|
|
return <DialogSelect ref={(value) => (ref = value)} title="Commands" options={list()} />
|
|
}
|