mirror of
https://github.com/aljazceru/notedeck.git
synced 2026-01-16 06:44:20 +01:00
This adds local nostrdb thread subscriptions. When navigating to a thread, we first check to see if we have any active nostrdb subscriptions for that thread. If not, we create a new subscription. If we do, we re-use that subscription. This works by storing thread state in the Threads struct in the Damus application state. When we pop a route, we check to see if its a thread route. If it is, then we try to unsubscribe, but only if that is the last remaining subscriber for that thread, as there could be more than one. Signed-off-by: William Casarin <jb55@jb55.com>
68 lines
1.6 KiB
Rust
68 lines
1.6 KiB
Rust
use crate::Damus;
|
|
use nostrdb::{NoteKey, QueryResult, Transaction};
|
|
use std::cmp::Ordering;
|
|
|
|
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
|
|
pub struct NoteRef {
|
|
pub key: NoteKey,
|
|
pub created_at: u64,
|
|
}
|
|
|
|
impl NoteRef {
|
|
pub fn new(key: NoteKey, created_at: u64) -> Self {
|
|
NoteRef { key, created_at }
|
|
}
|
|
|
|
pub fn from_query_result(qr: QueryResult<'_>) -> Self {
|
|
NoteRef {
|
|
key: qr.note_key,
|
|
created_at: qr.note.created_at(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Ord for NoteRef {
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
match self.created_at.cmp(&other.created_at) {
|
|
Ordering::Equal => self.key.cmp(&other.key),
|
|
Ordering::Less => Ordering::Greater,
|
|
Ordering::Greater => Ordering::Less,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl PartialOrd for NoteRef {
|
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
Some(self.cmp(other))
|
|
}
|
|
}
|
|
|
|
pub fn root_note_id_from_selected_id<'a>(
|
|
app: &mut Damus,
|
|
txn: &'a Transaction,
|
|
selected_note_id: &'a [u8; 32],
|
|
) -> &'a [u8; 32] {
|
|
let selected_note_key = if let Ok(key) = app
|
|
.ndb
|
|
.get_notekey_by_id(txn, selected_note_id)
|
|
.map(NoteKey::new)
|
|
{
|
|
key
|
|
} else {
|
|
return selected_note_id;
|
|
};
|
|
|
|
let note = if let Ok(note) = app.ndb.get_note_by_key(txn, selected_note_key) {
|
|
note
|
|
} else {
|
|
return selected_note_id;
|
|
};
|
|
|
|
app.note_cache_mut()
|
|
.cached_note_or_insert(selected_note_key, ¬e)
|
|
.reply
|
|
.borrow(note.tags())
|
|
.root()
|
|
.map_or_else(|| selected_note_id, |nr| nr.id)
|
|
}
|