|
|
@@ -195,11 +195,32 @@ func (ep *emojiPicker) HandleEvent(event tview.Event) tview.Command {
|
|
|
|
|
|
channelID := ep.targetChannelID
|
|
|
messageID := ep.targetMessageID
|
|
|
+
|
|
|
+ // Check if user already reacted with this emoji.
|
|
|
+ alreadyReacted := false
|
|
|
+ if msg, err := ep.chatView.state.Cabinet.Message(channelID, messageID); err == nil {
|
|
|
+ for _, r := range msg.Reactions {
|
|
|
+ if r.Me && r.Emoji.APIString() == apiEmoji {
|
|
|
+ alreadyReacted = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
ep.chatView.closeEmojiPicker()
|
|
|
|
|
|
return func() tview.Event {
|
|
|
- if err := ep.chatView.state.React(channelID, messageID, apiEmoji); err != nil {
|
|
|
- slog.Error("failed to add reaction", "err", err, "emoji", fmt.Sprint(apiEmoji))
|
|
|
+ if alreadyReacted {
|
|
|
+ if err := ep.chatView.state.Unreact(channelID, messageID, apiEmoji); err != nil {
|
|
|
+ slog.Error("failed to remove reaction", "err", err, "emoji", fmt.Sprint(apiEmoji))
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if err := ep.chatView.state.React(channelID, messageID, apiEmoji); err != nil {
|
|
|
+ slog.Error("failed to add reaction", "err", err, "emoji", fmt.Sprint(apiEmoji))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if cmd := ep.chatView.focusMessagesList(); cmd != nil {
|
|
|
+ return cmd()
|
|
|
}
|
|
|
return nil
|
|
|
}
|