diff --git a/packages/app/e2e/regression/settings-loading.spec.ts b/packages/app/e2e/regression/settings-loading.spec.ts index fc9cfda8d87..4749e79b970 100644 --- a/packages/app/e2e/regression/settings-loading.spec.ts +++ b/packages/app/e2e/regression/settings-loading.spec.ts @@ -27,6 +27,12 @@ test.beforeEach(async ({ page }) => { })), pageMessages: () => ({ items: [] }), }) + await page.addInitScript((directory) => { + localStorage.setItem( + "opencode.global.dat:server", + JSON.stringify({ projects: { local: [{ worktree: directory, expanded: true }] } }), + ) + }, directory) await page.goto("/") await page.getByRole("button", { name: "Settings", exact: true }).click() await expect(page.getByTestId("settings-screen").getByRole("tab", { name: "Preferences" })).toBeVisible() @@ -50,6 +56,34 @@ test("settings has its own route and returns through app history", async ({ page await expect(home).toHaveAttribute("aria-pressed", "true") }) +test("new session shortcut leaves settings and opens a new session screen", async ({ page }) => { + const settings = page.getByTestId("settings-screen") + await expect(settings).toBeFocused() + await page.keyboard.press("Control+t") + + await expect(page).toHaveURL(/\/new-session\?draftId=.+$/) + await expect(settings).toBeHidden() + await expect(page.locator('[data-component="composer-editor"]')).toBeEditable() + await expect(page.locator('[data-titlebar-tab][data-active="true"]')).toHaveCount(1) +}) + +test("recording a new session shortcut stays in settings until recording finishes", async ({ page }) => { + const settings = page.getByTestId("settings-screen") + await settings.getByRole("tab", { name: "Shortcuts", exact: true }).click() + const binding = settings.locator('[data-keybind-id="tab.new"]') + await binding.click() + await expect(binding).toHaveText("Press keys") + await page.keyboard.press("Control+t") + + await expect(binding).toHaveText("Ctrl+T") + await expect(page).toHaveURL("/settings") + await expect(page.locator("[data-titlebar-tab]")).toHaveCount(0) + await page.keyboard.press("Control+t") + await expect(page).toHaveURL(/\/new-session\?draftId=.+$/) + await expect(settings).toBeHidden() + await expect(page.locator('[data-component="composer-editor"]')).toBeEditable() +}) + test("workspaces opens without waiting for inventory or sessions", async ({ page }) => { const inventory = Promise.withResolvers() const sessions = Promise.withResolvers() diff --git a/packages/app/src/settings/shell.tsx b/packages/app/src/settings/shell.tsx index b85cecb270a..678f93aec4e 100644 --- a/packages/app/src/settings/shell.tsx +++ b/packages/app/src/settings/shell.tsx @@ -1,4 +1,4 @@ -import { Component, createEffect, createMemo, For, Show, onCleanup, onMount, startTransition } from "solid-js" +import { Component, createEffect, createMemo, For, Show, onMount, startTransition } from "solid-js" import { Tabs } from "@opencode-ai/ui/tabs" import { Icon } from "@opencode-ai/ui/icon" import { Menu } from "@opencode-ai/ui/menu" @@ -22,7 +22,6 @@ import { useLayout } from "@/shell/state/layout" import { useTabs } from "@/shell/tabs/tabs" import { useGlobal, useServerCtx } from "@/runtime/server/runtime" import { ServerConnection, useServers } from "@/runtime/server/registry" -import { useCommand } from "@/shell/commands/command" import { useSettingsSurface } from "./surface" import "@/settings/settings.css" @@ -50,7 +49,6 @@ const sections = [ export const SettingsScreen: Component = () => { const language = useLanguage() const dialog = useDialog() - const command = useCommand() const surface = useSettingsSurface() const layout = useLayout() const servers = useServers() @@ -59,10 +57,8 @@ export const SettingsScreen: Component = () => { let root: HTMLDivElement | undefined onMount(() => { - command.keybinds(false) root?.focus({ preventScroll: true }) }) - onCleanup(() => command.keybinds(true)) const server = createMemo(() => { const route = surface.route()