|
1 | 1 | "use client"; |
2 | | -import { useMemo, useTransition } from "react"; |
| 2 | +import { useEffect, useMemo, useTransition } from "react"; |
3 | 3 | import { useWatch, type FieldErrors } from "react-hook-form"; |
4 | 4 | import { useRouter } from "next/navigation"; |
5 | 5 | import { toast } from "sonner"; |
@@ -32,6 +32,7 @@ import { useWarningTime } from "@/hooks/planner/useWarningTime"; |
32 | 32 | import { WarningTimeDialog } from "./WarningTimeDialog"; |
33 | 33 | import ScheduleDetailField from "./fields/ScheduleDetailField"; |
34 | 34 | import ScheduleTitleField from "./fields/ScheduleTitleField"; |
| 35 | +import { useDebounce } from "@/hooks/useDebounce"; |
35 | 36 |
|
36 | 37 | interface AddScheduleDialogProps { |
37 | 38 | planId: string; |
@@ -69,15 +70,27 @@ export default function AddScheduleDialog({ |
69 | 70 | const userTransportType = useWatch({ control: form.control, name: "transportType" }); // 탭 연동 |
70 | 71 | const bufferMinutes = useWatch({ control: form.control, name: "bufferMinutes" }) ?? 10; |
71 | 72 |
|
| 73 | + const recommendedTimeParams = useMemo( |
| 74 | + () => ({ |
| 75 | + selectedScheduleId, |
| 76 | + currentCoords, |
| 77 | + bufferMinutes, |
| 78 | + }), |
| 79 | + [selectedScheduleId, currentCoords, bufferMinutes] |
| 80 | + ); |
| 81 | + const debouncedRecommendedTimeParams = useDebounce(recommendedTimeParams, 500); |
| 82 | + |
72 | 83 | const { recommendedTimes, isLoading } = useRecommendedTime({ |
73 | | - selectedScheduleId, |
74 | | - currentCoords, |
| 84 | + selectedScheduleId: debouncedRecommendedTimeParams.selectedScheduleId, |
| 85 | + currentCoords: debouncedRecommendedTimeParams.currentCoords, |
75 | 86 | regularScheduleCandidates, |
76 | | - bufferMinutes, |
| 87 | + bufferMinutes: debouncedRecommendedTimeParams.bufferMinutes, |
77 | 88 | }); |
78 | 89 |
|
79 | | - const activeRecommend = |
80 | | - recommendedTimes && userTransportType ? recommendedTimes[userTransportType] : null; |
| 90 | + const activeRecommend = useMemo( |
| 91 | + () => (recommendedTimes && !!userTransportType ? recommendedTimes[userTransportType] : null), |
| 92 | + [recommendedTimes, userTransportType] |
| 93 | + ); |
81 | 94 |
|
82 | 95 | // 시간 변경 시 검증 |
83 | 96 | const timeValidation: TimeValidationResult = useMemo(() => { |
@@ -150,6 +163,13 @@ export default function AddScheduleDialog({ |
150 | 163 | } |
151 | 164 | }; |
152 | 165 |
|
| 166 | + // 다이얼로그 호출 시 폼 초기화 |
| 167 | + useEffect(() => { |
| 168 | + if (open) { |
| 169 | + resetToInitialState(); |
| 170 | + } |
| 171 | + }, [open, resetToInitialState]); |
| 172 | + |
153 | 173 | return ( |
154 | 174 | <> |
155 | 175 | <Dialog open={open} onOpenChange={handleOpenChange}> |
|
0 commit comments