import { useState } from 'react' import { useVesselTracks } from '../hooks/useVesselTracks' import { useTrackStore } from '../stores/trackStore' interface TrackQueryPanelProps { /** 최근위치에서 클릭하여 넘어온 MMSI */ initialMmsi?: string } /** 기본 시간 범위: 지금부터 24시간 전 */ function getDefaultTimeRange(): { start: string; end: string } { const now = new Date() const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000) return { start: toLocalISOString(yesterday), end: toLocalISOString(now), } } function toLocalISOString(d: Date): string { const pad = (n: number) => String(n).padStart(2, '0') return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}` } export default function TrackQueryPanel({ initialMmsi }: TrackQueryPanelProps) { const { start, end } = getDefaultTimeRange() const [mmsiInput, setMmsiInput] = useState(initialMmsi || '') const [startTime, setStartTime] = useState(start) const [endTime, setEndTime] = useState(end) const { fetchTracks, clearTracks } = useVesselTracks() const loading = useTrackStore((s) => s.loading) const tracks = useTrackStore((s) => s.tracks) const handleQuery = () => { const mmsiList = mmsiInput .split(/[,\s]+/) .map((s) => s.trim()) .filter(Boolean) if (mmsiList.length === 0) return const startISO = startTime.replace('T', ' ') + ':00' const endISO = endTime.replace('T', ' ') + ':00' fetchTracks(mmsiList, startISO, endISO) } return (
{/* MMSI 입력 */}
setMmsiInput(e.target.value)} placeholder="440113620, 441027000" className="w-full rounded-md border border-border bg-surface px-3 py-1.5 text-sm text-foreground placeholder:text-muted focus:border-primary focus:outline-none" />
{/* 시간 범위 */}
setStartTime(e.target.value)} className="w-full rounded-md border border-border bg-surface px-2 py-1.5 text-xs text-foreground focus:border-primary focus:outline-none" />
setEndTime(e.target.value)} className="w-full rounded-md border border-border bg-surface px-2 py-1.5 text-xs text-foreground focus:border-primary focus:outline-none" />
{/* 버튼 */}
{tracks.length > 0 && ( )}
{/* 결과 요약 */} {tracks.length > 0 && (
{tracks.length}척 항적 로드
{tracks.map((t) => (
{t.shipName || t.vesselId} {t.geometry.length} pts
))}
)}
) }