"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslations } from "next-intl"; import { RefreshCw, Search } from "lucide-react"; import type { FirmwareInfo } from "@/lib/firmware"; import { DEFAULT_BOARD_ID } from "@/lib/boards"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { BoardSelector } from "@/components/board-selector"; import { FirmwareCard } from "@/components/firmware-card"; import { FirmwareDetail } from "@/components/firmware-detail"; function supportsWebSerial() { return typeof navigator !== "undefined" && "serial" in navigator; } export function FlasherPanel() { const t = useTranslations(); const [firmwares, setFirmwares] = useState([]); const [boardId, setBoardId] = useState(DEFAULT_BOARD_ID); const [selectedId, setSelectedId] = useState(null); const [query, setQuery] = useState(""); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [serialOk, setSerialOk] = useState(true); const load = useCallback(async () => { setLoading(true); setError(null); try { const res = await fetch("/api/firmware", { cache: "no-store" }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = (await res.json()) as { firmwares: FirmwareInfo[] }; setFirmwares(data.firmwares ?? []); } catch (err) { setError(err instanceof Error ? err.message : String(err)); setFirmwares([]); } finally { setLoading(false); } }, []); useEffect(() => { setSerialOk(supportsWebSerial()); void load(); }, [load]); const filtered = useMemo(() => { const q = query.trim().toLowerCase(); return firmwares.filter((fw) => { if (fw.boardId !== boardId) return false; if (!q) return true; const hay = [ fw.name, fw.summary, fw.description, fw.project, fw.variant, ...fw.tags, ] .filter(Boolean) .join(" ") .toLowerCase(); return hay.includes(q); }); }, [firmwares, boardId, query]); useEffect(() => { if (selectedId && filtered.some((f) => f.id === selectedId)) return; setSelectedId(filtered[0]?.id ?? null); }, [filtered, selectedId]); const selected = filtered.find((f) => f.id === selectedId) ?? null; return (
{!serialOk && (

{t("browser.unsupported")}

)} { setBoardId(id); setQuery(""); }} />

{t("firmware.title")}

{t("firmware.count", { count: filtered.length })}

{loading && !firmwares.length && (

{t("firmware.scanning")}

)} {error && (

{t("firmware.error", { message: error })}

)} {!loading && !error && !filtered.length && (

{t("firmware.empty")}

)}
{filtered.map((fw) => ( setSelectedId(fw.id)} /> ))}
); }