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

fix: tui: Handle Clipboard.copy errors properly (#3685)

Haris Gušić 3 месяцев назад
Родитель
Сommit
55787f2caa

+ 2 - 1
packages/opencode/src/cli/cmd/tui/app.tsx

@@ -296,8 +296,9 @@ function App() {
           /* @ts-expect-error */
           renderer.writeOut(finalOsc52)
           await Clipboard.copy(text)
+            .then(() => toast.show({ message: "Copied to clipboard", variant: "info" }))
+            .catch(toast.error)
           renderer.clearSelection()
-          toast.show({ message: "Copied to clipboard", variant: "info" })
         }
       }}
     >

+ 13 - 1
packages/opencode/src/cli/cmd/tui/ui/toast.tsx

@@ -49,7 +49,7 @@ function init() {
 
   let timeoutHandle: NodeJS.Timeout | null = null
 
-  return {
+  const toast = {
     show(options: ToastOptions) {
       const parsedOptions = TuiEvent.ToastShow.properties.parse(options)
       const { duration, ...currentToast } = parsedOptions
@@ -59,10 +59,22 @@ function init() {
         setStore("currentToast", null)
       }, duration).unref()
     },
+    error: (err: any) => {
+      if (err instanceof Error)
+        return toast.show({
+          variant: "error",
+          message: err.message,
+        })
+      toast.show({
+        variant: "error",
+        message: "An unknown error has occurred",
+      })
+    },
     get currentToast(): ToastOptions | null {
       return store.currentToast
     },
   }
+  return toast
 }
 
 export type ToastContext = ReturnType<typeof init>

+ 2 - 2
packages/opencode/src/cli/cmd/tui/util/clipboard.ts

@@ -76,7 +76,7 @@ export namespace Clipboard {
           const proc = Bun.spawn(["wl-copy"], { stdin: "pipe", stdout: "ignore", stderr: "ignore" })
           proc.stdin.write(text)
           proc.stdin.end()
-          await proc.exited.catch(() => {})
+          await proc.exited
         }
       }
       if (Bun.which("xclip")) {
@@ -117,7 +117,7 @@ export namespace Clipboard {
 
     console.log("clipboard: no native support")
     return async (text: string) => {
-      await clipboardy.write(text).catch(() => {})
+      await clipboardy.write(text)
     }
   })