File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -6,8 +6,13 @@ use crate::Route;
66
77#[ component]
88pub 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 ( ) ) ;
Original file line number Diff line number Diff 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]
You can’t perform that action at this time.
0 commit comments