From af632e8cce19940d79f945e0390584058f9d952e Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sat, 17 Jan 2026 22:53:08 +0900 Subject: [PATCH 1/7] =?UTF-8?q?fix:=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/api/{creat-group-study.ts => create-group-study.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/features/study/group/api/{creat-group-study.ts => create-group-study.ts} (100%) diff --git a/src/features/study/group/api/creat-group-study.ts b/src/features/study/group/api/create-group-study.ts similarity index 100% rename from src/features/study/group/api/creat-group-study.ts rename to src/features/study/group/api/create-group-study.ts From 17a41fd19986e2e161991914362cf88b78aea249 Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sat, 17 Jan 2026 22:53:30 +0900 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20createGroupStudy=20=EC=9E=84?= =?UTF-8?q?=ED=8F=AC=ED=8A=B8=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/study/group/const/use-group-study-mutation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/study/group/const/use-group-study-mutation.ts b/src/features/study/group/const/use-group-study-mutation.ts index b7aab825..848ffd30 100644 --- a/src/features/study/group/const/use-group-study-mutation.ts +++ b/src/features/study/group/const/use-group-study-mutation.ts @@ -1,5 +1,5 @@ import { useMutation } from '@tanstack/react-query'; -import { createGroupStudy } from '../api/creat-group-study'; +import { createGroupStudy } from '../api/create-group-study'; import { GroupStudyFormRequest } from '../api/group-study-types'; import { updateGroupStudy } from '../api/update-group-study'; From 68444859f1b3e8257e8ef93b4021d1ab2319d43c Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sat, 17 Jan 2026 23:20:46 +0900 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=EB=AF=B8=EC=85=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=88=98=EC=A0=95=20=EB=AA=A8=EB=8B=AC?= =?UTF-8?q?=EC=97=90=20=EB=82=A0=EC=A7=9C=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EB=A7=A4=EC=B2=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modals/create-mission-modal.tsx | 31 ++++++++-- src/components/modals/edit-mission-modal.tsx | 43 ++++++++++--- .../use-mission-date-disabled-matcher.ts | 33 ++++++++++ src/utils/time.ts | 61 +++++++++++++++++-- 4 files changed, 148 insertions(+), 20 deletions(-) create mode 100644 src/hooks/common/use-mission-date-disabled-matcher.ts diff --git a/src/components/modals/create-mission-modal.tsx b/src/components/modals/create-mission-modal.tsx index 4cd2c7f5..f620779e 100644 --- a/src/components/modals/create-mission-modal.tsx +++ b/src/components/modals/create-mission-modal.tsx @@ -1,4 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod'; +import dayjs from 'dayjs'; import { Plus, XIcon } from 'lucide-react'; import { useState } from 'react'; import { Controller, FormProvider, useForm } from 'react-hook-form'; @@ -9,8 +10,11 @@ import FormField from '@/components/ui/form/form-field'; import { BaseInput, TextAreaInput } from '@/components/ui/input'; import { Modal } from '@/components/ui/modal'; import { useGroupStudyDetailQuery } from '@/features/study/group/model/use-study-query'; -import { useCreateMission } from '@/hooks/queries/mission-api'; -import { createDateDisabledMatcher } from '@/utils/time'; +import { + MissionPeriod, + useMissionDateDisabledMatcher, +} from '@/hooks/common/use-mission-date-disabled-matcher'; +import { useCreateMission, useGetMissions } from '@/hooks/queries/mission-api'; // Form Schema const CreateMissionFormSchema = z.object({ @@ -45,7 +49,12 @@ export default function CreateMissionModal({ }: CreateMissionModalProps) { const [open, setOpen] = useState(false); const { data: studyData } = useGroupStudyDetailQuery(groupStudyId); + const { data: existingMissions } = useGetMissions({ + groupStudyId, + pageSize: 100, + }); + const studyStartDate = studyData?.basicInfo?.startDate; const studyEndDate = studyData?.basicInfo?.endDate; return ( @@ -76,7 +85,9 @@ export default function CreateMissionModal({ setOpen(false)} /> @@ -87,15 +98,25 @@ export default function CreateMissionModal({ interface CreateMissionFormProps { groupStudyId: number; + studyStartDate?: string; studyEndDate?: string; + existingMissions?: MissionPeriod[]; onClose: () => void; } function CreateMissionForm({ groupStudyId, + studyStartDate, studyEndDate, + existingMissions, onClose, }: CreateMissionFormProps) { + const disabledMatcher = useMissionDateDisabledMatcher({ + studyStartDate, + studyEndDate, + existingMissions, + }); + const methods = useForm({ resolver: zodResolver(CreateMissionFormSchema), mode: 'onChange', @@ -113,8 +134,8 @@ function CreateMissionForm({ const { mutate: createMission } = useCreateMission(); const onValidSubmit = (values: CreateMissionFormValues) => { - const startDate = values.dateRange.from.toISOString(); - const endDate = values.dateRange.to.toISOString(); + const startDate = dayjs(values.dateRange.from).format('YYYY-MM-DD'); + const endDate = dayjs(values.dateRange.to).format('YYYY-MM-DD'); createMission( { @@ -217,7 +238,7 @@ function CreateMissionForm({ mode="range" selected={field.value} onSelect={(date) => field.onChange(date)} - disabled={createDateDisabledMatcher(studyEndDate)} + disabled={disabledMatcher} /> )} /> diff --git a/src/components/modals/edit-mission-modal.tsx b/src/components/modals/edit-mission-modal.tsx index 4ea8341d..c7457180 100644 --- a/src/components/modals/edit-mission-modal.tsx +++ b/src/components/modals/edit-mission-modal.tsx @@ -1,4 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod'; +import dayjs from 'dayjs'; import { XIcon } from 'lucide-react'; import { useEffect, useState } from 'react'; import { Controller, FormProvider, useForm } from 'react-hook-form'; @@ -9,8 +10,15 @@ import FormField from '@/components/ui/form/form-field'; import { BaseInput, TextAreaInput } from '@/components/ui/input'; import { Modal } from '@/components/ui/modal'; import { useGroupStudyDetailQuery } from '@/features/study/group/model/use-study-query'; -import { useGetMission, useUpdateMission } from '@/hooks/queries/mission-api'; -import { createDateDisabledMatcher } from '@/utils/time'; +import { + MissionPeriod, + useMissionDateDisabledMatcher, +} from '@/hooks/common/use-mission-date-disabled-matcher'; +import { + useGetMission, + useGetMissions, + useUpdateMission, +} from '@/hooks/queries/mission-api'; // Form Schema const EditMissionFormSchema = z.object({ @@ -42,7 +50,12 @@ export default function EditMissionModal({ const [open, setOpen] = useState(false); const { data: missionData, isLoading } = useGetMission(missionId); const { data: studyData } = useGroupStudyDetailQuery(groupStudyId); + const { data: existingMissions } = useGetMissions({ + groupStudyId, + pageSize: 100, + }); + const studyStartDate = studyData?.basicInfo?.startDate; const studyEndDate = studyData?.basicInfo?.endDate; return ( @@ -77,7 +90,9 @@ export default function EditMissionModal({ setOpen(false)} /> ) : null} @@ -97,16 +112,26 @@ interface EditMissionFormProps { missionEndDate?: string; }; missionId: number; + studyStartDate?: string; studyEndDate?: string; + existingMissions?: MissionPeriod[]; onClose: () => void; } function EditMissionForm({ missionData, missionId, + studyStartDate, studyEndDate, + existingMissions, onClose, }: EditMissionFormProps) { + const disabledMatcher = useMissionDateDisabledMatcher({ + studyStartDate, + studyEndDate, + existingMissions, + excludeMissionId: missionId, + }); const methods = useForm({ resolver: zodResolver(EditMissionFormSchema), mode: 'onChange', @@ -126,8 +151,10 @@ function EditMissionForm({ }, }); + const { handleSubmit, formState, control, reset } = methods; + useEffect(() => { - methods.reset({ + reset({ title: missionData.missionTitle || '', description: missionData.missionDescription || '', weekNum: missionData.weekNum?.toString() || '', @@ -141,15 +168,13 @@ function EditMissionForm({ : new Date(), }, }); - }, [missionData, methods]); - - const { handleSubmit, formState, control } = methods; + }, [missionData, reset]); const { mutate: updateMission } = useUpdateMission(); const onValidSubmit = (values: EditMissionFormValues) => { - const startDate = values.dateRange.from.toISOString(); - const endDate = values.dateRange.to.toISOString(); + const startDate = dayjs(values.dateRange.from).format('YYYY-MM-DD'); + const endDate = dayjs(values.dateRange.to).format('YYYY-MM-DD'); updateMission( { @@ -252,7 +277,7 @@ function EditMissionForm({ mode="range" selected={field.value} onSelect={(date) => field.onChange(date)} - disabled={createDateDisabledMatcher(studyEndDate)} + disabled={disabledMatcher} /> )} /> diff --git a/src/hooks/common/use-mission-date-disabled-matcher.ts b/src/hooks/common/use-mission-date-disabled-matcher.ts new file mode 100644 index 00000000..1fcb5bec --- /dev/null +++ b/src/hooks/common/use-mission-date-disabled-matcher.ts @@ -0,0 +1,33 @@ +import { useMemo } from 'react'; +import { createMissionDateDisabledMatcher } from '@/utils/time'; + +export interface MissionPeriod { + missionId?: number; + startDate?: string; + endDate?: string; +} + +export interface UseMissionDateDisabledMatcherOptions { + studyStartDate?: string; + studyEndDate?: string; + existingMissions?: MissionPeriod[]; + excludeMissionId?: number; +} + +export function useMissionDateDisabledMatcher({ + studyStartDate, + studyEndDate, + existingMissions, + excludeMissionId, +}: UseMissionDateDisabledMatcherOptions) { + return useMemo( + () => + createMissionDateDisabledMatcher({ + studyStartDate, + studyEndDate, + existingMissions, + excludeMissionId, + }), + [studyStartDate, studyEndDate, existingMissions, excludeMissionId], + ); +} diff --git a/src/utils/time.ts b/src/utils/time.ts index 29f042a6..064d9694 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -91,23 +91,72 @@ export const getKoreaDisplayMonday = (base?: Date) => { return dow === 0 || dow === 6 ? addDays(monday, 7) : monday; }; -export const createDateDisabledMatcher = (endDateString?: string) => { +interface MissionPeriod { + missionId?: number; + startDate?: string; + endDate?: string; +} + +interface CreateMissionDateDisabledMatcherOptions { + studyStartDate?: string; + studyEndDate?: string; + existingMissions?: MissionPeriod[]; + excludeMissionId?: number; +} + +export const createMissionDateDisabledMatcher = ( + options: CreateMissionDateDisabledMatcherOptions, +) => { + const { studyStartDate, studyEndDate, existingMissions, excludeMissionId } = options; + return (date: Date) => { + const normalizedDate = new Date(date); + normalizedDate.setHours(0, 0, 0, 0); + const today = new Date(); today.setHours(0, 0, 0, 0); - if (date < today) { + if (normalizedDate < today) { return true; } - if (endDateString) { - const endDate = new Date(endDateString); - endDate.setHours(23, 59, 59, 999); - if (date > endDate) { + if (studyStartDate) { + const startDate = new Date(studyStartDate); + startDate.setHours(0, 0, 0, 0); + if (normalizedDate < startDate) { + return true; + } + } + + if (studyEndDate) { + const endDate = new Date(studyEndDate); + endDate.setHours(0, 0, 0, 0); + if (normalizedDate > endDate) { return true; } } + if (existingMissions) { + const targetTime = normalizedDate.getTime(); + for (const mission of existingMissions) { + if (excludeMissionId && mission.missionId === excludeMissionId) continue; + + if (mission.startDate && mission.endDate) { + const missionStart = new Date(mission.startDate); + missionStart.setHours(0, 0, 0, 0); + const missionEnd = new Date(mission.endDate); + missionEnd.setHours(0, 0, 0, 0); + + if ( + targetTime >= missionStart.getTime() && + targetTime <= missionEnd.getTime() + ) { + return true; + } + } + } + } + return false; }; }; From 3c671bd1632bf8146259fdba456511a71ea0db3f Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sat, 17 Jan 2026 23:31:52 +0900 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20'excludeMissionId'=EB=A5=BC=20'editi?= =?UTF-8?q?ngMissionId'=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=ED=8E=B8=EC=A7=91=20=EC=A4=91=EC=9D=B8=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?ID=EB=A5=BC=20=EB=AA=85=ED=99=95=ED=9E=88=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/modals/edit-mission-modal.tsx | 2 +- src/hooks/common/use-mission-date-disabled-matcher.ts | 8 ++++---- src/utils/time.ts | 7 ++++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/modals/edit-mission-modal.tsx b/src/components/modals/edit-mission-modal.tsx index c7457180..abc362b2 100644 --- a/src/components/modals/edit-mission-modal.tsx +++ b/src/components/modals/edit-mission-modal.tsx @@ -130,7 +130,7 @@ function EditMissionForm({ studyStartDate, studyEndDate, existingMissions, - excludeMissionId: missionId, + editingMissionId: missionId, }); const methods = useForm({ resolver: zodResolver(EditMissionFormSchema), diff --git a/src/hooks/common/use-mission-date-disabled-matcher.ts b/src/hooks/common/use-mission-date-disabled-matcher.ts index 1fcb5bec..26339977 100644 --- a/src/hooks/common/use-mission-date-disabled-matcher.ts +++ b/src/hooks/common/use-mission-date-disabled-matcher.ts @@ -11,14 +11,14 @@ export interface UseMissionDateDisabledMatcherOptions { studyStartDate?: string; studyEndDate?: string; existingMissions?: MissionPeriod[]; - excludeMissionId?: number; + editingMissionId?: number; } export function useMissionDateDisabledMatcher({ studyStartDate, studyEndDate, existingMissions, - excludeMissionId, + editingMissionId, }: UseMissionDateDisabledMatcherOptions) { return useMemo( () => @@ -26,8 +26,8 @@ export function useMissionDateDisabledMatcher({ studyStartDate, studyEndDate, existingMissions, - excludeMissionId, + editingMissionId, }), - [studyStartDate, studyEndDate, existingMissions, excludeMissionId], + [studyStartDate, studyEndDate, existingMissions, editingMissionId], ); } diff --git a/src/utils/time.ts b/src/utils/time.ts index 064d9694..3507f69a 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -101,13 +101,14 @@ interface CreateMissionDateDisabledMatcherOptions { studyStartDate?: string; studyEndDate?: string; existingMissions?: MissionPeriod[]; - excludeMissionId?: number; + editingMissionId?: number; // 편집 중인 미션 ID } export const createMissionDateDisabledMatcher = ( options: CreateMissionDateDisabledMatcherOptions, ) => { - const { studyStartDate, studyEndDate, existingMissions, excludeMissionId } = options; + const { studyStartDate, studyEndDate, existingMissions, editingMissionId } = options; + console.log(editingMissionId,'editingMissionId') return (date: Date) => { const normalizedDate = new Date(date); @@ -139,7 +140,7 @@ export const createMissionDateDisabledMatcher = ( if (existingMissions) { const targetTime = normalizedDate.getTime(); for (const mission of existingMissions) { - if (excludeMissionId && mission.missionId === excludeMissionId) continue; + if (editingMissionId && mission.missionId === editingMissionId) continue; if (mission.startDate && mission.endDate) { const missionStart = new Date(mission.startDate); From c303486b3ebc78b47140f6c7d7a22aa430e2f7d1 Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sat, 17 Jan 2026 23:38:39 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20createMissionDateDisabledMatcher?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=BD=94=EB=93=9C=20=ED=8F=AC=EB=A7=B7=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EC=BD=98=EC=86=94=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/time.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/utils/time.ts b/src/utils/time.ts index 3507f69a..bcacc6c8 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -107,8 +107,9 @@ interface CreateMissionDateDisabledMatcherOptions { export const createMissionDateDisabledMatcher = ( options: CreateMissionDateDisabledMatcherOptions, ) => { - const { studyStartDate, studyEndDate, existingMissions, editingMissionId } = options; - console.log(editingMissionId,'editingMissionId') + const { studyStartDate, studyEndDate, existingMissions, editingMissionId } = + options; + console.log(editingMissionId, 'editingMissionId'); return (date: Date) => { const normalizedDate = new Date(date); @@ -140,7 +141,8 @@ export const createMissionDateDisabledMatcher = ( if (existingMissions) { const targetTime = normalizedDate.getTime(); for (const mission of existingMissions) { - if (editingMissionId && mission.missionId === editingMissionId) continue; + if (editingMissionId && mission.missionId === editingMissionId) + continue; if (mission.startDate && mission.endDate) { const missionStart = new Date(mission.startDate); From 1ad0efe8071786a34aa4fc1d7e34267aadcdfaf6 Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sat, 17 Jan 2026 23:39:34 +0900 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=ED=8F=89=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20=EC=88=98=EC=A0=95=20=EB=AA=A8=EB=8B=AC?= =?UTF-8?q?=EC=9D=98=20=EC=BD=94=EB=A9=98=ED=8A=B8=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EB=A5=BC=201000=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/modals/create-evaluation-modal.tsx | 4 ++-- src/components/modals/edit-evaluation-modal.tsx | 2 +- src/components/modals/edit-homework-modal.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/modals/create-evaluation-modal.tsx b/src/components/modals/create-evaluation-modal.tsx index 57d39bc3..e6697bb7 100644 --- a/src/components/modals/create-evaluation-modal.tsx +++ b/src/components/modals/create-evaluation-modal.tsx @@ -23,7 +23,7 @@ const CreateEvaluationFormSchema = z.object({ 'C_MINUS', 'F', ]), - comment: z.string().min(1, '정성 코멘트를 입력해주세요.'), + comment: z.string().min(1, '정성 코멘트를 입력해주세요.').max(1000), }); type CreateEvaluationFormValues = z.infer; @@ -147,7 +147,7 @@ function CreateEvaluationForm({ id="comment" placeholder="정성 코멘트를 입력해 주세요." className="min-h-[230px]" - maxLength={5000} + maxLength={1000} /> diff --git a/src/components/modals/edit-evaluation-modal.tsx b/src/components/modals/edit-evaluation-modal.tsx index 243568b4..65c18b58 100644 --- a/src/components/modals/edit-evaluation-modal.tsx +++ b/src/components/modals/edit-evaluation-modal.tsx @@ -157,7 +157,7 @@ function EditEvaluationForm({ id="comment" placeholder="정성 코멘트를 입력해 주세요." className="min-h-[230px]" - maxLength={5000} + maxLength={1000} /> diff --git a/src/components/modals/edit-homework-modal.tsx b/src/components/modals/edit-homework-modal.tsx index 9ad0a937..13bd9149 100644 --- a/src/components/modals/edit-homework-modal.tsx +++ b/src/components/modals/edit-homework-modal.tsx @@ -11,7 +11,7 @@ import { useEditHomework } from '@/hooks/queries/group-study-homework-api'; import { BaseInput, TextAreaInput } from '../ui/input'; const EditHomeworkFormSchema = z.object({ - textContent: z.string().min(1, '과제 상세 내용을 입력해주세요.'), + textContent: z.string().min(1, '과제 상세 내용을 입력해주세요.').max(1000), attachmentLink: z.string().optional(), }); @@ -135,7 +135,7 @@ function EditHomeworkForm({ id="textContent" className="min-h-[230px]" placeholder="학습한 내용을 자세히 작성해 주세요." - maxLength={5000} + maxLength={1000} /> From 419d4e73d0abf50e121d12dd1a73d4bf6c4da905 Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Sun, 18 Jan 2026 08:42:35 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=EB=AF=B8=EC=85=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=88=98=EC=A0=95=20=EB=AA=A8=EB=8B=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=82=A0=EC=A7=9C=20=EB=B9=84=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94=20=EB=A7=A4=EC=B2=98=EB=A5=BC=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=ED=95=98=EA=B3=A0=20=EA=B4=80=EB=A0=A8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modals/create-mission-modal.tsx | 18 +++++----- src/components/modals/edit-mission-modal.tsx | 21 ++++++------ .../use-mission-date-disabled-matcher.ts | 33 ------------------- src/utils/time.ts | 11 +++---- 4 files changed, 23 insertions(+), 60 deletions(-) delete mode 100644 src/hooks/common/use-mission-date-disabled-matcher.ts diff --git a/src/components/modals/create-mission-modal.tsx b/src/components/modals/create-mission-modal.tsx index f620779e..ad1bc783 100644 --- a/src/components/modals/create-mission-modal.tsx +++ b/src/components/modals/create-mission-modal.tsx @@ -10,11 +10,11 @@ import FormField from '@/components/ui/form/form-field'; import { BaseInput, TextAreaInput } from '@/components/ui/input'; import { Modal } from '@/components/ui/modal'; import { useGroupStudyDetailQuery } from '@/features/study/group/model/use-study-query'; +import { useCreateMission, useGetMissions } from '@/hooks/queries/mission-api'; import { + createDisabledDateMatcherForMission, MissionPeriod, - useMissionDateDisabledMatcher, -} from '@/hooks/common/use-mission-date-disabled-matcher'; -import { useCreateMission, useGetMissions } from '@/hooks/queries/mission-api'; +} from '@/utils/time'; // Form Schema const CreateMissionFormSchema = z.object({ @@ -111,12 +111,6 @@ function CreateMissionForm({ existingMissions, onClose, }: CreateMissionFormProps) { - const disabledMatcher = useMissionDateDisabledMatcher({ - studyStartDate, - studyEndDate, - existingMissions, - }); - const methods = useForm({ resolver: zodResolver(CreateMissionFormSchema), mode: 'onChange', @@ -238,7 +232,11 @@ function CreateMissionForm({ mode="range" selected={field.value} onSelect={(date) => field.onChange(date)} - disabled={disabledMatcher} + disabled={createDisabledDateMatcherForMission({ + studyStartDate, + studyEndDate, + existingMissions, + })} /> )} /> diff --git a/src/components/modals/edit-mission-modal.tsx b/src/components/modals/edit-mission-modal.tsx index abc362b2..3b2e668a 100644 --- a/src/components/modals/edit-mission-modal.tsx +++ b/src/components/modals/edit-mission-modal.tsx @@ -10,15 +10,15 @@ import FormField from '@/components/ui/form/form-field'; import { BaseInput, TextAreaInput } from '@/components/ui/input'; import { Modal } from '@/components/ui/modal'; import { useGroupStudyDetailQuery } from '@/features/study/group/model/use-study-query'; -import { - MissionPeriod, - useMissionDateDisabledMatcher, -} from '@/hooks/common/use-mission-date-disabled-matcher'; import { useGetMission, useGetMissions, useUpdateMission, } from '@/hooks/queries/mission-api'; +import { + createDisabledDateMatcherForMission, + MissionPeriod, +} from '@/utils/time'; // Form Schema const EditMissionFormSchema = z.object({ @@ -126,12 +126,6 @@ function EditMissionForm({ existingMissions, onClose, }: EditMissionFormProps) { - const disabledMatcher = useMissionDateDisabledMatcher({ - studyStartDate, - studyEndDate, - existingMissions, - editingMissionId: missionId, - }); const methods = useForm({ resolver: zodResolver(EditMissionFormSchema), mode: 'onChange', @@ -277,7 +271,12 @@ function EditMissionForm({ mode="range" selected={field.value} onSelect={(date) => field.onChange(date)} - disabled={disabledMatcher} + disabled={createDisabledDateMatcherForMission({ + studyStartDate, + studyEndDate, + existingMissions, + editingMissionId: missionId, + })} /> )} /> diff --git a/src/hooks/common/use-mission-date-disabled-matcher.ts b/src/hooks/common/use-mission-date-disabled-matcher.ts deleted file mode 100644 index 26339977..00000000 --- a/src/hooks/common/use-mission-date-disabled-matcher.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { useMemo } from 'react'; -import { createMissionDateDisabledMatcher } from '@/utils/time'; - -export interface MissionPeriod { - missionId?: number; - startDate?: string; - endDate?: string; -} - -export interface UseMissionDateDisabledMatcherOptions { - studyStartDate?: string; - studyEndDate?: string; - existingMissions?: MissionPeriod[]; - editingMissionId?: number; -} - -export function useMissionDateDisabledMatcher({ - studyStartDate, - studyEndDate, - existingMissions, - editingMissionId, -}: UseMissionDateDisabledMatcherOptions) { - return useMemo( - () => - createMissionDateDisabledMatcher({ - studyStartDate, - studyEndDate, - existingMissions, - editingMissionId, - }), - [studyStartDate, studyEndDate, existingMissions, editingMissionId], - ); -} diff --git a/src/utils/time.ts b/src/utils/time.ts index bcacc6c8..4c87577a 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -91,25 +91,24 @@ export const getKoreaDisplayMonday = (base?: Date) => { return dow === 0 || dow === 6 ? addDays(monday, 7) : monday; }; -interface MissionPeriod { +export interface MissionPeriod { missionId?: number; startDate?: string; endDate?: string; } -interface CreateMissionDateDisabledMatcherOptions { +export interface CreateDisabledDateMatcherForMissionOptions { studyStartDate?: string; studyEndDate?: string; existingMissions?: MissionPeriod[]; - editingMissionId?: number; // 편집 중인 미션 ID + editingMissionId?: number; } -export const createMissionDateDisabledMatcher = ( - options: CreateMissionDateDisabledMatcherOptions, +export const createDisabledDateMatcherForMission = ( + options: CreateDisabledDateMatcherForMissionOptions, ) => { const { studyStartDate, studyEndDate, existingMissions, editingMissionId } = options; - console.log(editingMissionId, 'editingMissionId'); return (date: Date) => { const normalizedDate = new Date(date);