Skip to content

Commit 52c68c3

Browse files
committed
refactor: extract calendar page to component
1 parent 01f013d commit 52c68c3

File tree

2 files changed

+96
-70
lines changed

2 files changed

+96
-70
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { notifications } from "@quassel/ui";
2+
import { $api } from "../../stores/api";
3+
import { EntryCalendar } from "./calendar/EntryCalendar";
4+
import { useQueryClient } from "@tanstack/react-query";
5+
import { EntryFormValues } from "./calendar/EntryForm";
6+
import { components } from "../../api.gen";
7+
import { GapsPerDay } from "../../utils/entry";
8+
import { i18n } from "../../stores/i18n";
9+
import { useStore } from "@nanostores/react";
10+
11+
type QuestionnaireEntriesProps = {
12+
questionnaire: components["schemas"]["QuestionnaireResponseDto"];
13+
gaps?: GapsPerDay;
14+
};
15+
16+
const messages = i18n("questionnaireEntries", {
17+
notificationSuccessCreateLanguage: "Successfully add a new language.",
18+
notificationSuccessCreateCarer: "Successfully add a new carer.",
19+
});
20+
21+
export function QuestionnaireEntries({ questionnaire, gaps }: QuestionnaireEntriesProps) {
22+
const c = useQueryClient();
23+
const t = useStore(messages);
24+
25+
const participantId = questionnaire.participant?.id;
26+
27+
const createMutation = $api.useMutation("post", "/entries");
28+
const updateMutation = $api.useMutation("patch", "/entries/{id}");
29+
const deleteMutation = $api.useMutation("delete", "/entries/{id}");
30+
31+
const { data: languages } = $api.useQuery("get", "/languages", { params: { query: { participantId } } });
32+
const createLanguageMutation = $api.useMutation("post", "/languages", {
33+
onSuccess() {
34+
notifications.show({ message: t.notificationSuccessCreateLanguage, color: "uzhGreen" });
35+
c.refetchQueries($api.queryOptions("get", "/languages", { params: { query: { participantId } } }));
36+
},
37+
});
38+
39+
const { data: carers } = $api.useQuery("get", "/carers", { params: { query: { participantId } } });
40+
const createCarerMutation = $api.useMutation("post", "/carers", {
41+
onSuccess() {
42+
notifications.show({ message: t.notificationSuccessCreateCarer, color: "uzhGreen" });
43+
c.refetchQueries($api.queryOptions("get", "/carers", { params: { query: { participantId } } }));
44+
},
45+
});
46+
47+
const reloadEntries = () => {
48+
c.invalidateQueries($api.queryOptions("get", "/questionnaires/{id}", { params: { path: { id: questionnaire.id.toString() } } }));
49+
};
50+
51+
const handleCreate = ({ carer, ...rest }: EntryFormValues, weekday: number) => {
52+
const entryRequest = {
53+
...rest,
54+
carer: carer!,
55+
weekday,
56+
questionnaire: questionnaire.id,
57+
};
58+
59+
return createMutation.mutateAsync({ body: entryRequest }, { onSuccess: reloadEntries });
60+
};
61+
62+
const handleUpdate = (id: number, { carer, ...rest }: Partial<EntryFormValues>, weekday: number) => {
63+
const entryRequest = {
64+
...rest,
65+
carer: carer!,
66+
weekday,
67+
questionnaire: questionnaire.id,
68+
};
69+
70+
return updateMutation.mutateAsync({ body: entryRequest, params: { path: { id: id.toString() } } }, { onSuccess: reloadEntries });
71+
};
72+
73+
const handleDelete = (id: number) => {
74+
return deleteMutation.mutateAsync({ params: { path: { id: id.toString() } } }, { onSuccess: reloadEntries });
75+
};
76+
77+
return (
78+
<EntryCalendar
79+
entries={questionnaire.entries ?? []}
80+
gaps={gaps}
81+
onAddEntry={handleCreate}
82+
onUpdateEntry={handleUpdate}
83+
onDeleteEntry={handleDelete}
84+
carers={carers ?? []}
85+
languages={languages ?? []}
86+
onAddCarer={(name) => createCarerMutation.mutateAsync({ body: { name, participant: participantId } }).then(({ id }) => id)}
87+
onAddLanguage={(name) => createLanguageMutation.mutateAsync({ body: { name, participant: participantId } }).then(({ id }) => id)}
88+
/>
89+
);
90+
}
Lines changed: 6 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import { Button, Group, Modal, Stack, notifications, useDisclosure, useForm } from "@quassel/ui";
1+
import { Button, Group, Modal, Stack, useDisclosure, useForm } from "@quassel/ui";
22
import { createFileRoute, Link, useNavigate } from "@tanstack/react-router";
33
import { i18n } from "../../../../../stores/i18n";
44
import { useStore } from "@nanostores/react";
55
import { $api } from "../../../../../stores/api";
6-
import { EntryFormValues } from "../../../../../components/questionnaire/calendar/EntryForm";
7-
import { useQueryClient } from "@tanstack/react-query";
8-
import { EntryCalendar } from "../../../../../components/questionnaire/calendar/EntryCalendar";
96
import { useEffect, useState } from "react";
107
import { components } from "../../../../../api.gen";
118
import { GapsPerDay, resolveGaps } from "../../../../../utils/entry";
9+
import { QuestionnaireEntries } from "../../../../../components/questionnaire/QuestionnaireEntries";
1210

