Skip to content

Commit 31ac9c1

Browse files
committed
feat(dashboard): prefetch overview page
1 parent c8f5ba0 commit 31ac9c1

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

apps/dashboard/src/app/team/[team_slug]/[project_slug]/components/BarChart.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export function BarChart({
5959
}}
6060
/>
6161
<YAxis
62-
width={32}
62+
width={48}
6363
dataKey={activeKey}
6464
tickLine={false}
6565
axisLine={false}

apps/dashboard/src/app/team/[team_slug]/[project_slug]/components/CombinedBarChartCard.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export function CombinedBarChartCard<
5353
usersChart: key,
5454
},
5555
}}
56+
prefetch
5657
scroll={false}
5758
key={chart}
5859
data-active={activeChart === chart}

apps/dashboard/src/components/analytics/range-selector.tsx

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
import { IntervalSelector } from "components/analytics/interval-selector";
1313
import { differenceInDays } from "date-fns";
1414
import { usePathname, useSearchParams } from "next/navigation";
15+
import { useState } from "react";
1516

1617
export 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

Comments
 (0)