From bffce6efbc4e5ec20a1eaf36e95a430693fa2a4a Mon Sep 17 00:00:00 2001 From: vctt Date: Mon, 19 Aug 2024 10:42:46 -0300 Subject: [PATCH] [wip] render on embend content? --- brclient/appstate.go | 4 +- brclient/mainwindow.go | 1 - brclient/pluginwidget.go | 162 ++++----------------------------------- brclient/pluginwindow.go | 29 +------ 4 files changed, 24 insertions(+), 172 deletions(-) diff --git a/brclient/appstate.go b/brclient/appstate.go index 0ac955e9..3f7e516b 100644 --- a/brclient/appstate.go +++ b/brclient/appstate.go @@ -1220,9 +1220,11 @@ func (as *appState) findOrNewPluginWindow(id clientintf.UserID, alias string) *p embedContent: make(map[string]string), } as.pluginWindows = append(as.pluginWindows, pw) - as.updatedCW[len(as.chatWindows)-1] = false + as.updatedCW[len(as.pluginWindows)-1] = false as.pluginWindowsMtx.Unlock() + pw.ew = newPluginWidget(as, pw.addEmbedCB) + as.footerInvalidate() as.sendMsg(showPluginWindow{}) return pw diff --git a/brclient/mainwindow.go b/brclient/mainwindow.go index 8a30ac63..f1e7942b 100644 --- a/brclient/mainwindow.go +++ b/brclient/mainwindow.go @@ -657,7 +657,6 @@ func (mws mainWindowState) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case showPluginWindow: mws.as.workingCmd = "" - return newPluginWindow(mws.as) case showFeedWindow: mws.as.workingCmd = "" diff --git a/brclient/pluginwidget.go b/brclient/pluginwidget.go index 5947a88f..28dbe403 100644 --- a/brclient/pluginwidget.go +++ b/brclient/pluginwidget.go @@ -1,12 +1,9 @@ package main import ( - "fmt" "strings" tea "github.com/charmbracelet/bubbletea" - "github.com/companyzero/bisonrelay/client/clientdb" - "github.com/erikgeiser/promptkit/selection" ) // embedWidget is used to display the new embed screen in new posts and other @@ -15,163 +12,52 @@ type pluginWidget struct { initless as *appState - embedding bool + showing bool formEmbed formHelper embedErr error - sharing bool - sharedFiles []clientdb.SharedFileAndShares - selSharedFiles *selection.Model[string] - idxSharedFile int - addEmbedCB func(id string, data string) error } func (ew *pluginWidget) active() bool { - return ew.sharing || ew.embedding + return ew.showing } func (ew *pluginWidget) activate() []tea.Cmd { - ew.idxSharedFile = -1 - ew.embedding = true + ew.showing = true ew.embedErr = nil return ew.formEmbed.setFocus(0) } -// tryEmbed tries to create the embed and calls the addEmbedCB. -// func (ew *pluginWidget) tryEmbed() error { -// var args mdembeds.EmbeddedArgs - -// args.Alt = url.PathEscape(ew.formEmbed.inputs[1].(*textInputHelper).Value()) - -// filename, err := homedir.Expand(ew.formEmbed.inputs[0].(*textInputHelper).Value()) -// if err != nil { -// return err -// } - -// var data []byte -// var id string - -// if filename != "" { -// data, err = os.ReadFile(filename) -// if err != nil { -// return err -// } - -// if uint64(len(data)) > rpc.MaxChunkSize { -// return fmt.Errorf("file too big to embed") -// } - -// args.Typ = mime.TypeByExtension(filepath.Ext(filename)) -// id = chainhash.HashH(data).String()[:8] -// pseudoData := fmt.Sprintf("[content %s]", id) -// args.Data = []byte(pseudoData) -// } - -// if ew.idxSharedFile > -1 && ew.idxSharedFile < len(ew.sharedFiles) { -// sf := ew.sharedFiles[ew.idxSharedFile] -// args.Download = sf.SF.FID -// args.Cost = sf.Cost -// args.Size = sf.Size -// } - -// embedStr := args.String() -// return ew.addEmbedCB(id, data, embedStr) -// } - func (ew *pluginWidget) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var ( - cmd tea.Cmd - cmds []tea.Cmd + cmd tea.Cmd ) + if ew.showing { - if ew.sharing { switch msg := msg.(type) { case tea.KeyMsg: switch { - case msg.Type == tea.KeyEnter: - ew.sharing = false - choice, err := ew.selSharedFiles.ValueAsChoice() - if err == nil { - ew.idxSharedFile = choice.Index() - } - return ew, nil - case msg.Type == tea.KeyEsc: - ew.sharing = false + ew.showing = false return ew, nil } + default: + // fmt.Printf("%s", msg) + ew.formEmbed.Update(msg) } - _, cmd = ew.selSharedFiles.Update(msg) - - return ew, cmd - } - - if ew.embedding { - switch msg := msg.(type) { - case msgCancelForm: - ew.embedding = false - ew.formEmbed.clear() - cmds = ew.formEmbed.setFocus(-1) - return ew, batchCmds(cmds) - - case msgSubmitForm: - // err := ew.tryEmbed() - // if err == nil { - // return ew, emitMsg(msgCancelForm{}) - // } - // ew.embedErr = err - - case msgShowSharedFilesForLink: - // ew.sharing = true - // cmd = ew.listSharedFiles() - // return ew, cmd - - case tea.KeyMsg: - switch { - case msg.Type == tea.KeyF2 || msg.Type == tea.KeyEsc: - // Simulate canceling the form. - return ew, emitMsg(msgCancelForm{}) - } - } - - ew.formEmbed, cmd = ew.formEmbed.Update(msg) return ew, cmd } return ew, cmd } -func (ew *pluginWidget) embeddingView() string { +func (ew *pluginWidget) showingView() string { var b strings.Builder - nbLines := 2 + 1 + ew.formEmbed.lineCount() + 2 - + b.WriteString("plugin view\n\n") b.WriteString(ew.formEmbed.View()) - b.WriteString("\n") - if ew.embedErr != nil { - b.WriteString(ew.as.styles.Load().err.Render(ew.embedErr.Error())) - } - b.WriteString("\n") - - if ew.idxSharedFile > -1 && ew.idxSharedFile < len(ew.sharedFiles) { - b.WriteString(fmt.Sprintf("Linking to shared file %s", - ew.sharedFiles[ew.idxSharedFile].SF.Filename)) - } - - for i := 0; i < ew.as.winH-nbLines-1; i++ { - b.WriteString("\n") - } - - return b.String() -} - -func (ew *pluginWidget) sharingView() string { - var b strings.Builder - - b.WriteString(ew.selSharedFiles.View()) - nbLines := 2 + 2 + 5 for i := 0; i < ew.as.winH-nbLines-1; i++ { b.WriteString("\n") @@ -181,10 +67,8 @@ func (ew *pluginWidget) sharingView() string { } func (ew *pluginWidget) View() string { - if ew.sharing { - return ew.sharingView() - } else if ew.embedding { - return ew.embeddingView() + if ew.showing { + return ew.showingView() } return "" } @@ -197,12 +81,7 @@ func newPluginWidget(as *appState, addEmbedCB func(string, string) error) *plugi tihWithPrompt("Plugin: "), ), newTextInputHelper(styles, - tihWithPrompt("Alt Text: "), - ), - newButtonHelper(styles, - btnWithLabel("[ Link to Shared File ]"), - btnWithTrailing("\n\n"), - btnWithFixedMsgAction(msgShowSharedFilesForLink{}), + tihWithPrompt(""), ), newButtonHelper(styles, btnWithLabel("[ Cancel ]"), @@ -216,17 +95,10 @@ func newPluginWidget(as *appState, addEmbedCB func(string, string) error) *plugi ), ) - sel := selection.New("Select shared file", []string{""}) - selSharedFiles := selection.NewModel(sel) - selSharedFiles.Filter = nil - //selSharedFiles.Update(tea.WindowSizeMsg{Width: as.winW, Height: 10}) - //selSharedFiles.Selection.PageSize = 10 - ew := &pluginWidget{ - as: as, - formEmbed: formEmbed, - selSharedFiles: selSharedFiles, - addEmbedCB: addEmbedCB, + as: as, + formEmbed: formEmbed, + addEmbedCB: addEmbedCB, } return ew diff --git a/brclient/pluginwindow.go b/brclient/pluginwindow.go index 164f367d..9e06bab8 100644 --- a/brclient/pluginwindow.go +++ b/brclient/pluginwindow.go @@ -59,9 +59,10 @@ func (pw *pluginWindow) renderPluginString(id string, embedStr string) error { pw.embedContent[id] = embedStr } - // pw.textArea.InsertString(embedStr) - pw.embedContent[id] = embedStr - pw.textArea.Update(embedStr) + pw.ew.as.diagMsg(embedStr) // works but locks view + + // pw.ew.Update(embedStr) + return nil } @@ -193,25 +194,3 @@ func (pw pluginWindow) View() string { return b.String() } - -func newPluginWindow(as *appState) (pluginWindow, tea.Cmd) { - styles := as.styles.Load() - t := newTextAreaModel(styles) - t.Placeholder = "Plugin" - t.CharLimit = 0 - t.FocusedStyle.Prompt = styles.focused - t.FocusedStyle.Text = styles.focused - t.BlurredStyle.Prompt = styles.noStyle - t.BlurredStyle.Text = styles.noStyle - t.Focus() - - pw := pluginWindow{ - as: as, - textArea: t, - embedContent: make(map[string]string), - } - - pw.ew = newPluginWidget(as, pw.addEmbedCB) - pw.updateTextAreaSize() - return pw, batchCmds(nil) -}