/** * Dashboard.tsx * * @author Descomplicar® Crescimento Digital * @link https://descomplicar.pt * @copyright 2025 Descomplicar® */ import React, { useState, useCallback } from 'react'; import { mockEmails } from '../data/mockEmails'; import { classifyEmails } from '../services/geminiService'; import { deleteTicketsFromSendersInPerfex } from '../services/perfexCrmService'; import type { CategorizedEmails, CrmSettings } from '../types'; import { EmailCategory } from '../types'; import EmailCategoryCard from './EmailCategoryCard'; import Spinner from './Spinner'; import ConfirmationModal from './ConfirmationModal'; interface DashboardProps { crmSettings: CrmSettings; isAutoCleanEnabled: boolean; apiKey: string; } const Dashboard: React.FC = ({ crmSettings, isAutoCleanEnabled, apiKey }) => { const [isScanning, setIsScanning] = useState(false); const [categorizedEmails, setCategorizedEmails] = useState(null); const [error, setError] = useState(null); const [isConfirmModalOpen, setIsConfirmModalOpen] = useState(false); const [categoryToDelete, setCategoryToDelete] = useState<{name: string; count: number} | null>(null); const [ticketDeletionStatus, setTicketDeletionStatus] = useState<{ message: string; type: 'success' | 'error' } | null>(null); const handleScanInbox = useCallback(async () => { setCategorizedEmails(null); setIsScanning(true); setError(null); setTicketDeletionStatus(null); try { const result = await classifyEmails(mockEmails, apiKey); setCategorizedEmails(result); if (crmSettings.autoDeleteTickets && crmSettings.url && crmSettings.token) { const spamAndNotificationEmails = [ ...(result[EmailCategory.SPAM]?.emails || []), ...(result[EmailCategory.NOTIFICATIONS]?.emails || []) ]; const senderEmails = [...new Set(spamAndNotificationEmails.map(email => email.sender))]; if (senderEmails.length > 0) { try { const deletedCount = await deleteTicketsFromSendersInPerfex(crmSettings, senderEmails); if (deletedCount > 0) { setTicketDeletionStatus({ message: `${deletedCount} tickets de spam/notificações foram excluídos do CRM.`, type: 'success' }); } } catch (err) { setTicketDeletionStatus({ message: (err as Error).message, type: 'error' }); } } } } catch (err) { console.error(err); setError('Falha ao analisar a caixa de entrada. A chave de API do Gemini pode estar ausente ou inválida.'); } finally { setIsScanning(false); } }, [crmSettings, apiKey]); const handleClearCategory = (category: string, emailCount: number) => { setCategoryToDelete({ name: category, count: emailCount }); setIsConfirmModalOpen(true); }; const confirmClearCategory = () => { if(!categorizedEmails || !categoryToDelete) return; const newCategories = { ...categorizedEmails }; delete newCategories[categoryToDelete.name]; setCategorizedEmails(newCategories); setIsConfirmModalOpen(false); setCategoryToDelete(null); }; const getGreeting = () => { const hour = new Date().getHours(); if (hour < 12) return 'Bom dia'; if (hour < 18) return 'Boa tarde'; return 'Boa noite'; } const TicketDeletionToast = () => { if (!ticketDeletionStatus) return null; const isSuccess = ticketDeletionStatus.type === 'success'; return (

{ticketDeletionStatus.message}

); }; return ( <>

{getGreeting()}, Usuário!

{isAutoCleanEnabled ? 'A limpeza automática está ativa e a ser executada no servidor.' : 'Vamos organizar sua caixa de entrada.'}

{isAutoCleanEnabled ? (

Automação Ativa

Sua caixa de entrada é verificada em segundo plano a cada 2 horas.

) : (

Pronto para começar?

Clique para que a IA analise e organize sua caixa de entrada.

)} {isScanning && !categorizedEmails &&(

A IA está analisando seus e-mails...

)} {error && (

Oops! Algo deu errado.

{error}

)} {categorizedEmails && Object.keys(categorizedEmails).length > 0 && (
{Object.entries(categorizedEmails).map(([category, data]) => ( handleClearCategory(category, data.emails.length)} /> ))}
)} {categorizedEmails && Object.keys(categorizedEmails).length === 0 && !isScanning && (

Caixa de entrada limpa!

Você limpou todos os e-mails acionáveis.

)}
setIsConfirmModalOpen(false)} onConfirm={confirmClearCategory} categoryName={categoryToDelete?.name || ''} emailCount={categoryToDelete?.count || 0} /> ); }; export default Dashboard;