handle group delete events by purging local state

This commit is contained in:
2026-09-30 14:21:54 +07:00
parent cb10c2d26e
commit dbdfa8ad67
4 changed files with 61 additions and 10 deletions
+12
View File
@@ -485,6 +485,18 @@ impl Group {
cx.notify();
}
pub(crate) fn forget(&mut self, id: EventId, cx: &mut Context<Self>) {
self.window.remove(id);
if !self.index.remove(&id) {
return;
}
self.messages.retain(|message| message.id != id);
cx.emit(GroupEvent::Updated);
cx.notify();
}
pub(crate) fn eose(&mut self, cx: &mut Context<Self>) {
self.loading = false;
cx.emit(GroupEvent::Eose);
+40 -2
View File
@@ -506,8 +506,12 @@ impl GroupsRegistry {
key.clone(),
cx.subscribe(&group, |this, group, event, cx| match event {
GroupEvent::Sent(event) => {
let key = group.read(cx).key().clone();
this.reload(key, Some(event.clone()), cx);
if event.kind == Kind::GroupDeleteEvent {
this.forget_event(group, event.clone(), cx);
} else {
let key = group.read(cx).key().clone();
this.reload(key, Some(event.clone()), cx);
}
}
GroupEvent::Updated => {
this.refresh_entry(group, cx);
@@ -676,6 +680,40 @@ impl GroupsRegistry {
}));
}
fn forget_event(&mut self, group: Entity<Group>, event: Event, cx: &mut Context<Self>) {
let Some(target) = event.tags.event_ids().next() else {
return;
};
let key = group.read(cx).key().clone();
let cache_tag = key.cache_tag();
let nostr = NostrRegistry::global(cx);
let client = nostr.read(cx).client();
let purge = cx.background_spawn(async move {
let filter = Filter::new()
.kind(Kind::ApplicationSpecificData)
.identifier(target.to_hex())
.custom_tag(SingleLetterTag::LOWERCASE_R, cache_tag);
client.database().delete(filter).await
});
self.tasks.push(cx.spawn(async move |this, cx| {
if let Err(error) = purge.await {
log::warn!("nip29: dropping the deleted envelope failed: {error}");
}
this.update(cx, |this, cx| {
group.update(cx, |group, cx| {
group.forget(target, cx);
});
this.reload(key, Some(event), cx);
})
.ok();
}));
}
fn handle_event(&mut self, id: SubscriptionId, event: Event, cx: &mut Context<Self>) {
if id == list_subscription_id() {
match GroupList::parse(&event) {
+4
View File
@@ -819,6 +819,10 @@ impl TimelineWindow {
self.0.truncate(TIMELINE_WINDOW);
}
pub fn remove(&mut self, id: EventId) {
self.0.retain(|event| event.id != id);
}
pub fn previous_tag(&self, me: PublicKey) -> Option<Tag> {
let references: Vec<String> = self
.0