import { useState, useEffect, useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useFlight } from '../../components/FlightContext' import { api } from '../../api/client' import { createSSE } from '../../api/sse' import { useResizablePanel } from '../../hooks/useResizablePanel' import ConfirmDialog from '../../components/ConfirmDialog' import type { Flight, Waypoint, Aircraft } from '../../types' import FlightMap from './FlightMap' export default function FlightsPage() { const { t } = useTranslation() const { flights, selectedFlight, selectFlight, refreshFlights } = useFlight() const [mode, setMode] = useState<'params' | 'gps'>('params') const [waypoints, setWaypoints] = useState([]) const [aircrafts, setAircrafts] = useState([]) const [liveGps, setLiveGps] = useState<{ lat: number; lon: number; satellites: number; status: string } | null>(null) const [deleteId, setDeleteId] = useState(null) const [newName, setNewName] = useState('') const leftPanel = useResizablePanel(200, 150, 350) useEffect(() => { api.get('/api/flights/aircrafts').then(setAircrafts).catch(() => {}) }, []) useEffect(() => { if (!selectedFlight) { setWaypoints([]); return } api.get(`/api/flights/${selectedFlight.id}/waypoints`).then(setWaypoints).catch(() => {}) }, [selectedFlight]) useEffect(() => { if (!selectedFlight || mode !== 'gps') return return createSSE(`/api/flights/${selectedFlight.id}/live-gps`, (data: any) => setLiveGps(data)) }, [selectedFlight, mode]) const handleCreate = async () => { if (!newName.trim()) return await api.post('/api/flights', { name: newName.trim() }) setNewName('') refreshFlights() } const handleDelete = async () => { if (!deleteId) return await api.delete(`/api/flights/${deleteId}`) if (selectedFlight?.id === deleteId) selectFlight(null) setDeleteId(null) refreshFlights() } const handleAddWaypoint = async () => { if (!selectedFlight) return await api.post(`/api/flights/${selectedFlight.id}/waypoints`, { name: `Point ${waypoints.length}`, latitude: 50.45, longitude: 30.52, order: waypoints.length, }) const wps = await api.get(`/api/flights/${selectedFlight.id}/waypoints`) setWaypoints(wps) } const handleDeleteWaypoint = async (wpId: string) => { if (!selectedFlight) return await api.delete(`/api/flights/${selectedFlight.id}/waypoints/${wpId}`) setWaypoints(prev => prev.filter(w => w.id !== wpId)) } return (
{/* Flight list sidebar */}
setNewName(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleCreate()} placeholder={t('flights.create')} className="flex-1 bg-az-bg border border-az-border rounded px-2 py-1 text-xs text-az-text outline-none" />
{flights.map(f => (
selectFlight(f)} className={`px-2 py-1.5 cursor-pointer border-b border-az-border text-sm ${ selectedFlight?.id === f.id ? 'bg-az-bg text-white' : 'text-az-text hover:bg-az-bg' }`} >
{f.name}
{new Date(f.createdDate).toLocaleDateString()}
))}
{/* Resize handle */}
{/* Left params panel */} {selectedFlight && (
{mode === 'params' && (
{waypoints.map(wp => (
{wp.name}
))}
)} {mode === 'gps' && (
{liveGps ? (
Status: {liveGps.status}
Lat: {liveGps.lat.toFixed(6)}
Lon: {liveGps.lon.toFixed(6)}
Sats: {liveGps.satellites}
) : (
Waiting for GPS signal...
)}
)}
)} {/* Map view */}
setDeleteId(null)} />
) }