import { router, Stack, useLocalSearchParams } from "expo-router"; import { useMemo, useState } from "react"; import { Alert, KeyboardAvoidingView, Platform, ScrollView, StyleSheet, Text, View, } from "react-native"; import { AppBackground } from "@/components/AppBackground"; import { InvoicePdfPreview } from "@/components/invoices/InvoicePdfPreview"; import { LoadingScreen } from "@/components/LoadingScreen"; import { Button } from "@/components/ui/Button"; import { Card } from "@/components/ui/Card"; import { Input } from "@/components/ui/Input"; import { fonts, spacing } from "@/constants/theme"; import { useAppTheme } from "@/contexts/ThemeContext"; import { formatCurrency, formatDate } from "@/lib/format"; import { getInvoiceStatus } from "@/lib/invoice-status"; import { buildPreviewPdfInputFromInvoice } from "@/lib/invoice-pdf-input"; import { useTabBarScrollPadding } from "@/lib/tab-bar-insets"; import type { ThemeColors } from "@/lib/theme-palette"; import { useThemedStyles } from "@/lib/use-themed-styles"; import { api } from "@/lib/trpc"; export default function InvoiceSendScreen() { const { colors } = useAppTheme(); const styles = useThemedStyles(createSendStyles); const { id } = useLocalSearchParams<{ id: string }>(); const utils = api.useUtils(); const scrollPadding = useTabBarScrollPadding(); const [customMessage, setCustomMessage] = useState(""); const invoiceQuery = api.invoices.getById.useQuery( { id: id ?? "" }, { enabled: Boolean(id) }, ); const sendInvoice = api.email.sendInvoice.useMutation({ onSuccess: (data) => { void utils.invoices.getById.invalidate({ id: id ?? "" }); void utils.invoices.getAll.invalidate(); void utils.dashboard.getStats.invalidate(); Alert.alert("Invoice sent", data.message, [ { text: "OK", onPress: () => router.replace(`/(app)/invoices/${id}`) }, ]); }, onError: (err) => Alert.alert("Could not send invoice", err.message), }); const invoice = invoiceQuery.data; const previewInput = useMemo( () => (invoice ? buildPreviewPdfInputFromInvoice(invoice) : null), [invoice], ); if (!id) { return ; } if (invoiceQuery.isLoading) { return ; } if (!invoice) { return ; } const status = getInvoiceStatus(invoice); const clientEmail = invoice.client?.email?.trim() ?? ""; const businessName = invoice.business?.name ?? "Your business"; const sendLabel = status === "draft" ? "Send invoice" : "Resend invoice"; function handleSend() { if (!clientEmail) { Alert.alert( "No client email", "Add an email address to this client on the web app before sending invoices.", ); return; } if (invoice.items.length === 0) { Alert.alert( "No line items", "Add line items or clock time to this invoice before sending.", ); return; } sendInvoice.mutate({ invoiceId: invoice!.id, customMessage: customMessage.trim() || undefined, }); } return ( Optional note included in the email body.