Files
tui/screens/login.go
T
2023-02-18 02:50:14 -07:00

144 lines
3.2 KiB
Go

package screens
import (
"fmt"
"io"
"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
type Login struct {
selected int
servers []CursoriusServer
serverList list.Model
}
func (m Login) Init() tea.Cmd {
return nil
}
var appStyle = lipgloss.NewStyle().Padding(1, 2)
func (m Login) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
switch msg := msg.(type) {
case tea.WindowSizeMsg:
h, v := appStyle.GetFrameSize()
m.serverList.SetSize(msg.Width-h, msg.Height-v)
case tea.KeyMsg:
switch msg.String() {
case "e":
if m.serverList.Index() < len(m.servers) {
return m, func() tea.Msg {
return ScreenSwitchMsg{
NewScreen: createEditServer(
m.servers,
m.serverList.Index(),
),
}
}
}
case "enter":
if m.serverList.Index() < len(m.servers)-1 {
return m, func() tea.Msg {
return m.servers[m.selected].Login()
}
} else {
return m, func() tea.Msg {
return ScreenSwitchMsg{
NewScreen: createEditServer(
append(m.servers, CursoriusServer{}),
len(m.servers),
),
}
}
}
}
}
m.serverList, cmd = m.serverList.Update(msg)
return m, cmd
}
func (m Login) View() string {
s := m.serverList.View()
return s
}
type serverItem struct {
name string
url string
}
type newServerItem struct {
text string
}
func (i serverItem) FilterValue() string { return "" }
func (i newServerItem) FilterValue() string { return "" }
var (
titleStyle = lipgloss.NewStyle().MarginLeft(2)
itemStyle = lipgloss.NewStyle().PaddingLeft(4)
selectedItemStyle = lipgloss.NewStyle().PaddingLeft(2).Foreground(lipgloss.Color("170"))
paginationStyle = list.DefaultStyles().PaginationStyle.PaddingLeft(4)
helpStyle = list.DefaultStyles().HelpStyle.PaddingLeft(4).PaddingBottom(1)
quitTextStyle = lipgloss.NewStyle().Margin(1, 0, 2, 4)
)
type loginItemDelegate struct{}
func (d loginItemDelegate) Height() int { return 1 }
func (d loginItemDelegate) Spacing() int { return 0 }
func (d loginItemDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd { return nil }
func (d loginItemDelegate) Render(w io.Writer, m list.Model, index int, listItem list.Item) {
var str string
switch i := listItem.(type) {
case serverItem:
str = fmt.Sprintf("%d. %s (%s)", index+1, i.name, i.url)
case newServerItem:
str = i.text
}
fn := itemStyle.Render
if index == m.Index() {
fn = func(s string) string {
return selectedItemStyle.Render("> " + s)
}
}
fmt.Fprint(w, fn(str))
}
func CreateLogin(servers []CursoriusServer) Login {
items := []list.Item{}
for _, server := range servers {
items = append(
items,
serverItem{
name: server.Name,
url: server.Url,
},
)
}
items = append(
items,
newServerItem{text: "> Add new server <"},
)
l := list.New(items, loginItemDelegate{}, 50, 50)
l.Title = "Login to your Cursorius instance."
l.SetShowStatusBar(false)
l.KeyMap.CursorDown.SetKeys(append(l.KeyMap.CursorDown.Keys(), "tab")...)
return Login{
selected: 0,
servers: servers,
serverList: l,
}
}