Skip to content

Commit

Permalink
[wip] render on embend content?
Browse files Browse the repository at this point in the history
  • Loading branch information
vctt94 committed Aug 19, 2024
1 parent bad64ee commit bffce6e
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 172 deletions.
4 changes: 3 additions & 1 deletion brclient/appstate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion brclient/mainwindow.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ""
Expand Down
162 changes: 17 additions & 145 deletions brclient/pluginwidget.go
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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")
Expand All @@ -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 ""
}
Expand All @@ -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 ]"),
Expand All @@ -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
Expand Down
29 changes: 4 additions & 25 deletions brclient/pluginwindow.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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)
}

0 comments on commit bffce6e

Please sign in to comment.