fix(tui): prioritize composer keybinds (#42384)
This commit is contained in:
@@ -94,6 +94,7 @@ export function Composer(props: ComposerProps) {
|
||||
Keymap.createLayer(() => ({
|
||||
mode: "composer",
|
||||
enabled: () => props.open,
|
||||
priority: 1,
|
||||
commands: [
|
||||
{ bind: "left", title: "Previous tab", group: "Composer", run: () => switchTab(-1) },
|
||||
{ bind: "right", title: "Next tab", group: "Composer", run: () => switchTab(1) },
|
||||
|
||||
@@ -23,19 +23,6 @@ export function ShellTab(props: { sessionID: string }) {
|
||||
|
||||
const selectedEntry = createMemo(() => entries()[store.selected])
|
||||
|
||||
const keymap = Keymap.use()
|
||||
createEffect(() => {
|
||||
if (!composer.active("shell")) return
|
||||
const cleanup = keymap.intercept("key", ({ event, consume }) => {
|
||||
if (event.name !== "d" || !event.ctrl) return
|
||||
if (!shortcuts.list("composer.shell.kill").includes("ctrl+d")) return
|
||||
if (!selectedEntry()) return
|
||||
consume()
|
||||
keymap.dispatch("composer.shell.kill")
|
||||
})
|
||||
onCleanup(cleanup)
|
||||
})
|
||||
|
||||
createEffect(() => {
|
||||
if (store.selected >= entries().length) setStore("selected", Math.max(0, entries().length - 1))
|
||||
})
|
||||
@@ -63,6 +50,7 @@ export function ShellTab(props: { sessionID: string }) {
|
||||
Keymap.createLayer(() => ({
|
||||
mode: "composer",
|
||||
enabled: () => composer.active("shell"),
|
||||
priority: 1,
|
||||
commands: [
|
||||
{
|
||||
id: "composer.shell.up",
|
||||
|
||||
@@ -164,6 +164,7 @@ export function SubagentsTab(props: { sessionID: string }) {
|
||||
Keymap.createLayer(() => ({
|
||||
mode: "composer",
|
||||
enabled: () => composer.active("subagents"),
|
||||
priority: 1,
|
||||
commands: [
|
||||
{
|
||||
id: "composer.subagent.up",
|
||||
|
||||
@@ -95,7 +95,6 @@ async function renderComposer(
|
||||
<TestTuiContexts directory={directory}>
|
||||
<ConfigProvider config={createTuiResolvedConfig({ keybinds })}>
|
||||
<Keymap.Provider>
|
||||
<AppExit />
|
||||
<ClientProvider api={createApi(calls.fetch)}>
|
||||
<DataProvider>
|
||||
<LocationProvider>
|
||||
@@ -107,6 +106,7 @@ async function renderComposer(
|
||||
</LocationProvider>
|
||||
</DataProvider>
|
||||
</ClientProvider>
|
||||
<AppExit />
|
||||
</Keymap.Provider>
|
||||
</ConfigProvider>
|
||||
</TestTuiContexts>
|
||||
@@ -173,11 +173,13 @@ test("disabled shell bindings have no component fallbacks", async () => {
|
||||
}
|
||||
})
|
||||
|
||||
test("shell kill binding overrides app exit", async () => {
|
||||
const composer = await renderComposer("shell", {}, true)
|
||||
test("configured composer bindings work with a focused textarea", async () => {
|
||||
const composer = await renderComposer("subagents", { "composer.shell.kill": "ctrl+u" }, true)
|
||||
try {
|
||||
composer.app.mockInput.pressArrow("right")
|
||||
await composer.app.renderOnce()
|
||||
expect(composer.app.captureCharFrame()).toContain("bun test")
|
||||
composer.app.mockInput.pressKey("d", { ctrl: true })
|
||||
composer.app.mockInput.pressKey("u", { ctrl: true })
|
||||
await wait(() => composer.removed.length === 1)
|
||||
expect(composer.removed).toEqual(["sh-a"])
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user