From 3607beee121062a4a6f26c4c47ae804a84343752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=98=81=EB=B3=B4?= Date: Fri, 20 Mar 2026 16:15:50 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[=EC=A0=9C=ED=92=88=EA=B2=80=EC=82=AC]?= =?UTF-8?q?=20=EC=9A=B0=ED=8E=B8=EB=B2=88=ED=98=B8=20=EC=B0=BE=EA=B8=B0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InspectionCreate, InspectionDetail에 useDaumPostcode 훅 연결 - 우편번호 찾기 버튼 onClick → openPostcode 바인딩 - 주소 필드 readOnly 처리 (우편번호 검색으로만 입력) - useMemo deps에 openPostcode 추가 (stale closure 방지) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../InspectionManagement/InspectionCreate.tsx | 20 +++++++++++++++++-- .../InspectionManagement/InspectionDetail.tsx | 20 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/components/quality/InspectionManagement/InspectionCreate.tsx b/src/components/quality/InspectionManagement/InspectionCreate.tsx index 95427ad3..374602c2 100644 --- a/src/components/quality/InspectionManagement/InspectionCreate.tsx +++ b/src/components/quality/InspectionManagement/InspectionCreate.tsx @@ -13,6 +13,7 @@ import { useState, useCallback, useMemo } from 'react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; +import { useDaumPostcode } from '@/hooks/useDaumPostcode'; import { Plus, Trash2, ClipboardCheck } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; @@ -61,6 +62,20 @@ import { export function InspectionCreate() { const router = useRouter(); + // Daum 우편번호 서비스 + const { openPostcode } = useDaumPostcode({ + onComplete: (result) => { + setFormData(prev => ({ + ...prev, + scheduleInfo: { + ...prev.scheduleInfo, + sitePostalCode: result.zonecode, + siteAddress: result.address, + }, + })); + }, + }); + // 폼 상태 const [formData, setFormData] = useState({ qualityDocNumber: '', @@ -663,7 +678,7 @@ export function InspectionCreate() { onChange={(e) => updateNested('scheduleInfo', 'sitePostalCode', e.target.value)} className="w-28" /> - @@ -674,6 +689,7 @@ export function InspectionCreate() { value={formData.scheduleInfo.siteAddress} onChange={(e) => updateNested('scheduleInfo', 'siteAddress', e.target.value)} placeholder="주소 입력" + readOnly />
@@ -710,7 +726,7 @@ export function InspectionCreate() {
- ), [formData, orderSummary, orderGroups, updateField, updateNested, handleRemoveOrderItem, handleOpenInspectionInput, handleUpdateOrderItemField, orderModalOpen]); + ), [formData, orderSummary, orderGroups, updateField, updateNested, handleRemoveOrderItem, handleOpenInspectionInput, handleUpdateOrderItemField, orderModalOpen, openPostcode]); // 이미 선택된 수주 ID 목록 (orderId 기준, 중복 제거) const excludeOrderIds = useMemo( diff --git a/src/components/quality/InspectionManagement/InspectionDetail.tsx b/src/components/quality/InspectionManagement/InspectionDetail.tsx index 3c2a98b5..9f8c1c0e 100644 --- a/src/components/quality/InspectionManagement/InspectionDetail.tsx +++ b/src/components/quality/InspectionManagement/InspectionDetail.tsx @@ -13,6 +13,7 @@ import { useState, useCallback, useEffect, useMemo } from 'react'; import dynamic from 'next/dynamic'; import { useRouter, useSearchParams } from 'next/navigation'; +import { useDaumPostcode } from '@/hooks/useDaumPostcode'; import { FileText, PlayCircle, @@ -124,6 +125,20 @@ export function InspectionDetail({ id }: InspectionDetailProps) { const searchParams = useSearchParams(); const isEditModeParam = searchParams.get('mode') === 'edit'; + // Daum 우편번호 서비스 + const { openPostcode } = useDaumPostcode({ + onComplete: (result) => { + setFormData(prev => ({ + ...prev, + scheduleInfo: { + ...prev.scheduleInfo, + sitePostalCode: result.zonecode, + siteAddress: result.address, + }, + })); + }, + }); + // 상세 데이터 const [inspection, setInspection] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -1259,7 +1274,7 @@ export function InspectionDetail({ id }: InspectionDetailProps) { onChange={(e) => updateNested('scheduleInfo', 'sitePostalCode', e.target.value)} className="w-28" /> - @@ -1269,6 +1284,7 @@ export function InspectionDetail({ id }: InspectionDetailProps) { updateNested('scheduleInfo', 'siteAddress', e.target.value)} + readOnly />
@@ -1305,7 +1321,7 @@ export function InspectionDetail({ id }: InspectionDetailProps) {
); - }, [inspection, formData, orderSummary, orderGroups, updateField, updateNested, handleRemoveOrderItem, handleOpenInspectionInput, handleUpdateOrderItemField, orderModalOpen, renderFqcBadge, renderFqcProgressBar]); + }, [inspection, formData, orderSummary, orderGroups, updateField, updateNested, handleRemoveOrderItem, handleOpenInspectionInput, handleUpdateOrderItemField, orderModalOpen, renderFqcBadge, renderFqcProgressBar, openPostcode]); // ===== 모드 & Config ===== const mode = isEditMode ? 'edit' : 'view';