From 68d8aea6e784792a6dae63b8b860a9d1cf40ef95 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Wed, 8 Apr 2026 23:39:15 -0400 Subject: [PATCH] refactor(chat): rename chat view references for consistency --- internal/ui/chat/attachments_picker.go | 18 +++---- internal/ui/chat/channels_picker.go | 31 ++++++------ internal/ui/chat/guilds_tree.go | 4 +- internal/ui/chat/message_input.go | 4 +- internal/ui/chat/messages_list.go | 70 +++++++++++++------------- 5 files changed, 62 insertions(+), 65 deletions(-) diff --git a/internal/ui/chat/attachments_picker.go b/internal/ui/chat/attachments_picker.go index dcd71d2..c507749 100644 --- a/internal/ui/chat/attachments_picker.go +++ b/internal/ui/chat/attachments_picker.go @@ -15,19 +15,15 @@ type attachmentItem struct { type attachmentsPicker struct { *picker.Model - cfg *config.Config - chatView *Model - items []attachmentItem + cfg *config.Config + chat *Model + items []attachmentItem } var _ help.KeyMap = (*attachmentsPicker)(nil) -func newAttachmentsPicker(cfg *config.Config, chatView *Model) *attachmentsPicker { - ap := &attachmentsPicker{ - Model: picker.NewModel(), - cfg: cfg, - chatView: chatView, - } +func newAttachmentsPicker(cfg *config.Config, chat *Model) *attachmentsPicker { + ap := &attachmentsPicker{Model: picker.NewModel(), cfg: cfg, chat: chat} ConfigurePicker(ap.Model, cfg, "Attachments") return ap } @@ -47,8 +43,8 @@ func (ap *attachmentsPicker) SetItems(items []attachmentItem) { func (ap *attachmentsPicker) close() tview.Cmd { - ap.chatView.RemoveLayer(attachmentsPickerLayerName) - return tview.SetFocus(ap.chatView.messagesList) + ap.chat.RemoveLayer(attachmentsPickerLayerName) + return tview.SetFocus(ap.chat.messagesList) } func (ap *attachmentsPicker) Update(msg tview.Msg) tview.Cmd { diff --git a/internal/ui/chat/channels_picker.go b/internal/ui/chat/channels_picker.go index 0ee0e6f..b1ccab5 100644 --- a/internal/ui/chat/channels_picker.go +++ b/internal/ui/chat/channels_picker.go @@ -15,13 +15,14 @@ import ( type channelsPicker struct { *picker.Model - chatView *Model + chat *Model + cfg *config.Config } var _ help.KeyMap = (*channelsPicker)(nil) -func newChannelsPicker(cfg *config.Config, chatView *Model) *channelsPicker { - cp := &channelsPicker{picker.NewModel(), chatView} +func newChannelsPicker(cfg *config.Config, chat *Model) *channelsPicker { + cp := &channelsPicker{Model: picker.NewModel(), chat: chat, cfg: cfg} ConfigurePicker(cp.Model, cfg, "Channels") return cp } @@ -34,28 +35,28 @@ func (cp *channelsPicker) Update(msg tview.Msg) tview.Cmd { return nil } - channel, err := cp.chatView.state.Cabinet.Channel(channelID) + channel, err := cp.chat.state.Cabinet.Channel(channelID) if err != nil { slog.Error("failed to get channel from state", "err", err, "channel_id", channelID) return nil } - node := cp.chatView.guildsTree.findNodeByChannelID(channel.ID) + node := cp.chat.guildsTree.findNodeByChannelID(channel.ID) if node == nil { slog.Error("failed to locate channel in tree", "channel_id", channel.ID) return nil } - cp.chatView.guildsTree.expandPathToNode(node) - cp.chatView.guildsTree.SetCurrentNode(node) + cp.chat.guildsTree.expandPathToNode(node) + cp.chat.guildsTree.SetCurrentNode(node) var selectCmd tview.Cmd if channel.Type != discord.GuildCategory { - selectCmd = cp.chatView.guildsTree.onSelected(node) + selectCmd = cp.chat.guildsTree.onSelected(node) } - cp.chatView.closePicker() + cp.chat.closePicker() return selectCmd case *picker.CancelMsg: - cp.chatView.closePicker() + cp.chat.closePicker() return nil } return cp.Model.Update(msg) @@ -63,7 +64,7 @@ func (cp *channelsPicker) Update(msg tview.Msg) tview.Cmd { func (cp *channelsPicker) update() { var items picker.Items - state := cp.chatView.state + state := cp.chat.state privateChannels, err := state.Cabinet.PrivateChannels() if err != nil { @@ -94,12 +95,12 @@ func (cp *channelsPicker) update() { } } - cp.Model.SetItems(items) + cp.SetItems(items) } func (cp *channelsPicker) channelItem(guild *discord.Guild, channel discord.Channel) picker.Item { var b strings.Builder - b.WriteString(ui.ChannelToString(channel, cp.chatView.cfg.Icons, cp.chatView.state)) + b.WriteString(ui.ChannelToString(channel, cp.cfg.Icons, cp.chat.state)) if guild != nil { b.WriteString(" - ") @@ -111,12 +112,12 @@ func (cp *channelsPicker) channelItem(guild *discord.Guild, channel discord.Chan } func (cp *channelsPicker) ShortHelp() []keybind.Keybind { - cfg := cp.chatView.cfg.Keybinds.Picker + cfg := cp.cfg.Keybinds.Picker return []keybind.Keybind{cfg.Up.Keybind, cfg.Down.Keybind, cfg.Select.Keybind, cfg.Cancel.Keybind} } func (cp *channelsPicker) FullHelp() [][]keybind.Keybind { - cfg := cp.chatView.cfg.Keybinds.Picker + cfg := cp.cfg.Keybinds.Picker return [][]keybind.Keybind{ {cfg.Up.Keybind, cfg.Down.Keybind, cfg.Top.Keybind, cfg.Bottom.Keybind}, {cfg.Select.Keybind, cfg.Cancel.Keybind}, diff --git a/internal/ui/chat/guilds_tree.go b/internal/ui/chat/guilds_tree.go index a5c790a..fdc8d46 100644 --- a/internal/ui/chat/guilds_tree.go +++ b/internal/ui/chat/guilds_tree.go @@ -34,11 +34,11 @@ type guildsTree struct { var _ help.KeyMap = (*guildsTree)(nil) -func newGuildsTree(cfg *config.Config, chatView *Model) *guildsTree { +func newGuildsTree(cfg *config.Config, chat *Model) *guildsTree { gt := &guildsTree{ TreeView: tview.NewTreeView(), cfg: cfg, - chat: chatView, + chat: chat, guildNodeByID: make(map[discord.GuildID]*tview.TreeNode), channelNodeByID: make(map[discord.ChannelID]*tview.TreeNode), diff --git a/internal/ui/chat/message_input.go b/internal/ui/chat/message_input.go index 7fe1891..c1566db 100644 --- a/internal/ui/chat/message_input.go +++ b/internal/ui/chat/message_input.go @@ -58,11 +58,11 @@ type tabSuggestMsg struct{ tcell.EventTime } var _ help.KeyMap = (*messageInput)(nil) -func newMessageInput(cfg *config.Config, chatView *Model) *messageInput { +func newMessageInput(cfg *config.Config, chat *Model) *messageInput { mi := &messageInput{ TextArea: tview.NewTextArea(), cfg: cfg, - chat: chatView, + chat: chat, sendMessageData: &api.SendMessageData{}, cache: cache.NewCache(), mentionsList: newMentionsList(cfg), diff --git a/internal/ui/chat/messages_list.go b/internal/ui/chat/messages_list.go index 289a197..cbfc9e6 100644 --- a/internal/ui/chat/messages_list.go +++ b/internal/ui/chat/messages_list.go @@ -44,7 +44,7 @@ import ( type messagesList struct { *list.Model cfg *config.Config - chatView *Model + chat *Model messages []discord.Message // rows is the virtual list model rendered by tview (message rows + // date-separator rows). It is rebuilt lazily when rowsDirty is true. @@ -80,15 +80,15 @@ type messagesListRow struct { timestamp discord.Timestamp } -func newMessagesList(cfg *config.Config, chatView *Model) *messagesList { +func newMessagesList(cfg *config.Config, chat *Model) *messagesList { ml := &messagesList{ Model: list.NewModel(), cfg: cfg, - chatView: chatView, + chat: chat, renderer: markdown.NewRenderer(cfg), itemByID: make(map[discord.MessageID]*tview.TextView), } - ml.attachmentsPicker = newAttachmentsPicker(cfg, chatView) + ml.attachmentsPicker = newAttachmentsPicker(cfg, chat) ml.Box = ui.ConfigureBox(ml.Box, &cfg.Theme) ml.SetTitle("Messages") @@ -121,7 +121,7 @@ func (ml *messagesList) reset() { } func (ml *messagesList) setTitle(channel discord.Channel) { - title := ui.ChannelToString(channel, ml.cfg.Icons, ml.chatView.state) + title := ui.ChannelToString(channel, ml.cfg.Icons, ml.chat.state) if topic := channel.Topic; topic != "" { title += " - " + topic } @@ -343,7 +343,7 @@ func (ml *messagesList) nearestMessageRowIndex(rowIndex int) int { func (ml *messagesList) writeMessage(builder *tview.LineBuilder, message discord.Message, baseStyle tcell.Style) { if ml.cfg.HideBlockedUsers { - isBlocked := ml.chatView.state.UserIsBlocked(message.Author.ID) + isBlocked := ml.chat.state.UserIsBlocked(message.Author.ID) if isBlocked { builder.Write("Blocked message", baseStyle.Foreground(color.Red).Bold(true)) return @@ -390,7 +390,7 @@ func (ml *messagesList) drawAuthor(builder *tview.LineBuilder, message discord.M } color, ok := state.MemberColor(member, func(id discord.RoleID) *discord.Role { - r, _ := ml.chatView.state.Cabinet.Role(message.GuildID, id) + r, _ := ml.chat.state.Cabinet.Role(message.GuildID, id) return r }) if ok { @@ -408,7 +408,7 @@ func (ml *messagesList) memberForMessage(message discord.Message) *discord.Membe return nil } - member, err := ml.chatView.state.Cabinet.Member(message.GuildID, message.Author.ID) + member, err := ml.chat.state.Cabinet.Member(message.GuildID, message.Author.ID) if err != nil { slog.Error("failed to get member from state", "guild_id", message.GuildID, "member_id", message.Author.ID, "err", err) return nil @@ -418,7 +418,7 @@ func (ml *messagesList) memberForMessage(message discord.Message) *discord.Membe func (ml *messagesList) drawContent(builder *tview.LineBuilder, message discord.Message, baseStyle tcell.Style) { lines, root := ml.renderContentLines(message, baseStyle) - if ml.chatView.cfg.Markdown.Enabled && builder.HasCurrentLine() { + if ml.cfg.Markdown.Enabled && builder.HasCurrentLine() { startsWithCodeBlock := false if root != nil { if first := root.FirstChild(); first != nil { @@ -447,9 +447,9 @@ func (ml *messagesList) renderContentLines(message discord.Message, baseStyle tc func (ml *messagesList) renderContentLinesWithMarkdown(message discord.Message, baseStyle tcell.Style, forceMarkdown bool) ([]tview.Line, ast.Node) { // Keep one rendering path for both normal messages and embed fragments so we preserve mention/link parsing behavior consistently across both. - if forceMarkdown || ml.chatView.cfg.Markdown.Enabled { + if forceMarkdown || ml.cfg.Markdown.Enabled { c := []byte(message.Content) - root := discordmd.ParseWithMessage(c, *ml.chatView.state.Cabinet, &message, false) + root := discordmd.ParseWithMessage(c, *ml.chat.state.Cabinet, &message, false) return ml.renderer.RenderLines(c, root, baseStyle), root } @@ -888,7 +888,7 @@ func (ml *messagesList) Update(msg tview.Msg) tview.Cmd { return ml.Model.Update(msg) case *olderMessagesLoadedMsg: - selectedChannel := ml.chatView.SelectedChannel() + selectedChannel := ml.chat.SelectedChannel() if selectedChannel == nil || selectedChannel.ID != msg.ChannelID { return nil } @@ -989,7 +989,7 @@ func (ml *messagesList) selectReply() { } func (ml *messagesList) fetchOlderMessages() tview.Cmd { - selectedChannel := ml.chatView.SelectedChannel() + selectedChannel := ml.chat.SelectedChannel() if selectedChannel == nil { return nil } @@ -998,7 +998,7 @@ func (ml *messagesList) fetchOlderMessages() tview.Cmd { before := ml.messages[0].ID limit := uint(ml.cfg.MessagesLimit) return func() tview.Msg { - messages, err := ml.chatView.state.MessagesBefore(channelID, before, limit) + messages, err := ml.chat.state.MessagesBefore(channelID, before, limit) if err != nil { slog.Error("failed to fetch older messages", "err", err) return nil @@ -1176,7 +1176,7 @@ func (ml *messagesList) showAttachmentsList(urls []string, attachments []discord } ml.attachmentsPicker.SetItems(items) - ml.chatView. + ml.chat. AddLayer( ui.Centered(ml.attachmentsPicker, ml.cfg.Picker.Width, ml.cfg.Picker.Height), layers.WithName(attachmentsPickerLayerName), @@ -1239,7 +1239,7 @@ func (ml *messagesList) reply(mention bool) tview.Cmd { name = member.Nick } - data := ml.chatView.messageInput.sendMessageData + data := ml.chat.messageInput.sendMessageData data.Reference = &discord.MessageReference{MessageID: message.ID} data.AllowedMentions = &api.AllowedMentions{RepliedUser: option.False} @@ -1249,9 +1249,9 @@ func (ml *messagesList) reply(mention bool) tview.Cmd { title = "[@] " + title } - ml.chatView.messageInput.sendMessageData = data - ml.chatView.messageInput.SetTitle(title + name) - return tview.SetFocus(ml.chatView.messageInput) + ml.chat.messageInput.sendMessageData = data + ml.chat.messageInput.SetTitle(title + name) + return tview.SetFocus(ml.chat.messageInput) } func (ml *messagesList) editSelectedMessage() tview.Cmd { @@ -1261,16 +1261,16 @@ func (ml *messagesList) editSelectedMessage() tview.Cmd { return nil } - me, _ := ml.chatView.state.Cabinet.Me() + me, _ := ml.chat.state.Cabinet.Me() if message.Author.ID != me.ID { slog.Error("failed to edit message; not the author", "channel_id", message.ChannelID, "message_id", message.ID) return nil } - ml.chatView.messageInput.SetTitle("Editing") - ml.chatView.messageInput.edit = true - ml.chatView.messageInput.SetText(message.Content, true) - return tview.SetFocus(ml.chatView.messageInput) + ml.chat.messageInput.SetTitle("Editing") + ml.chat.messageInput.edit = true + ml.chat.messageInput.SetText(message.Content, true) + return tview.SetFocus(ml.chat.messageInput) } func (ml *messagesList) confirmDelete() { @@ -1282,7 +1282,7 @@ func (ml *messagesList) confirmDelete() { } } - ml.chatView.showConfirmModal( + ml.chat.showConfirmModal( "Are you sure you want to delete this message?", []string{"Yes", "No"}, onChoice, @@ -1298,19 +1298,19 @@ func (ml *messagesList) deleteSelectedMessage() tview.Cmd { return func() tview.Msg { if selectedMessage.GuildID.IsValid() { - me, _ := ml.chatView.state.Cabinet.Me() - if selectedMessage.Author.ID != me.ID && !ml.chatView.state.HasPermissions(selectedMessage.ChannelID, discord.PermissionManageMessages) { + me, _ := ml.chat.state.Cabinet.Me() + if selectedMessage.Author.ID != me.ID && !ml.chat.state.HasPermissions(selectedMessage.ChannelID, discord.PermissionManageMessages) { slog.Error("failed to delete message; missing relevant permissions", "channel_id", selectedMessage.ChannelID, "message_id", selectedMessage.ID) return nil } } - if err := ml.chatView.state.DeleteMessage(selectedMessage.ChannelID, selectedMessage.ID, ""); err != nil { + if err := ml.chat.state.DeleteMessage(selectedMessage.ChannelID, selectedMessage.ID, ""); err != nil { slog.Error("failed to delete message", "channel_id", selectedMessage.ChannelID, "message_id", selectedMessage.ID, "err", err) return nil } - if err := ml.chatView.state.MessageRemove(selectedMessage.ChannelID, selectedMessage.ID); err != nil { + if err := ml.chat.state.MessageRemove(selectedMessage.ChannelID, selectedMessage.ID); err != nil { slog.Error("failed to delete message", "channel_id", selectedMessage.ChannelID, "message_id", selectedMessage.ID, "err", err) return nil } @@ -1328,7 +1328,7 @@ func (ml *messagesList) requestGuildMembers(guildID discord.GuildID, messages [] continue } - if member, _ := ml.chatView.state.Cabinet.Member(guildID, message.Author.ID); member == nil { + if member, _ := ml.chat.state.Cabinet.Member(guildID, message.Author.ID); member == nil { userID := message.Author.ID if _, ok := seen[userID]; !ok { seen[userID] = struct{}{} @@ -1338,7 +1338,7 @@ func (ml *messagesList) requestGuildMembers(guildID discord.GuildID, messages [] } if len(usersToFetch) > 0 { - err := ml.chatView.state.SendGateway(context.Background(), &gateway.RequestGuildMembersCommand{ + err := ml.chat.state.SendGateway(context.Background(), &gateway.RequestGuildMembersCommand{ GuildIDs: []discord.GuildID{guildID}, UserIDs: usersToFetch, }) @@ -1391,7 +1391,7 @@ func (ml *messagesList) ShortHelp() []keybind.Keybind { } if msg, err := ml.selectedMessage(); err == nil { - me, _ := ml.chatView.state.Cabinet.Me() + me, _ := ml.chat.state.Cabinet.Me() if msg.Author.ID != me.ID { help = append(help, cfg.Reply.Keybind) } @@ -1412,13 +1412,13 @@ func (ml *messagesList) FullHelp() [][]keybind.Keybind { canSelectReply = msg.ReferencedMessage != nil canOpen = len(messageURLs(*msg)) != 0 || len(msg.Attachments) != 0 - me, _ := ml.chatView.state.Cabinet.Me() + me, _ := ml.chat.state.Cabinet.Me() canReply = msg.Author.ID != me.ID canEdit = msg.Author.ID == me.ID canDelete = canEdit if !canDelete { - selected := ml.chatView.SelectedChannel() - canDelete = selected != nil && ml.chatView.state.HasPermissions(selected.ID, discord.PermissionManageMessages) + selected := ml.chat.SelectedChannel() + canDelete = selected != nil && ml.chat.state.HasPermissions(selected.ID, discord.PermissionManageMessages) } }