File size: 2,570 Bytes
197ac2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { useEffect, useState } from "react";
import SecaoHeader from "../components/SecaoHeader.jsx";
import TrendChart from "../components/TrendChart.jsx";
import { buscarHistorico } from "../api.js";

const METRICAS = [
  ["opportunities.open_pipeline_product_value", "Pipeline (produtos)"],
  ["opportunities.open_pipeline_amount", "Pipeline (Amount)"],
  ["leads.new_leads", "Leads novos"],
  ["leads.conversion_rate", "Conversão (%)"],
  ["opportunities.won_opportunities", "Ganhas"],
  ["opportunities.stalled_opportunities", "Paradas"],
  ["tasks.tasks_overdue", "Tarefas vencidas"],
  ["satisfaction.avg_score", "Satisfação"],
];

export default function Trends() {
  const [metrica, setMetrica] = useState(METRICAS[0][0]);
  const [dias, setDias] = useState(7);
  const [serie, setSerie] = useState([]);
  const [status, setStatus] = useState("Carregando série do banco…");

  async function carregar() {
    setStatus("Carregando do Turso…");
    try {
      const d = await buscarHistorico(dias);
      const lista = d.days || [];
      setSerie(lista);
      setStatus(lista.length ? `${lista.length} dia(s) · ${METRICAS.find((m) => m[0] === metrica)?.[1]}` : "Sem dados salvos ainda — rode o agente em alguns dias.");
    } catch (e) {
      setStatus("Falha: " + e.message);
    }
  }

  useEffect(() => {
    carregar();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  return (
    <div className="card">
      <SecaoHeader
        icone="📈"
        titulo="Tendências (histórico do Turso)"
        cor="#8b5cf6"
        extra={
          <span style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
            <select className="sel" value={metrica} onChange={(e) => setMetrica(e.target.value)}>
              {METRICAS.map(([v, l]) => (
                <option key={v} value={v}>
                  {l}
                </option>
              ))}
            </select>
            <select className="sel" value={dias} onChange={(e) => setDias(Number(e.target.value))}>
              <option value={7}>7 dias</option>
              <option value={14}>14 dias</option>
              <option value={30}>30 dias</option>
            </select>
            <button className="btn btn-ghost btn-sm" onClick={carregar}>
              Carregar
            </button>
          </span>
        }
      />
      <TrendChart dias={serie} metrica={metrica} rotulo={METRICAS.find((m) => m[0] === metrica)?.[1] || metrica} />
      <div className="empty" style={{ padding: 12 }}>
        {status}
      </div>
    </div>
  );
}