Skip to content

Commit 03159e8

Browse files
fix(app): auto-accept toggle fallback directory when no session
1 parent 1674747 commit 03159e8

4 files changed

Lines changed: 67 additions & 10 deletions

File tree

packages/app/e2e/regression/remote-session-settings.spec.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,41 @@ test("auto-accept responds for an unfocused server session", async ({ page }) =>
142142
])
143143
})
144144

145+
test("auto-accept toggle stays enabled on a new-session draft", async ({ page }) => {
146+
const permissionRequests: string[] = []
147+
await mockServers(page, permissionRequests)
148+
await configureServers(page, [{ type: "draft", server: serverB, draftID: "draft-1", directory: directoryB }])
149+
150+
await page.goto("/new-session?draftId=draft-1")
151+
// Wait for server-backed controls: the page command registrations
152+
// (including settings.open) mount with this tree, so the keypress below
153+
// must not race them.
154+
await expect(page.getByRole("button", { name: "Server B Model" })).toBeVisible()
155+
await page.keyboard.press("Control+,")
156+
157+
const dialog = page.locator(".settings-v2-dialog")
158+
const autoAccept = dialog.locator('[data-action="settings-auto-accept-permissions"]')
159+
await expect(autoAccept).toBeVisible()
160+
await expect(autoAccept.getByRole("switch")).toBeEnabled()
161+
await autoAccept.locator('[data-slot="switch-control"]').click()
162+
await expect(autoAccept.getByRole("switch")).toBeChecked()
163+
})
164+
165+
test("auto-accept toggle stays disabled on home with no project selected", async ({ page }) => {
166+
const permissionRequests: string[] = []
167+
await mockServers(page, permissionRequests)
168+
await configureServers(page)
169+
170+
await page.goto("/")
171+
await page.keyboard.press("Control+,")
172+
173+
const dialog = page.locator(".settings-v2-dialog")
174+
const autoAccept = dialog.locator('[data-action="settings-auto-accept-permissions"]')
175+
await expect(autoAccept).toBeVisible()
176+
// No directory context on bare home: nothing to scope the flag to.
177+
await expect(autoAccept.getByRole("switch")).toBeDisabled()
178+
})
179+
145180
type PermissionResponse = {
146181
origin: string
147182
directory?: string
@@ -150,7 +185,10 @@ type PermissionResponse = {
150185
body: unknown
151186
}
152187

153-
async function configureServers(page: Page, tabs: { type: "session"; server: string; sessionId: string }[] = []) {
188+
async function configureServers(
189+
page: Page,
190+
tabs: ({ type: "session"; server: string; sessionId: string } | { type: "draft"; server: string; draftID: string; directory: string })[] = [],
191+
) {
154192
await page.addInitScript(
155193
({ serverB, tabs }) => {
156194
localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))

packages/app/src/components/settings-v2/dialog-settings-v2.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ export const DialogSettings: Component<{
3434
return draft?.type === "draft" ? draft.directory : undefined
3535
}
3636
if (route.type === "session") return serverSync().session.get(route.sessionId)?.directory
37+
// AUTO_ACCEPT_DIRECTORY_FALLBACK_002: on home, scope to the selected
38+
// project when the user picked one; bare home has nothing to scope to.
39+
if (route.type === "home") return layout.home.selection().directory
3740
return undefined
3841
})
3942

@@ -94,7 +97,7 @@ export const DialogSettings: Component<{
9497
</div>
9598
</TabsV2.List>
9699
<TabsV2.Content value="general" class="settings-v2-panel">
97-
<SettingsGeneralV2 sessionID={props.sessionID} />
100+
<SettingsGeneralV2 sessionID={props.sessionID} directory={directory()} />
98101
</TabsV2.Content>
99102
<TabsV2.Content value="shortcuts" class="settings-v2-panel">
100103
<SettingsKeybinds v2 />

packages/app/src/components/settings-v2/general-controllers.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,42 @@ import { createSoundPreviewController, type ShellOption } from "./general-contro
2222
export { createShellOptions, createSoundPreviewController } from "./general-controller-behavior"
2323
export type { ShellOption, ShellSelectOption } from "./general-controller-behavior"
2424

25-
export function createPermissionScopeController(sessionID: Accessor<string | undefined>) {
25+
export function createPermissionScopeController(
26+
sessionID: Accessor<string | undefined>,
27+
fallbackDirectory?: Accessor<string | undefined>,
28+
) {
2629
const permission = usePermission()
2730
const serverSync = useServerSync()
31+
// AUTO_ACCEPT_DIRECTORY_FALLBACK_002: resolve the scope directory from the
32+
// session lineage when a session exists, otherwise fall back to the active
33+
// route directory (new-session/draft views) so the toggle stays usable.
2834
const directory = createMemo(() => {
2935
const id = sessionID()
30-
if (!id) return undefined
31-
return serverSync().session.lineage.peek(id)?.session.directory
36+
if (id) {
37+
const dir = serverSync().session.lineage.peek(id)?.session.directory
38+
if (dir) return dir
39+
}
40+
return fallbackDirectory?.()
3241
})
3342

3443
return {
3544
accepting: createMemo(() => {
36-
const id = sessionID()
3745
const dir = directory()
38-
if (!id || !dir) return false
46+
if (!dir) return false
47+
const id = sessionID()
48+
if (!id) return permission.isAutoAcceptingDirectory(dir)
3949
return permission.isAutoAccepting(id, dir)
4050
}),
4151
enabled: createMemo(() => !!directory()),
4252
set: (checked: boolean) => {
43-
const id = sessionID()
4453
const dir = directory()
45-
if (!id || !dir) return
54+
if (!dir) return
55+
const id = sessionID()
56+
if (!id) {
57+
if (permission.isAutoAcceptingDirectory(dir) === checked) return
58+
permission.toggleAutoAcceptDirectory(dir)
59+
return
60+
}
4661
if (checked) return permission.enableAutoAccept(id, dir)
4762
permission.disableAutoAccept(id, dir)
4863
},

packages/app/src/components/settings-v2/general.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,14 +273,15 @@ const LanguageSetting = () => {
273273

274274
export const SettingsGeneralV2: Component<{
275275
sessionID?: string
276+
directory?: string
276277
}> = (props) => {
277278
const language = useLanguage()
278279
const platform = usePlatform()
279280
const dialog = useDialog()
280281
const settings = useSettings()
281282
const mobile = createMediaQuery("(max-width: 767px)")
282283
const updater = useUpdaterAction()
283-
const permissionScope = createPermissionScopeController(() => props.sessionID)
284+
const permissionScope = createPermissionScopeController(() => props.sessionID, () => props.directory)
284285
const shell = createShellSettingsController()
285286
const appearance = createAppearanceSettingsController()
286287
const sounds = createSoundSettingsController()

0 commit comments

Comments
 (0)