Files
tickte-system/src/hooks/useOpenInvoices.js
T

39 lines
1.6 KiB
JavaScript

import { useEffect, useState } from 'react'
import { getInvoices } from '../lib/financeApi'
import { invoiceFilterStatuses, mergeInvoiceLists } from '../lib/financeView'
const FALLBACK_ERROR = 'Die offenen Rechnungen konnten nicht geladen werden.'
/**
* Offene und überfällige Rechnungen für den Zuordnen-Dialog. Lädt jedes Mal frisch, wenn `active` true wird
* (damit der Dialog nie auf einem alten Stand arbeitet), und leert die Liste, wenn es wieder false ist.
* `loaded` ist true, sobald die Liste dieser Öffnung frisch und ohne Fehler da ist (erst dann darf der Dialog eine
* Rechnung als „nicht mehr offen“ erkennen). Scheitert Stripe, bleibt `invoices` leer und `error` nennt den Grund
* (Kategorien lassen sich trotzdem wählen).
*/
export function useOpenInvoices(active) {
const [state, setState] = useState({ invoices: [], loading: false, error: '', loaded: false })
useEffect(() => {
if (!active) {
setState({ invoices: [], loading: false, error: '', loaded: false })
return undefined
}
let cancelled = false
setState({ invoices: [], loading: true, error: '', loaded: false })
Promise.all(invoiceFilterStatuses('offen').map((status) => getInvoices({ status })))
.then((results) => {
if (cancelled) return
setState({ invoices: mergeInvoiceLists(results.map((r) => r?.rechnungen)), loading: false, error: '', loaded: true })
})
.catch((err) => {
if (!cancelled) setState({ invoices: [], loading: false, error: err?.message || FALLBACK_ERROR, loaded: false })
})
return () => {
cancelled = true
}
}, [active])
return state
}