refactor(chat): rename chat view references for consistency

This commit is contained in:
ayn2op 2026-04-08 23:39:15 -04:00
parent 08869063c2
commit 68d8aea6e7
5 changed files with 62 additions and 65 deletions

View file

@ -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 {

View file

@ -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},

View file

@ -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),

View file

@ -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),

View file

@ -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)
}
}