notedeck

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

commit af90ed537f9f1e9c03a64d80acd8f66041a3f29e
parent 8adf22a7e978b5a9f4438391aa16dee7d223b99c
Author: kernelkind <kernelkind@gmail.com>
Date:   Tue, 24 Feb 2026 17:55:57 -0500

feat(outbox-int): Notedeck::init pass along `OutboxSession`

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck/src/app.rs | 25+++++++++++++++++++++----
Mcrates/notedeck_chrome/src/android.rs | 19++++++++++++-------
Mcrates/notedeck_chrome/src/chrome.rs | 4+++-
Mcrates/notedeck_chrome/src/notedeck.rs | 36+++++++++++++++++++-----------------
4 files changed, 55 insertions(+), 29 deletions(-)

diff --git a/crates/notedeck/src/app.rs b/crates/notedeck/src/app.rs @@ -207,7 +207,7 @@ impl Notedeck { self.android_app = Some(context); } - pub fn new<P: AsRef<Path>>(ctx: &egui::Context, data_path: P, args: &[String]) -> Self { + pub fn init<P: AsRef<Path>>(ctx: &egui::Context, data_path: P, args: &[String]) -> NotedeckCtx { #[cfg(feature = "puffin")] setup_puffin(); @@ -270,8 +270,9 @@ impl Notedeck { try_swap_compacted_db(&dbpath_str); let mut ndb = Ndb::new(&dbpath_str, &config).expect("ndb"); let txn = Transaction::new(&ndb).expect("txn"); - let scoped_sub_state = ScopedSubsState::default(); - let pool = OutboxPool::default(); + let mut scoped_sub_state = ScopedSubsState::default(); + let mut pool = OutboxPool::default(); + let outbox_session = OutboxSessionHandler::new(&mut pool, EguiWakeup::new(ctx.clone())); let mut accounts = Accounts::new( keystore, @@ -302,6 +303,12 @@ impl Notedeck { if let Some(first) = parsed_args.keys.first() { accounts.select_account(&first.pubkey, &mut ndb, &txn, &mut legacy_pool, ctx); } + let outbox_session = if let Some(first) = parsed_args.keys.first() { + let remote = RemoteApi::new(outbox_session, &mut scoped_sub_state); + remote.export_session() + } else { + outbox_session.export() + }; let img_cache = Images::new(img_cache_dir); let note_cache = NoteCache::default(); @@ -338,7 +345,7 @@ impl Notedeck { let (send_new_jobs, receive_new_jobs) = std::sync::mpsc::channel(); let media_job_cache = JobCache::new(receive_new_jobs, send_new_jobs); - Self { + let notedeck = Self { ndb, img_cache, unknown_ids, @@ -363,6 +370,11 @@ impl Notedeck { i18n, #[cfg(target_os = "android")] android_app: None, + }; + + NotedeckCtx { + notedeck, + outbox_session, } } @@ -659,3 +671,8 @@ fn try_swap_compacted_db(dbpath: &str) { let _ = std::fs::remove_dir_all(&compact_path); info!("compact swap: success! {old_size} -> {compact_size} bytes"); } + +pub struct NotedeckCtx { + pub notedeck: Notedeck, + pub outbox_session: OutboxSession, +} diff --git a/crates/notedeck_chrome/src/android.rs b/crates/notedeck_chrome/src/android.rs @@ -66,13 +66,18 @@ pub async fn android_main(android_app: AndroidApp) { Box::new(move |cc| { let ctx = &cc.egui_ctx; - let mut notedeck = Notedeck::new(ctx, path, &app_args); - notedeck.set_android_context(android_app); - notedeck.setup(ctx); - let chrome = Chrome::new_with_apps(cc, &app_args, &mut notedeck)?; - notedeck.set_app(chrome); - - Ok(Box::new(notedeck)) + let mut notedeck_ctx = Notedeck::init(ctx, path, &app_args); + notedeck_ctx.notedeck.set_android_context(android_app); + notedeck_ctx.notedeck.setup(ctx); + let chrome = Chrome::new_with_apps( + cc, + &app_args, + &mut notedeck_ctx.notedeck, + notedeck_ctx.outbox_session, + )?; + notedeck_ctx.notedeck.set_app(chrome); + + Ok(Box::new(notedeck_ctx.notedeck)) }), ); } diff --git a/crates/notedeck_chrome/src/chrome.rs b/crates/notedeck_chrome/src/chrome.rs @@ -13,6 +13,7 @@ use egui_extras::{Size, StripBuilder}; use egui_nav::RouteResponse; use egui_nav::{NavAction, NavDrawer}; use nostrdb::{ProfileRecord, Transaction}; +use notedeck::enostr::OutboxSession; use notedeck::fonts::get_font_size; use notedeck::name::get_display_name; use notedeck::ui::is_compiled_as_mobile; @@ -151,10 +152,11 @@ impl Chrome { cc: &CreationContext, app_args: &[String], notedeck: &mut Notedeck, + outbox_session: OutboxSession, ) -> Result<Self, Error> { stop_debug_mode(notedeck.options()); - let notedeck_ref = &mut notedeck.notedeck_ref(&cc.egui_ctx, None); + let notedeck_ref = &mut notedeck.notedeck_ref(&cc.egui_ctx, Some(outbox_session)); let dave = Dave::new( cc.wgpu_render_state.as_ref(), notedeck_ref.app_ctx.ndb.clone(), diff --git a/crates/notedeck_chrome/src/notedeck.rs b/crates/notedeck_chrome/src/notedeck.rs @@ -87,12 +87,17 @@ async fn main() { let args: Vec<String> = std::env::args().collect(); let ctx = &cc.egui_ctx; - let mut notedeck = Notedeck::new(ctx, base_path, &args); - notedeck.setup(ctx); - let chrome = Chrome::new_with_apps(cc, &args, &mut notedeck)?; - notedeck.set_app(chrome); - - Ok(Box::new(notedeck)) + let mut notedeck_ctx = Notedeck::init(ctx, base_path, &args); + notedeck_ctx.notedeck.setup(ctx); + let chrome = Chrome::new_with_apps( + cc, + &args, + &mut notedeck_ctx.notedeck, + notedeck_ctx.outbox_session, + )?; + notedeck_ctx.notedeck.set_app(chrome); + + Ok(Box::new(notedeck_ctx.notedeck)) }), ); } @@ -155,7 +160,7 @@ mod tests { .collect(); let ctx = egui::Context::default(); - let _app = Notedeck::new(&ctx, &datapath, &args); + let _app = Notedeck::init(&ctx, &datapath, &args); assert!(Path::new(&dbpath.join("data.mdb")).exists()); assert!(Path::new(&dbpath.join("lock.mdb")).exists()); @@ -184,8 +189,8 @@ mod tests { .collect(); let ctx = egui::Context::default(); - let mut notedeck = Notedeck::new(&ctx, &tmpdir, &args); - let mut app_ctx = notedeck.app_context(&ctx); + let mut notedeck_ctx = Notedeck::init(&ctx, &tmpdir, &args); + let mut app_ctx = notedeck_ctx.notedeck.app_context(&ctx); let app = Damus::new(&mut app_ctx, &args); assert_eq!(app.columns(app_ctx.accounts).columns().len(), 2); @@ -233,17 +238,14 @@ mod tests { .collect(); let ctx = egui::Context::default(); - let mut notedeck = Notedeck::new(&ctx, &tmpdir, &args); - let unrecognized_args = { - let mut app_ctx = notedeck.app_context(&ctx); - let app = Damus::new(&mut app_ctx, &args); - app.unrecognized_args().clone() - }; + let mut notedeck_ctx = Notedeck::init(&ctx, &tmpdir, &args); + let app = Damus::new(&mut notedeck_ctx.notedeck.app_context(&ctx), &args); // ensure we recognized all the arguments - let completely_unrecognized: Vec<String> = notedeck + let completely_unrecognized: Vec<String> = notedeck_ctx + .notedeck .unrecognized_args() - .intersection(&unrecognized_args) + .intersection(app.unrecognized_args()) .cloned() .collect(); assert_eq!(completely_unrecognized, ["--unknown-arg"]);