route: add Search route and hook up SearchView

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2025-03-07 10:54:43 -08:00
parent 9edc9bf4a5
commit c2545d17e7
5 changed files with 49 additions and 1 deletions

View File

@@ -18,6 +18,7 @@ use crate::{
edit_deck::{EditDeckResponse, EditDeckView}, edit_deck::{EditDeckResponse, EditDeckView},
note::{PostAction, PostType}, note::{PostAction, PostType},
profile::EditProfileView, profile::EditProfileView,
search::SearchView,
support::SupportView, support::SupportView,
RelayView, View, RelayView, View,
}, },
@@ -387,6 +388,26 @@ fn render_nav_body(
SupportView::new(&mut app.support).show(ui); SupportView::new(&mut app.support).show(ui);
None 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 => { Route::NewDeck => {
let id = ui.id().with("new-deck"); let id = ui.id().with("new-deck");
let new_deck_state = app.view_state.id_to_deck_state.entry(id).or_default(); let new_deck_state = app.view_state.id_to_deck_state.entry(id).or_default();

View File

@@ -25,6 +25,8 @@ pub enum Route {
EditProfile(Pubkey), EditProfile(Pubkey),
Support, Support,
NewDeck, NewDeck,
/// Search screen
Search,
EditDeck(usize), EditDeck(usize),
} }
@@ -74,6 +76,7 @@ impl Route {
Route::Timeline(timeline_kind) => timeline_kind.serialize_tokens(writer), Route::Timeline(timeline_kind) => timeline_kind.serialize_tokens(writer),
Route::Accounts(routes) => routes.serialize_tokens(writer), Route::Accounts(routes) => routes.serialize_tokens(writer),
Route::AddColumn(routes) => routes.serialize_tokens(writer), Route::AddColumn(routes) => routes.serialize_tokens(writer),
Route::Search => writer.write_token("search"),
Route::Reply(note_id) => { Route::Reply(note_id) => {
writer.write_token("reply"); writer.write_token("reply");
writer.write_token(&note_id.hex()); writer.write_token(&note_id.hex());
@@ -181,6 +184,12 @@ impl Route {
Ok(Route::NewDeck) 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::NewDeck => ColumnTitle::simple("Add Deck"),
Route::EditDeck(_) => ColumnTitle::simple("Edit Deck"), Route::EditDeck(_) => ColumnTitle::simple("Edit Deck"),
Route::EditProfile(_) => ColumnTitle::simple("Edit Profile"), 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::NewDeck => write!(f, "Add Deck"),
Route::EditDeck(_) => write!(f, "Edit Deck"), Route::EditDeck(_) => write!(f, "Edit Deck"),
Route::EditProfile(_) => write!(f, "Edit Profile"), Route::EditProfile(_) => write!(f, "Edit Profile"),
Route::Search => write!(f, "Search"),
} }
} }
} }

View File

@@ -308,7 +308,10 @@ impl TimelineKind {
// the parser below as well // the parser below as well
pub fn serialize_tokens(&self, writer: &mut TokenWriter) { pub fn serialize_tokens(&self, writer: &mut TokenWriter) {
match self { 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::List(list_kind) => list_kind.serialize_tokens(writer),
TimelineKind::Algo(algo_timeline) => algo_timeline.serialize_tokens(writer), TimelineKind::Algo(algo_timeline) => algo_timeline.serialize_tokens(writer),
TimelineKind::Notifications(pk) => { TimelineKind::Notifications(pk) => {
@@ -394,6 +397,11 @@ impl TimelineKind {
p.parse_token("hashtag")?; p.parse_token("hashtag")?;
Ok(TimelineKind::Hashtag(p.pull_token()?.to_string())) 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))
},
], ],
) )
} }

View File

@@ -461,6 +461,9 @@ impl<'a> NavTitle<'a> {
Route::EditProfile(pubkey) => { Route::EditProfile(pubkey) => {
self.show_profile(ui, pubkey, pfp_size); self.show_profile(ui, pubkey, pfp_size);
} }
Route::Search => {
ui.add(ui::side_panel::search_button());
}
} }
} }

View File

@@ -325,6 +325,11 @@ impl<'a> DesktopSidePanel<'a> {
SidePanelAction::Search => { SidePanelAction::Search => {
// TODO // TODO
info!("Clicked search button"); info!("Clicked search button");
if router.top() == &Route::Search {
router.go_back();
} else {
router.route_to(Route::Search);
}
} }
SidePanelAction::ExpandSidePanel => { SidePanelAction::ExpandSidePanel => {
// TODO // TODO