import { RefreshControl, StyleSheet, Text, View } from "react-native"; import { AppBackground } from "@/components/AppBackground"; import { LoadingScreen } from "@/components/LoadingScreen"; import { PageHeader } from "@/components/PageHeader"; import { StatCard } from "@/components/StatCard"; import { TabPage } from "@/components/TabPage"; import { TabScrollView } from "@/components/TabScrollView"; import { Card } from "@/components/ui/Card"; import { spacing } from "@/constants/theme"; import { useAppTheme } from "@/contexts/ThemeContext"; import { formatCurrency } from "@/lib/format"; import { formatTrpcErrorMessage } from "@/lib/trpc-errors"; import { api } from "@/lib/trpc"; export default function ReportsScreen() { const { colors } = useAppTheme(); const statsQuery = api.dashboard.getStats.useQuery(); const expensesQuery = api.expenses.getAll.useQuery(); const summaryQuery = api.timeEntries.getSummary.useQuery(); if (statsQuery.isLoading || expensesQuery.isLoading || summaryQuery.isLoading) { return ; } if (statsQuery.error) { return ( {formatTrpcErrorMessage(statsQuery.error)} ); } const stats = statsQuery.data!; const expenseTotal = (expensesQuery.data ?? []).reduce((sum, e) => sum + e.amount, 0); const summary = summaryQuery.data; return ( } refreshControl={ { void statsQuery.refetch(); void expensesQuery.refetch(); void summaryQuery.refetch(); }} tintColor={colors.primary} /> } > {(stats.statusChartData ?? []).map((item) => ( {item.name} {item.count} · {formatCurrency(item.value)} ))} {stats.revenueChartData.map((point) => ( {point.monthLabel} {formatCurrency(point.revenue)} ))} ); } const styles = StyleSheet.create({ grid: { flexDirection: "row", flexWrap: "wrap", gap: spacing.md, }, statusRow: { flexDirection: "row", justifyContent: "space-between", paddingVertical: spacing.sm, }, errorBox: { padding: spacing.lg, gap: spacing.md, }, });