42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
'use client'
|
|
|
|
import { useEffect, useState } from 'react'
|
|
import { invoices as invoicesApi, payments as paymentsApi, shopPos as shopPosApi, getApiError } from '@/lib/api/index'
|
|
import type { PaymentResponse, InvoiceResponse } from '@/types/api'
|
|
import type { InvoiceCustomer } from './invoice-template'
|
|
|
|
// Loads everything the printed invoice needs. Only the invoice is required — if payments or the
|
|
// customer details fail to load, that block is simply left out.
|
|
export function useInvoiceDocument(invoiceId: string | null | undefined, enabled = true) {
|
|
const [invoice, setInvoice] = useState<InvoiceResponse | null>(null)
|
|
const [payments, setPayments] = useState<PaymentResponse[]>([])
|
|
const [customer, setCustomer] = useState<InvoiceCustomer | undefined>()
|
|
const [error, setError] = useState<string | null>(null)
|
|
|
|
useEffect(() => {
|
|
if (!enabled || !invoiceId) return
|
|
let cancelled = false
|
|
setInvoice(null)
|
|
setPayments([])
|
|
setCustomer(undefined)
|
|
setError(null)
|
|
|
|
invoicesApi.get(invoiceId)
|
|
.then((inv) => {
|
|
if (cancelled) return
|
|
setInvoice(inv)
|
|
paymentsApi.listByInvoice(inv.id).then((p) => !cancelled && setPayments(p)).catch(() => {})
|
|
shopPosApi.get(inv.shopPOId)
|
|
.then((po) => !cancelled && setCustomer({ address: po.storeAddress, phone: po.storeContactNumber }))
|
|
.catch(() => {})
|
|
})
|
|
.catch((err) => !cancelled && setError(getApiError(err)))
|
|
|
|
return () => {
|
|
cancelled = true
|
|
}
|
|
}, [invoiceId, enabled])
|
|
|
|
return { invoice, payments, customer, error }
|
|
}
|