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		itemCount := len(m.cfg.MailingLists) + 1
 34		m.listsCursor = (m.listsCursor - 1 + itemCount) % itemCount
 35	case keyDown, "j":
 36		itemCount := len(m.cfg.MailingLists) + 1
 37		m.listsCursor = (m.listsCursor + 1) % itemCount
 38	case "d":
 39		if m.listsCursor < len(m.cfg.MailingLists) && len(m.cfg.MailingLists) > 0 {
 40			m.confirmingDelete = true
 41		}
 42	case "e":
 43		if m.listsCursor < len(m.cfg.MailingLists) {
 44			list := m.cfg.MailingLists[m.listsCursor]
 45			idx := m.listsCursor
 46			return m, func() tea.Msg {
 47				return GoToEditMailingListMsg{
 48					Index:     idx,
 49					Name:      list.Name,
 50					Addresses: strings.Join(list.Addresses, ", "),
 51				}
 52			}
 53		}
 54	case keyEnter:
 55		if m.listsCursor == len(m.cfg.MailingLists) {
 56			return m, func() tea.Msg { return GoToAddMailingListMsg{} }
 57		}
 58	}
 59	return m, nil
 60}
 61
 62func (m *Settings) viewMailingLists() string {
 63	var b strings.Builder
 64
 65	b.WriteString(titleStyle.Render(t("settings_mailing_lists.title")) + "\n\n")
 66
 67	if len(m.cfg.MailingLists) == 0 {
 68		b.WriteString(accountEmailStyle.Render("  " + t("settings_mailing_lists.no_lists") + "\n\n"))
 69	}
 70
 71	for i, list := range m.cfg.MailingLists {
 72		addrCount := tn("settings_mailing_lists.address_count", len(list.Addresses), map[string]interface{}{
 73			keyCount: len(list.Addresses),
 74		})
 75		line := fmt.Sprintf("%s - %s", list.Name, accountEmailStyle.Render(addrCount))
 76
 77		selected := m.listsCursor == i
 78		cursor := m.contentCursor(selected)
 79		style := m.contentItemStyle(selected)
 80		b.WriteString(style.Render(cursor+line) + "\n")
 81	}
 82
 83	selected := m.listsCursor == len(m.cfg.MailingLists)
 84	cursor := m.contentCursor(selected)
 85	style := m.contentItemStyle(selected)
 86	b.WriteString(style.Render(cursor+t("settings_mailing_lists.add_list")) + "\n\n")
 87
 88	b.WriteString(helpStyle.Render(t("settings_mailing_lists.help")))
 89
 90	if m.confirmingDelete {
 91		listName := m.cfg.MailingLists[m.listsCursor].Name
 92		dialog := DialogBoxStyle.Render(
 93			lipgloss.JoinVertical(lipgloss.Center,
 94				dangerStyle.Render(t("settings_mailing_lists.delete_confirm")),
 95				accountEmailStyle.Render(listName),
 96				HelpStyle.Render("\n(y/n)"),
 97			),
 98		)
 99		b.WriteString("\n\n" + dialog)
100	}
101
102	return b.String()
103}