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}