118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package root
|
|
|
|
import (
|
|
"github.com/ayn2op/discordo/internal/config"
|
|
"github.com/ayn2op/discordo/internal/consts"
|
|
"github.com/ayn2op/discordo/internal/ui/chat"
|
|
"github.com/ayn2op/discordo/internal/ui/login"
|
|
"github.com/ayn2op/tview"
|
|
"github.com/ayn2op/tview/keybind"
|
|
"github.com/gdamore/tcell/v3"
|
|
)
|
|
|
|
const tokenEnvVarKey = "DISCORDO_TOKEN"
|
|
|
|
type View struct {
|
|
app *tview.Application
|
|
inner tview.Primitive
|
|
cfg *config.Config
|
|
}
|
|
|
|
func NewView(cfg *config.Config, app *tview.Application) *View {
|
|
return &View{
|
|
app: app,
|
|
cfg: cfg,
|
|
}
|
|
}
|
|
|
|
func (v *View) showLoginView() tview.Command {
|
|
v.inner = login.NewForm(v.app, v.cfg)
|
|
return v.inner.HandleEvent(tview.NewInitEvent())
|
|
}
|
|
|
|
func (v *View) showChatView(token string) tview.Command {
|
|
v.inner = chat.NewView(v.app, v.cfg, token)
|
|
return v.inner.HandleEvent(tview.NewInitEvent())
|
|
}
|
|
|
|
var _ tview.Primitive = (*View)(nil)
|
|
|
|
func (v *View) Draw(screen tcell.Screen) {
|
|
if v.inner != nil {
|
|
v.inner.Draw(screen)
|
|
}
|
|
}
|
|
|
|
func (v *View) HandleEvent(event tcell.Event) tview.Command {
|
|
switch event := event.(type) {
|
|
case *tview.InitEvent:
|
|
return tview.BatchCommand{
|
|
tview.SetTitleCommand(consts.Name),
|
|
tview.EventCommand(initClipboard),
|
|
tview.EventCommand(getToken),
|
|
}
|
|
case *tokenEvent:
|
|
if event.token == "" {
|
|
return tview.BatchCommand{v.showLoginView(), tview.SetFocusCommand{Target: v.inner}}
|
|
} else {
|
|
return tview.BatchCommand{v.showChatView(event.token), tview.SetFocusCommand{Target: v.inner}}
|
|
}
|
|
case *login.TokenEvent:
|
|
return tview.BatchCommand{v.showChatView(event.Token), tview.SetFocusCommand{Target: v.inner}}
|
|
case *chat.LogoutEvent:
|
|
v.showLoginView()
|
|
return tview.BatchCommand{
|
|
tview.EventCommand(deleteToken),
|
|
tview.SetFocusCommand{Target: v.inner},
|
|
}
|
|
|
|
case *tview.KeyEvent:
|
|
switch {
|
|
case keybind.Matches(event, v.cfg.Keybinds.Suspend.Keybind):
|
|
v.suspend()
|
|
return nil
|
|
case keybind.Matches(event, v.cfg.Keybinds.Quit.Keybind):
|
|
if v.inner != nil {
|
|
return v.inner.HandleEvent(chat.NewQuitEvent())
|
|
}
|
|
return tview.QuitCommand{}
|
|
}
|
|
}
|
|
|
|
if v.inner != nil {
|
|
return v.inner.HandleEvent(event)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (v *View) GetRect() (int, int, int, int) {
|
|
if v.inner != nil {
|
|
return v.inner.GetRect()
|
|
}
|
|
return 0, 0, 0, 0
|
|
}
|
|
|
|
func (v *View) SetRect(x int, y int, width int, height int) {
|
|
if v.inner != nil {
|
|
v.inner.SetRect(x, y, width, height)
|
|
}
|
|
}
|
|
|
|
func (v *View) Focus(delegate func(p tview.Primitive)) {
|
|
if v.inner != nil {
|
|
delegate(v.inner)
|
|
}
|
|
}
|
|
|
|
func (v *View) HasFocus() bool {
|
|
if v.inner != nil {
|
|
return v.inner.HasFocus()
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (v *View) Blur() {
|
|
if v.inner != nil {
|
|
v.inner.Blur()
|
|
}
|
|
}
|