import { router, Stack, useLocalSearchParams } from "expo-router"; import { useMemo, useState } from "react"; import { Alert, Platform, Pressable, ScrollView, StyleSheet, Text, View } from "react-native"; import { AppBackground } from "@/components/AppBackground"; import { InvoiceEditorSectionTabs, type InvoiceEditorSection, } from "@/components/invoices/InvoiceEditorSectionTabs"; import { InvoicePdfPreview } from "@/components/invoices/InvoicePdfPreview"; import { InvoiceTotals } from "@/components/invoices/InvoiceTotals"; import { LoadingScreen } from "@/components/LoadingScreen"; import { StatusBadge } from "@/components/StatusBadge"; import { Button } from "@/components/ui/Button"; import { Card } from "@/components/ui/Card"; import { fonts, spacing } from "@/constants/theme"; import { useAppTheme } from "@/contexts/ThemeContext"; import { formatCurrency, formatDate } from "@/lib/format"; import type { ThemeColors } from "@/lib/theme-palette"; import { useThemedStyles } from "@/lib/use-themed-styles"; import { getInvoiceStatus, type InvoiceStatus } from "@/lib/invoice-status"; import { buildPreviewPdfInputFromInvoice } from "@/lib/invoice-pdf-input"; import { useTabBarScrollPadding } from "@/lib/tab-bar-insets"; import { api } from "@/lib/trpc"; export default function InvoiceDetailScreen() { const { colors } = useAppTheme(); const styles = useThemedStyles(createInvoiceDetailStyles); const { id } = useLocalSearchParams<{ id: string }>(); const utils = api.useUtils(); const scrollPadding = useTabBarScrollPadding(); const [section, setSection] = useState("edit"); const invoiceQuery = api.invoices.getById.useQuery( { id: id ?? "" }, { enabled: Boolean(id) }, ); const updateStatus = api.invoices.updateStatus.useMutation({ onSuccess: () => { void utils.invoices.getById.invalidate({ id: id ?? "" }); void utils.invoices.getAll.invalidate(); void utils.dashboard.getStats.invalidate(); }, onError: (err) => Alert.alert("Update failed", err.message), }); const sendInvoice = api.email.sendInvoice.useMutation({ onSuccess: (data) => { Alert.alert("Invoice sent", data.message); void utils.invoices.getById.invalidate({ id: id ?? "" }); void utils.invoices.getAll.invalidate(); void utils.dashboard.getStats.invalidate(); }, onError: (err) => Alert.alert("Could not send invoice", err.message), }); const sendPaymentReminder = api.invoices.sendReminder.useMutation({ onSuccess: () => { Alert.alert("Reminder sent", "Payment reminder emailed to the client."); void utils.invoices.getById.invalidate({ id: id ?? "" }); }, onError: (err) => Alert.alert("Could not send reminder", err.message), }); if (!id) { return ; } if (invoiceQuery.isLoading) { return ; } if (invoiceQuery.error || !invoiceQuery.data) { return ( Could not load invoice {invoiceQuery.error?.message ?? "Invoice not found"}