import React, { useState, useEffect } from 'react'; // Componente principal da aplicação const App = () => { // Estado para armazenar os dados da planilha // Cada item no array é uma linha da planilha const [rows, setRows] = useState([ { id: 1, nome: 'João Silva', valorMensal: 150.00, dataAcerto: '2025-07-05', categoriaSugerida: '' }, { id: 2, nome: 'Maria Souza', valorMensal: 200.50, dataAcerto: '2025-07-10', categoriaSugerida: '' }, { id: 3, nome: 'Pedro Santos', valorMensal: 75.00, dataAcerto: '2025-07-15', categoriaSugerida: '' }, ]); // Estado para armazenar o valor total mensal const [totalMensal, setTotalMensal] = useState(0); // Estado para controlar o carregamento da sugestão de categoria const [loadingSuggestionId, setLoadingSuggestionId] = useState(null); // useEffect para recalcular o total sempre que as linhas mudarem useEffect(() => { const sum = rows.reduce((acc, row) => acc + (parseFloat(row.valorMensal) || 0), 0); setTotalMensal(sum); }, [rows]); // Dependência: recalcula quando 'rows' é alterado // Função para adicionar uma nova linha à planilha const addRow = () => { const newId = rows.length > 0 ? Math.max(...rows.map(row => row.id)) + 1 : 1; setRows([...rows, { id: newId, nome: '', valorMensal: 0, dataAcerto: '', categoriaSugerida: '' }]); }; // Função para deletar uma linha da planilha const deleteRow = (id) => { setRows(rows.filter(row => row.id !== id)); }; // Função para lidar com a mudança de valores nos inputs const handleChange = (id, field, value) => { setRows(rows.map(row => row.id === id ? { ...row, [field]: value } : row )); }; // Função para chamar a API do Gemini e sugerir uma categoria const suggestCategory = async (id, nome, valorMensal) => { setLoadingSuggestionId(id); // Define o ID da linha que está carregando try { const prompt = `Dado o item '${nome}' com valor '${valorMensal}', qual seria uma categoria financeira adequada (ex: Moradia, Alimentação, Transporte, Lazer, Contas Fixas, Educação, Saúde, Outros)? Responda apenas com a categoria.`; let chatHistory = []; chatHistory.push({ role: "user", parts: [{ text: prompt }] }); const payload = { contents: chatHistory }; const apiKey = ""; // A chave da API será fornecida em tempo de execução pelo Canvas const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`; const response = await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await response.json(); if (result.candidates && result.candidates.length > 0 && result.candidates[0].content && result.candidates[0].content.parts && result.candidates[0].content.parts.length > 0) { const text = result.candidates[0].content.parts[0].text; // Atualiza a linha com a categoria sugerida setRows(rows.map(row => row.id === id ? { ...row, categoriaSugerida: text.trim() } : row )); } else { console.error("Estrutura de resposta inesperada da API Gemini:", result); // Opcional: exibir mensagem de erro para o usuário } } catch (error) { console.error("Erro ao chamar a API Gemini:", error); // Opcional: exibir mensagem de erro para o usuário } finally { setLoadingSuggestionId(null); // Remove o estado de carregamento } }; return (

Minha Planilha de Controle Financeiro

{/* Seção da Planilha Principal */}
{rows.map((row) => ( ))}
NOME VALOR MENSAL DATA DE ACERTO CATEGORIA SUGERIDA AÇÕES
handleChange(row.id, 'nome', e.target.value)} className="w-full p-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-400 focus:border-transparent" placeholder="Nome" /> handleChange(row.id, 'valorMensal', e.target.value)} className="w-full p-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-400 focus:border-transparent" placeholder="0.00" /> handleChange(row.id, 'dataAcerto', e.target.value)} className="w-full p-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-400 focus:border-transparent" />
{row.categoriaSugerida || 'N/A'}
{/* Botão para adicionar nova linha */}
{/* Seção de Resumo (Total) */}

Resumo Geral

VALOR TOTAL MENSAL: R$ {totalMensal.toFixed(2)}
); }; export default App;