timetable-app

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit ee0ba4e7b7dc8cde85b83f0de4f0c47d741b3a10
parent 3c640c595b31a9ad4beaec818c9e48971df03701
Author: Yuukin256 <Yuukin256@gmail.com>
Date:   Sun,  6 Nov 2022 14:58:00 +0900

微調整

Diffstat:
Msrc/constant/index.tsx | 4+++-
Asrc/hooks/useRegisterStandardTimetable.ts | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/hooks/useStandardTimetable.ts | 102-------------------------------------------------------------------------------
Msrc/pages/api/rest/v1/timetables/[grade]/[date].ts | 3++-
Msrc/pages/api/rest/v1/timetables/index.ts | 3++-
Msrc/pages/console/standard.tsx | 4++--
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 へ