diff options
| author | Rhys Sullivan <[email protected]> | 2025-12-11 18:57:03 -0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-12-11 21:57:03 -0500 |
| commit | 11efda3f5caae86848478cebe479cab5f5fde002 (patch) | |
| tree | 52492feab0961f7ec69c3b2a9c93e644ac4218f6 | |
| parent | a5cb4e41f5694744ec172c0b452a805f43ee55dc (diff) | |
| download | opencode-11efda3f5caae86848478cebe479cab5f5fde002.tar.gz opencode-11efda3f5caae86848478cebe479cab5f5fde002.zip | |
[feat]: show indicator for in progress chats in the sessions list (#5417)
| -rw-r--r-- | packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx | 6 | ||||
| -rw-r--r-- | packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx | 10 |
2 files changed, 15 insertions, 1 deletions
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 9610ca6d3..f5e0efa49 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 @@ -8,6 +8,7 @@ import { Keybind } from "@/util/keybind" import { useTheme } from "../context/theme" import { useSDK } from "../context/sdk" import { DialogSessionRename } from "./dialog-session-rename" +import "opentui-spinner/solid" export function DialogSessionList() { const dialog = useDialog() @@ -22,6 +23,8 @@ export function DialogSessionList() { const currentSessionID = createMemo(() => (route.data.type === "session" ? route.data.sessionID : undefined)) + const spinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] + const options = createMemo(() => { const today = new Date().toDateString() return sync.data.session @@ -34,12 +37,15 @@ export function DialogSessionList() { category = "Today" } const isDeleting = toDelete() === x.id + const status = sync.data.session_status[x.id] + const isWorking = status?.type === "busy" return { title: isDeleting ? `Press ${deleteKeybind} again to confirm` : x.title, bg: isDeleting ? theme.error : undefined, value: x.id, category, footer: Locale.time(x.time.updated), + gutter: isWorking ? <spinner frames={spinnerFrames} interval={80} color={theme.primary} /> : undefined, } }) .slice(0, 150) 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 b6c5b5f8b..3f49a7c32 100644 --- a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx +++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx @@ -36,6 +36,7 @@ export interface DialogSelectOption<T = any> { category?: string disabled?: boolean bg?: RGBA + gutter?: JSX.Element onSelect?: (ctx: DialogContext, trigger?: "prompt") => void } @@ -239,7 +240,7 @@ export function DialogSelect<T>(props: DialogSelectProps<T>) { moveTo(index) }} backgroundColor={active() ? (option.bg ?? theme.primary) : RGBA.fromInts(0, 0, 0, 0)} - paddingLeft={current() ? 1 : 3} + paddingLeft={current() || option.gutter ? 1 : 3} paddingRight={3} gap={1} > @@ -249,6 +250,7 @@ export function DialogSelect<T>(props: DialogSelectProps<T>) { description={option.description !== category ? option.description : undefined} active={active()} current={current()} + gutter={option.gutter} /> </box> ) @@ -282,6 +284,7 @@ function Option(props: { active?: boolean current?: boolean footer?: JSX.Element | string + gutter?: JSX.Element onMouseOver?: () => void }) { const { theme } = useTheme() @@ -294,6 +297,11 @@ function Option(props: { ● </text> </Show> + <Show when={!props.current && props.gutter}> + <box flexShrink={0} marginRight={0.5}> + {props.gutter} + </box> + </Show> <text flexGrow={1} fg={props.active ? fg : props.current ? theme.primary : theme.text} |
