Skip to content

Commit 55e5196

Browse files
tmp: switch workstations
1 parent b5005fa commit 55e5196

File tree

4 files changed

+73
-13
lines changed

4 files changed

+73
-13
lines changed

src/chat/src/reaction.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
use atomic_refcell::AtomicRefCell;
2+
use gpui::{App, IntoElement, Render, Rgba};
13
use std::fmt::{Debug, Formatter};
24
use std::sync::Arc;
3-
use atomic_refcell::AtomicRefCell;
4-
use gpui::{App, IntoElement, Rgba};
55

66
pub type ReactionEvent<T> = (T, ReactionOperation);
77

@@ -14,7 +14,12 @@ pub enum MessageReactionType {
1414
#[derive(Clone, PartialEq)]
1515
pub enum ReactionEmoji {
1616
Simple(String),
17-
Custom { url: String, animated: bool, name: Option<String>, id: u64 },
17+
Custom {
18+
url: String,
19+
animated: bool,
20+
name: Option<String>,
21+
id: u64,
22+
},
1823
}
1924

2025
impl Debug for ReactionEmoji {
@@ -27,7 +32,6 @@ impl Debug for ReactionEmoji {
2732
}
2833

2934
pub trait MessageReaction: IntoElement {
30-
3135
fn get_count(&self, kind: Option<MessageReactionType>) -> u64;
3236
fn get_self_reaction(&self) -> Option<MessageReactionType>;
3337
fn get_emoji(&self) -> ReactionEmoji;
@@ -43,6 +47,7 @@ pub enum ReactionOperation {
4347
RemoveSelf(ReactionEmoji),
4448
RemoveAll,
4549
RemoveEmoji(ReactionEmoji),
50+
SetMembers(ReactionEmoji, Vec<String>),
4651
}
4752

4853
pub trait ReactionList {

src/discord/src/client.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ impl DiscordClient {
157157
}
158158
}
159159

160+
pub async fn load_users_reacting_to(&self, channel_id: ChannelId, message_id: MessageId, emoji: ReactionEmoji) {
161+
let reactions = channel_id.reaction_users(self.discord().http.clone(), message_id, Self::emoji_to_serenity(&emoji), Some(5), None).await;
162+
if reactions.is_err() {return;}
163+
let reactions = reactions.unwrap().iter().map(|user|user.name.clone()).collect();
164+
165+
self.send_reaction_operation(channel_id, message_id, ReactionOperation::SetMembers(emoji, reactions)).await;
166+
}
167+
160168
pub async fn add_reaction(&self, channel_id: ChannelId, message_id: MessageId, emoji: ReactionEmoji) {
161169
let reaction_type = Self::emoji_to_serenity(&emoji);
162170
channel_id.create_reaction(self.discord().http.clone(), message_id, reaction_type).await.unwrap();

src/discord/src/message/reaction.rs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::client::DiscordClient;
22
use components::theme::ActiveTheme;
33
use gpui::prelude::FluentBuilder;
4-
use gpui::{div, img, px, AnyElement, App, InteractiveElement, IntoElement, ParentElement, RenderOnce, Rgba, StatefulInteractiveElement, Styled};
4+
use gpui::{div, img, px, AnyElement, AnyView, App, AppContext, Context, InteractiveElement, IntoElement, ParentElement, Render, RenderOnce, Rgba, StatefulInteractiveElement, Styled, Window};
55
use scope_chat::reaction::MessageReactionType::Normal;
66
use scope_chat::reaction::{MessageReaction, MessageReactionType, ReactionEmoji};
77
use serenity::all::{ChannelId, MessageId, ReactionType};
@@ -43,6 +43,7 @@ pub struct DiscordMessageReaction {
4343
pub(crate) client: Arc<DiscordClient>,
4444
pub(crate) message_id: MessageId,
4545
pub(crate) channel_id: ChannelId,
46+
pub(crate) users: Arc<Option<Vec<String>>>,
4647
}
4748

4849
impl DiscordMessageReaction {
@@ -52,6 +53,7 @@ impl DiscordMessageReaction {
5253
client,
5354
message_id,
5455
channel_id,
56+
users: Arc::new(None),
5557
}
5658
}
5759

@@ -83,13 +85,15 @@ impl DiscordMessageReaction {
8385
fn handle_click(&self, app: &App) {
8486
let reaction = self.clone();
8587
let had_reaction = reaction.get_self_reaction().is_some();
86-
app.spawn(|_| async move {
87-
if had_reaction {
88-
reaction.client.remove_reaction(reaction.channel_id, reaction.message_id, reaction.get_emoji()).await;
89-
} else {
90-
reaction.client.add_reaction(reaction.channel_id, reaction.message_id, reaction.get_emoji()).await;
91-
}
92-
}).detach();
88+
app
89+
.spawn(|_| async move {
90+
if had_reaction {
91+
reaction.client.remove_reaction(reaction.channel_id, reaction.message_id, reaction.get_emoji()).await;
92+
} else {
93+
reaction.client.add_reaction(reaction.channel_id, reaction.message_id, reaction.get_emoji()).await;
94+
}
95+
})
96+
.detach();
9397
}
9498
}
9599

@@ -171,6 +175,12 @@ impl RenderOnce for DiscordMessageReaction {
171175
fn render(self, _: &mut gpui::Window, cx: &mut App) -> impl IntoElement {
172176
let emoji = self.get_emoji();
173177
let theme = cx.theme();
178+
179+
let channel = self.channel_id.clone();
180+
let message = self.message_id.clone();
181+
let closure_emoji = self.get_emoji();
182+
let client = self.client.clone();
183+
let users = self.users.clone();
174184
div()
175185
.px_1()
176186
.py_px()
@@ -189,6 +199,17 @@ impl RenderOnce for DiscordMessageReaction {
189199
.on_click(move |_, _, app| {
190200
self.handle_click(app);
191201
})
202+
.tooltip(move |win, cx| {
203+
204+
AnyView::from(cx.new(|cx| ReactionTooltip::new(users.clone())))
205+
})
206+
.on_hover(move |_, _, _| {
207+
let client = client.clone();
208+
let emoji = closure_emoji.clone();
209+
tokio::spawn(async move {
210+
client.load_users_reacting_to(channel, message, emoji).await;
211+
});
212+
})
192213
}
193214
}
194215

@@ -213,3 +234,20 @@ impl Debug for DiscordMessageReaction {
213234
f.debug_struct("DiscordMessageReaction").field("data", &self.data).finish()
214235
}
215236
}
237+
238+
struct ReactionTooltip {
239+
users: Arc<Option<Vec<String>>>,
240+
}
241+
242+
impl ReactionTooltip {
243+
pub fn new(users: Arc<Option<Vec<String>>>) -> Self {
244+
Self { users }
245+
}
246+
}
247+
248+
impl Render for ReactionTooltip {
249+
fn render(&mut self, window: &mut Window, cx: &mut Context<'_, Self>) -> impl IntoElement {
250+
div()
251+
.child("yay")
252+
}
253+
}

src/discord/src/message/reaction_list.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ impl ReactionList for DiscordReactionList {
5252
client: self.client.clone(),
5353
message_id: self.message_id.clone(),
5454
channel_id: self.channel_id.clone(),
55+
users: Arc::new(None)
5556
};
5657

5758
reaction.increment(kind, user_is_self, by);
@@ -79,11 +80,19 @@ impl ReactionList for DiscordReactionList {
7980
ReactionOperation::RemoveEmoji(emoji) => {
8081
self.reactions.borrow_mut().retain(|reaction| reaction.get_emoji() != emoji);
8182
}
83+
ReactionOperation::SetMembers(emoji, members) => {
84+
if let Some(reaction) = self.reactions.borrow_mut().iter_mut().find(|reaction| reaction.get_emoji() == emoji) {
85+
println!("users {:?}", &members);
86+
reaction.users = Arc::new(Some(members));
87+
}
88+
}
8289
}
8390
}
8491

8592
fn get_content(&self, cx: &mut App) -> impl IntoElement {
86-
self.entity.get_or_init(|| cx.new(|_| RenderableReactionList::new(self.clone()))).clone()
93+
self.entity.get_or_init(|| {
94+
cx.new(|_| RenderableReactionList::new(self.clone()))
95+
}).clone()
8796
}
8897
}
8998

0 commit comments

Comments
 (0)