93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package root
|
|
|
|
import (
|
|
"log/slog"
|
|
|
|
"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/zalando/go-keyring"
|
|
"golang.design/x/clipboard"
|
|
)
|
|
|
|
const (
|
|
keyringService = consts.Name
|
|
keyringUser = "token"
|
|
)
|
|
|
|
type tokenMsg string
|
|
|
|
func useToken(token string) tview.Cmd {
|
|
return func() tview.Msg {
|
|
return tokenMsg(token)
|
|
}
|
|
}
|
|
|
|
type loginMsg struct{}
|
|
|
|
func getToken() tview.Cmd {
|
|
return func() tview.Msg {
|
|
token, err := keyring.Get(keyringService, keyringUser)
|
|
if err != nil {
|
|
slog.Info("failed to retrieve token from keyring", "err", err)
|
|
return loginMsg{}
|
|
}
|
|
return tokenMsg(token)
|
|
}
|
|
}
|
|
|
|
func setToken(token string) tview.Cmd {
|
|
return func() tview.Msg {
|
|
if err := keyring.Set(keyringService, keyringUser, token); err != nil {
|
|
slog.Error("failed to set token to keyring", "err", err)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func deleteToken() tview.Cmd {
|
|
return func() tview.Msg {
|
|
if err := keyring.Delete(keyringService, keyringUser); err != nil {
|
|
slog.Error("failed to delete token from keyring", "err", err)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func initClipboard() tview.Cmd {
|
|
return func() tview.Msg {
|
|
if err := clipboard.Init(); err != nil {
|
|
slog.Error("failed to init clipboard", "err", err)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (m *Model) showLogin() tview.Cmd {
|
|
m.screen, m.login, m.chat = screenLogin, login.NewModel(m.cfg), chat.Model{}
|
|
return m.show(m.login.Init())
|
|
}
|
|
|
|
func (m *Model) showChat(token string) tview.Cmd {
|
|
m.screen, m.chat, m.login = screenChat, chat.NewModel(m.cfg, token), login.Model{}
|
|
return m.show(m.chat.Init())
|
|
}
|
|
|
|
// show closes any open modal after the shown model changed and returns what it needs done, with init its first command.
|
|
func (m *Model) show(init tview.Cmd) tview.Cmd {
|
|
m.modal = nil
|
|
return tview.Batch(tview.SetTitle(consts.Name), init)
|
|
}
|
|
|
|
func (m *Model) finishModal(index int) tview.Cmd {
|
|
if m.modal == nil || index < 0 || index >= len(m.modal.Buttons) {
|
|
m.modal = nil
|
|
return nil
|
|
}
|
|
button := m.modal.Buttons[index]
|
|
if !button.KeepOpen {
|
|
m.modal = nil
|
|
}
|
|
return button.Cmd
|
|
}
|