/** * 검증 이슈 등록·수정 모달 */ import React, { useEffect, useState } from 'react'; import type { VerificationIssueDto } from '../../utils/verificationBoardApi'; import { VERIFICATION_ISSUE_STAGES, type VerificationIssueStage, } from '../../utils/verificationBoardStages'; import ReproductionPathInput from './ReproductionPathInput'; import VerificationIssueAttachmentsSection from './VerificationIssueAttachmentsSection'; interface Props { open: boolean; initial: VerificationIssueDto | null; saving: boolean; onSave: (dto: VerificationIssueDto, pendingImages: File[]) => void; onCancel: () => void; } const EMPTY: VerificationIssueDto = { title: '', content: '', reproductionPath: '', stage: 'REGISTERED', }; const VerificationIssueFormModal: React.FC = ({ open, initial, saving, onSave, onCancel, }) => { const [title, setTitle] = useState(''); const [content, setContent] = useState(''); const [reproductionPath, setReproductionPath] = useState(''); const [stage, setStage] = useState('REGISTERED'); const [draftImages, setDraftImages] = useState([]); useEffect(() => { if (!open) return; setTitle(initial?.title ?? ''); setContent(initial?.content ?? ''); setReproductionPath(initial?.reproductionPath ?? ''); setStage(initial?.stage ?? 'REGISTERED'); setDraftImages([]); }, [open, initial]); if (!open) return null; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const trimmed = title.trim(); if (!trimmed) { window.alert('제목을 입력하세요.'); return; } const pathTrimmed = reproductionPath.trim(); onSave({ ...(initial?.id != null ? { id: initial.id } : {}), title: trimmed, content: content.trim(), reproductionPath: pathTrimmed || undefined, stage, }, initial?.id == null ? draftImages : []); }; return (
{ if (e.target === e.currentTarget) onCancel(); }}>

{initial?.id != null ? '검증 이슈 수정' : '검증 이슈 등록'}