'use client'; import type { DeadlineDto } from '@impuestos/contracts'; import { formatDateLong, type Locale } from '@impuestos/i18n'; import { deadlineDay } from '@impuestos/rules'; import { useQuery } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Skeleton } from '@/components/ui/skeleton'; import { useT } from '@/i18n/t'; import { api } from '@/lib/api'; import { cn } from '@/lib/utils'; /** Flow E2: a vertical timeline of everything coming, with the day rule explained. */ export function DeadlinesScreen({ locale }: { locale: string }) { const t = useT(); const profile = useQuery({ queryKey: ['me'], queryFn: ({ signal }) => api.getProfile(signal) }); const deadlines = useQuery({ queryKey: ['deadlines'], queryFn: ({ signal }) => api.getUpcomingDeadlines(12, signal), }); return (

{t('vto.title')}

{profile.data ? (

{t('vto.explainer', { digit: profile.data.deadlineDigit, day: deadlineDay(profile.data.deadlineDigit), })}

) : null} {deadlines.isPending ? ( ) : null} {deadlines.isError ? (

{t('common.error.generic')}

) : null} {deadlines.data?.length === 0 ? (

{t('vto.empty')}

) : null} {deadlines.data && deadlines.data.length > 0 ? (
    {deadlines.data.map((deadline) => (
  1. ))}
) : null}
); } function DeadlineRow({ deadline, locale }: { deadline: DeadlineDto; locale: Locale }) { const t = useT(); const days = daysUntil(deadline.dueDate); return (

{t(`obligation.${deadline.obligation}` as const)}

{deadline.period}

{formatDateLong(locale, deadline.dueDate)}

{deadline.status !== 'done' ? (

{days === 0 ? t('vto.today') : days > 0 ? t('vto.daysLeft', { days }) : t('vto.daysLate', { days: Math.abs(days) })}

) : null}
); } /** Overdue is the only thing that earns red (FLOWS.md section 1). */ function DeadlinePill({ status, label }: { status: DeadlineDto['status']; label: string }) { return ( {label} ); } function daysUntil(isoDate: string): number { const today = new Date(); const startOfToday = Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate()); return Math.round((Date.parse(`${isoDate}T00:00:00Z`) - startOfToday) / 86_400_000); }