Просмотр исходного кода

fix(tui): update toast duration handling to use default value (#23395)

Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
OpeOginni 4 месяцев назад
Родитель
Сommit
c68907ece2

+ 6 - 2
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(

+ 8 - 5
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)