summaryrefslogtreecommitdiff
path: root/src-tauri/src/timer.rs
diff options
context:
space:
mode:
authorSolstice <solstice@local>2026-06-09 01:10:46 -0700
committerSolstice <solstice@local>2026-06-09 01:10:46 -0700
commit887c0bc6f968f80ac90220f24bb578438e05708a (patch)
tree563925e9bc82ae0eee582dc9128ea753d0082ab0 /src-tauri/src/timer.rs
parent4e2d978eb5fc9457d5b913bc10faf1266e6dcda4 (diff)
fix: resolve final release blockers
Diffstat (limited to 'src-tauri/src/timer.rs')
-rw-r--r--src-tauri/src/timer.rs35
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,