From 10b1ed944d9c5af107e4d8cabd271bcee915c3d0 Mon Sep 17 00:00:00 2001 From: Ryan Pandya Date: Sat, 1 Feb 2025 16:17:44 -0800 Subject: [PATCH] AnalyticsView --- .../dashboard/analytics/AnalyticsView.tsx | 157 ++++++++++++------ .../dashboard/analytics/Timeseries.tsx | 1 - packages/trpc/routers/hours.ts | 6 +- 3 files changed, 113 insertions(+), 51 deletions(-) diff --git a/apps/web/components/dashboard/analytics/AnalyticsView.tsx b/apps/web/components/dashboard/analytics/AnalyticsView.tsx index 8e274ae..b9130c8 100644 --- a/apps/web/components/dashboard/analytics/AnalyticsView.tsx +++ b/apps/web/components/dashboard/analytics/AnalyticsView.tsx @@ -8,9 +8,10 @@ import { useSearchParams } from "next/navigation"; import { parseISO, format as fmt } from "date-fns"; import { DatePickerInput } from '@mantine/dates'; import { Calendar1, MenuIcon } from "lucide-react"; -import { Anchor, Button, Menu } from "@mantine/core"; +import { Anchor, Button, ButtonGroup, Menu } from "@mantine/core"; import { useTooltip, useTooltipInPortal, defaultStyles } from '@visx/tooltip'; -import PieChart from "./PieChart"; +// import PieChart from "./PieChart"; +import { Cell, LabelList, Pie, PieChart, Tooltip } from "recharts"; import { useTimezone } from "@/lib/userLocalSettings/client"; import TimeseriesChart from "./Timeseries"; @@ -56,6 +57,7 @@ export default function AnalyticsView() { const [dateRange, setDateRange] = useState(initialDateRange); const [datePickerRange, setDatePickerRange] = useState(initialDateRange); + const [hideSleep, setHideSleep] = useState(true); useEffect(() => { if (datePickerRef.current?.getAttribute("aria-expanded") === "false") { @@ -71,19 +73,34 @@ export default function AnalyticsView() { scroll: true, }); - const categoryFrequencies = api.hours.categoryFrequencies.useQuery({ + const rawCategoryFrequencies = api.hours.categoryFrequencies.useQuery({ dateRange, timezone: useTimezone(), - }).data ?? []; + }).data?.filter( + (category) => category.categoryCode != undefined + ) ?? []; + + const categoryFrequencies = hideSleep ? rawCategoryFrequencies.filter((category) => category.categoryCode > 1) : rawCategoryFrequencies; + + const maybeExtendWindow = (dateRange: Date[]) => { + // If distance between dates is less than 2 days, extend the first date back by 14 days + if (spacetime(dateRange[0]).diff(dateRange[1], "day") < 2) { + return [ + spacetime(dateRange[0]).subtract(14, "day").toNativeDate(), + dateRange[1] + ]; + } + return [dateRange[0], dateRange[1]]; + } const weightData = api.measurements.getTimeseries.useQuery({ - dateRange, + dateRange: maybeExtendWindow(dateRange) as [Date, Date], timezone: useTimezone(), metricName: "weight" }).data ?? []; return ( -
+

Analytics for  {dateRange[0].getUTCDate() == dateRange[1].getUTCDate() @@ -147,52 +164,82 @@ export default function AnalyticsView() {

-
- -
-
-
- Total -
-
- {categoryFrequencies.reduce((acc, category) => acc + category.count, 0)} hours -
- { - categoryFrequencies - .sort((a, b) => b.count - a.count) - .map((category, i) => ( +
+

Time

+ {categoryFrequencies.length === 0 ? : +
-
+ console.log(c)}> + {categoryFrequencies.sort( + (a, b) => b.count - a.count + ).map((c, _i) => ( + + ))} + + + + +
+
+
+
+
+ Total +
+
+ {categoryFrequencies.reduce((acc, category) => acc + category.count, 0)} hours +
+ { + categoryFrequencies + .sort((a, b) => b.count - a.count) + .map((category, i) => ( + +
+
+ {category.categoryName ?? "[Unallocated]"} +
+
+ {category.count} hours +
+ )) + }
+
+
+
+ Sleep + +
- )) - } -
+ Hide + + + +
+
+ }
-
-

Weight

-
- { - !weightData ? : - - } -
-
-
+

Drugs

{ @@ -206,7 +253,19 @@ export default function AnalyticsView() { }
+
+
+

Weight

+ { + weightData.length === 0 ? : +
+ +
+ } +
+
+ ); } \ No newline at end of file diff --git a/apps/web/components/dashboard/analytics/Timeseries.tsx b/apps/web/components/dashboard/analytics/Timeseries.tsx index ecd9bea..f7e15f3 100644 --- a/apps/web/components/dashboard/analytics/Timeseries.tsx +++ b/apps/web/components/dashboard/analytics/Timeseries.tsx @@ -29,7 +29,6 @@ export default function TimeseriesChart({ data }) { smoothed: polyResult.predict(i)[1], }; })); - console.log(polyResult); return (
diff --git a/packages/trpc/routers/hours.ts b/packages/trpc/routers/hours.ts index bb9e868..57d6dc9 100644 --- a/packages/trpc/routers/hours.ts +++ b/packages/trpc/routers/hours.ts @@ -229,6 +229,8 @@ export const hoursAppRouter = router({ { count: z.number(), percentage: z.number(), + color: z.string(), + inverse: z.string(), ...zHourSchema.shape } ))) @@ -257,6 +259,8 @@ export const hoursAppRouter = router({ if (!categoriesList[h.categoryCode]) { categoriesList[h.categoryCode] = { count: 0, + color: h.background, + inverse: h.foreground, ...h }; } @@ -269,7 +273,7 @@ export const hoursAppRouter = router({ const percentage = (count / totalHours); return { ...categoriesList[categoryCode], - percentage: percentage + percentage: percentage, }; }); return categoryPercentages;