package tui import ( "git.iamthefij.com/iamthefij/slog" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" "git.iamthefij.com/iamthefij/imap-notes/lib" ) type folderListItem struct { folder *lib.NoteFolder } func (fi folderListItem) Title() string { return fi.folder.Name } func (fi folderListItem) Description() string { return "" } func (fi folderListItem) FilterValue() string { return fi.folder.Name } type folderListModel struct { list list.Model selectedFolder *lib.NoteFolder } func newFolderList() folderListModel { m := folderListModel{} client, err := lib.GetClient() slog.OnErrFatalf(err, "failed to log on") folders, err := client.ListNoteFolders() slog.OnErrFatalf(err, "failed get folder list") folderItems := []list.Item{} for _, folder := range folders { item := folderListItem{folder} // item := listItem{title: folder.Name, desc: "", folder: folder} // slog.Debugf("adding %s to list", item.Title()) folderItems = append(folderItems, item) } itemDelegate := list.NewDefaultDelegate() itemDelegate.ShowDescription = false m.list = list.New(folderItems, itemDelegate, 0, 0) m.list.Title = "Note Folders" m.list.SetShowHelp(false) m.list.DisableQuitKeybindings() return m } func (m folderListModel) Init() tea.Cmd { return nil } func (m folderListModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": return m, tea.Quit case "enter": folderItem, ok := m.list.SelectedItem().(folderListItem) if ok { folder := folderItem.folder // slog.Debugf("Yay! We selected folder %s", folder.Name) m.selectedFolder = folder return m, nil } slog.Fatalf("selected an unknown item?") return m, tea.Quit } case tea.WindowSizeMsg: m.list.SetSize(msg.Width, msg.Height) } var cmd tea.Cmd m.list, cmd = m.list.Update(msg) return m, cmd } func (m folderListModel) View() string { return m.list.View() } func LaunchFolderView() { p := tea.NewProgram(newFolderList(), tea.WithAltScreen()) slog.OnErrFatalf(p.Start(), "error running TUI") }