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, } }