From 3c35c3dbfab1ed6ee2e193f881fad4ed5754d0c0 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sat, 21 Dec 2024 18:08:32 +0200 Subject: Fixed message-remembering issues and implemented non persistent "last frequency" per network --- internal/client/ui/core/chat/chat.go | 91 ++++++++++------------ internal/client/ui/core/core.go | 1 + .../client/ui/core/frequencylist/frequencylist.go | 42 ++++++++-- internal/client/ui/core/networklist/networklist.go | 40 ++-------- internal/client/ui/core/state/state.go | 4 +- 5 files changed, 91 insertions(+), 87 deletions(-) (limited to 'internal/client/ui') diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index 12a39d0..6ae7cdd 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -53,9 +53,9 @@ type Model struct { focus bool locked bool - networkIndex int // Note this might be invalid, rely on frequencyIndex - receiverIndex *int - frequencyIndex *int + networkIndex int + receiverIndex int + frequencyIndex int index int @@ -69,11 +69,14 @@ func New(width int) Model { vi.PlaceholderStyle = lipgloss.NewStyle().Foreground(colors.Gray) return Model{ - vi: vi, - focus: false, - locked: false, - width: width, - index: -1, + vi: vi, + focus: false, + locked: false, + networkIndex: -1, + receiverIndex: -1, + frequencyIndex: -1, + index: -1, + width: width, } } @@ -155,9 +158,9 @@ func (m Model) View() string { builder.Reset() var btree *btree.BTreeG[data.Message] - if m.frequencyIndex != nil { + if m.frequencyIndex != -1 && m.networkIndex != -1 { network := state.State.Networks[m.networkIndex] - frequencyId := network.Frequencies[*m.frequencyIndex].ID + frequencyId := network.Frequencies[m.frequencyIndex].ID btree = state.State.Messages[frequencyId] } else { // TODO: implement support for receiver id @@ -313,14 +316,14 @@ func (m *Model) sendMessage() tea.Cmd { m.vi.Reset() var receiverId *snowflake.ID = nil - if m.receiverIndex != nil { + if m.receiverIndex != -1 { // TODO: do nothing for now, until trusted friends are implemented } var frequencyId *snowflake.ID = nil - if m.frequencyIndex != nil { + if m.frequencyIndex != -1 && m.networkIndex != -1 { network := state.State.Networks[m.networkIndex] - frequencyId = &network.Frequencies[*m.frequencyIndex].ID + frequencyId = &network.Frequencies[m.frequencyIndex].ID } return gateway.Send(&packet.SendMessage{ @@ -330,69 +333,59 @@ func (m *Model) sendMessage() tea.Cmd { }) } -// func (m *Model) SetNetworkIndex(networkIndex int) { -// if m.networkIndex != networkIndex { -// m.index = -1 -// } -// m.networkIndex = networkIndex -// } - func (m *Model) SetReceiver(receiverIndex int) { - if m.receiverIndex != nil && *m.receiverIndex == receiverIndex { + if m.receiverIndex == receiverIndex { return } m.ResetBeforeSwitch() - m.receiverIndex = &receiverIndex - m.frequencyIndex = nil + m.receiverIndex = receiverIndex + m.frequencyIndex = -1 + m.networkIndex = -1 m.RestoreAfterSwitch() } func (m *Model) SetFrequency(networkIndex, frequencyIndex int) { - if m.frequencyIndex != nil && *m.frequencyIndex == frequencyIndex { + if m.frequencyIndex == frequencyIndex && m.networkIndex == networkIndex { return } m.ResetBeforeSwitch() - m.receiverIndex = nil - m.frequencyIndex = &frequencyIndex + m.receiverIndex = -1 + m.frequencyIndex = frequencyIndex m.networkIndex = networkIndex m.RestoreAfterSwitch() } func (m *Model) ResetBeforeSwitch() { - source := m.frequencyIndex - if source == nil { - source = m.receiverIndex - } - if source == nil { - return - } - - log.Println("Resetting", source) - state.State.IncompleteMessages[snowflake.ID(*source)] = m.vi.String() - m.vi.Reset() m.index = -1 + if m.frequencyIndex != -1 && m.networkIndex != -1 { + network := state.State.Networks[m.networkIndex] + frequencyId := network.Frequencies[m.frequencyIndex].ID + log.Println("Saving", frequencyId) + state.State.IncompleteMessages[frequencyId] = m.vi.String() + m.vi.Reset() + } else if m.receiverIndex != -1 { + // TODO: receiver + } } func (m *Model) RestoreAfterSwitch() { - source := m.frequencyIndex - if source == nil { - source = m.receiverIndex - } - if source == nil { - return - } - - log.Println("Restoring", source) msgs := state.State.IncompleteMessages - if val, ok := msgs[snowflake.ID(*source)]; ok { - m.vi.SetString(val) + if m.frequencyIndex != -1 && m.networkIndex != -1 { + network := state.State.Networks[m.networkIndex] + frequencyId := network.Frequencies[m.frequencyIndex].ID + log.Println("Restoring", frequencyId) + if val, ok := msgs[frequencyId]; ok { + m.vi.SetString(val) + } + } else if m.receiverIndex != -1 { + // TODO: receiver } } func (m *Model) renderMessage(message data.Message, builder *strings.Builder, header bool) int { lines := 0 - if header { + if header && m.networkIndex != -1 { var member *data.GetNetworkMembersRow = nil network := state.State.Networks[m.networkIndex] for _, networkMember := range network.Members { diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 11da7ef..f986351 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -313,6 +313,7 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd { case FocusNetworkList: m.networkList, cmd = m.networkList.Update(msg) m.frequencyList.SetNetworkIndex(m.networkList.Index()) + m.chat.SetFrequency(m.networkList.Index(), m.frequencyList.Index()) case FocusFrequencyList: m.frequencyList, cmd = m.frequencyList.Update(msg) m.chat.SetFrequency(m.networkList.Index(), m.frequencyList.Index()) diff --git a/internal/client/ui/core/frequencylist/frequencylist.go b/internal/client/ui/core/frequencylist/frequencylist.go index c00b8cd..98eb975 100644 --- a/internal/client/ui/core/frequencylist/frequencylist.go +++ b/internal/client/ui/core/frequencylist/frequencylist.go @@ -35,8 +35,10 @@ type Model struct { func New() Model { return Model{ - focus: false, - index: 0, + history: []func(m *Model){}, + networkIndex: -1, + index: -1, + focus: false, } } @@ -148,8 +150,38 @@ func (m Model) Swap(dir int) (Model, tea.Cmd) { return m, cmd } -func (m *Model) SetNetworkIndex(index int) { - m.networkIndex = index +func (m *Model) SetNetworkIndex(networkIndex int) { + if m.networkIndex == networkIndex { + return + } + + if 0 <= m.networkIndex && m.networkIndex < len(state.State.Networks) { + network := state.State.Networks[m.networkIndex] + if 0 <= m.index && m.index < len(network.Frequencies) { + frequencyId := network.Frequencies[m.index].ID + state.State.LastFrequency[network.ID] = frequencyId + } + } + + if networkIndex == -1 { + m.networkIndex = -1 + m.index = -1 + return + } + + m.networkIndex = networkIndex + m.index = 0 + + // Try restoring last ID + network := state.State.Networks[m.networkIndex] + if id, ok := state.State.LastFrequency[network.ID]; ok { + for i, frequency := range network.Frequencies { + if frequency.ID == id { + m.index = i + break + } + } + } } func (m Model) FrequenciesLength() int { @@ -164,5 +196,5 @@ func (m Model) Network() *packet.FullNetwork { } func (m *Model) Index() int { - return m.index + return m.index } diff --git a/internal/client/ui/core/networklist/networklist.go b/internal/client/ui/core/networklist/networklist.go index 6548a1d..bdeff54 100644 --- a/internal/client/ui/core/networklist/networklist.go +++ b/internal/client/ui/core/networklist/networklist.go @@ -41,38 +41,14 @@ var ( */ func IconStyle(icon string, fg, bg lipgloss.Color) lipgloss.Style { - if true { - bgStyle := lipgloss.NewStyle().Background(bg).Foreground(colors.Background) - top := bgStyle.Render("🭠🭘 🭣🭕") - middle := lipgloss.NewStyle().Width(6).Align(lipgloss.Center). - Background(bg).Foreground(fg).Render(icon) - bgStyle2 := lipgloss.NewStyle().Foreground(bg) - bottom := bgStyle2.Render("🭥🭓██🭞🭚") - combined := lipgloss.JoinVertical(lipgloss.Left, top, middle, bottom) - return lipgloss.NewStyle().SetString(combined) - } - if true { - bgStyle := lipgloss.NewStyle().Background(bg).Foreground(colors.Background) - top := bgStyle.Render("🭠🭘 🭣🭕") - middle := lipgloss.NewStyle().Width(6).Align(lipgloss.Center). - Background(bg).Foreground(fg).Render(icon) - bottom := bgStyle.Render("🭏🬽 🭈🭄") - combined := lipgloss.JoinVertical(lipgloss.Left, top, middle, bottom) - return lipgloss.NewStyle().SetString(combined) - } - if true { - return partialIconStyle.Foreground(fg).SetString("\n" + icon) - } - if true { - bgStyle := lipgloss.NewStyle().Foreground(bg) - top := bgStyle.Render("🭊🭂██🭍🬿") - middle := lipgloss.NewStyle().Width(6).Align(lipgloss.Center). - Background(bg).Foreground(fg).Render(icon) - bottom := bgStyle.Render("🭥🭓██🭞🭚") - combined := lipgloss.JoinVertical(lipgloss.Left, top, middle, bottom) - return lipgloss.NewStyle().SetString(combined) - } - return partialIconStyle.Foreground(fg).Background(bg).SetString("\n" + icon) + bgStyle := lipgloss.NewStyle().Background(bg).Foreground(colors.Background) + top := bgStyle.Render("🭠🭘 🭣🭕") + middle := lipgloss.NewStyle().Width(6).Align(lipgloss.Center). + Background(bg).Foreground(fg).Render(icon) + bgStyle2 := lipgloss.NewStyle().Foreground(bg) + bottom := bgStyle2.Render("🭥🭓██🭞🭚") + combined := lipgloss.JoinVertical(lipgloss.Left, top, middle, bottom) + return lipgloss.NewStyle().SetString(combined) } type Model struct { diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go index 285658f..762cf2f 100644 --- a/internal/client/ui/core/state/state.go +++ b/internal/client/ui/core/state/state.go @@ -10,13 +10,15 @@ import ( type state struct { // Key is either a frequency or receiver IncompleteMessages map[snowflake.ID]string + LastFrequency map[snowflake.ID]snowflake.ID // key is network Messages map[snowflake.ID]*btree.BTreeG[data.Message] Networks []packet.FullNetwork } var State state = state{ + IncompleteMessages: map[snowflake.ID]string{}, + LastFrequency: map[snowflake.ID]snowflake.ID{}, Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{}, Networks: []packet.FullNetwork{}, - IncompleteMessages: map[snowflake.ID]string{}, } -- cgit v1.3.1