22
33import BreadcrumbHeader from "@/components/breadcrumb" ;
44import ProjectDashboard from "@/components/project-dashboard" ;
5+ import {
6+ getEquivalentCarKm ,
7+ getEquivalentCitizenPercentage ,
8+ getEquivalentTvTime ,
9+ } from "@/helpers/constants" ;
510import { getDefaultDateRange } from "@/helpers/date-utils" ;
6- import { getProjectEmissionsByExperiment } from "@/server-functions/experiments" ;
11+ import {
12+ getExperiments ,
13+ getProjectEmissionsByExperiment ,
14+ } from "@/server-functions/experiments" ;
715import { getOneProject } from "@/server-functions/projects" ;
16+ import { Experiment } from "@/types/experiment" ;
17+ import { ExperimentReport } from "@/types/experiment-report" ;
818import { Project } from "@/types/project" ;
9- import { use , useEffect , useState } from "react" ;
19+ import { use , useCallback , useEffect , useState } from "react" ;
1020import { DateRange } from "react-day-picker" ;
11- import { useProjectDashboard } from "@/hooks/useProjectDashboard" ;
1221
1322export default function ProjectPage ( {
1423 params,
@@ -19,6 +28,7 @@ export default function ProjectPage({
1928 } > ;
2029} > ) {
2130 const { projectId, organizationId } = use ( params ) ;
31+ const [ isLoading , setIsLoading ] = useState ( true ) ;
2232
2333 const [ project , setProject ] = useState ( {
2434 name : "" ,
@@ -40,22 +50,41 @@ export default function ProjectPage({
4050 const default_date = getDefaultDateRange ( ) ;
4151 const [ date , setDate ] = useState < DateRange > ( default_date ) ;
4252
43- // Use custom hook for dashboard state and logic
44- const {
45- radialChartData,
46- convertedValues,
47- experimentsReportData,
48- projectExperiments,
49- runData,
50- selectedExperimentId,
51- selectedRunId,
52- isLoading,
53- handleExperimentClick,
54- handleRunClick,
55- refreshExperimentList,
56- setExperimentsReportData,
57- setIsLoading,
58- } = useProjectDashboard ( projectId , date ) ;
53+ const [ radialChartData , setRadialChartData ] = useState ( {
54+ energy : { label : "kWh" , value : 0 } ,
55+ emissions : { label : "kg eq CO2" , value : 0 } ,
56+ duration : { label : "days" , value : 0 } ,
57+ } ) ;
58+ // The experiments of the current project. We need this because experimentReport only contains the experiments that have been run
59+ const [ projectExperiments , setProjectExperiments ] = useState < Experiment [ ] > (
60+ [ ] ,
61+ ) ;
62+ // The reports (if any) of the experiments
63+ const [ experimentsReportData , setExperimentsReportData ] = useState <
64+ ExperimentReport [ ]
65+ > ( [ ] ) ;
66+
67+ const [ runData , setRunData ] = useState ( {
68+ experimentId : "" ,
69+ startDate : default_date . from . toISOString ( ) ,
70+ endDate : default_date . to . toISOString ( ) ,
71+ } ) ;
72+
73+ const [ convertedValues , setConvertedValues ] = useState ( {
74+ citizen : "0" ,
75+ transportation : "0" ,
76+ tvTime : "0" ,
77+ } ) ;
78+
79+ const [ selectedExperimentId , setSelectedExperimentId ] =
80+ useState < string > ( "" ) ;
81+ const [ selectedRunId , setSelectedRunId ] = useState < string > ( "" ) ;
82+
83+ const refreshExperimentList = useCallback ( async ( ) => {
84+ // Logic to refresh experiments if needed
85+ const experiments : Experiment [ ] = await getExperiments ( projectId ) ;
86+ setProjectExperiments ( experiments ) ;
87+ } , [ projectId ] ) ;
5988
6089 /** Use effect functions */
6190 useEffect ( ( ) => {
@@ -74,7 +103,6 @@ export default function ProjectPage({
74103 fetchProjectDetails ( ) ;
75104 refreshExperimentList ( ) ;
76105 } , [ projectId , refreshExperimentList ] ) ;
77-
78106 // Fetch the experiment report of the current project
79107 useEffect ( ( ) => {
80108 async function fetchData ( ) {
@@ -84,7 +112,63 @@ export default function ProjectPage({
84112 projectId ,
85113 date ,
86114 ) ;
115+
116+ const newRadialChartData = {
117+ energy : {
118+ label : "kWh" ,
119+ value : parseFloat (
120+ report
121+ . reduce (
122+ ( n , { energy_consumed } ) =>
123+ n + energy_consumed ,
124+ 0 ,
125+ )
126+ . toFixed ( 2 ) ,
127+ ) ,
128+ } ,
129+ emissions : {
130+ label : "kg eq CO2" ,
131+ value : parseFloat (
132+ report
133+ . reduce ( ( n , { emissions } ) => n + emissions , 0 )
134+ . toFixed ( 2 ) ,
135+ ) ,
136+ } ,
137+ duration : {
138+ label : "days" ,
139+ value : parseFloat (
140+ report
141+ . reduce (
142+ ( n , { duration } ) => n + duration / 86400 ,
143+ 0 ,
144+ )
145+ . toFixed ( 2 ) ,
146+ ) ,
147+ } ,
148+ } ;
149+ setRadialChartData ( newRadialChartData ) ;
150+
87151 setExperimentsReportData ( report ) ;
152+
153+ setRunData ( {
154+ experimentId : report [ 0 ] ?. experiment_id ?? "" ,
155+ startDate : date ?. from ?. toISOString ( ) ?? "" ,
156+ endDate : date ?. to ?. toISOString ( ) ?? "" ,
157+ } ) ;
158+
159+ setSelectedExperimentId ( report [ 0 ] ?. experiment_id ?? "" ) ;
160+
161+ setConvertedValues ( {
162+ citizen : getEquivalentCitizenPercentage (
163+ newRadialChartData . emissions . value ,
164+ ) . toFixed ( 2 ) ,
165+ transportation : getEquivalentCarKm (
166+ newRadialChartData . emissions . value ,
167+ ) . toFixed ( 2 ) ,
168+ tvTime : getEquivalentTvTime (
169+ newRadialChartData . energy . value ,
170+ ) . toFixed ( 2 ) ,
171+ } ) ;
88172 } catch ( error ) {
89173 console . error ( "Error fetching project data:" , error ) ;
90174 } finally {
@@ -95,7 +179,31 @@ export default function ProjectPage({
95179 if ( projectId ) {
96180 fetchData ( ) ;
97181 }
98- } , [ projectId , date , setExperimentsReportData , setIsLoading ] ) ;
182+ } , [ projectId , date ] ) ;
183+
184+ const handleExperimentClick = useCallback (
185+ ( experimentId : string ) => {
186+ if ( experimentId === selectedExperimentId ) {
187+ setSelectedExperimentId ( "" ) ;
188+ setSelectedRunId ( "" ) ;
189+ return ;
190+ }
191+ setSelectedExperimentId ( experimentId ) ;
192+ setSelectedRunId ( "" ) ;
193+ } ,
194+ [ selectedExperimentId ] ,
195+ ) ;
196+
197+ const handleRunClick = useCallback (
198+ ( runId : string ) => {
199+ if ( runId === selectedRunId ) {
200+ setSelectedRunId ( "" ) ;
201+ return ;
202+ }
203+ setSelectedRunId ( runId ) ;
204+ } ,
205+ [ selectedRunId ] ,
206+ ) ;
99207
100208 return (
101209 < div className = "h-full w-full overflow-auto" >
0 commit comments