-
Notifications
You must be signed in to change notification settings - Fork 331
Open
Description
Hi, this is my minimality code, i am doing a article app, when user press n key, load next page reply,
package main
import (
"fmt"
"regexp"
"strings"
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/dromara/carbon/v2"
"github.com/seth-shi/go-v2ex/internal/model/messages"
"github.com/seth-shi/go-v2ex/internal/model/response"
)
type Model struct {
viewport viewport.Model
replies []response.V2ReplyResult
replyPage int
}
func (m Model) Init() tea.Cmd {
return nil
}
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var (
cmd tea.Cmd
cmds []tea.Cmd
)
switch msgType := msg.(type) {
case messages.GetReplyResponse:
m.replies = append(m.replies, msgType.Data.Result...)
m.replyPage++
cmds = append(cmds, m.initViewport())
case tea.WindowSizeMsg:
cmds = append(cmds, m.initViewport())
case tea.KeyMsg:
switch {
case msgType.String() == "n":
// load more reply
return m, tea.Sequence(
messages.LoadingRequestReply.PostStart(),
// api request next page reply : m.replyPage
messages.LoadingRequestReply.PostEnd(),
)
case msgType.String() == "i":
// load more reply
return m, m.replaceLinks()
}
}
m.viewport, cmd = m.viewport.Update(msg)
cmds = append(cmds, cmd)
return m, tea.Batch(cmds...)
}
func (m Model) View() string {
return m.viewport.View()
}
func (m *Model) replaceLinks() tea.Cmd {
imgurPattern := regexp.MustCompile(`https://i\.imgur\.com/[a-zA-Z0-9]+(?:\.\w+)?`)
list := imgurPattern.FindAllString(m.viewport.View(), -1)
// imgMap = api.request(list)
// replaceItems = [x1.png, ansiitext, x2.png, ansiitext]
replaceItems := list
// i try this way, but it's wrong, because press n key, image will replace
r := strings.NewReplacer(replaceItems...)
m.viewport.SetContent(r.Replace(m.viewport.View()))
return nil
}
func (m *Model) initViewport() tea.Cmd {
var (
content strings.Builder
)
content.WriteString("\n\n")
if len(m.replies) > 0 {
var replies strings.Builder
for i, r := range m.replies {
floor := fmt.Sprintf(
"#%d · %s @%s",
i+1,
carbon.CreateFromTimestamp(r.Created),
r.Member.Username,
)
replies.WriteString(lipgloss.NewStyle().Bold(true).Render(floor))
replies.WriteString("\n")
replies.WriteString(r.GetContent())
replies.WriteString("\n\n")
}
content.WriteString(replies.String())
}
m.viewport.SetContent(content.String())
return nil
}
But I have a new feature, reply content includes image link, likely https://xxx.com/a.png, I need to replace with ASCII text (I'm already ok), But I don't know when to make the replacement. (at View() or initViewport() )
Metadata
Metadata
Assignees
Labels
No labels