|
|
|
|
|
import { useState, useEffect, useCallback, useRef } from "react"; |
|
|
|
|
|
interface SimulationOptions { |
|
|
interval?: number; |
|
|
initialDelay?: number; |
|
|
enabled?: boolean; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function useDataSimulation<T>( |
|
|
dataGenerator: () => T, |
|
|
options: SimulationOptions = {} |
|
|
) { |
|
|
const { |
|
|
interval = 2000, |
|
|
initialDelay = 500, |
|
|
enabled = true |
|
|
} = options; |
|
|
|
|
|
const [data, setData] = useState<T | null>(null); |
|
|
const [loading, setLoading] = useState(true); |
|
|
const generatorRef = useRef(dataGenerator); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
generatorRef.current = dataGenerator; |
|
|
}, [dataGenerator]); |
|
|
|
|
|
const generateData = useCallback(() => { |
|
|
return generatorRef.current(); |
|
|
}, []); |
|
|
|
|
|
useEffect(() => { |
|
|
if (!enabled) { |
|
|
setLoading(false); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const initialTimer = setTimeout(() => { |
|
|
setData(generateData()); |
|
|
setLoading(false); |
|
|
}, initialDelay); |
|
|
|
|
|
|
|
|
const intervalTimer = setInterval(() => { |
|
|
setData(generateData()); |
|
|
}, interval); |
|
|
|
|
|
return () => { |
|
|
clearTimeout(initialTimer); |
|
|
clearInterval(intervalTimer); |
|
|
}; |
|
|
}, [generateData, interval, initialDelay, enabled]); |
|
|
|
|
|
return { data, loading, refreshData: () => setData(generateData()) }; |
|
|
} |
|
|
|