mirror of
https://github.com/mrusme/neonmodem.git
synced 2025-02-02 15:07:59 -05:00
Implemented first draft of create post UI
This commit is contained in:
parent
c15ba4e10e
commit
520686204e
@ -11,6 +11,7 @@ import (
|
||||
"github.com/mrusme/gobbs/models/post"
|
||||
"github.com/mrusme/gobbs/ui/cmd"
|
||||
"github.com/mrusme/gobbs/ui/ctx"
|
||||
"github.com/mrusme/gobbs/ui/windows/postcreate"
|
||||
"github.com/mrusme/gobbs/ui/windows/postshow"
|
||||
)
|
||||
|
||||
@ -20,6 +21,7 @@ var (
|
||||
|
||||
type KeyMap struct {
|
||||
Refresh key.Binding
|
||||
NewPost key.Binding
|
||||
Select key.Binding
|
||||
}
|
||||
|
||||
@ -28,6 +30,10 @@ var DefaultKeyMap = KeyMap{
|
||||
key.WithKeys("ctrl+r"),
|
||||
key.WithHelp("ctrl+r", "refresh"),
|
||||
),
|
||||
NewPost: key.NewBinding(
|
||||
key.WithKeys("n"),
|
||||
key.WithHelp("n", "new post"),
|
||||
),
|
||||
Select: key.NewBinding(
|
||||
key.WithKeys("r", "enter"),
|
||||
key.WithHelp("r/enter", "read"),
|
||||
@ -100,6 +106,25 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
})
|
||||
cmds = append(cmds, cmd.Tea())
|
||||
}
|
||||
|
||||
case key.Matches(msg, m.keymap.NewPost):
|
||||
i, ok := m.list.SelectedItem().(post.Post)
|
||||
if ok {
|
||||
m.viewcache = m.buildView(false)
|
||||
cmd := cmd.New(
|
||||
cmd.WinOpen,
|
||||
postcreate.WIN_ID,
|
||||
cmd.Arg{
|
||||
Name: "action",
|
||||
Value: "post",
|
||||
},
|
||||
cmd.Arg{
|
||||
Name: "post",
|
||||
Value: &i,
|
||||
},
|
||||
)
|
||||
cmds = append(cmds, cmd.Tea())
|
||||
}
|
||||
}
|
||||
|
||||
case tea.WindowSizeMsg:
|
||||
|
@ -7,6 +7,27 @@ import (
|
||||
"github.com/mrusme/gobbs/ui/cmd"
|
||||
)
|
||||
|
||||
func handleTab(mi interface{}) (bool, []tea.Cmd) {
|
||||
var m *Model = mi.(*Model)
|
||||
var cmds []tea.Cmd
|
||||
|
||||
if m.action == "reply" {
|
||||
return false, cmds
|
||||
}
|
||||
|
||||
if m.inputFocused == 0 {
|
||||
m.inputFocused = 1
|
||||
m.textinput.Blur()
|
||||
cmds = append(cmds, m.textarea.Focus())
|
||||
} else {
|
||||
m.inputFocused = 0
|
||||
m.textarea.Blur()
|
||||
cmds = append(cmds, m.textinput.Focus())
|
||||
}
|
||||
|
||||
return true, cmds
|
||||
}
|
||||
|
||||
func handleSubmit(mi interface{}) (bool, []tea.Cmd) {
|
||||
var m *Model = mi.(*Model)
|
||||
var cmds []tea.Cmd
|
||||
@ -15,7 +36,7 @@ func handleSubmit(mi interface{}) (bool, []tea.Cmd) {
|
||||
if m.replyToIdx == 0 {
|
||||
// No numbers were typed before hitting `r` so we're replying to the actual
|
||||
// Post
|
||||
x := m.replyToIface.(post.Post)
|
||||
x := m.iface.(post.Post)
|
||||
r = reply.Reply{
|
||||
ID: x.ID,
|
||||
InReplyTo: "",
|
||||
@ -25,7 +46,7 @@ func handleSubmit(mi interface{}) (bool, []tea.Cmd) {
|
||||
} else {
|
||||
// Numbers were typed before hitting `r`, so we're taking the actual reply
|
||||
// here
|
||||
r = m.replyToIface.(reply.Reply)
|
||||
r = m.iface.(reply.Reply)
|
||||
}
|
||||
|
||||
r.Body = m.textarea.Value()
|
||||
@ -53,10 +74,21 @@ func handleWinOpenCmd(mi interface{}, c cmd.Command) (bool, []tea.Cmd) {
|
||||
|
||||
if c.Target == WIN_ID {
|
||||
m.xywh = c.GetArg("xywh").([4]int)
|
||||
m.replyToIdx = c.GetArg("replyToIdx").(int)
|
||||
m.replyTo = c.GetArg("replyTo").(string)
|
||||
m.replyToIface = c.GetArg(m.replyTo)
|
||||
cmds = append(cmds, m.textarea.Focus())
|
||||
|
||||
m.action = c.GetArg("action").(string)
|
||||
|
||||
if m.action == "post" {
|
||||
m.iface = c.GetArg("post").(*post.Post)
|
||||
m.inputFocused = 0
|
||||
cmds = append(cmds, m.textinput.Focus())
|
||||
} else if m.action == "reply" {
|
||||
m.replyToIdx = c.GetArg("replyToIdx").(int)
|
||||
m.replyTo = c.GetArg("replyTo").(string)
|
||||
m.iface = c.GetArg(m.replyTo)
|
||||
m.inputFocused = 1
|
||||
cmds = append(cmds, m.textarea.Focus())
|
||||
}
|
||||
|
||||
return true, cmds
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@ package postcreate
|
||||
|
||||
import (
|
||||
"github.com/charmbracelet/bubbles/textarea"
|
||||
"github.com/charmbracelet/bubbles/textinput"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/mrusme/gobbs/aggregator"
|
||||
"github.com/mrusme/gobbs/ui/ctx"
|
||||
@ -18,13 +19,16 @@ type Model struct {
|
||||
|
||||
xywh [4]int
|
||||
|
||||
textarea textarea.Model
|
||||
textinput textinput.Model
|
||||
textarea textarea.Model
|
||||
inputFocused int
|
||||
|
||||
a *aggregator.Aggregator
|
||||
|
||||
replyToIdx int
|
||||
replyTo string
|
||||
replyToIface interface{}
|
||||
action string
|
||||
iface interface{}
|
||||
replyToIdx int
|
||||
replyTo string
|
||||
|
||||
viewcache string
|
||||
viewcacheTextareaXY []int
|
||||
@ -44,18 +48,26 @@ func NewModel(c *ctx.Ctx) Model {
|
||||
),
|
||||
xywh: [4]int{0, 0, 0, 0},
|
||||
|
||||
replyToIdx: 0,
|
||||
replyTo: "",
|
||||
replyToIface: nil,
|
||||
inputFocused: 0,
|
||||
|
||||
action: "",
|
||||
iface: nil,
|
||||
replyToIdx: 0,
|
||||
replyTo: "",
|
||||
|
||||
viewcache: "",
|
||||
viewcacheTextareaXY: []int{0, 0, 0, 0},
|
||||
}
|
||||
|
||||
m.textinput = textinput.New()
|
||||
m.textinput.Placeholder = "Subject goes here"
|
||||
m.textinput.Prompt = ""
|
||||
|
||||
m.textarea = textarea.New()
|
||||
m.textarea.Placeholder = "Type in your reply ..."
|
||||
m.textarea.Placeholder = "Type in your post ..."
|
||||
m.textarea.Prompt = ""
|
||||
|
||||
m.tk.KeymapAdd("tab", "tab", "tab") // TODO CONTINUE HERE
|
||||
m.tk.KeymapAdd("submit", "submit", "ctrl+s")
|
||||
|
||||
m.a, _ = aggregator.New(m.ctx)
|
||||
@ -63,6 +75,10 @@ func NewModel(c *ctx.Ctx) Model {
|
||||
m.tk.SetViewFunc(buildView)
|
||||
m.tk.SetMsgHandling(toolkit.MsgHandling{
|
||||
OnKeymapKey: []toolkit.MsgHandlingKeymapKey{
|
||||
{
|
||||
ID: "tab",
|
||||
Handler: handleTab,
|
||||
},
|
||||
{
|
||||
ID: "submit",
|
||||
Handler: handleSubmit,
|
||||
@ -85,10 +101,21 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
|
||||
var tcmd tea.Cmd
|
||||
|
||||
if !m.textarea.Focused() {
|
||||
cmds = append(cmds, m.textarea.Focus())
|
||||
switch m.inputFocused {
|
||||
|
||||
case 0:
|
||||
if !m.textinput.Focused() {
|
||||
cmds = append(cmds, m.textinput.Focus())
|
||||
}
|
||||
m.textinput, tcmd = m.textinput.Update(msg)
|
||||
|
||||
case 1:
|
||||
if !m.textarea.Focused() {
|
||||
cmds = append(cmds, m.textarea.Focus())
|
||||
}
|
||||
m.textarea, tcmd = m.textarea.Update(msg)
|
||||
|
||||
}
|
||||
m.textarea, tcmd = m.textarea.Update(msg)
|
||||
cmds = append(cmds, tcmd)
|
||||
|
||||
return m, tea.Batch(cmds...)
|
||||
|
@ -3,6 +3,8 @@ package postcreate
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
"github.com/mrusme/gobbs/models/post"
|
||||
"github.com/mrusme/gobbs/ui/helpers"
|
||||
)
|
||||
|
||||
@ -25,11 +27,20 @@ func buildView(mi interface{}, cached bool) string {
|
||||
false)
|
||||
}
|
||||
|
||||
title := "Reply"
|
||||
if m.replyToIdx != 0 {
|
||||
title += fmt.Sprintf(" to reply #%d", m.replyToIdx)
|
||||
title := ""
|
||||
|
||||
if m.action == "reply" {
|
||||
title = "Reply"
|
||||
if m.replyToIdx != 0 {
|
||||
title += fmt.Sprintf(" to reply #%d", m.replyToIdx)
|
||||
}
|
||||
} else if m.action == "post" {
|
||||
title = fmt.Sprintf("New Post in %s", m.iface.(*post.Post).Forum.Name)
|
||||
}
|
||||
|
||||
// textinputWidth := m.tk.ViewWidth() - 2
|
||||
// m.textinput.SetWidth(textinputWidth)
|
||||
|
||||
textareaWidth := m.tk.ViewWidth() - 2
|
||||
textareaHeight := 6
|
||||
m.textarea.SetWidth(textareaWidth)
|
||||
@ -43,9 +54,21 @@ func buildView(mi interface{}, cached bool) string {
|
||||
m.ctx.Logger.Debugln("View()")
|
||||
m.ctx.Logger.Debugf("IsFocused: %v\n", m.tk.IsFocused())
|
||||
|
||||
var tmp string = ""
|
||||
if m.action == "post" {
|
||||
tmp = lipgloss.JoinVertical(
|
||||
lipgloss.Left,
|
||||
m.textinput.View(),
|
||||
"",
|
||||
m.textarea.View(),
|
||||
)
|
||||
} else if m.action == "reply" {
|
||||
tmp = m.textarea.View()
|
||||
}
|
||||
|
||||
return m.tk.Dialog(
|
||||
title,
|
||||
m.textarea.View(),
|
||||
tmp,
|
||||
true,
|
||||
)
|
||||
|
||||
|
@ -65,6 +65,7 @@ func handleReply(mi interface{}) (bool, []tea.Cmd) {
|
||||
}
|
||||
|
||||
m.ctx.Logger.Debugf("replyToIdx: %d", replyToIdx)
|
||||
var ract cmd.Arg = cmd.Arg{Name: "action", Value: "reply"}
|
||||
var rtype cmd.Arg = cmd.Arg{Name: "replyTo"}
|
||||
var rarg cmd.Arg
|
||||
var ridx cmd.Arg = cmd.Arg{Name: "replyToIdx", Value: replyToIdx}
|
||||
@ -79,7 +80,7 @@ func handleReply(mi interface{}) (bool, []tea.Cmd) {
|
||||
rarg.Value = *m.allReplies[(replyToIdx - 1)]
|
||||
}
|
||||
|
||||
cmd := cmd.New(cmd.WinOpen, postcreate.WIN_ID, rtype, rarg, ridx)
|
||||
cmd := cmd.New(cmd.WinOpen, postcreate.WIN_ID, ract, rtype, rarg, ridx)
|
||||
cmds = append(cmds, cmd.Tea())
|
||||
|
||||
m.ctx.Logger.Debugln("caching view")
|
||||
|
Loading…
x
Reference in New Issue
Block a user