From 0ce0022005b2387c1e5f942bca25a498e41a1e96 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Mon, 11 May 2026 22:37:42 -0400 Subject: [PATCH] refactor(chat): route image paste through command --- internal/ui/chat/message_input.go | 34 ++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/internal/ui/chat/message_input.go b/internal/ui/chat/message_input.go index 8ec8734..bcd1500 100644 --- a/internal/ui/chat/message_input.go +++ b/internal/ui/chat/message_input.go @@ -34,7 +34,10 @@ import ( "github.com/yuin/goldmark/ast" ) -const tmpFilePattern = consts.Name + "_*.md" +const ( + tmpFilePattern = consts.Name + "_*.md" + imageAttachmentName = "clipboard.png" +) var mentionRegex = regexp.MustCompile("@[a-zA-Z0-9._]+") @@ -110,11 +113,17 @@ func (mi *messageInput) Update(msg tview.Msg) tview.Cmd { switch msg := msg.(type) { case tabSuggestMsg: return mi.tabSuggest() + case imagePastedMsg: + if len(msg) == 0 { + return nil + } + mi.attach(imageAttachmentName, bytes.NewReader(msg)) + return nil + case tview.KeyMsg: switch { case keybind.Matches(msg, mi.cfg.Keybinds.MessageInput.Paste.Keybind): - mi.paste() - return handler(tcell.NewEventKey(tcell.KeyCtrlV, "", tcell.ModNone)) + return tview.Sequence(mi.pasteImage(), handler(tcell.NewEventKey(tcell.KeyCtrlV, "", tcell.ModNone))) case keybind.Matches(msg, mi.cfg.Keybinds.MessageInput.Send.Keybind): if mi.chat.GetVisible(mentionsListLayerName) { return mi.tabComplete() @@ -173,15 +182,16 @@ func (mi *messageInput) Update(msg tview.Msg) tview.Cmd { return handler(msg) } -func (mi *messageInput) paste() { - data, err := clipboard.Read(clipboard.FmtImage) - if err != nil { - slog.Error("failed to read clipboard image", "err", err) - return - } - if data != nil { - name := "clipboard.png" - mi.attach(name, bytes.NewReader(data)) +type imagePastedMsg []byte + +func (mi *messageInput) pasteImage() tview.Cmd { + return func() tview.Msg { + data, err := clipboard.Read(clipboard.FmtImage) + if err != nil { + slog.Error("failed to read clipboard image", "err", err) + return nil + } + return imagePastedMsg(data) } }