settings_lists.go

  1package tui
  2
  3import (
  4	"fmt"
  5	"strings"
  6
  7	tea "charm.land/bubbletea/v2"
  8	"charm.land/lipgloss/v2"
  9	"github.com/floatpane/matcha/config"
 10)
 11
 12func (m *Settings) updateMailingLists(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) {
 13	if m.confirmingDelete {
 14		switch msg.String() {
 15		case "y", "Y":
 16			if m.listsCursor < len(m.cfg.MailingLists) {
 17				m.cfg.MailingLists = append(m.cfg.MailingLists[:m.listsCursor], m.cfg.MailingLists[m.listsCursor+1:]...)
 18				_ = config.SaveConfig(m.cfg)
 19				if m.listsCursor >= len(m.cfg.MailingLists) && m.listsCursor > 0 {
 20					m.listsCursor--
 21				}
 22				m.confirmingDelete = false
 23			}
 24		case "n", "N", "esc":
 25			m.confirmingDelete = false
 26			return m, nil
 27		}
 28		return m, nil
 29	}
 30
 31	switch msg.String() {
 32	case "up", "k":
 33		if m.listsCursor > 0 {
 34			m.listsCursor--
 35		}
 36	case "down", "j":
 37		if m.listsCursor < len(m.cfg.MailingLists) {
 38			m.listsCursor++
 39		}
 40	case "d":
 41		if m.listsCursor < len(m.cfg.MailingLists) && len(m.cfg.MailingLists) > 0 {
 42			m.confirmingDelete = true
 43		}
 44	case "e":
 45		if m.listsCursor < len(m.cfg.MailingLists) {
 46			list := m.cfg.MailingLists[m.listsCursor]
 47			idx := m.listsCursor
 48			return m, func() tea.Msg {
 49				return GoToEditMailingListMsg{
 50					Index:     idx,
 51					Name:      list.Name,
 52					Addresses: strings.Join(list.Addresses, ", "),
 53				}
 54			}
 55		}
 56	case "enter":
 57		if m.listsCursor == len(m.cfg.MailingLists) {
 58			return m, func() tea.Msg { return GoToAddMailingListMsg{} }
 59		}
 60	}
 61	return m, nil
 62}
 63
 64func (m *Settings) viewMailingLists() string {
 65	var b strings.Builder
 66
 67	b.WriteString(titleStyle.Render("Mailing Lists") + "\n\n")
 68
 69	if len(m.cfg.MailingLists) == 0 {
 70		b.WriteString(accountEmailStyle.Render("  No mailing lists configured.\n\n"))
 71	}
 72
 73	for i, list := range m.cfg.MailingLists {
 74		addrCount := fmt.Sprintf("%d address", len(list.Addresses))
 75		if len(list.Addresses) != 1 {
 76			addrCount += "es"
 77		}
 78		line := fmt.Sprintf("%s - %s", list.Name, accountEmailStyle.Render(addrCount))
 79
 80		cursor := "  "
 81		style := accountItemStyle
 82		if m.listsCursor == i {
 83			cursor = "> "
 84			style = selectedAccountItemStyle
 85		}
 86		b.WriteString(style.Render(cursor+line) + "\n")
 87	}
 88
 89	cursor := "  "
 90	style := accountItemStyle
 91	if m.listsCursor == len(m.cfg.MailingLists) {
 92		cursor = "> "
 93		style = selectedAccountItemStyle
 94	}
 95	b.WriteString(style.Render(cursor+"Add New Mailing List") + "\n\n")
 96
 97	b.WriteString(helpStyle.Render("↑/↓: navigate • enter: select • e: edit • d: delete"))
 98
 99	if m.confirmingDelete {
100		listName := m.cfg.MailingLists[m.listsCursor].Name
101		dialog := DialogBoxStyle.Render(
102			lipgloss.JoinVertical(lipgloss.Center,
103				dangerStyle.Render("Delete mailing list?"),
104				accountEmailStyle.Render(listName),
105				HelpStyle.Render("\n(y/n)"),
106			),
107		)
108		b.WriteString("\n\n" + dialog)
109	}
110
111	return b.String()
112}