diff options
| author | Dax Raad <[email protected]> | 2025-11-19 20:18:04 -0500 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-11-19 20:18:15 -0500 |
| commit | 61007a9b9499d161189cf95caf5240965d021a03 (patch) | |
| tree | 05002f83c2e5156d59fe161d0341ba98cf56025f | |
| parent | 52fe1a5ac52bfc8535f74b5fdc6d1ea7b3642bd0 (diff) | |
| download | opencode-61007a9b9499d161189cf95caf5240965d021a03.tar.gz opencode-61007a9b9499d161189cf95caf5240965d021a03.zip | |
refactor: switch to Switch/Match pattern for assistant message status rendering
| -rw-r--r-- | packages/opencode/src/cli/cmd/tui/routes/session/index.tsx | 107 |
1 files changed, 55 insertions, 52 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 6ae31dbed..190180d9b 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -982,59 +982,62 @@ function AssistantMessage(props: { message: AssistantMessage; parts: Part[]; las <text fg={theme.textMuted}>{props.message.error?.data.message}</text> </box> </Show> - <Show when={props.last && status().type !== "idle"}> - <box paddingLeft={3} flexDirection="row" gap={1} marginTop={1}> - <text fg={local.agent.color(props.message.mode)}>{Locale.titlecase(props.message.mode)}</text> - <Shimmer text={props.message.modelID} color={theme.text} /> - {(() => { - const retry = createMemo(() => { - const s = status() - if (s.type !== "retry") return - return s - }) - const message = createMemo(() => { - const r = retry() - if (!r) return - if (r.message.includes("exceeded your current quota") && r.message.includes("gemini")) - return "gemini 3 way too hot right now" - if (r.message.length > 50) return r.message.slice(0, 50) + "..." - return r.message - }) - const [seconds, setSeconds] = createSignal(0) - onMount(() => { - const timer = setInterval(() => { - const next = retry()?.next - if (next) setSeconds(Math.round((next - Date.now()) / 1000)) - }, 1000) - - onCleanup(() => { - clearInterval(timer) + <Switch> + <Match when={props.last && status().type !== "idle"}> + <box paddingLeft={3} flexDirection="row" gap={1} marginTop={1}> + <text fg={local.agent.color(props.message.mode)}>{Locale.titlecase(props.message.mode)}</text> + <Shimmer text={props.message.modelID} color={theme.text} /> + {(() => { + const retry = createMemo(() => { + const s = status() + if (s.type !== "retry") return + return s }) - }) - return ( - <Show when={retry()}> - <text fg={theme.error}> - {message()} [retrying {seconds() > 0 ? `in ${seconds()}s ` : ""} - attempt #{retry()!.attempt}] - </text> - </Show> - ) - })()} - </box> - </Show> - <Show - when={ - props.message.time.completed && - props.parts.some((item) => item.type === "step-finish" && item.reason !== "tool-calls") - } - > - <box paddingLeft={3}> - <text marginTop={1}> - <span style={{ fg: local.agent.color(props.message.mode) }}>{Locale.titlecase(props.message.mode)}</span>{" "} - <span style={{ fg: theme.textMuted }}>{props.message.modelID}</span> - </text> - </box> - </Show> + const message = createMemo(() => { + const r = retry() + if (!r) return + if (r.message.includes("exceeded your current quota") && r.message.includes("gemini")) + return "gemini 3 way too hot right now" + if (r.message.length > 50) return r.message.slice(0, 50) + "..." + return r.message + }) + const [seconds, setSeconds] = createSignal(0) + onMount(() => { + const timer = setInterval(() => { + const next = retry()?.next + if (next) setSeconds(Math.round((next - Date.now()) / 1000)) + }, 1000) + + onCleanup(() => { + clearInterval(timer) + }) + }) + return ( + <Show when={retry()}> + <text fg={theme.error}> + {message()} [retrying {seconds() > 0 ? `in ${seconds()}s ` : ""} + attempt #{retry()!.attempt}] + </text> + </Show> + ) + })()} + </box> + </Match> + <Match + when={ + (props.message.time.completed && + props.parts.some((item) => item.type === "step-finish" && item.reason !== "tool-calls")) || + props.last + } + > + <box paddingLeft={3}> + <text marginTop={1}> + <span style={{ fg: local.agent.color(props.message.mode) }}>{Locale.titlecase(props.message.mode)}</span>{" "} + <span style={{ fg: theme.textMuted }}>{props.message.modelID}</span> + </text> + </box> + </Match> + </Switch> </> ) } |
