@@ -26,7 +26,14 @@ import {
26
26
UserLatencyInsightsResponse ,
27
27
} from "api/typesGenerated" ;
28
28
import { ComponentProps , ReactNode , useState } from "react" ;
29
- import { subDays , isToday } from "date-fns" ;
29
+ import {
30
+ subDays ,
31
+ subWeeks ,
32
+ startOfWeek ,
33
+ endOfWeek ,
34
+ isSunday ,
35
+ endOfDay ,
36
+ } from "date-fns" ;
30
37
import "react-date-range/dist/styles.css" ;
31
38
import "react-date-range/dist/theme/default.css" ;
32
39
import { DateRange , DateRangeValue } from "./DateRange" ;
@@ -37,23 +44,30 @@ import { getDateRangeFilter } from "./utils";
37
44
import Tooltip from "@mui/material/Tooltip" ;
38
45
import LinkOutlined from "@mui/icons-material/LinkOutlined" ;
39
46
import { InsightsInterval , IntervalMenu } from "./IntervalMenu" ;
47
+ import { WeeklyPreset , WeeklyPresetsMenu } from "./WeeklyPresetsMenu" ;
40
48
41
49
export default function TemplateInsightsPage ( ) {
50
+ const { template } = useTemplateLayoutContext ( ) ;
42
51
const now = new Date ( ) ;
43
- const [ interval , setInterval ] = useState < InsightsInterval > ( "day" ) ;
44
- const [ dateRangeValue , setDateRangeValue ] = useState < DateRangeValue > ( {
52
+
53
+ const defaultWeeklyPreset = 4 ;
54
+ const defaultDateRangeValue = {
45
55
startDate : subDays ( now , 6 ) ,
46
56
endDate : now ,
47
- } ) ;
48
- const { template } = useTemplateLayoutContext ( ) ;
57
+ } ;
58
+
59
+ const [ interval , setInterval ] = useState < InsightsInterval > ( "day" ) ;
60
+ const [ weeklyPreset , setWeeklyPreset ] =
61
+ useState < WeeklyPreset > ( defaultWeeklyPreset ) ;
62
+ const [ dateRangeValue , setDateRangeValue ] = useState < DateRangeValue > (
63
+ defaultDateRangeValue ,
64
+ ) ;
65
+
66
+ const dateRange =
67
+ interval === "day" ? dateRangeValue : getWeeklyRange ( weeklyPreset ) ;
49
68
const commonFilters = {
50
69
template_ids : template . id ,
51
- ...getDateRangeFilter ( {
52
- startDate : dateRangeValue . startDate ,
53
- endDate : dateRangeValue . endDate ,
54
- now,
55
- isToday,
56
- } ) ,
70
+ ...getDateRangeFilter ( dateRange ) ,
57
71
} ;
58
72
const insightsFilter = { ...commonFilters , interval } ;
59
73
const { data : templateInsights } = useQuery ( {
@@ -73,8 +87,25 @@ export default function TemplateInsightsPage() {
73
87
< TemplateInsightsPageView
74
88
controls = {
75
89
< >
76
- < IntervalMenu value = { interval } onChange = { setInterval } />
77
- < DateRange value = { dateRangeValue } onChange = { setDateRangeValue } />
90
+ < IntervalMenu
91
+ value = { interval }
92
+ onChange = { ( interval ) => {
93
+ setInterval ( interval ) ;
94
+ if ( interval === "week" ) {
95
+ setWeeklyPreset ( defaultWeeklyPreset ) ;
96
+ } else {
97
+ setDateRangeValue ( defaultDateRangeValue ) ;
98
+ }
99
+ } }
100
+ />
101
+ { interval === "day" ? (
102
+ < DateRange value = { dateRangeValue } onChange = { setDateRangeValue } />
103
+ ) : (
104
+ < WeeklyPresetsMenu
105
+ value = { weeklyPreset }
106
+ onChange = { setWeeklyPreset }
107
+ />
108
+ ) }
78
109
</ >
79
110
}
80
111
templateInsights = { templateInsights }
@@ -598,6 +629,13 @@ const TextValue = ({ children }: { children: ReactNode }) => {
598
629
) ;
599
630
} ;
600
631
632
+ const getWeeklyRange = ( numberOfWeeks : WeeklyPreset ) => {
633
+ const now = new Date ( ) ;
634
+ const startDate = startOfWeek ( subWeeks ( now , numberOfWeeks ) ) ;
635
+ const endDate = isSunday ( now ) ? endOfDay ( now ) : endOfWeek ( subWeeks ( now , 1 ) ) ;
636
+ return { startDate, endDate } ;
637
+ } ;
638
+
601
639
function mapToDAUsResponse (
602
640
data : TemplateInsightsResponse [ "interval_reports" ] ,
603
641
) : DAUsResponse {
0 commit comments