notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit c2545d17e722004067ee9b5f9b450c79b1a4f1f8
parent 9edc9bf4a59b722d2d54b08db54ad5da6058402f
Author: William Casarin <jb55@jb55.com>
Date:   Fri,  7 Mar 2025 10:54:43 -0800

route: add Search route and hook up SearchView

Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mcrates/notedeck_columns/src/nav.rs | 21+++++++++++++++++++++
Mcrates/notedeck_columns/src/route.rs | 11+++++++++++
Mcrates/notedeck_columns/src/timeline/kind.rs | 10+++++++++-
Mcrates/notedeck_columns/src/ui/column/header.rs | 3+++
Mcrates/notedeck_columns/src/ui/side_panel.rs | 5+++++
5 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -18,6 +18,7 @@ use crate::{ edit_deck::{EditDeckResponse, EditDeckView}, note::{PostAction, PostType}, profile::EditProfileView, + search::SearchView, support::SupportView, RelayView, View, }, @@ -387,6 +388,26 @@ fn render_nav_body( SupportView::new(&mut app.support).show(ui); None } + + Route::Search => { + let id = ui.id().with(("search", depth, col)); + let search_buffer = app.view_state.searches.entry(id).or_default(); + let txn = Transaction::new(ctx.ndb).expect("txn"); + + SearchView::new( + ctx.ndb, + &txn, + ctx.note_cache, + ctx.img_cache, + &ctx.accounts.mutefun(), + app.note_options, + search_buffer, + ) + .show(ui); + + None + } + Route::NewDeck => { let id = ui.id().with("new-deck"); let new_deck_state = app.view_state.id_to_deck_state.entry(id).or_default(); diff --git a/crates/notedeck_columns/src/route.rs b/crates/notedeck_columns/src/route.rs @@ -25,6 +25,8 @@ pub enum Route { EditProfile(Pubkey), Support, NewDeck, + /// Search screen + Search, EditDeck(usize), } @@ -74,6 +76,7 @@ impl Route { Route::Timeline(timeline_kind) => timeline_kind.serialize_tokens(writer), Route::Accounts(routes) => routes.serialize_tokens(writer), Route::AddColumn(routes) => routes.serialize_tokens(writer), + Route::Search => writer.write_token("search"), Route::Reply(note_id) => { writer.write_token("reply"); writer.write_token(&note_id.hex()); @@ -181,6 +184,12 @@ impl Route { Ok(Route::NewDeck) }) }, + |p| { + p.parse_all(|p| { + p.parse_token("search")?; + Ok(Route::Search) + }) + }, ], ) } @@ -223,6 +232,7 @@ impl Route { Route::NewDeck => ColumnTitle::simple("Add Deck"), Route::EditDeck(_) => ColumnTitle::simple("Edit Deck"), Route::EditProfile(_) => ColumnTitle::simple("Edit Profile"), + Route::Search => ColumnTitle::simple("Search"), } } } @@ -344,6 +354,7 @@ impl fmt::Display for Route { Route::NewDeck => write!(f, "Add Deck"), Route::EditDeck(_) => write!(f, "Edit Deck"), Route::EditProfile(_) => write!(f, "Edit Profile"), + Route::Search => write!(f, "Search"), } } } diff --git a/crates/notedeck_columns/src/timeline/kind.rs b/crates/notedeck_columns/src/timeline/kind.rs @@ -308,7 +308,10 @@ impl TimelineKind { // the parser below as well pub fn serialize_tokens(&self, writer: &mut TokenWriter) { match self { - TimelineKind::Search(query) => query.serialize_tokens(writer), + TimelineKind::Search(query) => { + writer.write_token("search"); + query.serialize_tokens(writer) + } TimelineKind::List(list_kind) => list_kind.serialize_tokens(writer), TimelineKind::Algo(algo_timeline) => algo_timeline.serialize_tokens(writer), TimelineKind::Notifications(pk) => { @@ -394,6 +397,11 @@ impl TimelineKind { p.parse_token("hashtag")?; Ok(TimelineKind::Hashtag(p.pull_token()?.to_string())) }, + |p| { + p.parse_token("search")?; + let search_query = SearchQuery::parse_from_tokens(p)?; + Ok(TimelineKind::Search(search_query)) + }, ], ) } diff --git a/crates/notedeck_columns/src/ui/column/header.rs b/crates/notedeck_columns/src/ui/column/header.rs @@ -461,6 +461,9 @@ impl<'a> NavTitle<'a> { Route::EditProfile(pubkey) => { self.show_profile(ui, pubkey, pfp_size); } + Route::Search => { + ui.add(ui::side_panel::search_button()); + } } } diff --git a/crates/notedeck_columns/src/ui/side_panel.rs b/crates/notedeck_columns/src/ui/side_panel.rs @@ -325,6 +325,11 @@ impl<'a> DesktopSidePanel<'a> { SidePanelAction::Search => { // TODO info!("Clicked search button"); + if router.top() == &Route::Search { + router.go_back(); + } else { + router.route_to(Route::Search); + } } SidePanelAction::ExpandSidePanel => { // TODO