commit ee0ba4e7b7dc8cde85b83f0de4f0c47d741b3a10
parent 3c640c595b31a9ad4beaec818c9e48971df03701
Author: Yuukin256 <Yuukin256@gmail.com>
Date: Sun, 6 Nov 2022 14:58:00 +0900
微調整
Diffstat:
6 files changed, 111 insertions(+), 107 deletions(-)
diff --git a/src/constant/index.tsx b/src/constant/index.tsx
@@ -74,7 +74,7 @@ export const ABSTRACT_LESSON_NAMES = [
'Fri7',
] as const;
-export const ABSTRACT_LESSON_NAME_MAP: Record<AbstractLessonNameEn, AbstractLessonNameJa> = {
+export const ABSTRACT_LESSON_NAME_MAP: Readonly<Record<AbstractLessonNameEn, AbstractLessonNameJa>> = {
Mon1: '月1',
Mon2: '月2',
Mon3: '月3',
@@ -111,5 +111,7 @@ export const ABSTRACT_LESSON_NAME_MAP: Record<AbstractLessonNameEn, AbstractLess
Fri7: '金7',
};
+export const DATE_FORMAT = 'yyyy-MM-dd';
+
export const BUG_REPORT_FORM_URL = process.env['NEXT_PUBLIC_BUG_REPORT_FORM_URL'];
export const REQUEST_FORM_URL = process.env['NEXT_PUBLIC_REQUEST_FORM_URL'];
diff --git a/src/hooks/useRegisterStandardTimetable.ts b/src/hooks/useRegisterStandardTimetable.ts
@@ -0,0 +1,102 @@
+import { useAspidaQuery } from '@aspida/react-query';
+import { useSnackbar } from 'notistack';
+import { useState } from 'react';
+import { useMutation, useQueryClient } from 'react-query';
+import { useMap } from 'react-use';
+
+import { apiClient } from 'lib/apiClient';
+
+import type { SchoolClass } from '@prisma/client';
+import type { AbstractLessonNameEn, StandardEn } from 'types';
+
+type Result = {
+ loading: boolean;
+ classes: SchoolClass[];
+ classId: number;
+ setClassId: (val: number) => void;
+ standard: StandardEn;
+ setStandard: (key: AbstractLessonNameEn, value: string[]) => void;
+ submit: () => void;
+};
+
+const emptyStandard: StandardEn = {
+ Mon1: [],
+ Mon2: [],
+ Mon3: [],
+ Mon4: [],
+ Mon5: [],
+ Mon6: [],
+ Mon7: [],
+ Tue1: [],
+ Tue2: [],
+ Tue3: [],
+ Tue4: [],
+ Tue5: [],
+ Tue6: [],
+ Tue7: [],
+ Wed1: [],
+ Wed2: [],
+ Wed3: [],
+ Wed4: [],
+ Wed5: [],
+ Wed6: [],
+ Wed7: [],
+ Thu1: [],
+ Thu2: [],
+ Thu3: [],
+ Thu4: [],
+ Thu5: [],
+ Thu6: [],
+ Fri1: [],
+ Fri2: [],
+ Fri3: [],
+ Fri4: [],
+ Fri5: [],
+ Fri6: [],
+ Fri7: [],
+};
+
+const useRegisterStandardTimetable = (): Result => {
+ const queryClient = useQueryClient();
+ const { enqueueSnackbar } = useSnackbar();
+
+ const [classId, setClassId] = useState<number>(-1);
+ const [standard, { set: setStandard, setAll }] = useMap(emptyStandard);
+
+ const classesQuery = useAspidaQuery(apiClient.classes, {
+ onError: () => enqueueSnackbar('エラーが発生しました', { variant: 'error' }),
+ });
+
+ const standardQuery = useAspidaQuery(apiClient.classes._classId(classId).standard, {
+ enabled: !!classId,
+ onSuccess: (data) => data && setAll(data),
+ onError: () => enqueueSnackbar('エラーが発生しました', { variant: 'error' }),
+ });
+
+ const standardMutation = useMutation(
+ (body: StandardEn) => apiClient.classes._classId(classId).standard.$put({ body }),
+ {
+ onSuccess: () => {
+ enqueueSnackbar('正常に保存されました', { variant: 'success' });
+ queryClient.invalidateQueries(apiClient.classes._classId(classId).standard.$path());
+ },
+ onError: () => {
+ enqueueSnackbar('エラーが発生しました', { variant: 'error' });
+ },
+ }
+ );
+
+ const submit = () => standardMutation.mutate(standard);
+
+ return {
+ loading: classesQuery.isFetching || standardQuery.isFetching || standardMutation.isLoading,
+ classes: classesQuery.data ?? [],
+ classId,
+ setClassId,
+ standard,
+ setStandard,
+ submit,
+ };
+};
+
+export default useRegisterStandardTimetable;
diff --git a/src/hooks/useStandardTimetable.ts b/src/hooks/useStandardTimetable.ts
@@ -1,102 +0,0 @@
-import { useAspidaQuery } from '@aspida/react-query';
-import { useSnackbar } from 'notistack';
-import { useState } from 'react';
-import { useMutation, useQueryClient } from 'react-query';
-import { useMap } from 'react-use';
-
-import { apiClient } from 'lib/apiClient';
-
-import type { SchoolClass } from '@prisma/client';
-import type { AbstractLessonNameEn, StandardEn } from 'types';
-
-type Result = {
- loading: boolean;
- classes: SchoolClass[];
- classId: number;
- setClassId: (val: number) => void;
- standard: StandardEn;
- setStandard: (key: AbstractLessonNameEn, value: string[]) => void;
- submit: () => void;
-};
-
-const emptyStandard: StandardEn = {
- Mon1: [],
- Mon2: [],
- Mon3: [],
- Mon4: [],
- Mon5: [],
- Mon6: [],
- Mon7: [],
- Tue1: [],
- Tue2: [],
- Tue3: [],
- Tue4: [],
- Tue5: [],
- Tue6: [],
- Tue7: [],
- Wed1: [],
- Wed2: [],
- Wed3: [],
- Wed4: [],
- Wed5: [],
- Wed6: [],
- Wed7: [],
- Thu1: [],
- Thu2: [],
- Thu3: [],
- Thu4: [],
- Thu5: [],
- Thu6: [],
- Fri1: [],
- Fri2: [],
- Fri3: [],
- Fri4: [],
- Fri5: [],
- Fri6: [],
- Fri7: [],
-};
-
-const useStandardTimetable = (): Result => {
- const queryClient = useQueryClient();
- const { enqueueSnackbar } = useSnackbar();
-
- const [classId, setClassId] = useState<number>(-1);
- const [standard, { set: setStandard, setAll }] = useMap(emptyStandard);
-
- const classesQuery = useAspidaQuery(apiClient.classes, {
- onError: () => enqueueSnackbar('エラーが発生しました', { variant: 'error' }),
- });
-
- const standardQuery = useAspidaQuery(apiClient.classes._classId(classId).standard, {
- enabled: !!classId,
- onSuccess: (data) => data && setAll(data),
- onError: () => enqueueSnackbar('エラーが発生しました', { variant: 'error' }),
- });
-
- const standardMutation = useMutation(
- (body: StandardEn) => apiClient.classes._classId(classId).standard.$put({ body }),
- {
- onSuccess: () => {
- enqueueSnackbar('正常に保存されました', { variant: 'success' });
- queryClient.invalidateQueries(apiClient.classes._classId(classId).standard.$path());
- },
- onError: () => {
- enqueueSnackbar('エラーが発生しました', { variant: 'error' });
- },
- }
- );
-
- const submit = () => standardMutation.mutate(standard);
-
- return {
- loading: classesQuery.isFetching || standardQuery.isFetching || standardMutation.isLoading,
- classes: classesQuery.data ?? [],
- classId,
- setClassId,
- standard,
- setStandard,
- submit,
- };
-};
-
-export default useStandardTimetable;
diff --git a/src/pages/api/rest/v1/timetables/[grade]/[date].ts b/src/pages/api/rest/v1/timetables/[grade]/[date].ts
@@ -2,6 +2,7 @@ import format from 'date-fns/format';
import { createRouter } from 'next-connect';
import { putApiRequestSchema, getApiRequestSchema } from 'api/timetables/_grade@number/_date@string';
+import { DATE_FORMAT } from 'constant';
import { prisma } from 'lib/prisma';
import withZod from 'lib/withZod';
@@ -13,7 +14,7 @@ const router = createRouter<NextApiRequest, NextApiResponse>();
const formatDayTimetable = ({ date, ...other }: DayTimetable): Omit<DayTimetable, 'date'> & { date: string } => ({
...other,
- date: format(date, 'yyyy-MM-dd'),
+ date: format(date, DATE_FORMAT),
});
router
diff --git a/src/pages/api/rest/v1/timetables/index.ts b/src/pages/api/rest/v1/timetables/index.ts
@@ -2,6 +2,7 @@ import format from 'date-fns/format';
import { createRouter } from 'next-connect';
import { getApiRequestSchema } from 'api/timetables';
+import { DATE_FORMAT } from 'constant';
import { prisma } from 'lib/prisma';
import withZod from 'lib/withZod';
@@ -13,7 +14,7 @@ const router = createRouter<NextApiRequest, NextApiResponse>();
const formatDayTimetable = ({ date, ...other }: DayTimetable): Omit<DayTimetable, 'date'> & { date: string } => ({
...other,
- date: format(date, 'yyyy-MM-dd'),
+ date: format(date, DATE_FORMAT),
});
router.get(
diff --git a/src/pages/console/standard.tsx b/src/pages/console/standard.tsx
@@ -18,7 +18,7 @@ import TableRow from '@mui/material/TableRow';
import TextField from '@mui/material/TextField';
import Typography from '@mui/material/Typography';
-import useStandardTimetable from 'hooks/useStandardTimetable';
+import useRegisterStandardTimetable from 'hooks/useRegisterStandardTimetable';
import type { NextPage } from 'next';
import type { FC } from 'react';
@@ -140,7 +140,7 @@ const StandardTimetableForm: FC<{
};
const Page: NextPage = () => {
- const { loading, classes, classId, setClassId, standard, setStandard, submit } = useStandardTimetable();
+ const { loading, classes, classId, setClassId, standard, setStandard, submit } = useRegisterStandardTimetable();
// TODO: classes 取得時に Backdrop
// TODO: SWRConfig を _app.tsx へ