import { useRef, useEffect } from 'react' import type { BacktrackPhase, BacktrackVessel, BacktrackConditions } from '@common/types/backtrack' interface BacktrackModalProps { isOpen: boolean onClose: () => void phase: BacktrackPhase conditions: BacktrackConditions vessels: BacktrackVessel[] onRunAnalysis: () => void onStartReplay: () => void } export function BacktrackModal({ isOpen, onClose, phase, conditions, vessels, onRunAnalysis, onStartReplay, }: BacktrackModalProps) { const backdropRef = useRef(null) useEffect(() => { const handler = (e: MouseEvent) => { if (e.target === backdropRef.current) onClose() } if (isOpen) document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, [isOpen, onClose]) if (!isOpen) return null return (
{/* Header */}
๐Ÿ”

์œ ์ถœ์œ  ์—ญ์ถ”์  ๋ถ„์„

AIS ํ•ญ์  ๊ธฐ๋ฐ˜ ์œ ์ถœ ์„ ๋ฐ• ์ถ”์ •
{/* Scrollable Content */}
{/* Analysis Conditions */}

๋ถ„์„ ์กฐ๊ฑด

{[ { label: '์œ ์ถœ ์ถ”์ • ์‹œ๊ฐ', value: conditions.estimatedSpillTime }, { label: '๋ถ„์„ ๋ฒ”์œ„', value: conditions.analysisRange }, { label: 'ํƒ์ƒ‰ ๋ฐ˜๊ฒฝ', value: conditions.searchRadius }, { label: '์œ ์ถœ ์œ„์น˜', value: `${conditions.spillLocation.lat.toFixed(4)}ยฐN, ${conditions.spillLocation.lon.toFixed(4)}ยฐE` }, ].map((item, i) => (
{item.label}
{item.value}
))}
๋ถ„์„ ๋Œ€์ƒ ์„ ๋ฐ•
{conditions.totalVessels}์ฒ™ (AIS ์ˆ˜์‹ )
{/* Results */} {phase === 'results' && vessels.length > 0 && (

๋ถ„์„ ๊ฒฐ๊ณผ

{conditions.totalVessels}์ฒ™ ์ค‘ {vessels.length}์ฒ™ ์˜์‹ฌ
{vessels.map((v) => ( ))}
)}
{/* Footer */}
{phase === 'conditions' && ( )} {phase === 'analyzing' && ( )} {phase === 'results' && ( )}
) } function VesselCard({ vessel }: { vessel: BacktrackVessel }) { const probColor = vessel.probability >= 80 ? 'var(--red)' : vessel.probability >= 20 ? 'var(--orange)' : 'var(--t3)' return (
{/* Header row */}
{vessel.rank}
{vessel.name}
IMO: {vessel.imo} ยท {vessel.type} ยท {vessel.flag}
{vessel.probability}%
์œ ์ถœ ํ™•๋ฅ 
{/* Stats grid */}
{[ { label: '์ตœ๊ทผ์ ‘ ์‹œ๊ฐ', value: vessel.closestTime }, { label: '์ตœ๊ทผ์ ‘ ๊ฑฐ๋ฆฌ', value: `${vessel.closestDistance} NM` }, { label: '์†๋„ ๋ณ€ํ™”', value: vessel.speedChange, highlight: vessel.speedChange === '๊ธ‰๊ฐ์†' }, { label: 'AIS ์ƒํƒœ', value: vessel.aisStatus, highlight: vessel.aisStatus === '์ถฉ๋Œ์‹ ํ˜ธ' }, ].map((s, i) => (
{s.label}
{s.value}
))}
{/* Description */} {vessel.description && (
{vessel.description}
)}
) }