a lightweight, interval-based utility to combat digital strain through "Ma" (intentional pauses) for the eyes and body.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: wire password setup wizard, hash and persist

+33 -6
+30 -4
src/main.rs
··· 21 21 22 22 use app::{active_profile, spawn_idle_poller, AppState}; 23 23 use config::AppConfig; 24 + use generated::PasswordSetupWindow; 24 25 use overlay::OverlayManager; 25 26 use settings::{read_settings_into, SettingsManager}; 26 27 use timer::{BreakMode, TimerCommand, TimerEvent}; ··· 135 136 let _ = open::that(dir); 136 137 } 137 138 }); 138 - // Password (Phase 3) 139 - mgr.window().on_set_password_clicked(|| { 140 - log::info!("Password setup — Phase 3"); 141 - }); 139 + // Password setup wizard — created fresh on each click. 140 + { 141 + let cfg_arc_pw = cfg_arc.clone(); 142 + mgr.window().on_set_password_clicked(move || { 143 + match PasswordSetupWindow::new() { 144 + Ok(pw) => { 145 + let pw_cancel = pw.clone_strong(); 146 + pw.on_cancel_clicked(move || { 147 + pw_cancel.hide().unwrap_or_default(); 148 + }); 149 + let pw_submit = pw.clone_strong(); 150 + let cfg_arc_submit = cfg_arc_pw.clone(); 151 + pw.on_submit_clicked(move |password| { 152 + match overlay::password::hash_password(password.as_str()) { 153 + Ok(hash) => { 154 + cfg_arc_submit.lock().unwrap().enforced.password_hash = hash.clone(); 155 + let snap = cfg_arc_submit.lock().unwrap().clone(); 156 + config::save(&snap).unwrap_or_else(|e| log::warn!("save failed: {e}")); 157 + } 158 + Err(e) => log::warn!("hash_password failed: {e}"), 159 + } 160 + pw_submit.hide().unwrap_or_default(); 161 + }); 162 + pw.show().unwrap_or_default(); 163 + } 164 + Err(e) => log::warn!("Failed to create password window: {e}"), 165 + } 166 + }); 167 + } 142 168 143 169 mgr.window().show().unwrap_or_default(); 144 170 settings_mgr = Some(mgr);
+3 -2
ui/app.slint
··· 1 1 import { OverlayWindow } from "overlay.slint"; 2 2 import { SettingsWindow } from "settings.slint"; 3 + import { PasswordSetupWindow } from "password.slint"; 3 4 4 - // Re-export both windows from a single entry point so include_modules! works once. 5 - export { OverlayWindow, SettingsWindow } 5 + // Re-export all windows from a single entry point so include_modules! works once. 6 + export { OverlayWindow, SettingsWindow, PasswordSetupWindow }