@@ -12,6 +12,7 @@ import type {
1212import { IntervalSelector } from "components/analytics/interval-selector" ;
1313import { differenceInDays } from "date-fns" ;
1414import { usePathname , useSearchParams } from "next/navigation" ;
15+ import { useState } from "react" ;
1516
1617export function RangeSelector ( {
1718 range,
@@ -20,11 +21,16 @@ export function RangeSelector({
2021 const pathname = usePathname ( ) ;
2122 const searchParams = useSearchParams ( ) ;
2223 const router = useDashboardRouter ( ) ;
24+ const [ localRange , setRange ] = useState < Range > (
25+ range || getLastNDaysRange ( "last-120" ) ,
26+ ) ;
27+ const [ localInterval , setInterval ] = useState < "day" | "week" > ( interval ) ;
2328
24- const { data : computedRange } = useQuery ( {
29+ useQuery ( {
2530 queryKey : [ "analytics-range" , searchParams ?. toString ( ) , range ] ,
2631 queryFn : async ( ) => {
2732 if ( range ) {
33+ setRange ( range ) ;
2834 return range ;
2935 }
3036 if ( searchParams ) {
@@ -35,17 +41,43 @@ export function RangeSelector({
3541 const toStringified = searchParams . get ( "to" ) ;
3642 const to = toStringified ? new Date ( toStringified ) : new Date ( ) ;
3743 const type = ( searchParams . get ( "type" ) as DurationId ) || "last-120" ;
44+ setRange ( { from, to, type } ) ;
3845 return { from, to, type } satisfies Range ;
3946 }
4047 return getLastNDaysRange ( "last-120" ) ;
4148 } ,
4249 } ) ;
4350
51+ // prefetch for each interval and default range
52+ useQuery ( {
53+ queryKey : [ "analytics-range" , searchParams ?. toString ( ) ] ,
54+ queryFn : async ( ) => {
55+ const newSearchParams = new URLSearchParams ( searchParams || { } ) ;
56+ for ( const interval of [ "day" , "week" ] as const ) {
57+ newSearchParams . set ( "interval" , interval ) ;
58+ for ( const type of [
59+ "last-120" ,
60+ "last-60" ,
61+ "last-30" ,
62+ "last-7" ,
63+ ] as const ) {
64+ const newRange = getLastNDaysRange ( type ) ;
65+ newSearchParams . set ( "from" , newRange . from . toISOString ( ) ) ;
66+ newSearchParams . set ( "to" , newRange . to . toISOString ( ) ) ;
67+ newSearchParams . set ( "type" , newRange . type ) ;
68+ router . prefetch ( `${ pathname } ?${ newSearchParams . toString ( ) } ` ) ;
69+ }
70+ }
71+ return true ;
72+ } ,
73+ } ) ;
74+
4475 return (
4576 < div className = "flex flex-col justify-end gap-3 sm:flex-row" >
4677 < DateRangeSelector
47- range = { computedRange || getLastNDaysRange ( "last-120" ) }
78+ range = { localRange }
4879 setRange = { ( newRange ) => {
80+ setRange ( newRange ) ;
4981 const days = differenceInDays ( newRange . to , newRange . from ) ;
5082 const interval = days > 30 ? "week" : "day" ;
5183 const newSearchParams = new URLSearchParams ( searchParams || { } ) ;
@@ -57,8 +89,9 @@ export function RangeSelector({
5789 } }
5890 />
5991 < IntervalSelector
60- intervalType = { interval }
92+ intervalType = { localInterval }
6193 setIntervalType = { ( newInterval ) => {
94+ setInterval ( newInterval ) ;
6295 const newSearchParams = new URLSearchParams ( searchParams || { } ) ;
6396 newSearchParams . set ( "interval" , newInterval ) ;
6497 router . push ( `${ pathname } ?${ newSearchParams . toString ( ) } ` ) ;
0 commit comments