Update metricQueryHelpers.ts

This commit is contained in:
Nate Kelley 2025-04-17 09:54:57 -06:00
parent 9068ebd5d3
commit de77bc15e3
No known key found for this signature in database
GPG Key ID: FD90372AB8D98B4F
1 changed files with 24 additions and 20 deletions

View File

@ -57,7 +57,7 @@ const getLatestVersionNumber = (queries: [readonly unknown[], IBusterMetric | un
const lastVersion = last(data.versions); const lastVersion = last(data.versions);
const version = Number(lastVersion?.version_number); const version = Number(lastVersion?.version_number);
if (!isNaN(version)) { if (!isNaN(version)) {
latestVersion = Math.max(latestVersion, version, data.version_number); latestVersion = Math.max(latestVersion, version);
} }
} }
} }
@ -67,34 +67,38 @@ const getLatestVersionNumber = (queries: [readonly unknown[], IBusterMetric | un
const useGetLatestMetricVersion = ({ metricId }: { metricId: string }) => { const useGetLatestMetricVersion = ({ metricId }: { metricId: string }) => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const [cacheVersion, setCacheVersion] = useState(0); // To force re-renders on relevant cache changes const [latestVersion, setLatestVersion] = useState<number | null>(null);
const memoizedKey = useMemo(() => { const memoizedKey = useMemo(() => {
return metricsQueryKeys.metricsGetMetric(metricId, null).queryKey.slice(0, -1); return metricsQueryKeys.metricsGetMetric(metricId, null).queryKey.slice(0, -1);
}, [metricId]); }, [metricId]);
const subscribeMethod = useMemoizedFn((event: QueryCacheNotifyEvent) => { const updateLatestVersion = useMemoizedFn(() => {
if (
event.type === 'updated' &&
event.query.queryKey[2] === last(memoizedKey) &&
event.query.queryKey[1] === memoizedKey[1]
) {
setCacheVersion((prev) => prev + 1);
}
});
useEffect(() => {
const unsubscribe = queryClient.getQueryCache().subscribe(subscribeMethod);
return () => unsubscribe();
}, [memoizedKey]);
const latestVersion = useMemo(() => {
const queries = queryClient.getQueriesData<IBusterMetric, any>({ const queries = queryClient.getQueriesData<IBusterMetric, any>({
queryKey: memoizedKey, queryKey: memoizedKey,
predicate: filterMetricPredicate predicate: filterMetricPredicate
}); });
return getLatestVersionNumber(queries); const newVersion = getLatestVersionNumber(queries);
}, [memoizedKey, cacheVersion]); setLatestVersion(newVersion);
});
useEffect(() => {
// Initial computation
updateLatestVersion();
// Subscribe to cache updates
const unsubscribe = queryClient.getQueryCache().subscribe((event) => {
if (
event.type === 'updated' &&
event.query.queryKey[2] === last(memoizedKey) &&
event.query.queryKey[1] === memoizedKey[1]
) {
updateLatestVersion();
}
});
return () => unsubscribe();
}, [memoizedKey, updateLatestVersion]);
return latestVersion; return latestVersion;
}; };