"use client"; import { useEffect, useState } from "react"; import { Check, Copy, ExternalLink } from "lucide-react"; export default function CodeExample({ framework }) { const examplesUrl = framework?.exemplos; const [sample, setSample] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [copied, setCopied] = useState(false); useEffect(() => { setSample(""); setError(null); setLoading(false); if (!framework) return; const exemploPath = framework.exemplo; if (!exemploPath) { setSample(`// Exemplos completos: ${examplesUrl || "ver repositório"}\n`); return; } const url = exemploPath.startsWith("/") ? exemploPath : `/${exemploPath}`; let cancelled = false; setLoading(true); fetch(url) .then((res) => { if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.text(); }) .then((text) => { if (cancelled) return; if (text && text.trim().length > 0) { setSample(text); } else { setSample("// O arquivo de exemplo está vazio. Consulte o repositório oficial.\n"); setError("arquivo vazio"); } }) .catch((err) => { if (cancelled) return; setSample("// Não foi possível carregar o exemplo.\n// Consulte o repositório oficial para exemplos completos.\n"); setError(err.message || "falha ao carregar"); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [framework?.exemplo, framework?.exemplos]); const lines = (sample || "").replace(/\n$/, "").split("\n"); async function handleCopy() { try { await navigator.clipboard.writeText(sample); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch {} } return (
Trecho de partida em {framework?.linguagem}. Ajuste pinos e configuração à sua placa.
{lines.map((line, idx) => (
{idx + 1}
{line || " "}
))}
Não foi possível carregar o exemplo local ({error}). Use “Mais exemplos” para ver o código oficial.
)}