1- import { Suspense } from "react" ;
1+ import { Suspense , useMemo } from "react" ;
22import styles from "./projects.module.css" ;
33
44import { useLocalStorage } from "@uidotdev/usehooks" ;
55import { ChevronDownIcon } from "lucide-react" ;
66
7- import { type Metric , type ProjectResponse , api , metricNames , useMe , useProjectData , useQuery } from "../api" ;
8- import type { RangeName } from "../api/ranges" ;
7+ import {
8+ type DateRange ,
9+ type Metric ,
10+ type ProjectResponse ,
11+ api ,
12+ metricNames ,
13+ useMe ,
14+ useProjectData ,
15+ useQuery ,
16+ } from "../api" ;
17+ import { deserializeRange , type RangeName } from "../api/ranges" ;
918import { getUsername } from "../utils" ;
1019import { LineGraph } from "./graph" ;
1120import { SelectRange } from "./project/range" ;
@@ -45,9 +54,10 @@ export const Projects = () => {
4554 queryFn : ( ) => api [ "/api/dashboard/projects" ] . get ( ) . json ( ) ,
4655 } ) ;
4756
48- const [ dateRange , setDateRange ] = useLocalStorage < RangeName > ( "date-range" , "last7Days" ) ;
4957 const [ metric , setMetric ] = useLocalStorage < Metric > ( "metric" , "views" ) ;
5058 const [ hiddenProjects , setHiddenProjects ] = useLocalStorage < string [ ] > ( "hiddenProjects" , [ ] ) ;
59+ const [ rangeString , setRangeString ] = useLocalStorage < string > ( "date-range" , "last7Days" ) ;
60+ const range = useMemo ( ( ) => deserializeRange ( rangeString ) , [ rangeString ] ) ;
5161
5262 const projects = data ?. projects || [ ] ;
5363
@@ -75,7 +85,7 @@ export const Projects = () => {
7585 < div className = { styles . projects } >
7686 < div className = { styles . header } >
7787 < h1 > Dashboard</ h1 >
78- < SelectRange onSelect = { ( name : RangeName ) => setDateRange ( name ) } range = { dateRange } />
88+ < SelectRange onSelect = { ( name ) => setRangeString ( name ) } range = { rangeString } />
7989 </ div >
8090
8191 < Suspense >
@@ -89,7 +99,7 @@ export const Projects = () => {
8999 >
90100 { projects . map ( ( project ) => (
91101 < Accordion . Item key = { project . id } value = { project . id } >
92- < Project project = { project } metric = { metric } setMetric = { setMetric } rangeName = { dateRange } />
102+ < Project project = { project } metric = { metric } setMetric = { setMetric } range = { range } />
93103 </ Accordion . Item >
94104 ) ) }
95105 </ Accordion . Root >
@@ -102,9 +112,9 @@ const Project = ({
102112 project,
103113 metric,
104114 setMetric,
105- rangeName ,
106- } : { project : ProjectResponse ; metric : Metric ; setMetric : ( value : Metric ) => void ; rangeName : RangeName } ) => {
107- const { stats, graph, isLoading, isError } = useProjectData ( { project, metric, rangeName } ) ;
115+ range ,
116+ } : { project : ProjectResponse ; metric : Metric ; setMetric : ( value : Metric ) => void ; range : DateRange } ) => {
117+ const { stats, graph, isLoading, isError } = useProjectData ( { project, metric, range } ) ;
108118
109119 return (
110120 < article className = { styles . project } data-loading = { isLoading || isError } data-error = { isError } >
0 commit comments