diff --git a/desktop/src/main.rs b/desktop/src/main.rs index eb051e7..d3cdd42 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -16,9 +16,16 @@ struct BackendProcess { restarting: Mutex, } +#[derive(Debug, Serialize, Deserialize, Clone)] +struct VaultConfig { + name: String, + path: String, +} + #[derive(Debug, Serialize, Deserialize, Clone)] struct AppConfig { vault_path: Option, + vaults: Vec, window_x: Option, window_y: Option, window_width: Option, @@ -29,6 +36,7 @@ impl Default for AppConfig { fn default() -> Self { Self { vault_path: None, + vaults: Vec::new(), window_x: None, window_y: None, window_width: Some(1200.0), @@ -123,9 +131,19 @@ fn spawn_backend(exe_dir: &PathBuf) -> Result { let data_dir = app_data_dir(); let _ = fs::create_dir_all(data_dir.join("data")); - let child = Command::new(&python) - .current_dir(&data_dir) - .env("PYTHONPATH", exe_dir) + let mut cmd = Command::new(&python); + cmd.current_dir(&data_dir) + .env("PYTHONPATH", exe_dir); + + // Pass vault config as env vars (VAULT_1_NAME, VAULT_1_PATH, etc.) + let config = load_config(); + for (i, vault) in config.vaults.iter().enumerate() { + let n = i + 1; + cmd.env(format!("VAULT_{}_NAME", n), &vault.name); + cmd.env(format!("VAULT_{}_PATH", n), &vault.path); + } + + let child = cmd .args([ "-m", "uvicorn", "backend.main:app", @@ -235,6 +253,31 @@ fn get_system_theme(app: tauri::AppHandle) -> String { } } +#[tauri::command] +fn add_vault(name: String, path: String) -> Result<(), String> { + let mut config = load_config(); + // Avoid duplicates + config.vaults.retain(|v| v.name != name); + config.vaults.push(VaultConfig { name: name.clone(), path }); + save_config(&config); + info!("Vault added: {} — restart backend to apply", name); + Ok(()) +} + +#[tauri::command] +fn remove_vault(name: String) -> Result<(), String> { + let mut config = load_config(); + config.vaults.retain(|v| v.name != name); + save_config(&config); + info!("Vault removed: {} — restart backend to apply", name); + Ok(()) +} + +#[tauri::command] +fn list_vaults() -> Vec { + load_config().vaults +} + #[tauri::command] fn restart_backend(state: tauri::State) -> Result { let mut restarting = state.restarting.lock().map_err(|e| e.to_string())?; @@ -393,6 +436,9 @@ fn main() { check_backend_health, save_window_state, get_window_state, + add_vault, + remove_vault, + list_vaults, ]) .setup(move |app| { // Restore window position/size