import {useEffect} from 'react' import {useEvent} from './use-event' import {usePersistentInMemoryState} from './use-persistent-in-memory-state' const promiseCache: Record | undefined> = {} export const useGetter = ( key: string, props: P | undefined, getter: (params: P) => Promise, ) => { const propsString = JSON.stringify(props) const fullKey = `getter-${key}-${propsString}` const [data, setData] = usePersistentInMemoryState(undefined, fullKey) const refresh = useEvent(async () => { if (props === undefined) return let data: any if (promiseCache[fullKey]) { data = await promiseCache[fullKey] } else { const promise = getter(props) promiseCache[fullKey] = promise data = await promise promiseCache[fullKey] = undefined } setData(data) }) useEffect(() => { refresh() }, [propsString]) return {data, refresh} }