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

37 lines
1.3 KiB
JavaScript

import { useCallback, useEffect, useRef, useState } from 'react'
/**
* Lädt eine Ressource der Finanzen-API (z. B. getSettings) und hält sie.
* data bleibt beim erneuten Laden stehen; error ist die Meldung des letzten fehlgeschlagenen Versuchs (leer, solange
* alles in Ordnung ist). reload() liefert ein Promise, das nie wirft; nur der jüngste Aufruf zählt.
*/
export function useFinanceResource(load, fallbackError) {
const [state, setState] = useState({ data: null, loading: true, error: '' })
const aliveRef = useRef(true)
const seqRef = useRef(0)
const loadRef = useRef(load)
loadRef.current = load
const reload = useCallback(async () => {
const mine = ++seqRef.current
const current = () => aliveRef.current && mine === seqRef.current
setState((s) => ({ ...s, loading: true, error: '' }))
try {
const data = await loadRef.current()
if (current()) setState({ data: data && typeof data === 'object' ? data : {}, loading: false, error: '' })
} catch (err) {
if (current()) setState((s) => ({ ...s, loading: false, error: err?.message || fallbackError }))
}
}, [fallbackError])
useEffect(() => {
aliveRef.current = true
reload()
return () => {
aliveRef.current = false
}
}, [reload])
return { ...state, reload }
}