@@ -5,7 +5,7 @@ import GridList from "@/components/GridList";
5
5
import List from "@/components/List" ;
6
6
import { SessionTile } from "@/components/session" ;
7
7
import { getEventFullDate } from "@/utils/utils" ;
8
- import { useSearchParams } from "next/navigation" ;
8
+ import { usePathname , useRouter , useSearchParams } from "next/navigation" ;
9
9
import { useEffect , useMemo , useState } from "react" ;
10
10
11
11
interface ScheduleTableProps {
@@ -14,25 +14,31 @@ interface ScheduleTableProps {
14
14
15
15
export default function ScheduleTable ( { sessions } : ScheduleTableProps ) {
16
16
const searchParams = useSearchParams ( ) ;
17
+ const pathname = usePathname ( ) ;
18
+ const router = useRouter ( ) ;
17
19
const [ showingDay , setShowingDay ] = useState < string | null > ( null ) ;
18
20
21
+ const dayParam = searchParams . get ( "day" ) ;
22
+ const kindParam = searchParams . get ( "kind" ) ;
23
+ const placeParam = searchParams . get ( "place" ) ;
24
+
19
25
const sessionsByDay = useMemo ( ( ) => {
20
26
const sortedSessions = sessions . sort ( ( a , b ) =>
21
- a . date . localeCompare ( b . date ) ,
27
+ a . date . localeCompare ( b . date )
22
28
) ;
23
29
return sortedSessions . reduce (
24
30
( acc , s ) => {
25
31
const day = s . date . split ( "T" ) [ 0 ] ;
26
32
const daySessions = [ ...( acc [ day ] || [ ] ) , s ] ;
27
33
return { ...acc , [ day ] : daySessions } ;
28
34
} ,
29
- { } as Record < string , SINFOSession [ ] > ,
35
+ { } as Record < string , SINFOSession [ ] >
30
36
) ;
31
37
} , [ sessions ] ) ;
32
38
33
39
const sortedDays = useMemo (
34
40
( ) => Object . keys ( sessionsByDay ) . sort ( ) ,
35
- [ sessionsByDay ] ,
41
+ [ sessionsByDay ]
36
42
) ;
37
43
38
44
useEffect ( ( ) => {
@@ -42,16 +48,33 @@ export default function ScheduleTable({ sessions }: ScheduleTableProps) {
42
48
setShowingDay ( sortedDays . find ( ( d ) => day === d ) || null ) ;
43
49
} , [ sortedDays , searchParams ] ) ;
44
50
51
+ const updateSearchParam = ( newDay : string ) => {
52
+ const params = new URLSearchParams ( searchParams . toString ( ) ) ;
53
+ params . delete ( "kind" ) ;
54
+ params . delete ( "place" ) ;
55
+
56
+ if ( newDay === dayParam ) {
57
+ params . delete ( "day" ) ;
58
+ } else {
59
+ params . set ( "day" , newDay ) ;
60
+ }
61
+ router . push ( `${ pathname } ?${ params . toString ( ) } ` , { scroll : false } ) ;
62
+ } ;
63
+
64
+ useEffect ( ( ) => {
65
+ if ( dayParam && sortedDays . includes ( dayParam ) ) {
66
+ setShowingDay ( dayParam ) ;
67
+ }
68
+ } , [ dayParam , sortedDays ] ) ;
69
+
45
70
return (
46
71
< >
47
72
< GridList >
48
73
{ sortedDays . map ( ( d ) => (
49
74
< EventDayButton
50
75
key = { `event-day-${ d } ` }
51
76
date = { d }
52
- onClick = { ( ) =>
53
- setShowingDay ( ( currentDay ) => ( currentDay === d ? null : d ) )
54
- }
77
+ onClick = { ( ) => updateSearchParam ( d ) }
55
78
selected = { showingDay === d }
56
79
/>
57
80
) ) }
@@ -60,9 +83,15 @@ export default function ScheduleTable({ sessions }: ScheduleTableProps) {
60
83
. filter ( ( d ) => ! showingDay || d === showingDay )
61
84
. map ( ( d ) => (
62
85
< List key = { d } title = { getEventFullDate ( d ) } >
63
- { sessionsByDay [ d ] . map ( ( s ) => (
64
- < SessionTile key = { s . id } session = { s } onlyShowHours = { true } />
65
- ) ) }
86
+ { sessionsByDay [ d ]
87
+ . filter (
88
+ ( s ) =>
89
+ ( ! kindParam || s . kind === kindParam ) &&
90
+ ( ! placeParam || s . place === placeParam )
91
+ )
92
+ . map ( ( s ) => (
93
+ < SessionTile key = { s . id } session = { s } onlyShowHours = { true } />
94
+ ) ) }
66
95
</ List >
67
96
) ) }
68
97
</ >
0 commit comments