47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
|
|
import { datasetsApi } from '../services/api'
|
|
import type { SourceFreshnessReport } from '../types'
|
|
|
|
export function useSourceFreshness(selectedProjectId: string | null) {
|
|
const [report, setReport] = useState<SourceFreshnessReport | null>(null)
|
|
const [loading, setLoading] = useState(false)
|
|
const [error, setError] = useState<string | null>(null)
|
|
const requestSequence = useRef(0)
|
|
|
|
const refresh = useCallback(async () => {
|
|
const requestId = ++requestSequence.current
|
|
if (!selectedProjectId) {
|
|
setReport(null)
|
|
setError(null)
|
|
setLoading(false)
|
|
return
|
|
}
|
|
setLoading(true)
|
|
setError(null)
|
|
try {
|
|
const nextReport = await datasetsApi.sourceFreshness(selectedProjectId)
|
|
if (requestSequence.current === requestId) {
|
|
setReport(nextReport)
|
|
}
|
|
} catch (caught) {
|
|
if (requestSequence.current === requestId) {
|
|
setError(caught instanceof Error ? caught.message : 'De broncontrole kon niet worden geladen.')
|
|
}
|
|
} finally {
|
|
if (requestSequence.current === requestId) {
|
|
setLoading(false)
|
|
}
|
|
}
|
|
}, [selectedProjectId])
|
|
|
|
useEffect(() => {
|
|
void refresh()
|
|
return () => {
|
|
requestSequence.current += 1
|
|
}
|
|
}, [refresh])
|
|
|
|
return { report, loading, error, refresh }
|
|
}
|