Skip to content

Commit a358c65

Browse files
committed
chore: fix date-range picker, remove console.log when not needed
1 parent bad025e commit a358c65

File tree

12 files changed

+305
-147
lines changed

12 files changed

+305
-147
lines changed

webapp/src/app/(dashboard)/[organizationId]/projects/[projectId]/page.tsx

Lines changed: 129 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@
22

33
import BreadcrumbHeader from "@/components/breadcrumb";
44
import ProjectDashboard from "@/components/project-dashboard";
5+
import {
6+
getEquivalentCarKm,
7+
getEquivalentCitizenPercentage,
8+
getEquivalentTvTime,
9+
} from "@/helpers/constants";
510
import { getDefaultDateRange } from "@/helpers/date-utils";
6-
import { getProjectEmissionsByExperiment } from "@/server-functions/experiments";
11+
import {
12+
getExperiments,
13+
getProjectEmissionsByExperiment,
14+
} from "@/server-functions/experiments";
715
import { getOneProject } from "@/server-functions/projects";
16+
import { Experiment } from "@/types/experiment";
17+
import { ExperimentReport } from "@/types/experiment-report";
818
import { Project } from "@/types/project";
9-
import { use, useEffect, useState } from "react";
19+
import { use, useCallback, useEffect, useState } from "react";
1020
import { DateRange } from "react-day-picker";
11-
import { useProjectDashboard } from "@/hooks/useProjectDashboard";
1221

1322
export 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">

webapp/src/app/(dashboard)/[organizationId]/projects/[projectId]/settings/page.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@ async function updateProjectAction(projectId: string, formData: FormData) {
1616
const description = formData.get("description") as string;
1717
const isPublic = formData.has("isPublic");
1818

19-
console.log("SAVING PROJECT:", { name, description, public: isPublic });
20-
21-
const response = await updateProject(projectId, {
19+
await updateProject(projectId, {
2220
name,
2321
description,
2422
public: isPublic,
2523
});
26-
console.log("RESPONSE:", response);
2724

2825
revalidatePath(`/projects/${projectId}/settings`);
2926
}

0 commit comments

Comments
 (0)