import { useEffect, useMemo, useState } from "react"; import { AlertCircle, CalendarDays, CheckCircle2, Clock, ExternalLink, FileText, Plus } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { getStoredToken } from "@/lib/auth"; import { listCalendarItemsByRange, listCustomDates, listHolidays, type CalendarItem, type CustomDate, type Holiday, } from "@/lib/calendar"; import type { Client } from "@/lib/clients"; type ClientDashboardViewProps = { client: Client | null; selectedClientId: string; onViewChange: (view: string) => void; onPostSelect: (postId: string) => void; }; const statusLabels: Record = { rascunho: "Rascunho", planejado: "Planejado", em_producao: "Em produção", em_revisao: "Em revisão", aprovado: "Aprovado", publicado: "Publicado", cancelado: "Cancelado", }; const shortDateFormatter = new Intl.DateTimeFormat("pt-BR", { day: "2-digit", month: "short" }); const longDateFormatter = new Intl.DateTimeFormat("pt-BR", { day: "2-digit", month: "long", year: "numeric" }); export function ClientDashboardView({ client, selectedClientId, onViewChange, onPostSelect }: ClientDashboardViewProps) { const today = useMemo(() => new Date(), []); const monthStart = useMemo(() => new Date(today.getFullYear(), today.getMonth(), 1), [today]); const monthEnd = useMemo(() => new Date(today.getFullYear(), today.getMonth() + 1, 0), [today]); const [items, setItems] = useState([]); const [holidays, setHolidays] = useState([]); const [customDates, setCustomDates] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(""); const monthStartValue = formatDateValue(monthStart); const monthEndValue = formatDateValue(monthEnd); const todayValue = formatDateValue(today); const year = today.getFullYear(); useEffect(() => { const token = getStoredToken(); if (!token) return; setIsLoading(true); setError(""); Promise.all([ listCalendarItemsByRange(token, monthStartValue, monthEndValue, selectedClientId), listHolidays(token, year), listCustomDates(token, year, selectedClientId), ]) .then(([loadedItems, loadedHolidays, loadedCustomDates]) => { setItems(loadedItems); setHolidays(loadedHolidays); setCustomDates(loadedCustomDates); }) .catch((err) => { setError(err instanceof Error ? err.message : "Não foi possível carregar o dashboard do cliente."); }) .finally(() => setIsLoading(false)); }, [monthEndValue, monthStartValue, selectedClientId, year]); const visibleItems = items .filter((item) => item.status !== "cancelado") .sort((a, b) => a.scheduled_date.localeCompare(b.scheduled_date)); const upcomingItems = visibleItems.filter((item) => item.scheduled_date >= todayValue); const reviewItems = visibleItems.filter((item) => item.status === "em_revisao"); const approvedItems = visibleItems.filter((item) => item.status === "aprovado" || item.status === "publicado"); const dates = [...holidays, ...customDates] .filter((date) => date.date >= monthStartValue && date.date <= monthEndValue) .sort((a, b) => a.date.localeCompare(b.date)); if (!client) { return (
Cliente não encontrado.
); } return (

Dashboard de {client.name}

{client.status === "archived" ? "Arquivado" : "Ativo"}

Visão do cliente entre {shortDateFormatter.format(monthStart)} e {shortDateFormatter.format(monthEnd)}.

{error && (
{error}
)}
Linha do tempo de posts {isLoading &&

Carregando posts...

} {!isLoading && visibleItems.length === 0 && (

Nenhum post previsto para este mês.

)} {visibleItems.map((item) => ( ))}
Datas relevantes {dates.map((date) => (

{date.name}

{"source" in date ? "Feriado nacional" : date.category === "feriados-brasil" ? "Data comemorativa" : "Data da agência"}

{shortDateFormatter.format(parseDateValue(date.date))}
))} {dates.length === 0 && (

Nenhuma data relevante neste mês.

)}
{(client.website_url || client.instagram_url || client.facebook_url || client.linkedin_url) && ( Links do cliente )}
); } function MetricCard({ title, value, detail, emphasize = false }: { title: string; value: number; detail: string; emphasize?: boolean }) { return ( {title}
{value}

{detail}

); } function ClientLink({ label, url }: { label: string; url: string }) { if (!url) return null; return ( {label} ); } function formatDateValue(date: Date) { return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`; } function parseDateValue(value: string) { const [year, month, day] = value.split("-").map(Number); return new Date(year, month - 1, day); }