feat(oxibadge): add onboarding flow with i18n and reader preferences
Check, format and test / build (push) Successful in 9m59s
Check, format and test / build (push) Successful in 9m59s
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>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
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())
|
||||
}
|
||||
Reference in New Issue
Block a user