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