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:
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
+ }));
}
}