diff options
| author | Solstice <solstice@local> | 2026-06-09 01:10:46 -0700 |
|---|---|---|
| committer | Solstice <solstice@local> | 2026-06-09 01:10:46 -0700 |
| commit | 887c0bc6f968f80ac90220f24bb578438e05708a (patch) | |
| tree | 563925e9bc82ae0eee582dc9128ea753d0082ab0 /src-tauri/src/timer.rs | |
| parent | 4e2d978eb5fc9457d5b913bc10faf1266e6dcda4 (diff) | |
fix: resolve final release blockers
Diffstat (limited to 'src-tauri/src/timer.rs')
| -rw-r--r-- | src-tauri/src/timer.rs | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/src-tauri/src/timer.rs b/src-tauri/src/timer.rs index 322795e..02ae285 100644 --- a/src-tauri/src/timer.rs +++ b/src-tauri/src/timer.rs @@ -8,6 +8,12 @@ use crate::audio::{self, AudioEngine}; use crate::state::{TimerPhase, TimerState}; use crate::storage::{self, AppData}; +fn persist_timer_state(data: &mut AppData, timer: &TimerState, data_dir: &std::path::PathBuf) { + data.current_task_id = timer.current_task_id.clone(); + data.timer_snapshot = Some(timer.snapshot()); + let _ = storage::save(data_dir, data); +} + // LOCK ORDERING: When acquiring multiple locks, always take timer_state // before app_data to prevent deadlock. Never acquire app_data first // while timer_state is not held. @@ -68,20 +74,22 @@ pub fn spawn_timer_thread( session_count: ts.session_count, current_task_id: ts.current_task_id.clone(), }; + + { + let mut data = data_arc.lock().unwrap(); + persist_timer_state(&mut data, &ts, &data_dir); + } + let _ = app_handle.emit("timer-tick", tick); // Check if phase has reached zero if ts.remaining_secs == 0 { ts.running = false; + let mut emit_completed = false; + let mut completed_task_id = None; match ts.phase { TimerPhase::Work => { - // Emit completion before transitioning - let completed = CompletedPayload { - task_id: ts.current_task_id.clone(), - }; - let _ = app_handle.emit("timer-completed", completed); - // Decrement task remaining sessions let task_id = ts.current_task_id.clone(); { @@ -96,8 +104,9 @@ pub fn spawn_timer_thread( } } } - let _ = storage::save(&data_dir, &data); } + emit_completed = true; + completed_task_id = task_id; ts.session_count += 1; @@ -129,6 +138,11 @@ pub fn spawn_timer_thread( } } + { + let mut data = data_arc.lock().unwrap(); + persist_timer_state(&mut data, &ts, &data_dir); + } + // Emit phase-changed after state is updated if let Some(engine) = audio_arc.lock().unwrap().as_mut() { if audio::should_duck_for_phase(ts.phase) { @@ -138,6 +152,13 @@ pub fn spawn_timer_thread( } } + if emit_completed { + let completed = CompletedPayload { + task_id: completed_task_id, + }; + let _ = app_handle.emit("timer-completed", completed); + } + let phase_changed = PhaseChangedPayload { phase: ts.phase, session_count: ts.session_count, |
