import { motion } from 'framer-motion';
import { Building2, ListChecks, AlertTriangle, CheckCircle, Clock, Wrench, FileText, BookOpen, LogOut } from 'lucide-react';
import { Link } from 'react-router-dom';
import { ThemeToggle } from '../components/ThemeToggle';
import { useAuthContext } from '../contexts/AuthContext';
import { useCurrentUser } from '../stores/useUserStore';
import { useState, useEffect } from 'react';
import { supabase } from '../lib/supabase';
const getProgressColor = (progress: number) => {
if (progress >= 80) return 'bg-green-500';
if (progress >= 50) return 'bg-yellow-500';
return 'bg-red-500';
};
// Componente isolado para a barra de progresso para evitar alertas de linter sobre style inline
const ProgressBar = ({ progress, colorClass }: { progress: number, colorClass: string }) => {
return (
{
if (el) el.style.width = `${progress}%`;
}}
className={`h-2 rounded-full ${colorClass}`}
/>
);
};
export default function Dashboard() {
const currentUser = useCurrentUser();
const { logout } = useAuthContext();
const [showLogoutConfirm, setShowLogoutConfirm] = useState(false);
const [organizationName, setOrganizationName] = useState
('Carregando...');
// States for real data
const [obras, setObras] = useState([]);
const [tarefas, setTarefas] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function fetchData() {
if (!currentUser?.organizacao_id) return;
try {
setLoading(true);
// Fetch Organization Name
const { data: orgData, error: orgError } = await supabase
.from('organizacoes')
.select('nome')
.eq('id', currentUser.organizacao_id)
.single();
if (orgData && !orgError) {
setOrganizationName(orgData.nome);
} else {
// Fallback or error handling
console.error('Error fetching org name:', orgError);
setOrganizationName(orgError ? 'Erro' : 'Não identificada');
}
// Fetch Obras (Active)
const { data: obrasData, error: obrasError } = await supabase
.from('obras')
.select('*')
.eq('organizacao_id', currentUser.organizacao_id)
.neq('status', 'cancelada') // Show active, paused, finished but maybe filter more in UI
.order('progresso_geral', { ascending: false })
.limit(5);
if (obrasError) {
console.error('Error fetching obras:', obrasError);
}
if (obrasData) {
setObras(obrasData);
}
// Fetch My Pending Tasks (Assignments for current user)
// If current user is admin, maybe show all pending? For now stick to assigned.
const { data: tarefasData, error: tarefasError } = await supabase
.from('tarefas')
.select(`
*,
obra:obras(nome)
`)
.eq('organizacao_id', currentUser.organizacao_id)
.eq('responsavel_id', currentUser.id)
.in('status', ['pendente', 'em_andamento', 'atrasada'])
.order('data_fim', { ascending: true })
.limit(5);
if (tarefasError) {
console.error('Error fetching tarefas:', tarefasError);
}
if (tarefasData) {
setTarefas(tarefasData);
}
} catch (err) {
console.error('Error loading dashboard data:', err);
} finally {
setLoading(false);
}
}
fetchData();
}, [currentUser]);
const handleLogout = async () => {
await logout();
};
return (
<>
Dashboard
Bem-vindo, {currentUser?.nome || 'Usuário'}, à empresa {organizationName}!
Manual
{/* Modal de confirmação de logout */}
{showLogoutConfirm && (
Deseja sair?
Você será desconectado da sua conta.
)}
{/* Acesso Rápido */}
Acesso Rápido
Novo RDO
Nova Obra
0 ? `/obra/${obras[0].id}/tarefas` : '/cadastros/obras'}
className={`flex flex-col items-center justify-center p-4 bg-green-100 dark:bg-green-900/30 rounded-2xl text-green-700 dark:text-green-300 hover:bg-green-200 dark:hover:bg-green-900/50 transition-colors ${loading ? 'opacity-50 pointer-events-none' : ''}`}
>
Apontar Tarefa
Configurar
{/* Avisos Importantes */}
Avisos Importantes
Segurança
EPIs da equipe de montagem precisam de inspeção.
Prazo Apertado
Entrega da estrutura do Setor B vence em 3 dias.
{/* Minhas Tarefas */}
Minhas Tarefas Pendentes
{loading ? (
Carregando tarefas...
) : tarefas.length === 0 ? (
Nenhuma tarefa pendente encontrada.
) : (
tarefas.map(tarefa => (
{tarefa.titulo}
{tarefa.obra?.nome || 'Obra não def.'} - {tarefa.data_fim ? new Date(tarefa.data_fim).toLocaleDateString() : 'Sem prazo'}
{/* Link to obra tasks */}
Ver
))
)}
{/* Obras em Andamento */}
Obras em Andamento
Ver todas
{loading ? (
Carregando obras...
) : obras.length === 0 ? (
Nenhuma obra ativa encontrada.
) : (
obras.map(obra => (
{obra.nome}
{Number(obra.progresso_geral || 0).toFixed(0)}%
))
)}
>
);
}