Skip to content

Commit

Permalink
feat(RunDistanceByMonthForPeriod): add new chart
Browse files Browse the repository at this point in the history
  • Loading branch information
benji6 committed Feb 1, 2025
1 parent 03a0812 commit 54e86e5
Show file tree
Hide file tree
Showing 11 changed files with 169 additions and 136 deletions.
2 changes: 1 addition & 1 deletion client/src/components/Nav/TrackedCategorySubList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default function TrackedCategorySubList({

const isTrackingEnabled = eventTypeTracking[eventType];

if (!isTrackingEnabled && !showLog) return null;
if (!isTrackingEnabled && !showLog) return;

return (
<EriNav.SubList
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/pages/Stats/SleepChartForWeek.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export default function SleepChartForWeek({ dateFrom }: Props) {
});
}

if (data.every(({ minutesSlept }) => minutesSlept === undefined)) return null;
if (data.every(({ minutesSlept }) => minutesSlept === undefined)) return;

return (
<Paper>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export default function SummaryForCalendarPeriod({
!secondsMeditatedInCurrentPeriod &&
!secondsMeditatedInPreviousPeriod
)
return null;
return;

return (
<Paper>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export default function MeditationByMonthForPeriod({
);
const navigate = useNavigate();

if (!hasMeditationsInPeriod) return null;
if (!hasMeditationsInPeriod) return;

const months = eachMonthOfInterval({ start: dateFrom, end: dateTo }).slice(
0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { monthShortFormatter } from "../../../../formatters/dateTimeFormatters";
import { integerFormatter } from "../../../../formatters/numberFormatters";
import { useNavigate } from "react-router-dom";
import { useSelector } from "react-redux";
import EventIcon from "../../../shared/EventIcon";

interface Props {
dateFrom: Date;
Expand All @@ -25,7 +26,7 @@ export default function PushUpsByMonthForPeriod({ dateFrom, dateTo }: Props) {
);
const navigate = useNavigate();

if (!hasPushUpsInPeriod) return null;
if (!hasPushUpsInPeriod) return;

const months = eachMonthOfInterval({ start: dateFrom, end: dateTo }).slice(
0,
Expand All @@ -34,7 +35,10 @@ export default function PushUpsByMonthForPeriod({ dateFrom, dateTo }: Props) {

return (
<Paper>
<h3>Total push-ups by month</h3>
<h3>
<EventIcon eventType="push-ups" margin="end" />
Total push-ups by month
</h3>
<Chart.ColumnChart
aria-label="Chart displaying total push-ups by month"
data={months.map((month) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { Chart, Paper } from "eri";
import {
formatIsoDateInLocalTimezone,
formatIsoMonthInLocalTimezone,
} from "../../../../utils";
import { RootState } from "../../../../store";
import { eachMonthOfInterval } from "date-fns";
import eventsSlice from "../../../../store/eventsSlice";
import { monthShortFormatter } from "../../../../formatters/dateTimeFormatters";
import { useNavigate } from "react-router-dom";
import { useSelector } from "react-redux";
import EventIcon from "../../../shared/EventIcon";
import { formatMetersToOneNumberWithUnits } from "../../../../formatters/formatDistance";

interface Props {
dateFrom: Date;
dateTo: Date;
}

export default function RunDistanceByMonthForPeriod({
dateFrom,
dateTo,
}: Props) {
const hasRunDistanceInPeriod = useSelector((state: RootState) =>
eventsSlice.selectors.hasRunDistanceInPeriod(state, dateFrom, dateTo),
);
const noramlizedTotalRunDistanceByMonth = useSelector(
eventsSlice.selectors.normalizedTotalRunDistanceByMonth,
);
const navigate = useNavigate();

if (!hasRunDistanceInPeriod) return;

const months = eachMonthOfInterval({ start: dateFrom, end: dateTo }).slice(
0,
-1,
);

return (
<Paper>
<h3>
<EventIcon eventType="runs" margin="end" />
Total run distance by month
</h3>
<Chart.ColumnChart
aria-label="Chart displaying total run distance by month"
data={months.map((month) => {
const totalMeters =
noramlizedTotalRunDistanceByMonth.byId[
formatIsoDateInLocalTimezone(month)
] ?? 0;
const label = monthShortFormatter.format(month);
return {
key: label,
label: label,
onClick: () =>
navigate(`/stats/months/${formatIsoMonthInLocalTimezone(month)}`),
title: formatMetersToOneNumberWithUnits(totalMeters),
y: totalMeters / 1e3,
};
})}
rotateXLabels
xAxisTitle="Month"
yAxisTitle="Kilometers"
/>
</Paper>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default function SleepByMonthForPeriod({ dateFrom, dateTo }: Props) {
};
});

if (data.every(({ y }) => y === undefined)) return null;
if (data.every(({ y }) => y === undefined)) return;
return (
<Paper>
<h3>Average sleep by month</h3>
Expand Down
8 changes: 7 additions & 1 deletion client/src/components/pages/Stats/Year/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import WeightChartForPeriod from "../WeightChartForPeriod";
import { formatIsoYearInLocalTimezone } from "../../../../utils";
import withStatsPage from "../../../hocs/withStatsPage";
import PushUpsByMonthForPeriod from "./PushUpsByMonthForPeriod";
import RunDistanceByMonthForPeriod from "./RunDistanceByMonthForPeriod";

interface Props {
date: Date;
Expand All @@ -41,7 +42,12 @@ function Year({ date, nextDate, prevDate, showNext, showPrevious }: Props) {
let view: ReactElement;
switch (activeView) {
case "exercise":
view = <PushUpsByMonthForPeriod dateFrom={date} dateTo={nextDate} />;
view = (
<>
<RunDistanceByMonthForPeriod dateFrom={date} dateTo={nextDate} />
<PushUpsByMonthForPeriod dateFrom={date} dateTo={nextDate} />
</>
);
break;
case "location":
view = <LocationForPeriod dateFrom={date} dateTo={nextDate} />;
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/shared/StatsViewControls/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export default function StatsViewControls({
icon: <EventIcon eventType="meditations" margin="end" />,
});

if (!buttons.length) return null;
if (!buttons.length) return;

return (
<Paper>
Expand Down
5 changes: 3 additions & 2 deletions client/src/formatters/formatDistance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ export const integerMeterFormatter = Intl.NumberFormat(undefined, {
unit: "meter",
});

const kilometerFormatter = new Intl.NumberFormat(undefined, {
const kilometerFormatter = Intl.NumberFormat(undefined, {
maximumFractionDigits: 1,
style: "unit",
unit: "kilometer",
});

export const formatMetersToOneNumberWithUnits = (meters: number) =>
meters < 1000
? integerMeterFormatter.format(meters)
: kilometerFormatter.format(meters / 1000);
: kilometerFormatter.format(meters / 1e3);
Loading

0 comments on commit 54e86e5

Please sign in to comment.