Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/app_shell.rs
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,8 @@ pub struct LocalEnvironmentSelectionState {
pub struct LocalThemeState {
pub theme_name: Option<String>,
pub font_size: AppFontSize,
pub auto_format_response: bool,
pub wrap_body_editor: bool,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
Expand Down Expand Up @@ -2283,6 +2285,8 @@ where
theme: LocalThemeState {
theme_name: app_settings.app_settings.theme_name.clone(),
font_size: app_settings.app_settings.font_size,
auto_format_response: app_settings.app_settings.auto_format_response,
wrap_body_editor: app_settings.app_settings.wrap_body_editor,
},
workspace: WorkspaceState {
workspace_id: workspace_entry.map(|e| e.workspace_id),
Expand Down Expand Up @@ -4078,6 +4082,8 @@ expanded_item_ids = ["{folder_id}"]
app_settings: crate::models::AppSettings {
theme_name: Some("One Dark".to_string()),
font_size: AppFontSize::Large,
auto_format_response: true,
wrap_body_editor: false,
updated_at: Utc::now(),
},
})
Expand Down Expand Up @@ -4180,6 +4186,8 @@ post_response = "console.log(response.status)"
);
assert_eq!(state.theme.theme_name.as_deref(), Some("One Dark"));
assert_eq!(state.theme.font_size, AppFontSize::Large);
assert!(state.theme.auto_format_response);
assert!(!state.theme.wrap_body_editor);
assert_eq!(
state
.shared_store
Expand Down
10 changes: 10 additions & 0 deletions src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -338,9 +338,17 @@ pub struct AppSettings {
pub theme_name: Option<String>,
#[serde(default)]
pub font_size: AppFontSize,
#[serde(default = "default_auto_format_response")]
pub auto_format_response: bool,
#[serde(default)]
pub wrap_body_editor: bool,
pub updated_at: DateTime<Utc>,
}

const fn default_auto_format_response() -> bool {
true
}

impl WorkspacesRegistryFile {
pub fn new_with_default_workspace(
workspace_name: impl Into<String>,
Expand Down Expand Up @@ -385,6 +393,8 @@ impl Default for AppSettingsFile {
app_settings: AppSettings {
theme_name: None,
font_size: AppFontSize::default(),
auto_format_response: default_auto_format_response(),
wrap_body_editor: false,
updated_at: Utc::now(),
},
}
Expand Down
60 changes: 60 additions & 0 deletions src/storage/workspace_repo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,36 @@ impl<B: StorageIoBackend> WorkspaceRepository<B> {
self.save_app_settings(&app_settings)
}

pub fn persist_auto_format_response_state(&self, auto_format_response: bool) -> Result<()> {
let mut app_settings = match self.load_app_settings() {
Ok(state) => state,
Err(_) => AppSettingsFile::default(),
};

if app_settings.app_settings.auto_format_response == auto_format_response {
return Ok(());
}

app_settings.app_settings.auto_format_response = auto_format_response;
app_settings.app_settings.updated_at = Utc::now();
self.save_app_settings(&app_settings)
}

pub fn persist_wrap_body_editor_state(&self, wrap_body_editor: bool) -> Result<()> {
let mut app_settings = match self.load_app_settings() {
Ok(state) => state,
Err(_) => AppSettingsFile::default(),
};

if app_settings.app_settings.wrap_body_editor == wrap_body_editor {
return Ok(());
}

app_settings.app_settings.wrap_body_editor = wrap_body_editor;
app_settings.app_settings.updated_at = Utc::now();
self.save_app_settings(&app_settings)
}

fn seed_app_settings_file(&self) -> Result<AppSettingsFile> {
let mut app_settings = AppSettingsFile::default();
let local_state_path = &self.backend.paths().local_state_file;
Expand Down Expand Up @@ -1904,6 +1934,34 @@ mod tests {
assert_eq!(loaded.app_settings.font_size, AppFontSize::Large);
}

#[test]
fn persist_auto_format_response_state_updates_app_settings() {
let dir = tempdir().expect("tempdir");
let backend = FileSystemStorage::new(BeamPaths::from_root(dir.path().to_path_buf()));
let storage = WorkspaceRepository::new(backend).expect("load workspace into memory");

storage
.persist_auto_format_response_state(false)
.expect("persist auto format response state");
let loaded = storage.load_app_settings().expect("load app settings");

assert!(!loaded.app_settings.auto_format_response);
}

#[test]
fn persist_wrap_body_editor_state_updates_app_settings() {
let dir = tempdir().expect("tempdir");
let backend = FileSystemStorage::new(BeamPaths::from_root(dir.path().to_path_buf()));
let storage = WorkspaceRepository::new(backend).expect("load workspace into memory");

storage
.persist_wrap_body_editor_state(true)
.expect("persist wrap body editor state");
let loaded = storage.load_app_settings().expect("load app settings");

assert!(loaded.app_settings.wrap_body_editor);
}

#[test]
fn load_app_settings_seeds_from_existing_local_state_fields() {
let dir = tempdir().expect("tempdir");
Expand All @@ -1927,6 +1985,8 @@ updated_at = "2026-05-01T03:42:36.157016+00:00"

assert_eq!(loaded.app_settings.theme_name.as_deref(), Some("One Dark"));
assert_eq!(loaded.app_settings.font_size, AppFontSize::Large);
assert!(loaded.app_settings.auto_format_response);
assert!(!loaded.app_settings.wrap_body_editor);
assert!(backend.paths.app_settings_file.exists());
}

Expand Down
Loading