From c1b0b81e25a6a7fa81e9b4c276316c140b2ae71a Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Tue, 31 Mar 2026 09:28:54 +0700 Subject: [PATCH] add event map --- crates/chat/src/lib.rs | 13 +++++++++++++ crates/chat_ui/src/actions.rs | 1 + crates/chat_ui/src/lib.rs | 19 ++++++++++++------- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/crates/chat/src/lib.rs b/crates/chat/src/lib.rs index abbfdf2..2833518 100644 --- a/crates/chat/src/lib.rs +++ b/crates/chat/src/lib.rs @@ -87,6 +87,9 @@ pub struct ChatRegistry { /// Tracking events seen on which relays in the current session seens: Arc>>>, + /// Mapping of unwrapped event ids to their gift wrap event ids + event_map: Arc>>, + /// Tracking the status of unwrapping gift wrap events. tracking_flag: Arc, @@ -150,6 +153,7 @@ impl ChatRegistry { rooms: vec![], trashes: cx.new(|_| BTreeSet::default()), seens: Arc::new(RwLock::new(HashMap::default())), + event_map: Arc::new(RwLock::new(HashMap::default())), tracking_flag: Arc::new(AtomicBool::new(false)), signal_rx: rx, signal_tx: tx, @@ -165,6 +169,7 @@ impl ChatRegistry { let signer = nostr.read(cx).signer(); let status = self.tracking_flag.clone(); let seens = self.seens.clone(); + let event_map = self.event_map.clone(); let trashes = self.trashes.downgrade(); let initialized_at = Timestamp::now(); @@ -206,6 +211,13 @@ impl ChatRegistry { // Extract the rumor from the gift wrap event match extract_rumor(&client, &signer, event.as_ref()).await { Ok(rumor) => { + // Map the rumor id to the gift wrap event id for later lookup + { + let mut event_map = event_map.write().await; + event_map.insert(rumor.id.unwrap(), event.id); + } + + // Check if the rumor has a recipient if rumor.tags.is_empty() { let signal = Signal::error(event.as_ref(), "Recipient is missing"); @@ -214,6 +226,7 @@ impl ChatRegistry { continue; } + // Check if the rumor was created after the chat was initialized (for detecting new messages) if rumor.created_at >= initialized_at { let signal = Signal::message(event.id, rumor); tx.send_async(signal).await?; diff --git a/crates/chat_ui/src/actions.rs b/crates/chat_ui/src/actions.rs index 25ab534..091b365 100644 --- a/crates/chat_ui/src/actions.rs +++ b/crates/chat_ui/src/actions.rs @@ -13,4 +13,5 @@ pub enum Command { Copy(PublicKey), Relays(PublicKey), Njump(PublicKey), + Trace(EventId), } diff --git a/crates/chat_ui/src/lib.rs b/crates/chat_ui/src/lib.rs index 750a871..ebb6406 100644 --- a/crates/chat_ui/src/lib.rs +++ b/crates/chat_ui/src/lib.rs @@ -658,9 +658,19 @@ impl ChatPanel { Command::Njump(public_key) => { self.open_njump(public_key, cx); } + Command::Trace(id) => { + self.open_trace(id, window, cx); + } } } + fn open_trace(&mut self, id: &EventId, window: &mut Window, cx: &mut Context) { + window.open_modal(cx, move |this, _window, cx| { + // TODO + this.child(v_flex().child("")) + }); + } + fn open_relays(&mut self, public_key: &PublicKey, window: &mut Window, cx: &mut Context) { let profile = self.profile(public_key, cx); @@ -1131,15 +1141,10 @@ impl ChatPanel { .ghost() .dropdown_menu({ let public_key = *public_key; - let _id = *id; + let id = *id; move |this, _window, _cx| { this.menu("Copy author", Box::new(Command::Copy(public_key))) - /* - .menu( - "Trace", - Box::new(Command::Trace(id)), - ) - */ + .menu("Seen on", Box::new(Command::Trace(id))) } }), )