package screens import ( "fmt" "io" "git.ohea.xyz/cursorius/tui/settings" "git.ohea.xyz/golang/config" "github.com/charmbracelet/bubbles/list" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" ) type EditServer struct { entries list.Model config config.Config[settings.Config] pos int } type entryItem struct { field textinput.Model } type submitItem struct { text string } func (i entryItem) FilterValue() string { return "" } func (i submitItem) FilterValue() string { return "" } func (m EditServer) Init() tea.Cmd { return nil } type editServerDelegate struct{} func (d editServerDelegate) Height() int { return 1 } func (d editServerDelegate) Spacing() int { return 0 } func (d editServerDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd { return nil } func (d editServerDelegate) Render(w io.Writer, m list.Model, index int, listItem list.Item) { var str string switch i := listItem.(type) { case entryItem: str = i.field.View() case submitItem: 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 (m EditServer) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.WindowSizeMsg: h, v := appStyle.GetFrameSize() m.entries.SetSize(msg.Width-h, msg.Height-v) case tea.KeyMsg: switch msg.String() { case "enter": name := "" url := "" token := "" if e, ok := m.entries.Items()[0].(entryItem); ok { name = e.field.Value() } if e, ok := m.entries.Items()[1].(entryItem); ok { url = e.field.Value() } if e, ok := m.entries.Items()[2].(entryItem); ok { token = e.field.Value() } newServer := settings.CursoriusServer{ Name: name, Url: url, Token: token, } m.config.Config.Servers[m.pos] = newServer m.config.Write() return m, func() tea.Msg { return ScreenSwitchMsg{ NewScreen: CreateLogin(m.config), } } } } m.entries, cmd = m.entries.Update(msg) items := m.entries.Items() for i := 0; i < len(items); i++ { if e, ok := items[i].(entryItem); ok { if i == m.entries.Index() { e.field.Focus() } else { e.field.Blur() } e.field, _ = e.field.Update(msg) m.entries.SetItem(i, e) } } return m, cmd } func (m EditServer) View() string { return m.entries.View() } func createEditServer(conf config.Config[settings.Config], pos int) EditServer { nameField := textinput.New() nameField.Focus() nameField.Width = 20 nameField.Prompt = "Name: " nameField.Placeholder = "Nickname" nameField.SetValue(conf.Config.Servers[pos].Name) urlField := textinput.New() urlField.Prompt = "Url: " urlField.Placeholder = "https://ci.cursorius.ohea/" urlField.SetValue(conf.Config.Servers[pos].Url) tokenField := textinput.New() tokenField.Prompt = "Token: " tokenField.Placeholder = "1234567890" tokenField.SetValue(conf.Config.Servers[pos].Token) tokenField.EchoMode = textinput.EchoPassword items := []list.Item{ entryItem{field: nameField}, entryItem{field: urlField}, entryItem{field: tokenField}, submitItem{text: "> Submit <"}, } l := list.New(items, editServerDelegate{}, 50, 50) l.Title = "Entry your Cursorius Server configuration." l.SetShowStatusBar(false) l.KeyMap.GoToStart.SetEnabled(false) l.KeyMap.GoToEnd.SetEnabled(false) l.KeyMap.CursorDown.SetKeys(append(l.KeyMap.CursorDown.Keys(), "tab")...) l.KeyMap.Filter.SetEnabled(false) l.KeyMap.Quit.SetEnabled(false) e := EditServer{ entries: l, config: conf, pos: pos, } return e }