1311
const messages = i18n("questionnaireEntries", {
1412
formAction: "Continue",
@@ -21,67 +19,14 @@ const messages = i18n("questionnaireEntries", {
2119
gapsDialogHighlightGaps: "Highlight gaps",
2220
});
2321

24-
function QuestionnaireEntries() {
22+
export function Entries() {
2523
const n = useNavigate();
2624
const p = Route.useParams();
2725

2826
const t = useStore(messages);
2927

30-
const c = useQueryClient();
31-
32-
const createMutation = $api.useMutation("post", "/entries");
33-
const updateMutation = $api.useMutation("patch", "/entries/{id}");
34-
const deleteMutation = $api.useMutation("delete", "/entries/{id}");
3528
const { data: questionnaire } = $api.useSuspenseQuery("get", "/questionnaires/{id}", { params: { path: p } });
3629

37-
const participantId = questionnaire.participant?.id;
38-
39-
const { data: languages } = $api.useQuery("get", "/languages", { params: { query: { participantId } } });
40-
const createLanguageMutation = $api.useMutation("post", "/languages", {
41-
onSuccess() {
42-
notifications.show({ message: t.notificationSuccessCreateLanguage, color: "uzhGreen" });
43-
c.refetchQueries($api.queryOptions("get", "/languages", { params: { query: { participantId } } }));
44-
},
45-
});
46-
47-
const { data: carers } = $api.useQuery("get", "/carers", { params: { query: { participantId } } });
48-
const createCarerMutation = $api.useMutation("post", "/carers", {
49-
onSuccess() {
50-
notifications.show({ message: t.notificationSuccessCreateCarer, color: "uzhGreen" });
51-
c.refetchQueries($api.queryOptions("get", "/carers", { params: { query: { participantId } } }));
52-
},
53-
});
54-
55-
const reloadEntries = () => {
56-
c.invalidateQueries($api.queryOptions("get", "/questionnaires/{id}", { params: { path: p } }));
57-
};
58-
59-
const handleCreate = ({ carer, ...rest }: EntryFormValues, weekday: number) => {
60-
const entryRequest = {
61-
...rest,
62-
carer: carer!,
63-
weekday,
64-
questionnaire: questionnaire.id,
65-
};
66-
67-
return createMutation.mutateAsync({ body: entryRequest }, { onSuccess: reloadEntries });
68-
};
69-
70-
const handleUpdate = (id: number, { carer, ...rest }: Partial<EntryFormValues>, weekday: number) => {
71-
const entryRequest = {
72-
...rest,
73-
carer: carer!,
74-
weekday,
75-
questionnaire: questionnaire.id,
76-
};
77-
78-
return updateMutation.mutateAsync({ body: entryRequest, params: { path: { id: id.toString() } } }, { onSuccess: reloadEntries });
79-
};
80-
81-
const handleDelete = (id: number) => {
82-
return deleteMutation.mutateAsync({ params: { path: { id: id.toString() } } }, { onSuccess: reloadEntries });
83-
};
84-
8530
const [gaps, setGaps] = useState<GapsPerDay>();
8631
const [highlightGaps, setHighlightGaps] = useState(false);
8732
const [gapsDialogOpened, { open, close }] = useDisclosure();
@@ -130,17 +75,8 @@ function QuestionnaireEntries() {
13075
</Button>
13176
</Group>
13277
</Modal>
133-
<EntryCalendar
134-
entries={questionnaire.entries ?? []}
135-
gaps={highlightGaps ? gaps : undefined}
136-
onAddEntry={handleCreate}
137-
onUpdateEntry={handleUpdate}
138-
onDeleteEntry={handleDelete}
139-
carers={carers ?? []}
140-
languages={languages ?? []}
141-
onAddCarer={(name) => createCarerMutation.mutateAsync({ body: { name, participant: participantId } }).then(({ id }) => id)}
142-
onAddLanguage={(name) => createLanguageMutation.mutateAsync({ body: { name, participant: participantId } }).then(({ id }) => id)}
143-
/>
78+
79+
<QuestionnaireEntries gaps={highlightGaps ? gaps : undefined} questionnaire={questionnaire} />
14480

14581
<Group>
14682
<Link to="/questionnaire/$id/period" params={p}>
@@ -161,5 +97,5 @@ export const Route = createFileRoute("/_auth/questionnaire/_questionnaire/$id/en
16197
params: { path: { id: params.id } },
16298
})
16399
),
164-
component: QuestionnaireEntries,
100+
component: Entries,
165101
});

0 commit comments

Comments
 (0)