app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit b062c2fc5991a22edb36663452974e8d7805478c
parent 2639d04102ca1467f80230c29d6fbd0579172c3c
Author: triesap <triesap@radroots.dev>
Date:   Wed, 21 Jan 2026 18:58:24 +0000

app: reset all state and logs

- reset datastore contents instead of clearing bootstrap record
- clear log store after destructive reset completes
- add reset error mapping for datastore failures
- keep setup gating updated after reset

Diffstat:
Mapp/src/app.rs | 8++++++++
Mapp/src/init.rs | 21+++++++++++++++++----
2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/app/src/app.rs b/app/src/app.rs @@ -5,6 +5,7 @@ use leptos_router::components::{A, Route, Router, Routes}; use leptos_router::hooks::use_navigate; use leptos_router::path; +use radroots_app_core::datastore::RadrootsClientDatastore; use radroots_app_core::idb::IDB_CONFIG_LOGS; use crate::{ @@ -369,6 +370,13 @@ fn HomePage() -> impl IntoView { .await { Ok(()) => { + let log_datastore = logs_datastore(); + if let Err(err) = log_datastore.reset().await { + let reset_err = RadrootsAppInitError::Datastore(err); + let _ = app_log_error_emit(&reset_err); + reset_status.set(Some(reset_err.to_string())); + return; + } reset_status.set(Some("reset_done".to_string())); spawn_health_checks( config, diff --git a/app/src/init.rs b/app/src/init.rs @@ -20,7 +20,6 @@ use radroots_app_core::keystore::{ }; use crate::{ - app_datastore_clear_bootstrap, app_datastore_has_state, app_datastore_read_state, app_assets_geocoder_db_url, @@ -348,12 +347,12 @@ pub fn app_init_mark_completed() { pub async fn app_init_reset<T: RadrootsClientDatastore, K: RadrootsClientKeystoreNostr>( datastore: Option<&T>, - key_maps: Option<&RadrootsAppKeyMapConfig>, + _key_maps: Option<&RadrootsAppKeyMapConfig>, keystore: Option<&K>, ) -> RadrootsAppInitResult<()> { let _ = app_log_debug_emit("log.app.init.reset", "start", None); - if let (Some(datastore), Some(key_maps)) = (datastore, key_maps) { - app_datastore_clear_bootstrap(datastore, key_maps).await?; + if let Some(datastore) = datastore { + datastore.reset().await.map_err(RadrootsAppInitError::Datastore)?; } if let Some(keystore) = keystore { keystore.reset().await.map_err(RadrootsAppInitError::Keystore)?; @@ -527,6 +526,20 @@ mod tests { assert!(result.is_ok()); } + #[test] + fn app_init_reset_maps_datastore_errors() { + let datastore = radroots_app_core::datastore::RadrootsClientWebDatastore::new(None); + let err = futures::executor::block_on(super::app_init_reset::< + radroots_app_core::datastore::RadrootsClientWebDatastore, + TestKeystore, + >(Some(&datastore), None, None)) + .expect_err("datastore reset should error on native"); + assert_eq!( + err, + RadrootsAppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined) + ); + } + struct TestKeystore; #[async_trait(?Send)]