refactor(ui/chat): make yank actions command-based

This commit is contained in:
ayn2op 2026-03-14 16:30:26 -04:00
parent 2d79e45f6f
commit 1acf10994f
2 changed files with 25 additions and 24 deletions

View file

@ -418,8 +418,7 @@ func (gt *guildsTree) HandleEvent(event tcell.Event) tview.Command {
case keybind.Matches(event, gt.cfg.Keybinds.GuildsTree.SelectCurrent.Keybind):
return handler(tcell.NewEventKey(tcell.KeyEnter, "", tcell.ModNone))
case keybind.Matches(event, gt.cfg.Keybinds.GuildsTree.YankID.Keybind):
gt.yankID()
return nil
return gt.yankID()
}
// Do not fall through to TreeView defaults for unmatched keys.
return nil
@ -427,21 +426,23 @@ func (gt *guildsTree) HandleEvent(event tcell.Event) tview.Command {
return gt.TreeView.HandleEvent(event)
}
func (gt *guildsTree) yankID() {
func (gt *guildsTree) yankID() tview.Command {
node := gt.GetCurrentNode()
if node == nil {
return
return nil
}
// Reference of a tree node in the guilds tree is its ID.
// discord.Snowflake (discord.GuildID and discord.ChannelID) have the String method.
if id, ok := node.GetReference().(fmt.Stringer); ok {
go func() {
return func() tcell.Event {
if err := clipboard.Write(clipboard.FmtText, []byte(id.String())); err != nil {
slog.Error("failed to copy node id", "err", err)
}
}()
return nil
}
}
return nil
}
func (gt *guildsTree) findNodeByReference(reference any) *tview.TreeNode {

View file

@ -872,14 +872,11 @@ func (ml *messagesList) HandleEvent(event tcell.Event) tview.Command {
ml.selectReply()
return nil
case keybind.Matches(event, ml.cfg.Keybinds.MessagesList.YankID.Keybind):
ml.yankID()
return nil
return ml.yankMessageID()
case keybind.Matches(event, ml.cfg.Keybinds.MessagesList.YankContent.Keybind):
ml.yankContent()
return nil
return ml.yankContent()
case keybind.Matches(event, ml.cfg.Keybinds.MessagesList.YankURL.Keybind):
ml.yankURL()
return nil
return ml.yankURL()
case keybind.Matches(event, ml.cfg.Keybinds.MessagesList.Open.Keybind):
ml.open()
return nil
@ -1014,46 +1011,49 @@ func (ml *messagesList) prependOlderMessages() int {
return len(messages)
}
func (ml *messagesList) yankID() {
func (ml *messagesList) yankMessageID() tview.Command {
msg, err := ml.selectedMessage()
if err != nil {
slog.Error("failed to get selected message", "err", err)
return
return nil
}
go func() {
return func() tcell.Event {
if err := clipboard.Write(clipboard.FmtText, []byte(msg.ID.String())); err != nil {
slog.Error("failed to copy message id", "err", err)
}
}()
return nil
}
}
func (ml *messagesList) yankContent() {
func (ml *messagesList) yankContent() tview.Command {
msg, err := ml.selectedMessage()
if err != nil {
slog.Error("failed to get selected message", "err", err)
return
return nil
}
go func() {
return func() tcell.Event {
if err := clipboard.Write(clipboard.FmtText, []byte(msg.Content)); err != nil {
slog.Error("failed to copy message content", "err", err)
}
}()
return nil
}
}
func (ml *messagesList) yankURL() {
func (ml *messagesList) yankURL() tview.Command {
msg, err := ml.selectedMessage()
if err != nil {
slog.Error("failed to get selected message", "err", err)
return
return nil
}
go func() {
return func() tcell.Event {
if err := clipboard.Write(clipboard.FmtText, []byte(msg.URL())); err != nil {
slog.Error("failed to copy message url", "err", err)
}
}()
return nil
}
}
func (ml *messagesList) open() {