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:
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>
}
}