integrate new threads conception
Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
@@ -208,8 +208,6 @@ pub enum TimelineKind {
|
||||
|
||||
Profile(Pubkey),
|
||||
|
||||
Thread(ThreadSelection),
|
||||
|
||||
Universe,
|
||||
|
||||
/// Generic filter, references a hash of a filter
|
||||
@@ -266,7 +264,6 @@ impl Display for TimelineKind {
|
||||
TimelineKind::Profile(_) => f.write_str("Profile"),
|
||||
TimelineKind::Universe => f.write_str("Universe"),
|
||||
TimelineKind::Hashtag(_) => f.write_str("Hashtag"),
|
||||
TimelineKind::Thread(_) => f.write_str("Thread"),
|
||||
TimelineKind::Search(_) => f.write_str("Search"),
|
||||
}
|
||||
}
|
||||
@@ -282,7 +279,6 @@ impl TimelineKind {
|
||||
TimelineKind::Universe => None,
|
||||
TimelineKind::Generic(_) => None,
|
||||
TimelineKind::Hashtag(_ht) => None,
|
||||
TimelineKind::Thread(_ht) => None,
|
||||
TimelineKind::Search(query) => query.author(),
|
||||
}
|
||||
}
|
||||
@@ -298,7 +294,6 @@ impl TimelineKind {
|
||||
TimelineKind::Universe => true,
|
||||
TimelineKind::Generic(_) => true,
|
||||
TimelineKind::Hashtag(_ht) => true,
|
||||
TimelineKind::Thread(_ht) => true,
|
||||
TimelineKind::Search(_q) => true,
|
||||
}
|
||||
}
|
||||
@@ -321,10 +316,6 @@ impl TimelineKind {
|
||||
writer.write_token("profile");
|
||||
PubkeySource::pubkey(*pk).serialize_tokens(writer);
|
||||
}
|
||||
TimelineKind::Thread(root_note_id) => {
|
||||
writer.write_token("thread");
|
||||
writer.write_token(&root_note_id.root_id.hex());
|
||||
}
|
||||
TimelineKind::Universe => {
|
||||
writer.write_token("universe");
|
||||
}
|
||||
@@ -377,12 +368,6 @@ impl TimelineKind {
|
||||
TokenParser::alt(
|
||||
parser,
|
||||
&[
|
||||
|p| {
|
||||
p.parse_token("thread")?;
|
||||
Ok(TimelineKind::Thread(ThreadSelection::from_root_id(
|
||||
RootNoteIdBuf::new_unsafe(tokenator::parse_hex_id(p)?),
|
||||
)))
|
||||
},
|
||||
|p| {
|
||||
p.parse_token("universe")?;
|
||||
Ok(TimelineKind::Universe)
|
||||
@@ -425,10 +410,6 @@ impl TimelineKind {
|
||||
TimelineKind::Profile(pk)
|
||||
}
|
||||
|
||||
pub fn thread(selected_note: ThreadSelection) -> Self {
|
||||
TimelineKind::Thread(selected_note)
|
||||
}
|
||||
|
||||
pub fn is_notifications(&self) -> bool {
|
||||
matches!(self, TimelineKind::Notifications(_))
|
||||
}
|
||||
@@ -474,17 +455,6 @@ impl TimelineKind {
|
||||
todo!("implement generic filter lookups")
|
||||
}
|
||||
|
||||
TimelineKind::Thread(selection) => FilterState::ready(vec![
|
||||
nostrdb::Filter::new()
|
||||
.kinds([1])
|
||||
.event(selection.root_id.bytes())
|
||||
.build(),
|
||||
nostrdb::Filter::new()
|
||||
.ids([selection.root_id.bytes()])
|
||||
.limit(1)
|
||||
.build(),
|
||||
]),
|
||||
|
||||
TimelineKind::Profile(pk) => FilterState::ready(vec![Filter::new()
|
||||
.authors([pk.bytes()])
|
||||
.kinds([1])
|
||||
@@ -510,8 +480,6 @@ impl TimelineKind {
|
||||
TimelineTab::full_tabs(),
|
||||
)),
|
||||
|
||||
TimelineKind::Thread(root_id) => Some(Timeline::thread(root_id)),
|
||||
|
||||
TimelineKind::Generic(_filter_id) => {
|
||||
warn!("you can't convert a TimelineKind::Generic to a Timeline");
|
||||
// TODO: you actually can! just need to look up the filter id
|
||||
@@ -609,7 +577,6 @@ impl TimelineKind {
|
||||
},
|
||||
TimelineKind::Notifications(_pubkey_source) => ColumnTitle::simple("Notifications"),
|
||||
TimelineKind::Profile(_pubkey_source) => ColumnTitle::needs_db(self),
|
||||
TimelineKind::Thread(_root_id) => ColumnTitle::simple("Thread"),
|
||||
TimelineKind::Universe => ColumnTitle::simple("Universe"),
|
||||
TimelineKind::Generic(_) => ColumnTitle::simple("Custom"),
|
||||
TimelineKind::Hashtag(hashtag) => ColumnTitle::formatted(hashtag.to_string()),
|
||||
|
||||
@@ -214,24 +214,6 @@ impl Timeline {
|
||||
))
|
||||
}
|
||||
|
||||
pub fn thread(selection: ThreadSelection) -> Self {
|
||||
let filter = vec![
|
||||
nostrdb::Filter::new()
|
||||
.kinds([1])
|
||||
.event(selection.root_id.bytes())
|
||||
.build(),
|
||||
nostrdb::Filter::new()
|
||||
.ids([selection.root_id.bytes()])
|
||||
.limit(1)
|
||||
.build(),
|
||||
];
|
||||
Timeline::new(
|
||||
TimelineKind::Thread(selection),
|
||||
FilterState::ready(filter),
|
||||
TimelineTab::only_notes_and_replies(),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn last_per_pubkey(list: &Note, list_kind: &ListKind) -> Result<Self> {
|
||||
let kind = 1;
|
||||
let notes_per_pk = 1;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::{
|
||||
nav::RenderNavAction,
|
||||
profile::ProfileAction,
|
||||
timeline::{TimelineCache, TimelineKind},
|
||||
timeline::{thread::Threads, ThreadSelection, TimelineCache, TimelineKind},
|
||||
ui::{self, ProfileView},
|
||||
};
|
||||
|
||||
@@ -16,7 +16,7 @@ pub fn render_timeline_route(
|
||||
accounts: &mut Accounts,
|
||||
kind: &TimelineKind,
|
||||
col: usize,
|
||||
mut note_options: NoteOptions,
|
||||
note_options: NoteOptions,
|
||||
depth: usize,
|
||||
ui: &mut egui::Ui,
|
||||
note_context: &mut NoteContext,
|
||||
@@ -74,32 +74,40 @@ pub fn render_timeline_route(
|
||||
note_action.map(RenderNavAction::NoteAction)
|
||||
}
|
||||
}
|
||||
|
||||
TimelineKind::Thread(id) => {
|
||||
// don't truncate thread notes for now, since they are
|
||||
// default truncated everywher eelse
|
||||
note_options.set_truncate(false);
|
||||
|
||||
// text is selectable in threads
|
||||
note_options.set_selectable_text(true);
|
||||
|
||||
ui::ThreadView::new(
|
||||
timeline_cache,
|
||||
unknown_ids,
|
||||
id.selected_or_root(),
|
||||
note_options,
|
||||
&accounts.mutefun(),
|
||||
note_context,
|
||||
&accounts.get_selected_account().map(|a| (&a.key).into()),
|
||||
jobs,
|
||||
)
|
||||
.id_source(egui::Id::new(("threadscroll", col)))
|
||||
.ui(ui)
|
||||
.map(Into::into)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn render_thread_route(
|
||||
unknown_ids: &mut UnknownIds,
|
||||
threads: &mut Threads,
|
||||
accounts: &mut Accounts,
|
||||
selection: &ThreadSelection,
|
||||
col: usize,
|
||||
mut note_options: NoteOptions,
|
||||
ui: &mut egui::Ui,
|
||||
note_context: &mut NoteContext,
|
||||
jobs: &mut JobsCache,
|
||||
) -> Option<RenderNavAction> {
|
||||
// don't truncate thread notes for now, since they are
|
||||
// default truncated everywher eelse
|
||||
note_options.set_truncate(false);
|
||||
|
||||
ui::ThreadView::new(
|
||||
threads,
|
||||
unknown_ids,
|
||||
selection.selected_or_root(),
|
||||
note_options,
|
||||
&accounts.mutefun(),
|
||||
note_context,
|
||||
&accounts.get_selected_account().map(|a| (&a.key).into()),
|
||||
jobs,
|
||||
)
|
||||
.id_source(col)
|
||||
.ui(ui)
|
||||
.map(Into::into)
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn render_profile_route(
|
||||
pubkey: &Pubkey,
|
||||
@@ -139,30 +147,3 @@ pub fn render_profile_route(
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use enostr::NoteId;
|
||||
use tokenator::{TokenParser, TokenWriter};
|
||||
|
||||
use crate::timeline::{ThreadSelection, TimelineKind};
|
||||
use enostr::Pubkey;
|
||||
use notedeck::RootNoteIdBuf;
|
||||
|
||||
#[test]
|
||||
fn test_timeline_route_serialize() {
|
||||
let note_id_hex = "1c54e5b0c386425f7e017d9e068ddef8962eb2ce1bb08ed27e24b93411c12e60";
|
||||
let note_id = NoteId::from_hex(note_id_hex).unwrap();
|
||||
let data_str = format!("thread:{}", note_id_hex);
|
||||
let data = &data_str.split(":").collect::<Vec<&str>>();
|
||||
let mut token_writer = TokenWriter::default();
|
||||
let mut parser = TokenParser::new(&data);
|
||||
let parsed = TimelineKind::parse(&mut parser, &Pubkey::new(*note_id.bytes())).unwrap();
|
||||
let expected = TimelineKind::Thread(ThreadSelection::from_root_id(
|
||||
RootNoteIdBuf::new_unsafe(*note_id.bytes()),
|
||||
));
|
||||
parsed.serialize_tokens(&mut token_writer);
|
||||
assert_eq!(expected, parsed);
|
||||
assert_eq!(token_writer.str(), data_str);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user