mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-29 16:31:18 +00:00
Reorganize feed module
This commit is contained in:
parent
6a19ee8fe9
commit
cabd0aa7e5
@ -6,12 +6,16 @@ use eframe::egui;
|
|||||||
use egui::{Context, Frame, RichText, ScrollArea, Ui, Vec2};
|
use egui::{Context, Frame, RichText, ScrollArea, Ui, Vec2};
|
||||||
use nostr_types::Id;
|
use nostr_types::Id;
|
||||||
|
|
||||||
pub use note::Notes;
|
mod notedata;
|
||||||
|
|
||||||
|
mod notes;
|
||||||
|
pub use notes::Notes;
|
||||||
|
|
||||||
mod note;
|
mod note;
|
||||||
pub use note::NoteRenderData;
|
pub use note::NoteRenderData;
|
||||||
pub(super) mod post;
|
pub(super) mod post;
|
||||||
|
|
||||||
|
|
||||||
struct FeedNoteParams {
|
struct FeedNoteParams {
|
||||||
id: Id,
|
id: Id,
|
||||||
indent: usize,
|
indent: usize,
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
mod content;
|
mod content;
|
||||||
mod notedata;
|
|
||||||
|
|
||||||
pub use notedata::Notes;
|
pub use super::Notes;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use notedata::{NoteData, RepostType};
|
use super::notedata::{NoteData, RepostType};
|
||||||
|
|
||||||
use super::FeedNoteParams;
|
use super::FeedNoteParams;
|
||||||
use crate::comms::ToOverlordMessage;
|
use crate::comms::ToOverlordMessage;
|
||||||
|
@ -6,7 +6,6 @@ use nostr_types::{
|
|||||||
ContentSegment, Event, EventDelegation, EventKind, Id, NostrBech32, PublicKeyHex,
|
ContentSegment, Event, EventDelegation, EventKind, Id, NostrBech32, PublicKeyHex,
|
||||||
ShatteredContent, Tag,
|
ShatteredContent, Tag,
|
||||||
};
|
};
|
||||||
use std::{cell::RefCell, collections::HashMap, rc::Rc};
|
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub(super) enum RepostType {
|
pub(super) enum RepostType {
|
||||||
@ -191,106 +190,3 @@ impl NoteData {
|
|||||||
self.self_already_reacted = self_already_reacted;
|
self.self_already_reacted = self_already_reacted;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// a 'note' is a processed event
|
|
||||||
pub struct Notes {
|
|
||||||
notes: HashMap<Id, Rc<RefCell<NoteData>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Notes {
|
|
||||||
pub fn new() -> Notes {
|
|
||||||
Notes {
|
|
||||||
notes: HashMap::new(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
/// Drop NoteData objects that do not have a
|
|
||||||
/// correlated event in the event cache
|
|
||||||
pub(super) fn cache_invalidate_missing_events(&mut self) {
|
|
||||||
self.notes.retain(|id,_| GLOBALS.events.contains_key(id));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// Drop NoteData for a specific note
|
|
||||||
pub(super) fn cache_invalidate_note(&mut self, id: &Id) {
|
|
||||||
self.notes.remove(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Drop all NoteData for a given person
|
|
||||||
pub(in crate::ui) fn cache_invalidate_person(&mut self, pubkey: &PublicKeyHex) {
|
|
||||||
self.notes
|
|
||||||
.retain(|_, note| note.borrow().author.pubkey != *pubkey);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) fn try_update_and_get(&mut self, id: &Id) -> Option<Rc<RefCell<NoteData>>> {
|
|
||||||
if self.notes.contains_key(id) {
|
|
||||||
// get a mutable reference to update reactions, then give it back
|
|
||||||
if let Some(pair) = self.notes.get(id) {
|
|
||||||
if let Ok(mut mut_ref) = pair.try_borrow_mut() {
|
|
||||||
mut_ref.update_reactions();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// return from cache
|
|
||||||
return self._try_get_and_borrow(id);
|
|
||||||
} else {
|
|
||||||
// otherwise try to create new and add to cache
|
|
||||||
if let Some(event) = GLOBALS.events.get(id) {
|
|
||||||
let note = NoteData::new(event);
|
|
||||||
// add to cache
|
|
||||||
let ref_note = Rc::new(RefCell::new(note));
|
|
||||||
self.notes.insert(*id, ref_note);
|
|
||||||
return self._try_get_and_borrow(id);
|
|
||||||
} else {
|
|
||||||
// send a worker to try and load it from the database
|
|
||||||
// if it's in the db it will go into the cache and be
|
|
||||||
// available on a future UI update
|
|
||||||
let id_copy = id.to_owned();
|
|
||||||
tokio::spawn(async move {
|
|
||||||
if let Err(e) = GLOBALS.events.get_local(id_copy).await {
|
|
||||||
tracing::error!("{}", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
pub(super) fn try_get(&mut self, id: &Id) -> Option<Rc<RefCell<NoteData>>> {
|
|
||||||
if self.notes.contains_key(id) {
|
|
||||||
// return from cache
|
|
||||||
return self._try_get_and_borrow(id)
|
|
||||||
} else {
|
|
||||||
// otherwise try to create new and add to cache
|
|
||||||
if let Some(event) = GLOBALS.events.get(id) {
|
|
||||||
if let Some(note) = NoteData::new(event) {
|
|
||||||
// add to cache
|
|
||||||
let ref_note = Rc::new(RefCell::new(note));
|
|
||||||
self.notes.insert(*id, ref_note);
|
|
||||||
return self._try_get_and_borrow(id);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// send a worker to try and load it from the database
|
|
||||||
// if it's in the db it will go into the cache and be
|
|
||||||
// available on the next UI update
|
|
||||||
let id_copy = id.to_owned();
|
|
||||||
tokio::spawn(async move {
|
|
||||||
if let Err(e) = GLOBALS.events.get_local(id_copy).await {
|
|
||||||
tracing::error!("{}", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
fn _try_get_and_borrow(&self, id: &Id) -> Option<Rc<RefCell<NoteData>>> {
|
|
||||||
if let Some(value) = self.notes.get(id) {
|
|
||||||
return Some(value.clone());
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
107
src/ui/feed/notes.rs
Normal file
107
src/ui/feed/notes.rs
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
use crate::globals::GLOBALS;
|
||||||
|
use super::notedata::NoteData;
|
||||||
|
use nostr_types::{Id, PublicKeyHex};
|
||||||
|
use std::{cell::RefCell, collections::HashMap, rc::Rc};
|
||||||
|
|
||||||
|
/// a 'note' is a processed event
|
||||||
|
pub struct Notes {
|
||||||
|
notes: HashMap<Id, Rc<RefCell<NoteData>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Notes {
|
||||||
|
pub fn new() -> Notes {
|
||||||
|
Notes {
|
||||||
|
notes: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
/// Drop NoteData objects that do not have a
|
||||||
|
/// correlated event in the event cache
|
||||||
|
pub(super) fn cache_invalidate_missing_events(&mut self) {
|
||||||
|
self.notes.retain(|id,_| GLOBALS.events.contains_key(id));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// Drop NoteData for a specific note
|
||||||
|
pub(super) fn cache_invalidate_note(&mut self, id: &Id) {
|
||||||
|
self.notes.remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Drop all NoteData for a given person
|
||||||
|
pub(in crate::ui) fn cache_invalidate_person(&mut self, pubkey: &PublicKeyHex) {
|
||||||
|
self.notes
|
||||||
|
.retain(|_, note| note.borrow().author.pubkey != *pubkey);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn try_update_and_get(&mut self, id: &Id) -> Option<Rc<RefCell<NoteData>>> {
|
||||||
|
if self.notes.contains_key(id) {
|
||||||
|
// get a mutable reference to update reactions, then give it back
|
||||||
|
if let Some(pair) = self.notes.get(id) {
|
||||||
|
if let Ok(mut mut_ref) = pair.try_borrow_mut() {
|
||||||
|
mut_ref.update_reactions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// return from cache
|
||||||
|
return self._try_get_and_borrow(id);
|
||||||
|
} else {
|
||||||
|
// otherwise try to create new and add to cache
|
||||||
|
if let Some(event) = GLOBALS.events.get(id) {
|
||||||
|
let note = NoteData::new(event);
|
||||||
|
// add to cache
|
||||||
|
let ref_note = Rc::new(RefCell::new(note));
|
||||||
|
self.notes.insert(*id, ref_note);
|
||||||
|
return self._try_get_and_borrow(id);
|
||||||
|
} else {
|
||||||
|
// send a worker to try and load it from the database
|
||||||
|
// if it's in the db it will go into the cache and be
|
||||||
|
// available on a future UI update
|
||||||
|
let id_copy = id.to_owned();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
if let Err(e) = GLOBALS.events.get_local(id_copy).await {
|
||||||
|
tracing::error!("{}", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
pub(super) fn try_get(&mut self, id: &Id) -> Option<Rc<RefCell<NoteData>>> {
|
||||||
|
if self.notes.contains_key(id) {
|
||||||
|
// return from cache
|
||||||
|
return self._try_get_and_borrow(id)
|
||||||
|
} else {
|
||||||
|
// otherwise try to create new and add to cache
|
||||||
|
if let Some(event) = GLOBALS.events.get(id) {
|
||||||
|
if let Some(note) = NoteData::new(event) {
|
||||||
|
// add to cache
|
||||||
|
let ref_note = Rc::new(RefCell::new(note));
|
||||||
|
self.notes.insert(*id, ref_note);
|
||||||
|
return self._try_get_and_borrow(id);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// send a worker to try and load it from the database
|
||||||
|
// if it's in the db it will go into the cache and be
|
||||||
|
// available on the next UI update
|
||||||
|
let id_copy = id.to_owned();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
if let Err(e) = GLOBALS.events.get_local(id_copy).await {
|
||||||
|
tracing::error!("{}", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
fn _try_get_and_borrow(&self, id: &Id) -> Option<Rc<RefCell<NoteData>>> {
|
||||||
|
if let Some(value) = self.notes.get(id) {
|
||||||
|
return Some(value.clone());
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user