fix: [card] 수정 모드 진입 시 폼 데이터 초기화 문제 해결

- card prop 변경 시 formData를 동기화하는 useEffect 추가
- buildFormData 헬퍼 함수로 중복 코드 제거
- useState 초기값은 최초 1회만 적용되는 React 특성 대응
This commit is contained in:
김보곤
2026-02-21 00:52:01 +09:00
parent f4c0df3579
commit 1b8a2d8127

View File

@@ -79,6 +79,29 @@ const FORM_TO_API_FIELD: Record<string, string> = {
memo: 'memo',
};
// card prop → formData 변환 헬퍼
function buildFormData(card?: CardType): CardFormData {
return {
cardCompany: card?.cardCompany || '',
cardType: card?.cardType || '',
cardNumber: card?.cardNumber || '',
cardName: card?.cardName || '',
alias: card?.alias || '',
expiryDate: card?.expiryDate || '',
csv: card?.csv || '',
paymentDay: card?.paymentDay || '',
pinPrefix: '',
totalLimit: card?.totalLimit || 0,
usedAmount: card?.usedAmount || 0,
remainingLimit: card?.remainingLimit || 0,
status: card?.status || 'active',
userId: card?.user?.id || '',
departmentId: card?.user?.departmentId || '',
positionId: card?.user?.positionId || '',
memo: card?.memo || '',
};
}
interface CardDetailProps {
card?: CardType;
mode: 'create' | 'view' | 'edit';
@@ -108,25 +131,14 @@ export function CardDetail({ card, mode: initialMode, isLoading }: CardDetailPro
}
}, [mode]);
const [formData, setFormData] = useState<CardFormData>({
cardCompany: card?.cardCompany || '',
cardType: card?.cardType || '',
cardNumber: card?.cardNumber || '',
cardName: card?.cardName || '',
alias: card?.alias || '',
expiryDate: card?.expiryDate || '',
csv: card?.csv || '',
paymentDay: card?.paymentDay || '',
pinPrefix: '',
totalLimit: card?.totalLimit || 0,
usedAmount: card?.usedAmount || 0,
remainingLimit: card?.remainingLimit || 0,
status: card?.status || 'active',
userId: card?.user?.id || '',
departmentId: card?.user?.departmentId || '',
positionId: card?.user?.positionId || '',
memo: card?.memo || '',
});
const [formData, setFormData] = useState<CardFormData>(() => buildFormData(card));
// card prop 변경 시 formData 동기화 (API 로딩 완료 후)
useEffect(() => {
if (card) {
setFormData(buildFormData(card));
}
}, [card]);
const isViewMode = mode === 'view';
const isCreateMode = mode === 'create';
@@ -193,27 +205,7 @@ export function CardDetail({ card, mode: initialMode, isLoading }: CardDetailPro
router.push('/ko/hr/card-management');
} else {
setMode('view');
if (card) {
setFormData({
cardCompany: card.cardCompany || '',
cardType: card.cardType || '',
cardNumber: card.cardNumber || '',
cardName: card.cardName || '',
alias: card.alias || '',
expiryDate: card.expiryDate || '',
csv: card.csv || '',
paymentDay: card.paymentDay || '',
pinPrefix: '',
totalLimit: card.totalLimit || 0,
usedAmount: card.usedAmount || 0,
remainingLimit: card.remainingLimit || 0,
status: card.status || 'active',
userId: card.user?.id || '',
departmentId: card.user?.departmentId || '',
positionId: card.user?.positionId || '',
memo: card.memo || '',
});
}
setFormData(buildFormData(card));
}
};