94 lines
1.7 KiB
Go
94 lines
1.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
tea "github.com/charmbracelet/bubbletea"
|
||
|
)
|
||
|
|
||
|
type viewType int
|
||
|
|
||
|
const (
|
||
|
viewNone viewType = 0
|
||
|
viewLogin viewType = 1
|
||
|
viewChannels viewType = 2
|
||
|
viewChat viewType = 3
|
||
|
)
|
||
|
|
||
|
type mainModel struct {
|
||
|
conf *config
|
||
|
conn *loungeConnection
|
||
|
view viewType
|
||
|
width int
|
||
|
height int
|
||
|
loginModel loginModel
|
||
|
channelsModel channelsModel
|
||
|
chatModel chatModel
|
||
|
}
|
||
|
|
||
|
func mainModelInit() mainModel {
|
||
|
conf := configLoad()
|
||
|
conn := &loungeConnection{User: conf.User, Token: conf.Token, Action: actionNone}
|
||
|
login := loginModelInit(conf)
|
||
|
channels := channelsModelInit()
|
||
|
chat := chatModelInit()
|
||
|
return mainModel{conf, conn, viewLogin, 0, 0, login, channels, chat}
|
||
|
}
|
||
|
|
||
|
func (m mainModel) Init() tea.Cmd {
|
||
|
var (
|
||
|
cmd tea.Cmd
|
||
|
cmds []tea.Cmd
|
||
|
)
|
||
|
cmd = m.loginInit(m.conf)
|
||
|
cmds = append(cmds, cmd)
|
||
|
cmd = m.channelsInit()
|
||
|
cmds = append(cmds, cmd)
|
||
|
cmd = m.chatInit()
|
||
|
cmds = append(cmds, cmd)
|
||
|
return tea.Batch(cmds...)
|
||
|
}
|
||
|
|
||
|
func (m mainModel) View() string {
|
||
|
s := ""
|
||
|
switch m.view {
|
||
|
case viewLogin:
|
||
|
s = m.loginView()
|
||
|
case viewChannels:
|
||
|
s = m.channelsView()
|
||
|
case viewChat:
|
||
|
s = m.chatView()
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||
|
var model tea.Model = m
|
||
|
var cmd tea.Cmd = nil
|
||
|
switch msg := msg.(type) {
|
||
|
case tea.WindowSizeMsg:
|
||
|
if m.conn.Action != actionNone {
|
||
|
m = connActionHandle(m)
|
||
|
} else {
|
||
|
m.width = msg.Width
|
||
|
m.height = msg.Height
|
||
|
}
|
||
|
case tea.KeyMsg:
|
||
|
switch msg.String() {
|
||
|
case "ctrl+c", "esc":
|
||
|
return m, tea.Quit
|
||
|
case "ctrl+s":
|
||
|
if m.view != viewLogin {
|
||
|
m.view = viewChannels
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
switch m.view {
|
||
|
case viewLogin:
|
||
|
model, cmd = m.loginUpdate(msg)
|
||
|
case viewChannels:
|
||
|
model, cmd = m.channelsUpdate(msg)
|
||
|
case viewChat:
|
||
|
model, cmd = m.chatUpdate(msg)
|
||
|
}
|
||
|
return model, cmd
|
||
|
}
|