summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOpeOginni <[email protected]>2026-04-27 00:27:02 +0200
committerGitHub <[email protected]>2026-04-26 17:27:02 -0500
commitc68907ece239819a6fdd31f6b2463fb69fbc5b37 (patch)
tree60a383ffab9efe6adb39e71971f817a74d692000
parentaf3998c8a60dc00f27c94a410c4f508e5b0891a7 (diff)
downloadopencode-c68907ece239819a6fdd31f6b2463fb69fbc5b37.tar.gz
opencode-c68907ece239819a6fdd31f6b2463fb69fbc5b37.zip
fix(tui): update toast duration handling to use default value (#23395)
Co-authored-by: Aiden Cline <[email protected]>
-rw-r--r--packages/opencode/src/cli/cmd/tui/event.ts8
-rw-r--r--packages/opencode/src/cli/cmd/tui/ui/toast.tsx13
2 files changed, 14 insertions, 7 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/event.ts b/packages/opencode/src/cli/cmd/tui/event.ts
index ab85b1e64..1c764c12f 100644
--- a/packages/opencode/src/cli/cmd/tui/event.ts
+++ b/packages/opencode/src/cli/cmd/tui/event.ts
@@ -1,6 +1,8 @@
import { BusEvent } from "@/bus/bus-event"
import { SessionID } from "@/session/schema"
-import { Schema } from "effect"
+import { Effect, Schema } from "effect"
+
+const DEFAULT_TOAST_DURATION = 5000
export const TuiEvent = {
PromptAppend: BusEvent.define("tui.prompt.append", Schema.Struct({ text: Schema.String })),
@@ -36,7 +38,9 @@ export const TuiEvent = {
title: Schema.optional(Schema.String),
message: Schema.String,
variant: Schema.Literals(["info", "success", "warning", "error"]),
- duration: Schema.optional(Schema.Number).annotate({ description: "Duration in milliseconds" }),
+ duration: Schema.Number.pipe(Schema.withDecodingDefault(Effect.succeed(DEFAULT_TOAST_DURATION))).annotate({
+ description: "Duration in milliseconds",
+ }),
}),
),
SessionSelect: BusEvent.define(
diff --git a/packages/opencode/src/cli/cmd/tui/ui/toast.tsx b/packages/opencode/src/cli/cmd/tui/ui/toast.tsx
index 69674ba7c..d15fb3920 100644
--- a/packages/opencode/src/cli/cmd/tui/ui/toast.tsx
+++ b/packages/opencode/src/cli/cmd/tui/ui/toast.tsx
@@ -5,10 +5,13 @@ import { useTerminalDimensions } from "@opentui/solid"
import { SplitBorder } from "../component/border"
import { TextAttributes } from "@opentui/core"
import { Schema } from "effect"
-import { type TuiEvent } from "../event"
+import { TuiEvent } from "../event"
+type ToastInput = Schema.Codec.Encoded<typeof TuiEvent.ToastShow.properties>
export type ToastOptions = Schema.Schema.Type<typeof TuiEvent.ToastShow.properties>
+const decodeToastOptions = Schema.decodeUnknownSync(TuiEvent.ToastShow.properties)
+
export function Toast() {
const toast = useToast()
const { theme } = useTheme()
@@ -55,13 +58,13 @@ function init() {
let timeoutHandle: NodeJS.Timeout | null = null
const toast = {
- show(options: ToastOptions) {
- const { duration, ...currentToast } = options
- setStore("currentToast", currentToast)
+ show(options: ToastInput) {
+ const toastOptions = decodeToastOptions(options)
+ setStore("currentToast", toastOptions)
if (timeoutHandle) clearTimeout(timeoutHandle)
timeoutHandle = setTimeout(() => {
setStore("currentToast", null)
- }, duration).unref()
+ }, toastOptions.duration).unref()
},
error: (err: any) => {
if (err instanceof Error)