import { useState, useRef, useEffect } from 'react' import { createHnsAnalysis } from '../services/hnsApi' interface HNSRecalcModalProps { isOpen: boolean onClose: () => void onSubmit: () => void } type RecalcPhase = 'editing' | 'running' | 'done' const HNS_SUBSTANCES = ['톨루엔', '암모니아', '메탄올', '수소', '벤젠', '스티렌', 'LNG', '염소', '황화수소'] const RELEASE_TYPES = ['순간 유출', '연속 유출', '반연속'] const MODELS = ['ALOHA', 'PHAST', 'CALPUFF', 'Lagrangian'] const STABILITIES = ['A (매우 불안정)', 'B (불안정)', 'C (약간 불안정)', 'D (중립)', 'E (약간 안정)', 'F (안정)'] const PRED_TIMES = [1, 3, 6, 12, 24, 48] export function HNSRecalcModal({ isOpen, onClose, onSubmit }: HNSRecalcModalProps) { const backdropRef = useRef(null) const [substance, setSubstance] = useState('톨루엔') const [releaseType, setReleaseType] = useState('순간 유출') const [amount, setAmount] = useState(2.5) const [unit, setUnit] = useState<'t' | 'kg' | 'm³' | 'L'>('t') const [windDir, setWindDir] = useState('SW') const [windSpeed, setWindSpeed] = useState(5.2) const [temp, setTemp] = useState(18.5) const [stability, setStability] = useState('D (중립)') const [model, setModel] = useState('ALOHA') const [predTime, setPredTime] = useState(6) const [lat, setLat] = useState(35.4215) const [lon, setLon] = useState(129.3542) const [phase, setPhase] = useState('editing') useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect if (isOpen) setPhase('editing') }, [isOpen]) useEffect(() => { const handler = (e: MouseEvent) => { if (e.target === backdropRef.current) onClose() } if (isOpen) document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, [isOpen, onClose]) const handleRun = async () => { setPhase('running') try { await createHnsAnalysis({ anlysNm: `HNS 재계산 — ${substance}`, lon, lat, sbstNm: substance, spilQty: amount, spilUnitCd: unit, fcstHr: predTime, algoCd: model, windSpd: windSpeed, windDir, temp, atmStblCd: stability.charAt(0), }) setPhase('done') setTimeout(() => { onSubmit() onClose() }, 800) } catch (err) { console.error('[hns] 재계산 실패:', err) setPhase('editing') alert('재계산 실행에 실패했습니다.') } } if (!isOpen) return null return (
{/* Header */}
🔄

HNS 대기확산 재계산

물질·기상조건을 수정하여 대기확산 예측을 재실행합니다
{/* Content */}
{/* 현재 분석 정보 */}
현재 분석 정보
{/* HNS 물질 */} {/* 유출 유형 + 유출량 */}
setAmount(Number(e.target.value))} step={0.1} style={{ flex: 1 }} />
{/* 풍향 / 풍속 / 기온 */}
setWindSpeed(Number(e.target.value))} step={0.1} /> setTemp(Number(e.target.value))} step={0.1} />
{/* 대기안정도 + 확산 모델 */}
{/* 예측 시간 */} {/* 유출 위치 */}
위도 (N)
setLat(Number(e.target.value))} style={{ fontFamily: 'var(--fM)' }} />
경도 (E)
setLon(Number(e.target.value))} style={{ fontFamily: 'var(--fM)' }} />
{/* Footer */}
) } function FG({ label, children }: { label: string; children: React.ReactNode }) { return (
{label}
{children}
) } function InfoRow({ label, value }: { label: string; value: string }) { return (
{label} {value}
) }