tui: add escape key handling to permission dialogs for better keyboard navigation

This commit is contained in:
Dax Raad
2026-01-02 18:48:26 -05:00
parent 1261b7d333
commit 4956ee3ebd
3 changed files with 14 additions and 32 deletions

View File

@@ -1,6 +1,7 @@
import { createStore } from "solid-js/store"
import { createMemo, For, Match, Show, Switch } from "solid-js"
import { useKeyboard, useTerminalDimensions, type JSX } from "@opentui/solid"
import { useKeybind } from "../../context/keybind"
import { useTheme } from "../../context/theme"
import type { PermissionRequest } from "@opencode-ai/sdk/v2"
import { useSDK } from "../../context/sdk"
@@ -145,6 +146,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
</Switch>
}
options={{ confirm: "Confirm", cancel: "Cancel" }}
escapeKey="cancel"
onSelect={(option) => {
setStore("always", false)
if (option === "cancel") return
@@ -199,7 +201,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
<TextBody icon="◇" title={`Exa Code Search "` + (input().query ?? "") + `"`} />
</Match>
<Match when={props.request.permission === "external_directory"}>
<TextBody icon="" title={`Access external directory ` + normalizePath(input().path as string)} />
<TextBody icon="" title={`Access external directory ` + normalizePath(input().path as string)} />
</Match>
<Match when={props.request.permission === "doom_loop"}>
<TextBody icon="⟳" title="Continue after repeated failures" />
@@ -210,6 +212,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
</Switch>
}
options={{ once: "Allow once", always: "Allow always", reject: "Reject" }}
escapeKey="reject"
onSelect={(option) => {
if (option === "always") {
setStore("always", true)
@@ -230,9 +233,11 @@ function Prompt<const T extends Record<string, string>>(props: {
title: string
body: JSX.Element
options: T
escapeKey?: keyof T
onSelect: (option: keyof T) => void
}) {
const { theme } = useTheme()
const keybind = useKeybind()
const keys = Object.keys(props.options) as (keyof T)[]
const [store, setStore] = createStore({
selected: keys[0],
@@ -257,6 +262,11 @@ function Prompt<const T extends Record<string, string>>(props: {
evt.preventDefault()
props.onSelect(store.selected)
}
if (props.escapeKey && (evt.name === "escape" || keybind.match("app_exit", evt))) {
evt.preventDefault()
props.onSelect(props.escapeKey)
}
})
return (