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(t("settings_mailing_lists.title")) + "\n\n")
 68
 69	if len(m.cfg.MailingLists) == 0 {
 70		b.WriteString(accountEmailStyle.Render("  " + t("settings_mailing_lists.no_lists") + "\n\n"))
 71	}
 72
 73	for i, list := range m.cfg.MailingLists {
 74		addrCount := tn("settings_mailing_lists.address_count", len(list.Addresses), map[string]interface{}{
 75			"count": len(list.Addresses),
 76		})
 77		line := fmt.Sprintf("%s - %s", list.Name, accountEmailStyle.Render(addrCount))
 78
 79		cursor := "  "
 80		style := accountItemStyle
 81		if m.listsCursor == i {
 82			cursor = "> "
 83			style = selectedAccountItemStyle
 84		}
 85		b.WriteString(style.Render(cursor+line) + "\n")
 86	}
 87
 88	cursor := "  "
 89	style := accountItemStyle
 90	if m.listsCursor == len(m.cfg.MailingLists) {
 91		cursor = "> "
 92		style = selectedAccountItemStyle
 93	}
 94	b.WriteString(style.Render(cursor+t("settings_mailing_lists.add_list")) + "\n\n")
 95
 96	b.WriteString(helpStyle.Render(t("settings_mailing_lists.help")))
 97
 98	if m.confirmingDelete {
 99		listName := m.cfg.MailingLists[m.listsCursor].Name
100		dialog := DialogBoxStyle.Render(
101			lipgloss.JoinVertical(lipgloss.Center,
102				dangerStyle.Render(t("settings_mailing_lists.delete_confirm")),
103				accountEmailStyle.Render(listName),
104				HelpStyle.Render("\n(y/n)"),
105			),
106		)
107		b.WriteString("\n\n" + dialog)
108	}
109
110	return b.String()
111}