app

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

commit d14a573e6113d15823b9850d74e54998ba94fab5
parent ce9f4bb751e42d6bd190e92c544e7bac2765bd06
Author: triesap <tyson@radroots.org>
Date:   Sat,  6 Jun 2026 22:50:57 -0700

app: read general settings from runtime

Diffstat:
Mcrates/desktop/src/window.rs | 60++++++++++++++++++++++++++++++++++++++++++++++++++----------
Mcrates/ui/src/lib.rs | 4++--
Mcrates/ui/src/text.rs | 47+++++++++++++++++++++++++++++++++++++++--------
3 files changed, 91 insertions(+), 20 deletions(-)

diff --git a/crates/desktop/src/window.rs b/crates/desktop/src/window.rs @@ -28,9 +28,10 @@ use radroots_app_sync::{ }; use radroots_app_ui::{ APP_UI_THEME, AppCheckboxFieldSpec, AppFormFieldSpec, - AppSegmentButtonIconSpec as IconSegmentButtonSpec, LabelValueRow, app_button_card, - app_button_choice as choice_button, app_button_compact as action_button_compact, - app_button_list_row as list_row_button, app_button_primary as action_button_primary, + AppSegmentButtonIconSpec as IconSegmentButtonSpec, LabelValueRow, + SettingsPreferencesGeneralRowState, app_button_card, app_button_choice as choice_button, + app_button_compact as action_button_compact, app_button_list_row as list_row_button, + app_button_primary as action_button_primary, app_button_primary_disabled as action_button_primary_disabled, app_button_secondary as action_button, app_button_secondary_disabled as action_button_disabled, app_button_text as text_button, app_checkbox_field, app_cluster, app_detail_row, @@ -6335,6 +6336,18 @@ enum SettingsAutoFocusTarget { AboutRefresh, } +fn settings_preferences_general_row_state( + runtime: &DesktopAppRuntimeSummary, +) -> SettingsPreferencesGeneralRowState { + let general = &runtime.shell_projection.settings.general; + SettingsPreferencesGeneralRowState { + allow_relay_connections: general.allow_relay_connections, + use_media_servers: general.use_media_servers, + use_nip05: general.use_nip05, + launch_at_login: general.launch_at_login, + } +} + impl SettingsWindowView { pub fn new(runtime: DesktopAppRuntime, initial_view: SettingsPanelViewKey) -> Self { let _ = initial_view; @@ -6931,6 +6944,7 @@ impl SettingsWindowView { fn settings_panel(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement { self.sync_farm_panel_state(window, cx); + let runtime = self.runtime.summary(); let mut cards = Vec::new(); @@ -7188,7 +7202,9 @@ impl SettingsWindowView { app_shared_text(AppTextKey::SettingsGeneralSectionLabel), app_stack_v(APP_UI_THEME.foundation.spacing.small_px) .w_full() - .child(label_value_list(settings_preferences_general_rows())), + .child(label_value_list(settings_preferences_general_rows( + settings_preferences_general_row_state(&runtime), + ))), ) .into_any_element(), ); @@ -13820,12 +13836,12 @@ mod tests { parse_product_editor_price_input, presented_farmer_reminder, product_display_title, reminder_action_target, reminder_deadline_text, reminder_delivery_state_key, reminder_urgency_color, reminder_urgency_key, settings_auto_focus_target, - startup_home_surface, startup_issue_summary_text, startup_notice_text, - startup_signer_preview_summary, startup_signer_preview_summary_for_connect_state, - startup_signer_source_input_is_editable, startup_signer_status_spec, - startup_signer_transport_failure_requires_notice, trade_agreement_status_key, - trade_fulfillment_status_key, trade_inventory_status_key, trade_payment_display_status_key, - trade_revision_status_key, trade_workflow_source_key, + settings_preferences_general_row_state, startup_home_surface, startup_issue_summary_text, + startup_notice_text, startup_signer_preview_summary, + startup_signer_preview_summary_for_connect_state, startup_signer_source_input_is_editable, + startup_signer_status_spec, startup_signer_transport_failure_requires_notice, + trade_agreement_status_key, trade_fulfillment_status_key, trade_inventory_status_key, + trade_payment_display_status_key, trade_revision_status_key, trade_workflow_source_key, }; use crate::runtime::{ DesktopAppRuntimeMetadataSummary, DesktopAppRuntimeSummary, DesktopAppSyncConflictSummary, @@ -14863,6 +14879,30 @@ mod tests { } #[test] + fn settings_general_rows_read_runtime_projection_values() { + let mut runtime = summary( + HomeRoute::Today, + TodayAgendaProjection::default(), + FarmSetupProjection::default(), + ); + runtime + .shell_projection + .settings + .general + .allow_relay_connections = false; + runtime.shell_projection.settings.general.use_media_servers = true; + runtime.shell_projection.settings.general.use_nip05 = false; + runtime.shell_projection.settings.general.launch_at_login = true; + + let state = settings_preferences_general_row_state(&runtime); + + assert!(!state.allow_relay_connections); + assert!(state.use_media_servers); + assert!(!state.use_nip05); + assert!(state.launch_at_login); + } + + #[test] fn farmer_home_farm_state_distinguishes_no_farm_incomplete_and_configured() { let farm_id = FarmId::new(); let incomplete_farm = FarmSummary { diff --git a/crates/ui/src/lib.rs b/crates/ui/src/lib.rs @@ -17,8 +17,8 @@ pub use primitives::{ app_text_label, app_text_value, label_value_list, utility_title_row, }; pub use text::{ - app_shared_label_text, app_shared_text, runtime_metadata_rows, - settings_preferences_general_rows, + SettingsPreferencesGeneralRowState, app_shared_label_text, app_shared_text, + runtime_metadata_rows, settings_preferences_general_rows, }; pub use theme::{ APP_UI_THEME, AppBorderTokens, AppButtonColors, AppButtonSizing, AppButtonTokens, diff --git a/crates/ui/src/text.rs b/crates/ui/src/text.rs @@ -4,6 +4,14 @@ use radroots_app_i18n::{AppTextKey, app_text}; use crate::LabelValueRow; +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct SettingsPreferencesGeneralRowState { + pub allow_relay_connections: bool, + pub use_media_servers: bool, + pub use_nip05: bool, + pub launch_at_login: bool, +} + pub fn app_shared_text(key: AppTextKey) -> SharedString { app_text(key).into() } @@ -91,23 +99,25 @@ pub fn runtime_metadata_rows(snapshot: &AppRuntimeSnapshot) -> Vec<LabelValueRow ] } -pub fn settings_preferences_general_rows() -> Vec<LabelValueRow> { +pub fn settings_preferences_general_rows( + state: SettingsPreferencesGeneralRowState, +) -> Vec<LabelValueRow> { vec![ text_row( AppTextKey::SettingsGeneralAllowRelayConnections, - AppTextKey::ValueEnabled, + enabled_value_key(state.allow_relay_connections), ), text_row( AppTextKey::SettingsGeneralUseMediaServers, - AppTextKey::ValueEnabled, + enabled_value_key(state.use_media_servers), ), text_row( AppTextKey::SettingsGeneralUseNip05, - AppTextKey::ValueEnabled, + enabled_value_key(state.use_nip05), ), text_row( AppTextKey::SettingsGeneralLaunchAtLogin, - AppTextKey::ValueDisabled, + enabled_value_key(state.launch_at_login), ), ] } @@ -120,6 +130,14 @@ fn text_row(label: AppTextKey, value: AppTextKey) -> LabelValueRow { metadata_row(label, app_text(value)) } +fn enabled_value_key(enabled: bool) -> AppTextKey { + if enabled { + AppTextKey::ValueEnabled + } else { + AppTextKey::ValueDisabled + } +} + fn runtime_mode_text(mode: &AppRuntimeMode) -> String { match mode { AppRuntimeMode::Production => app_text(AppTextKey::ValueRuntimeModeProduction), @@ -135,7 +153,10 @@ mod tests { }; use radroots_app_i18n::{AppTextKey, app_text}; - use super::{runtime_metadata_rows, settings_preferences_general_rows}; + use super::{ + SettingsPreferencesGeneralRowState, runtime_metadata_rows, + settings_preferences_general_rows, + }; #[test] fn runtime_metadata_rows_use_localized_labels() { @@ -170,15 +191,25 @@ mod tests { #[test] fn settings_preferences_rows_use_localized_copy() { - let general_rows = settings_preferences_general_rows(); + let general_rows = settings_preferences_general_rows(SettingsPreferencesGeneralRowState { + allow_relay_connections: false, + use_media_servers: true, + use_nip05: false, + launch_at_login: true, + }); let allow_relay_label = app_text(AppTextKey::SettingsGeneralAllowRelayConnections); let enabled_value = app_text(AppTextKey::ValueEnabled); + let disabled_value = app_text(AppTextKey::ValueDisabled); assert!( general_rows .iter() - .any(|row| row.label == allow_relay_label && row.value == enabled_value) + .any(|row| row.label == allow_relay_label && row.value == disabled_value) ); + assert!(general_rows.iter().any(|row| { + row.label == app_text(AppTextKey::SettingsGeneralLaunchAtLogin) + && row.value == enabled_value + })); } }