"use client"; import { useEffect, useState } from "react"; import { Database, Loader2, CheckCircle2, AlertTriangle, Zap } from "lucide-react"; import { Button } from "@/shared/components/ui/button"; type Step = { label: string; endpoint: string; done: boolean }; export function SetupBanner() { const [steps, setSteps] = useState([]); const [running, setRunning] = useState(""); const [error, setError] = useState(""); const [doneMsg, setDoneMsg] = useState(""); const [checking, setChecking] = useState(true); useEffect(() => { (async () => { const pending: Step[] = []; try { const vr = await fetch("/api/geoportal/setup-views").then((r) => r.json()); pending.push({ label: "View-uri UAT zoom", endpoint: "/api/geoportal/setup-views", done: vr.ready }); const or1 = await fetch("/api/geoportal/optimize-views").then((r) => r.json()); pending.push({ label: "Geometrie pre-calculata", endpoint: "/api/geoportal/optimize-views", done: or1.optimized }); const or2 = await fetch("/api/geoportal/optimize-tiles").then((r) => r.json()); pending.push({ label: "Tile-uri slim (fara JSON greu)", endpoint: "/api/geoportal/optimize-tiles", done: or2.optimized }); } catch { /* noop */ } setSteps(pending); setChecking(false); })(); }, []); const pendingSteps = steps.filter((s) => !s.done); if (checking || pendingSteps.length === 0) return null; const runAll = async () => { setError(""); for (const step of pendingSteps) { setRunning(step.label); try { const r = await fetch(step.endpoint, { method: "POST" }); const d = await r.json(); if (d.status !== "ok") { setError(`${step.label}: ${d.error ?? "Eroare"}`); setRunning(""); return; } step.done = true; } catch (e) { setError(`${step.label}: ${e instanceof Error ? e.message : "Eroare"}`); setRunning(""); return; } } setRunning(""); setDoneMsg("Optimizari aplicate. Restart Martin: docker restart martin"); setSteps([...steps]); }; if (doneMsg) { return (
{doneMsg}
); } if (error) { return (
{error}
); } return (
{running ? `Se aplica: ${running}...` : `${pendingSteps.length} optimizari necesare: ${pendingSteps.map((s) => s.label).join(", ")}`}
); }