'use client'; import { useState } from 'react'; import { FirmwareUpdate, Vehicle, VehicleGroup, uploadUpdate, createDeployment } from '@/lib/api'; import { Upload, Rocket, HardDrive, CheckCircle2, AlertCircle, Users } from 'lucide-react'; interface UpdateManagerProps { updates: FirmwareUpdate[]; vehicles: Vehicle[]; groups: VehicleGroup[]; onUpdateDeployed: () => void; } export function UpdateManager({ updates, vehicles, groups, onUpdateDeployed }: UpdateManagerProps) { const [file, setFile] = useState(null); const [version, setVersion] = useState(''); const [description, setDescription] = useState(''); const [uploading, setUploading] = useState(false); const [selectedUpdate, setSelectedUpdate] = useState(null); const [targetType, setTargetType] = useState<'vehicle' | 'group'>('vehicle'); const [selectedTarget, setSelectedTarget] = useState(''); // VIN or Group ID const [deploying, setDeploying] = useState(false); const handleUpload = async (e: React.FormEvent) => { e.preventDefault(); if (!file || !version) return; setUploading(true); try { const formData = new FormData(); formData.append('file', file); formData.append('version', version); formData.append('description', description); await uploadUpdate(formData); onUpdateDeployed(); setFile(null); setVersion(''); setDescription(''); } catch (err) { console.error(err); alert('Upload failed'); } finally { setUploading(false); } }; const handleDeploy = async () => { if (!selectedUpdate || !selectedTarget) return; setDeploying(true); try { if (targetType === 'vehicle') { await createDeployment(selectedUpdate, selectedTarget, undefined); } else { await createDeployment(selectedUpdate, undefined, parseInt(selectedTarget)); } onUpdateDeployed(); alert('Deployment started!'); } catch (err) { console.error(err); alert('Deployment failed'); } finally { setDeploying(false); } }; return (
{/* Upload Section */}

Upload Firmware

setVersion(e.target.value)} placeholder="e.g. 1.2.0" className="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-3 py-2 text-white focus:ring-2 focus:ring-blue-500 outline-none" required />
setDescription(e.target.value)} placeholder="Critical security patch..." className="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-3 py-2 text-white focus:ring-2 focus:ring-blue-500 outline-none" />
setFile(e.target.files?.[0] || null)} className="absolute inset-0 opacity-0 cursor-pointer" required />

{file ? file.name : "Click to select binary"}

{/* Deploy Section */}

Deploy Update

{targetType === 'vehicle' ? ( ) : ( )}
{/* Recent Deployments Snippet could go here */}
); }