Skip to content

Commit 2a3b77b

Browse files
committed
chore: use utc in month picker
1 parent bcf4c82 commit 2a3b77b

File tree

8 files changed

+47
-37
lines changed

8 files changed

+47
-37
lines changed

apps/frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"@quassel/ui": "workspace:*",
2424
"@tanstack/react-query": "^5.62.0",
2525
"@tanstack/react-router": "^1.85.0",
26-
"date-fns": "^4.1.0",
26+
"dayjs": "^1.11.13",
2727
"nanostores": "^0.11.3",
2828
"openapi-fetch": "^0.13.1",
2929
"openapi-react-query": "^0.2.6",

apps/frontend/src/api.gen.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ export interface components {
599599
* @example Series 1
600600
*/
601601
title: string;
602-
questionnaires: number[];
602+
questionnaires?: number[];
603603
};
604604
QuestionnaireDto: {
605605
/**
@@ -905,7 +905,7 @@ export interface components {
905905
* @example Series 1
906906
*/
907907
title: string;
908-
questionnaires: number[];
908+
questionnaires?: number[];
909909
};
910910
StudyResponseDto: {
911911
/**
@@ -918,7 +918,7 @@ export interface components {
918918
* @example Series 1
919919
*/
920920
title: string;
921-
questionnaires: number[];
921+
questionnaires?: number[];
922922
};
923923
StudyMutationDto: {
924924
/**

apps/frontend/src/components/questionnaire/PeriodForm.tsx

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,37 @@ import { useForm } from "@mantine/form";
22
import { Button, Flex, MonthPicker, Stack, TextInput } from "@quassel/ui";
33
import { i18n } from "../../stores/i18n";
44
import { useStore } from "@nanostores/react";
5-
import { components } from "../../api.gen";
6-
import { endOfMonth } from "date-fns";
5+
import dayjs from "dayjs";
76

8-
type FormValues = {
7+
export type PeriodFormValues = {
98
title: string;
109
range: [Date, Date];
1110
};
1211

13-
type ResultType = Pick<components["schemas"]["QuestionnaireMutationDto"], "startedAt" | "endedAt" | "title">;
14-
1512
type PeriodFormProps = {
16-
onSave: (questionnaire: ResultType) => void;
13+
onSave: (form: PeriodFormValues) => void;
1714
actionLabel: string;
1815
};
1916

20-
const mapValues = ({ range: [startedAt, endedAt], ...rest }: FormValues): ResultType => ({
21-
...rest,
22-
startedAt: startedAt.toISOString(),
23-
endedAt: endedAt.toISOString(),
24-
});
25-
2617
export const messages = i18n("periodForm", {
2718
labelTitle: "Title",
2819
});
2920

3021
export function PeriodForm({ onSave, actionLabel }: PeriodFormProps) {
3122
const t = useStore(messages);
3223

33-
const f = useForm<FormValues>({
24+
const f = useForm<PeriodFormValues>({
3425
mode: "uncontrolled",
3526
transformValues(values) {
36-
values.range[1] = endOfMonth(values.range[1]);
27+
values.range[0] = dayjs(values.range[0]).utc().toDate();
28+
values.range[1] = dayjs(values.range[1]).utc().endOf("month").toDate();
3729

3830
return values;
3931
},
4032
});
4133

4234
return (
43-
<form onSubmit={f.onSubmit((values) => onSave(mapValues(values)))}>
35+
<form onSubmit={f.onSubmit((values) => onSave(values))}>
4436
<Stack>
4537
<Flex justify="center">
4638
<MonthPicker {...f.getInputProps("range")} size="md" type="range" numberOfColumns={2} />

apps/frontend/src/main.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { ThemeProvider } from "@quassel/ui";
55
import { RouterProvider, createRouter } from "@tanstack/react-router";
66
import { routeTree } from "./routeTree.gen.ts";
77
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8+
import dayjs from "dayjs";
9+
import utc from "dayjs/plugin/utc";
810

911
const queryClient = new QueryClient();
1012
const router = createRouter({ routeTree, context: { queryClient }, defaultPreload: "intent", defaultPreloadStaleTime: 0 });
@@ -15,6 +17,8 @@ declare module "@tanstack/react-router" {
1517
}
1618
}
1719

20+
dayjs.extend(utc);
21+
1822
createRoot(document.getElementById("root")!).render(
1923
<StrictMode>
2024
<QueryClientProvider client={queryClient}>

apps/frontend/src/routes/_auth/questionnaire/_questionnaire/new.tsx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createFileRoute, useNavigate } from "@tanstack/react-router";
22
import { i18n } from "../../../../stores/i18n";
33
import { useStore } from "@nanostores/react";
4-
import { PeriodForm } from "../../../../components/questionnaire/PeriodForm";
4+
import { PeriodForm, PeriodFormValues } from "../../../../components/questionnaire/PeriodForm";
55
import { $api } from "../../../../stores/api";
66
import { $questionnaire } from "../../../../stores/questionnaire";
77

@@ -22,17 +22,24 @@ function QuestionnaireNew() {
2222
},
2323
});
2424

25+
const onSave = (form: PeriodFormValues) => {
26+
const {
27+
title,
28+
range: [localStartedAt, localEndedAt],
29+
} = form;
30+
31+
const startedAt = localStartedAt.toISOString();
32+
const endedAt = localEndedAt.toISOString();
33+
34+
createQuestionnaireMutation.mutate({
35+
body: { title, startedAt, endedAt, study: questionnaire!.study.id, participant: questionnaire!.participant.id },
36+
});
37+
};
38+
2539
return (
2640
<>
2741
<h3>{t.title}</h3>
28-
<PeriodForm
29-
onSave={(period) =>
30-
createQuestionnaireMutation.mutate({
31-
body: { ...period, study: questionnaire!.study.id, participant: questionnaire!.participant.id },
32-
})
33-
}
34-
actionLabel={t.formAction}
35-
/>
42+
<PeriodForm onSave={onSave} actionLabel={t.formAction} />
3643
</>
3744
);
3845
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { MonthPicker as MantineMonthPicker, MonthPickerProps as MantineMonthPickerProps } from "@mantine/dates";
2+
3+
type MonthPickerProps = MantineMonthPickerProps;
4+
5+
export function MonthPicker(props: MonthPickerProps) {
6+
return <MantineMonthPicker {...props} />;
7+
}

libs/ui/src/theme/ThemeProvider.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { MantineProvider, MantineThemeOverride, MantineProviderProps } from "@mantine/core";
22
import "./Theme.css";
3+
import { DatesProvider } from "@mantine/dates";
34

45
type ThemeProviderProps = MantineProviderProps;
56

@@ -26,5 +27,9 @@ export const theme: MantineThemeOverride = {
2627
};
2728

2829
export function ThemeProvider(args: ThemeProviderProps) {
29-
return <MantineProvider {...args} theme={theme} />;
30+
return (
31+
<DatesProvider settings={{ timezone: "UTC" }}>
32+
<MantineProvider {...args} theme={theme} />
33+
</DatesProvider>
34+
);
3035
}

pnpm-lock.yaml

Lines changed: 3 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)