Files
r701/oxibadge/src-tauri/src/preferences.rs
T
nicolabelluti 99772b9e4a
Check, format and test / build (push) Successful in 9m59s
feat(oxibadge): add onboarding flow with i18n and reader preferences
Adds the first real screen: a setup form for the device's host/port,
tested against the real device (3 retries) and persisted to
preferences.toml before showing a placeholder "done" screen.

- Rust: test_connection/save_preferences/load_preferences commands;
  preferences stored as [[reader]] in TOML so more readers can be
  added later without a format change.
- Svelte: split the monolithic page into reusable components
  (Screen, Column, Field, Button, ErrorBanner, Hint) under
  src/lib/components, sharing design tokens from app.css.
- Automatic it/en i18n via svelte-i18n, locale detected from
  navigator.language.

Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-07 11:08:02 +02:00

32 lines
1.0 KiB
Rust

use serde::{Deserialize, Serialize};
use tauri::{AppHandle, Manager};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reader {
pub host: String,
pub port: u16,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
struct Preferences {
#[serde(default)]
reader: Vec<Reader>,
}
pub fn load(app: &AppHandle) -> Option<Reader> {
let path = app.path().app_data_dir().ok()?.join("preferences.toml");
let contents = std::fs::read_to_string(path).ok()?;
let preferences: Preferences = toml::from_str(&contents).ok()?;
preferences.reader.into_iter().next()
}
pub fn save(app: &AppHandle, reader: Reader) -> Result<(), String> {
let dir = app.path().app_data_dir().map_err(|err| err.to_string())?;
std::fs::create_dir_all(&dir).map_err(|err| err.to_string())?;
let preferences = Preferences {
reader: vec![reader],
};
let contents = toml::to_string_pretty(&preferences).map_err(|err| err.to_string())?;
std::fs::write(dir.join("preferences.toml"), contents).map_err(|err| err.to_string())
}