app

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

commit 59c1533a0e76cda0392d1bb7702fd27648a39cde
parent 58525728c5cf184076d83947c49e943e8dabf25e
Author: triesap <triesap@radroots.dev>
Date:   Tue, 20 Jan 2026 23:19:31 +0000

app: speed up logs page refresh

- reuse backends datastore handle in logs view

- refresh logs once backends become available

- switch logs refresh to no-prune buffer flush

- keep empty state behavior when backends missing

Diffstat:
Mapp/src/logs.rs | 58++++++++++++++++++++++++++++++----------------------------
1 file changed, 30 insertions(+), 28 deletions(-)

diff --git a/app/src/logs.rs b/app/src/logs.rs @@ -7,11 +7,9 @@ use leptos::prelude::*; use leptos::task::spawn_local; use std::rc::Rc; -use radroots_app_core::datastore::RadrootsClientWebDatastore; - use crate::{ app_context, - app_log_buffer_flush, + app_log_buffer_flush_no_prune, app_log_entries_clear, app_log_entries_dump, app_log_entries_load, @@ -42,18 +40,24 @@ pub fn RadrootsAppLogsPage() -> impl IntoView { let did_load = RwSignal::new_local(false); let interval_started = RwSignal::new_local(false); let context = Rc::new(app_context()); - let refresh = { + let resolve_backends = { let context = Rc::clone(&context); Rc::new(move || { - let Some(context) = context.as_ref().clone() else { - entries.set(Vec::new()); - dump.set(String::new()); - return; - }; - let config = context - .backends - .with_untracked(|value| value.as_ref().map(|backends| backends.config.clone())); - let Some(config) = config else { + context.as_ref().as_ref().and_then(|context| { + context + .backends + .with_untracked(|value| { + value.as_ref().map(|backends| { + (backends.datastore.clone(), backends.config.datastore.key_maps.clone()) + }) + }) + }) + }) + }; + let refresh = { + let resolve_backends = Rc::clone(&resolve_backends); + Rc::new(move || { + let Some((datastore, key_maps)) = resolve_backends() else { entries.set(Vec::new()); dump.set(String::new()); return; @@ -63,9 +67,8 @@ pub fn RadrootsAppLogsPage() -> impl IntoView { let dump_signal = dump; let loading_signal = loading; spawn_local(async move { - let datastore = RadrootsClientWebDatastore::new(Some(config.datastore.idb_config)); - let _ = app_log_buffer_flush(&datastore, &config.datastore.key_maps).await; - let result = app_log_entries_load(&datastore, &config.datastore.key_maps).await; + let _ = app_log_buffer_flush_no_prune(datastore.as_ref(), &key_maps).await; + let result = app_log_entries_load(datastore.as_ref(), &key_maps).await; match result { Ok(mut items) => { items.sort_by(|a, b| b.timestamp_ms.cmp(&a.timestamp_ms)); @@ -82,18 +85,10 @@ pub fn RadrootsAppLogsPage() -> impl IntoView { }) }; let clear = { - let context = Rc::clone(&context); + let resolve_backends = Rc::clone(&resolve_backends); let refresh = Rc::clone(&refresh); Rc::new(move || { - let Some(context) = context.as_ref().clone() else { - entries.set(Vec::new()); - dump.set(String::new()); - return; - }; - let config = context - .backends - .with_untracked(|value| value.as_ref().map(|backends| backends.config.clone())); - let Some(config) = config else { + let Some((datastore, key_maps)) = resolve_backends() else { entries.set(Vec::new()); dump.set(String::new()); return; @@ -101,17 +96,24 @@ pub fn RadrootsAppLogsPage() -> impl IntoView { loading.set(true); let refresh = Rc::clone(&refresh); spawn_local(async move { - let datastore = RadrootsClientWebDatastore::new(Some(config.datastore.idb_config)); - let _ = app_log_entries_clear(&datastore, &config.datastore.key_maps).await; + let _ = app_log_entries_clear(datastore.as_ref(), &key_maps).await; refresh(); }); }) }; let refresh_effect = Rc::clone(&refresh); + let context_effect = Rc::clone(&context); Effect::new(move || { + let Some(context) = context_effect.as_ref() else { + return; + }; if did_load.get() { return; } + let has_backends = context.backends.with(|value| value.is_some()); + if !has_backends { + return; + } did_load.set(true); refresh_effect(); });