app

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

commit 3b424bd5bc014634a0ca1e546ccd0105ccad9f30
parent e379377449593e0d240fdac4b97dd7ef54d4c1e9
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 18:14:19 +0000

app: add reset button for bootstrap data

- add reset status signal for UI feedback
- wire reset button to clear bootstrap datastore entries
- use config key maps to target bootstrap keys
- display reset status text under app

Diffstat:
MCargo.lock | 1+
Mapp/src/app.rs | 33+++++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1543,6 +1543,7 @@ dependencies = [ "futures", "leptos", "radroots-app-core", + "serde", "wasm-bindgen", ] diff --git a/app/src/app.rs b/app/src/app.rs @@ -5,6 +5,7 @@ use crate::{ app_init_backends, app_init_state_default, app_init_mark_completed, + app_init_reset, app_config_default, AppBackends, AppInitError, @@ -16,6 +17,7 @@ pub fn App() -> impl IntoView { let backends = RwSignal::new_local(None::<AppBackends>); let init_error = RwSignal::new_local(None::<AppInitError>); let init_state = RwSignal::new_local(app_init_state_default()); + let reset_status = RwSignal::new_local(None::<String>); provide_context(backends); provide_context(init_error); provide_context(init_state); @@ -45,6 +47,12 @@ pub fn App() -> impl IntoView { AppInitStage::Geocoder => "orange", AppInitStage::Idle => "gray", }; + let reset_disabled = move || backends.with_untracked(|value| value.is_none()); + let reset_label = move || { + reset_status + .get() + .unwrap_or_else(|| "reset_idle".to_string()) + }; view! { <main> <div>"app"</div> @@ -57,6 +65,31 @@ pub fn App() -> impl IntoView { ></span> <span>{move || init_state.get().stage.as_str()}</span> </div> + <div style="margin-top: 12px; display: flex; align-items: center; gap: 8px;"> + <button + on:click=move |_| { + let config = backends.with_untracked(|value| value.as_ref().map(|backends| backends.config.clone())); + reset_status.set(Some("resetting".to_string())); + spawn_local(async move { + let Some(config) = config else { + reset_status.set(Some("reset_missing_backends".to_string())); + return; + }; + let datastore = radroots_app_core::datastore::RadrootsClientWebDatastore::new( + Some(config.datastore.idb_config), + ); + match app_init_reset(Some(&datastore), Some(&config.datastore.key_maps)).await { + Ok(()) => reset_status.set(Some("reset_done".to_string())), + Err(err) => reset_status.set(Some(err.to_string())), + } + }); + } + disabled=reset_disabled + > + "reset" + </button> + <span>{reset_label}</span> + </div> </main> } }