diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx index 32342e77247d..3e6844cb2283 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx @@ -1,5 +1,5 @@ import { useDialog } from "@tui/ui/dialog" -import { DialogSelect } from "@tui/ui/dialog-select" +import { DialogSelect, type DialogSelectRef } from "@tui/ui/dialog-select" import { useRoute } from "@tui/context/route" import { useSync } from "@tui/context/sync" import { createMemo, createResource, createSignal, onMount } from "solid-js" @@ -31,6 +31,8 @@ export function DialogSessionList() { const toast = useToast() const [toDelete, setToDelete] = createSignal() const [search, setSearch] = createDebouncedSignal("", 150) + const [selectRef, setSelectRef] = createSignal>() + const [searchResults, { refetch }] = createResource(search, async (query) => { if (!query) return undefined @@ -176,6 +178,7 @@ export function DialogSessionList() { return ( { if (toDelete() === option.value) { + const ref = selectRef() + const currentIndex = ref?.filtered.findIndex((opt) => opt.value === option.value) ?? -1 const session = sessions().find((item) => item.id === option.value) - const status = session?.workspaceID ? project.workspace.status(session.workspaceID) : undefined + const wsStatus = session?.workspaceID ? project.workspace.status(session.workspaceID) : undefined try { const result = await sdk.client.session.delete({ @@ -230,11 +235,20 @@ export function DialogSessionList() { setToDelete(undefined) return } - if (status && status !== "connected") { + if (wsStatus && wsStatus !== "connected") { await sync.session.refresh() } if (search()) await refetch() setToDelete(undefined) + + if (ref && currentIndex >= 0) { + setTimeout(() => { + const newIndex = Math.min(currentIndex, ref.filtered.length - 1) + if (newIndex >= 0) { + ref.moveTo(newIndex, true) + } + }, 50) + } return } setToDelete(option.value) diff --git a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx index dda9a5a8ed8e..fda92c3af1be 100644 --- a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx +++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx @@ -50,6 +50,7 @@ export interface DialogSelectOption { export type DialogSelectRef = { filter: string filtered: DialogSelectOption[] + moveTo: (index: number, center?: boolean) => void } export function DialogSelect(props: DialogSelectProps) { @@ -232,6 +233,7 @@ export function DialogSelect(props: DialogSelectProps) { get filtered() { return filtered() }, + moveTo, } props.ref?.(ref)