@@ -33,6 +33,9 @@ const qsProps = [
3333 "selected" ,
3434 "showOutsideDays" ,
3535 "showWeekNumber" ,
36+ "startMonth" ,
37+ "endMonth" ,
38+ "month" ,
3639 "timeZone" ,
3740 "toMonth" ,
3841 "weeksStartOn" ,
@@ -50,70 +53,89 @@ export function useQueryStringSync(basePath: string = "/playground") {
5053 const parseQueryString = ( search : string ) : DayPickerPropsWithCalendar => {
5154 const params = new URLSearchParams ( search ) ;
5255 const parsedProps : DayPickerPropsWithCalendar = { } ;
53- const typeMap : Record < string , "boolean" | "number" | "string" | "locale" > =
54- {
55- animate : "boolean" ,
56- broadcastCalendar : "boolean" ,
57- calendar : "string" ,
58- captionLayout : "string" ,
59- defaultMonth : "string" ,
60- dir : "string" ,
61- disabled : "string" ,
62- disableNavigation : "boolean" ,
63- firstDayOfWeek : "number" ,
64- firstWeekContainsDate : "number" ,
65- fixedWeeks : "boolean" ,
66- fromMonth : "string" ,
67- hideNavigation : "boolean" ,
68- hideWeekdays : "boolean" ,
69- ISOWeek : "boolean" ,
70- locale : "locale" ,
71- max : "number" ,
72- min : "number" ,
73- mode : "string" ,
74- navLayout : "string" ,
75- numberOfMonths : "number" ,
76- numerals : "string" ,
77- pagedNavigation : "boolean" ,
78- required : "boolean" ,
79- reverseMonths : "boolean" ,
80- reverseYears : "boolean" ,
81- selected : "string" ,
82- showOutsideDays : "boolean" ,
83- showWeekNumber : "boolean" ,
84- timeZone : "string" ,
85- toMonth : "string" ,
86- weeksStartOn : "number" ,
87- weekStartsOn : "number" ,
88- } ;
56+ const typeMap : Record <
57+ string ,
58+ "boolean" | "number" | "string" | "locale" | "date"
59+ > = {
60+ animate : "boolean" ,
61+ broadcastCalendar : "boolean" ,
62+ calendar : "string" ,
63+ captionLayout : "string" ,
64+ defaultMonth : "date" ,
65+ dir : "string" ,
66+ disabled : "string" ,
67+ disableNavigation : "boolean" ,
68+ endMonth : "date" ,
69+ firstDayOfWeek : "number" ,
70+ firstWeekContainsDate : "number" ,
71+ fixedWeeks : "boolean" ,
72+ fromMonth : "date" ,
73+ hideNavigation : "boolean" ,
74+ hideWeekdays : "boolean" ,
75+ ISOWeek : "boolean" ,
76+ locale : "locale" ,
77+ max : "number" ,
78+ min : "number" ,
79+ mode : "string" ,
80+ month : "date" ,
81+ navLayout : "string" ,
82+ numberOfMonths : "number" ,
83+ numerals : "string" ,
84+ pagedNavigation : "boolean" ,
85+ required : "boolean" ,
86+ reverseMonths : "boolean" ,
87+ reverseYears : "boolean" ,
88+ selected : "string" ,
89+ showOutsideDays : "boolean" ,
90+ showWeekNumber : "boolean" ,
91+ startMonth : "date" ,
92+ timeZone : "string" ,
93+ toMonth : "date" ,
94+ weeksStartOn : "number" ,
95+ weekStartsOn : "number" ,
96+ } ;
8997
9098 qsProps . forEach ( ( key ) => {
91- if ( params . has ( key ) ) {
92- const value = params . get ( key ) || true ;
93- try {
94- switch ( typeMap [ key ] ) {
95- case "boolean" :
96- parsedProps [ key as keyof DayPickerPropsWithCalendar ] = ! ! key ;
97- break ;
98- case "number" :
99+ if ( ! params . has ( key ) ) {
100+ return ;
101+ }
102+ const value = params . get ( key ) ;
103+ try {
104+ switch ( typeMap [ key ] ) {
105+ case "boolean" :
106+ parsedProps [ key as keyof DayPickerPropsWithCalendar ] = true ;
107+ break ;
108+ case "number" :
109+ if ( value !== null ) {
99110 parsedProps [ key as keyof DayPickerPropsWithCalendar ] =
100111 Number ( value ) ;
101- break ;
102- case "string" :
103- parsedProps [ key as keyof DayPickerPropsWithCalendar ] =
104- value || "" ;
105- break ;
106- case "locale" :
107- parsedProps . locale = Object . values ( locales ) . find (
108- ( locale ) => locale . code === value ,
109- ) ;
110- break ;
111- default :
112- break ;
112+ }
113+ break ;
114+ case "string" :
115+ parsedProps [ key as keyof DayPickerPropsWithCalendar ] = value ?? "" ;
116+ break ;
117+ case "locale" :
118+ if ( ! value ) break ;
119+ parsedProps . locale = Object . values ( locales ) . find (
120+ ( locale ) => locale . code === value ,
121+ ) ;
122+ break ;
123+ case "date" : {
124+ if ( ! value ) break ;
125+ const timestamp = Number ( value ) ;
126+ const parsedDate = new Date (
127+ Number . isNaN ( timestamp ) ? value : timestamp ,
128+ ) ;
129+ if ( ! Number . isNaN ( parsedDate . getTime ( ) ) ) {
130+ parsedProps [ key as keyof DayPickerPropsWithCalendar ] = parsedDate ;
131+ }
132+ break ;
113133 }
114- } catch ( error ) {
115- console . error ( `Error parsing query string key " ${ key } ":` , error ) ;
134+ default :
135+ break ;
116136 }
137+ } catch ( error ) {
138+ console . error ( `Error parsing query string key "${ key } ":` , error ) ;
117139 }
118140 } ) ;
119141 return parsedProps ;
@@ -132,6 +154,8 @@ export function useQueryStringSync(basePath: string = "/playground") {
132154 if ( key === "locale" ) {
133155 if ( ! value ) return ;
134156 qs . push ( `locale=${ value . code } ` ) ;
157+ } else if ( value instanceof Date ) {
158+ qs . push ( `${ key } =${ value . getTime ( ) } ` ) ;
135159 } else {
136160 qs . push ( `${ key } ${ value === true ? "" : `=${ value } ` } ` ) ;
137161 }
0 commit comments