commit cd0bd53b3d68bdbb7260343585cf12dc4b1acf3a
parent 5c0546deabb63fdb0d8764b6f365a563bf1f3333
Author: kernelkind <kernelkind@gmail.com>
Date: Wed, 13 Aug 2025 19:08:22 -0400
add toolbar related logic
copied from chrome
Signed-off-by: kernelkind <kernelkind@gmail.com>
Diffstat:
2 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/crates/notedeck_columns/src/lib.rs b/crates/notedeck_columns/src/lib.rs
@@ -27,6 +27,7 @@ mod subscriptions;
mod support;
mod test_data;
pub mod timeline;
+mod toolbar;
pub mod ui;
mod unknowns;
mod view_state;
diff --git a/crates/notedeck_columns/src/toolbar.rs b/crates/notedeck_columns/src/toolbar.rs
@@ -0,0 +1,75 @@
+use nostrdb::Transaction;
+use notedeck::AppContext;
+
+use crate::{
+ timeline::{kind::ListKind, TimelineKind},
+ Damus, Route,
+};
+
+pub fn unseen_notification(
+ columns: &mut Damus,
+ ndb: &nostrdb::Ndb,
+ current_pk: notedeck::enostr::Pubkey,
+) -> bool {
+ let Some(tl) = columns
+ .timeline_cache
+ .get_mut(&TimelineKind::Notifications(current_pk))
+ else {
+ return false;
+ };
+
+ let freshness = &mut tl.current_view_mut().freshness;
+ freshness.update(|timestamp_last_viewed| {
+ let filter = crate::timeline::kind::notifications_filter(¤t_pk)
+ .since_mut(timestamp_last_viewed);
+ let txn = Transaction::new(ndb).expect("txn");
+
+ let Some(res) = ndb.query(&txn, &[filter], 1).ok() else {
+ return false;
+ };
+
+ !res.is_empty()
+ });
+
+ freshness.has_unseen()
+}
+
+/// When you click the toolbar button, these actions
+/// are returned
+#[derive(Debug, Eq, PartialEq)]
+pub enum ToolbarAction {
+ Notifications,
+ Search,
+ Home,
+}
+
+impl ToolbarAction {
+ pub fn process(&self, app: &mut Damus, ctx: &mut AppContext) {
+ let cur_acc_pk = ctx.accounts.get_selected_account().key.pubkey;
+ let route = match &self {
+ ToolbarAction::Notifications => {
+ Route::timeline(TimelineKind::Notifications(cur_acc_pk))
+ }
+ ToolbarAction::Search => Route::Search,
+ ToolbarAction::Home => {
+ Route::timeline(TimelineKind::List(ListKind::Contact(cur_acc_pk)))
+ }
+ };
+
+ let Some(cols) = app.decks_cache.active_columns_mut(ctx.i18n, ctx.accounts) else {
+ return;
+ };
+
+ match cols.select_by_route(route) {
+ crate::column::SelectionResult::AlreadySelected(_) => {} // great! no need to go to top yet
+ crate::column::SelectionResult::NewSelection(_) => {
+ // we already selected this, so scroll to top
+ app.scroll_to_top();
+ }
+ crate::column::SelectionResult::Failed => {
+ // oh no, something went wrong
+ // TODO(jb55): handle tab selection failure
+ }
+ }
+ }
+}