import type { Metadata } from "next"; import Link from "next/link"; import { Suspense } from "react"; import { PageHeader } from "@/components/page-header"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { SummaryCardsSkeleton } from "@/features/dashboard/components/summary-cards-skeleton"; import { DailyPlanCard } from "@/features/budgets/components/daily-plan-card"; import { BudgetWarningBanner } from "@/features/budgets/components/warning-banner"; import { getIncomePlan } from "@/features/budgets/plan"; import { getBudget } from "@/features/budgets/service"; import { ContactsDueBanner } from "@/features/contacts/components/due-banner"; import { getNetWorth } from "@/features/net-worth/service"; import { OverdueBanner } from "@/features/recurring/components/overdue-banner"; import { ShoppingCard } from "@/features/shopping/components/shopping-card"; import { LowStockCard } from "@/features/stock/components/low-stock-card"; import { tr } from "@/i18n/tr"; import { requireActiveHousehold } from "@/lib/dal"; import { cn } from "@/lib/utils"; import { formatMoney } from "@/shared/format"; export const metadata: Metadata = { title: tr.dashboard.title }; type SummaryCard = { key: keyof typeof tr.dashboard.cards; tone?: string; amountMinor: number | null; href?: string; }; /** * Özet kartları (içinde bulunulan bütçe ayı): gerçekleşen gelir, gider ve farkı; hesap bakiyesi, * kart borcu ve net varlık. */ async function getSummary(userId: string, householdId: string): Promise { const [nw, budget] = await Promise.all([ getNetWorth(userId, householdId), getBudget(userId, householdId), ]); const income = budget ? await getIncomePlan(userId, householdId, budget.month) : null; const inc = income?.actualMinor ?? null; const exp = budget?.totals.actualMinor ?? null; return [ { key: "monthIncome", tone: "text-income", amountMinor: inc, href: "/butce" }, { key: "monthExpense", tone: "text-expense", amountMinor: exp, href: "/butce" }, { key: "monthRemaining", tone: "text-budget", amountMinor: inc !== null && exp !== null ? inc - exp : null, }, { key: "totalBalance", amountMinor: nw?.accountsMinor ?? null, href: "/hesaplar" }, { key: "cardDebt", tone: "text-expense", amountMinor: nw?.cardDebtMinor ?? null }, { key: "netWorth", amountMinor: nw?.totalMinor ?? null, href: "/birikim" }, ]; } async function SummaryCards({ userId, householdId }: { userId: string; householdId: string }) { const cards = await getSummary(userId, householdId); return (
{cards.map((c) => ( {tr.dashboard.cards[c.key]} {c.amountMinor === null ? ( "—" ) : c.href ? ( {formatMoney(c.amountMinor)} ) : ( formatMoney(c.amountMinor) )} {c.amountMinor === null ? ( {tr.dashboard.noData} ) : null} ))}
); } export default async function DashboardPage() { const { user, household } = await requireActiveHousehold("viewer"); return ( <> }>
); }