Prefetching views and favorites (#4421)
* wip * Push * Complete work on prefetch * Add comment * Fix * Fix * Fix * Fix * Remove dead code * Simplify * Fix tests * Fix tests * Fix according to review * Fix according to review --------- Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
@ -0,0 +1,55 @@
|
||||
import { useSetRecoilState } from 'recoil';
|
||||
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { useUpsertFindManyRecordsQueryInCache } from '@/object-record/cache/hooks/useUpsertFindManyRecordsQueryInCache';
|
||||
import { useMapConnectionToRecords } from '@/object-record/hooks/useMapConnectionToRecords';
|
||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||
import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection';
|
||||
import { ALL_VIEWS_QUERY_KEY } from '@/prefetch/query-keys/AllViewsQueryKey';
|
||||
import { prefetchIsLoadedFamilyState } from '@/prefetch/states/prefetchIsLoadedFamilyState';
|
||||
import { PrefetchKey } from '@/prefetch/types/PrefetchKey';
|
||||
|
||||
export type UsePrefetchRunQuery = {
|
||||
prefetchKey: PrefetchKey;
|
||||
objectNameSingular: CoreObjectNameSingular;
|
||||
};
|
||||
|
||||
export const usePrefetchRunQuery = <T extends ObjectRecord>({
|
||||
prefetchKey,
|
||||
objectNameSingular,
|
||||
}: UsePrefetchRunQuery) => {
|
||||
const setPrefetchDataIsLoadedLoaded = useSetRecoilState(
|
||||
prefetchIsLoadedFamilyState(prefetchKey),
|
||||
);
|
||||
const { objectMetadataItem } = useObjectMetadataItem({
|
||||
objectNameSingular: objectNameSingular,
|
||||
});
|
||||
|
||||
const { upsertFindManyRecordsQueryInCache } =
|
||||
useUpsertFindManyRecordsQueryInCache({
|
||||
objectMetadataItem: objectMetadataItem,
|
||||
});
|
||||
|
||||
const mapConnectionToRecords = useMapConnectionToRecords();
|
||||
|
||||
const upsertRecordsInCache = (records: ObjectRecordConnection<T>) => {
|
||||
upsertFindManyRecordsQueryInCache({
|
||||
queryVariables: ALL_VIEWS_QUERY_KEY.variables,
|
||||
depth: ALL_VIEWS_QUERY_KEY.depth,
|
||||
objectRecordsToOverwrite:
|
||||
mapConnectionToRecords({
|
||||
objectRecordConnection: records,
|
||||
objectNameSingular: CoreObjectNameSingular.View,
|
||||
depth: 2,
|
||||
}) ?? [],
|
||||
});
|
||||
setPrefetchDataIsLoadedLoaded(true);
|
||||
};
|
||||
|
||||
return {
|
||||
objectMetadataItem,
|
||||
setPrefetchDataIsLoadedLoaded,
|
||||
upsertRecordsInCache,
|
||||
};
|
||||
};
|
||||
@ -0,0 +1,27 @@
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
|
||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||
import { PREFETCH_CONFIG } from '@/prefetch/constants/PrefetchConfig';
|
||||
import { prefetchIsLoadedFamilyState } from '@/prefetch/states/prefetchIsLoadedFamilyState';
|
||||
import { PrefetchKey } from '@/prefetch/types/PrefetchKey';
|
||||
|
||||
export const usePrefetchedData = <T extends ObjectRecord>(
|
||||
prefetchKey: PrefetchKey,
|
||||
) => {
|
||||
const isDataPrefetched = useRecoilValue(
|
||||
prefetchIsLoadedFamilyState(prefetchKey),
|
||||
);
|
||||
const prefetchQueryKey = PREFETCH_CONFIG[prefetchKey];
|
||||
|
||||
const { records } = useFindManyRecords<T>({
|
||||
skip: !isDataPrefetched,
|
||||
...prefetchQueryKey,
|
||||
useRecordsWithoutConnection: true,
|
||||
});
|
||||
|
||||
return {
|
||||
isDataPrefetched,
|
||||
records,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user