import { useMemo, useSyncExternalStore } from 'react';
import type { IGridReactiveValue } from './IGridReactiveValue.js';
export function useGridReactiveValue
| undefined>(
value: P,
...args: P extends IGridReactiveValue ? T : never[]
): P extends IGridReactiveValue ? T : undefined {
const mappedValue = useMemo(
() => ({
cache: null as any,
cacheInvalidated: true,
subscribe: (onValueChange: () => void) => {
if (value) {
return value.subscribe(
() => {
mappedValue.cacheInvalidated = true;
return onValueChange();
},
...args,
);
}
return () => {};
},
get: () => {
if (mappedValue.cacheInvalidated) {
mappedValue.cache = value?.get(...args);
mappedValue.cacheInvalidated = false;
}
return mappedValue.cache;
},
}),
[value, ...args],
);
return useSyncExternalStore(mappedValue.subscribe, mappedValue.get);
}