Finanzen: Offen zeigt auch Ueberfaellige, Rechnungsliste laedt nach Zuordnen neu
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1feeb18c08
commit
24a3cc41ef
6 files changed
+149
-29
No files matched your search
@@ -1,31 +1,33 @@
|
||||
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.
|
||||
* Scheitert Stripe, bleibt `invoices` leer und `error` nennt den Grund (Kategorien lassen sich trotzdem wählen).
|
||||
* `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: '' })
|
||||
const [state, setState] = useState({ invoices: [], loading: false, error: '', loaded: false })
|
||||
|
||||
useEffect(() => {
|
||||
if (!active) {
|
||||
setState({ invoices: [], loading: false, error: '' })
|
||||
setState({ invoices: [], loading: false, error: '', loaded: false })
|
||||
return undefined
|
||||
}
|
||||
let cancelled = false
|
||||
setState({ invoices: [], loading: true, error: '' })
|
||||
Promise.all([getInvoices({ status: 'offen' }), getInvoices({ status: 'ueberfaellig' })])
|
||||
.then(([open, overdue]) => {
|
||||
setState({ invoices: [], loading: true, error: '', loaded: false })
|
||||
Promise.all(invoiceFilterStatuses('offen').map((status) => getInvoices({ status })))
|
||||
.then((results) => {
|
||||
if (cancelled) return
|
||||
const all = [...(open?.rechnungen || []), ...(overdue?.rechnungen || [])]
|
||||
setState({ invoices: all, loading: false, error: '' })
|
||||
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 })
|
||||
if (!cancelled) setState({ invoices: [], loading: false, error: err?.message || FALLBACK_ERROR, loaded: false })
|
||||
})
|
||||
return () => {
|
||||
cancelled = true
|
||||
|
||||
Reference in new issue
Block a user