package tui import ( "fmt" "git.iamthefij.com/iamthefij/slog" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" "git.iamthefij.com/iamthefij/imap-notes/lib" ) type noteListItem struct { note *lib.Note } func (fi noteListItem) Title() string { return fi.note.Name() } func (fi noteListItem) Description() string { return "some body description" } func (fi noteListItem) FilterValue() string { return fi.note.Name() } type noteListModel struct { list list.Model selectedFolder *lib.NoteFolder selectedNote *lib.Note } func newNoteList() noteListModel { m := noteListModel{} noteItems := []list.Item{} m.list = list.New(noteItems, list.NewDefaultDelegate(), 0, 0) m.list.Title = "Notes" m.list.SetShowHelp(false) m.list.DisableQuitKeybindings() return m } func (m noteListModel) Init() tea.Cmd { return nil } func (m *noteListModel) SetFolder(folder *lib.NoteFolder) error { m.selectedFolder = folder noteItems := []list.Item{} notes, err := folder.ListNotes() if err != nil { return fmt.Errorf("failed to get notes for list view: %w", err) } for _, note := range notes { noteItems = append(noteItems, noteListItem{note}) } m.list.SetItems(noteItems) return nil } func (m noteListModel) 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": noteItem, ok := m.list.SelectedItem().(noteListItem) if ok { note := noteItem.note // slog.Debugf("Yay! We selected note %s", note.Name) m.selectedNote = note 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 noteListModel) View() string { return m.list.View() } func LaunchNoteView() { p := tea.NewProgram(newFolderList(), tea.WithAltScreen()) slog.OnErrFatalf(p.Start(), "error running TUI") }