← back to Trademarks Copyright

src/components/SwotPanel.tsx

63 lines

"use client";
import { useState } from "react";

type Quad = { quadrant: string; content: string };
const COLORS: Record<string, string> = {
  strength: "bg-green-50 border-green-300",
  weakness: "bg-red-50 border-red-300",
  opportunity: "bg-blue-50 border-blue-300",
  threat: "bg-amber-50 border-amber-300",
};

export default function SwotPanel({ itemId }: { itemId: number }) {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const [quadrants, setQuadrants] = useState<Quad[]>([]);
  const [ran, setRan] = useState(false);

  async function run(force = false) {
    setLoading(true); setError(null);
    try {
      const r = await fetch("/api/swot", {
        method: "POST",
        headers: { "content-type": "application/json" },
        body: JSON.stringify({ itemId, force }),
      });
      const j = await r.json();
      if (!r.ok) throw new Error(j.error || `HTTP ${r.status}`);
      setQuadrants(j.quadrants || []);
      setRan(true);
    } catch (e: unknown) {
      setError(e instanceof Error ? e.message : String(e));
    } finally {
      setLoading(false);
    }
  }

  const byQ = (q: string) => quadrants.find((x) => x.quadrant === q)?.content ?? "";

  return (
    <div>
      <div className="mb-3 flex items-center gap-2">
        <button className="btn" disabled={loading} onClick={() => run(false)}>
          {loading ? "Running 4 agents…" : ran ? "Reload SWOT" : "Run SWOT (4 agents)"}
        </button>
        {ran && (
          <button className="btn-ghost" disabled={loading} onClick={() => run(true)}>Re-run fresh</button>
        )}
      </div>
      {error && <div className="mb-2 rounded bg-red-50 p-2 text-sm text-red-700">{error}</div>}
      {ran && (
        <div className="grid grid-cols-1 gap-3 md:grid-cols-2">
          {(["strength", "weakness", "opportunity", "threat"] as const).map((q) => (
            <div key={q} className={`card border-2 p-3 ${COLORS[q]}`}>
              <div className="mb-1 text-xs font-bold uppercase tracking-wide">{q}</div>
              <pre className="whitespace-pre-wrap font-sans text-sm">{byQ(q) || "—"}</pre>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}