Skip to content

Commit 692ad7e

Browse files
Copilotgfauredev
andcommitted
Fix WASM panic: move use_sessions() out of use_signal initializer; add session tests
Co-authored-by: gfauredev <19304085+gfauredev@users.noreply.github.com>
1 parent 532b9e4 commit 692ad7e

2 files changed

Lines changed: 51 additions & 2 deletions

File tree

src/components/active_session.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ use crate::Route;
66

77
#[component]
88
pub fn ActiveSessionPage() -> Element {
9-
let mut session = use_signal(|| {
10-
storage::get_active_session().unwrap_or_else(WorkoutSession::new)
9+
// use_sessions() must be called at the top level of the component, not inside
10+
// use_signal's initializer. Calling use_context (via use_sessions) inside another
11+
// use_hook's initializer causes a double-borrow of the hooks RefCell → panic.
12+
let sessions = storage::use_sessions();
13+
let mut session = use_signal(move || {
14+
sessions.read().iter().find(|s| s.is_active()).cloned()
15+
.unwrap_or_else(WorkoutSession::new)
1116
});
1217

1318
let mut search_query = use_signal(|| String::new());

src/models/mod.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,50 @@ mod tests {
368368
assert_eq!(session.version, DATA_VERSION);
369369
}
370370

371+
#[test]
372+
fn find_active_session_returns_first_without_end_time() {
373+
let sessions = vec![
374+
WorkoutSession {
375+
id: "s1".into(),
376+
start_time: 1000,
377+
end_time: Some(2000),
378+
exercise_logs: vec![],
379+
version: DATA_VERSION,
380+
},
381+
WorkoutSession {
382+
id: "s2".into(),
383+
start_time: 3000,
384+
end_time: None,
385+
exercise_logs: vec![],
386+
version: DATA_VERSION,
387+
},
388+
];
389+
let active = sessions.iter().find(|s| s.is_active()).cloned();
390+
assert_eq!(active.unwrap().id, "s2");
391+
}
392+
393+
#[test]
394+
fn find_active_session_returns_none_when_all_finished() {
395+
let sessions = vec![
396+
WorkoutSession {
397+
id: "s1".into(),
398+
start_time: 1000,
399+
end_time: Some(2000),
400+
exercise_logs: vec![],
401+
version: DATA_VERSION,
402+
},
403+
];
404+
let active = sessions.iter().find(|s| s.is_active()).cloned();
405+
assert!(active.is_none());
406+
}
407+
408+
#[test]
409+
fn find_active_session_returns_none_for_empty_list() {
410+
let sessions: Vec<WorkoutSession> = vec![];
411+
let active = sessions.iter().find(|s| s.is_active()).cloned();
412+
assert!(active.is_none());
413+
}
414+
371415
// ── Exercise ──────────────────────────────────────────────────────────────
372416

373417
#[test]

0 commit comments

Comments
 (0)