diff --git a/crates/notedeck_columns/src/lib.rs b/crates/notedeck_columns/src/lib.rs index 725d8b0..c1ae86c 100644 --- 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 new file mode 100644 index 0000000..6d9f16a --- /dev/null +++ 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 + } + } + } +}