diff --git a/internal/tui/components/chat/editor/editor.go b/internal/tui/components/chat/editor/editor.go index 6aae3b404196cceb40f074807d048fe25b3a2dd7..e62dda720770519bfdf76e2b4789d07312bc2c8c 100644 --- a/internal/tui/components/chat/editor/editor.go +++ b/internal/tui/components/chat/editor/editor.go @@ -175,7 +175,28 @@ func (m *editorCmp) repositionCompletions() tea.Msg { return completions.RepositionCompletionsMsg{X: x, Y: y} } -func onCompletionItemSelect(item FileCompletionItem, insert bool, m *editorCmp) { +func onCompletionItemSelect(fsys fs.FS, item FileCompletionItem, insert bool, m *editorCmp) (tea.Model, tea.Cmd) { + path := item.Path + // check if item is an image + if isExtOfAllowedImageType(path) { + tooBig, _ := filepicker.IsFileTooBigWithFS(fsys, path, filepicker.MaxAttachmentSize) + if tooBig { + return m, nil + } + + content, err := fs.ReadFile(fsys, path) + if err != nil { + return m, nil + } + mimeBufferSize := min(512, len(content)) + mimeType := http.DetectContentType(content[:mimeBufferSize]) + fileName := filepath.Base(path) + attachment := message.Attachment{FilePath: path, FileName: fileName, MimeType: mimeType, Content: content} + return m, util.CmdHandler(filepicker.FilePickedMsg{ + Attachment: attachment, + }) + } + word := m.textarea.Word() // If the selected item is a file, insert its path into the textarea value := m.textarea.Value() @@ -190,6 +211,21 @@ func onCompletionItemSelect(item FileCompletionItem, insert bool, m *editorCmp) m.currentQuery = "" m.completionsStartIndex = 0 } + + return m, nil +} + +func isExtOfAllowedImageType(path string) bool { + isAllowedType := false + // TODO(tauraamui) [17/09/2025]: this needs to be combined with the actual data inference/checking + // of the contents that happens when we resolve the "mime" type + for _, ext := range filepicker.AllowedTypes { + if strings.HasSuffix(path, ext) { + isAllowedType = true + break + } + } + return isAllowedType } type ResolveAbs func(path string) (string, error) @@ -205,14 +241,9 @@ func onPaste(fsys fs.FS, fsysAbs ResolveAbs, m *editorCmp, msg tea.PasteMsg) (te m.textarea, cmd = m.textarea.Update(msg) return m, cmd } - isAllowedType := false - for _, ext := range filepicker.AllowedTypes { - if strings.HasSuffix(path, ext) { - isAllowedType = true - break - } - } - if !isAllowedType { + // TODO(tauraamui) [17/09/2025]: this needs to be combined with the actual data inference/checking + // of the contents that happens when we resolve the "mime" type + if !isExtOfAllowedImageType(path) { m.textarea, cmd = m.textarea.Update(msg) return m, cmd }