Refresh of `objectmetadataitems` was not happening fast enough. Page was breaking when enabling the feature flag. Instead of not storing worklow objects in state, we will use the feature flag to block on read. This way we avoid race conditions <img width="1511" alt="Capture d’écran 2025-02-04 à 14 11 56" src="https://github.com/user-attachments/assets/912cc59a-f422-48ab-84b7-7fdd7bbc35c1" />
52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import { FIND_MANY_OBJECT_METADATA_ITEMS } from '@/object-metadata/graphql/queries';
|
|
import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient';
|
|
import { isAppWaitingForFreshObjectMetadataState } from '@/object-metadata/states/isAppWaitingForFreshObjectMetadataState';
|
|
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
|
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '@/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
|
|
import { useRecoilCallback } from 'recoil';
|
|
import { ObjectMetadataItemsQuery } from '~/generated-metadata/graphql';
|
|
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
|
|
|
type FetchPolicy = 'network-only' | 'cache-first';
|
|
|
|
export const useRefreshObjectMetadataItems = (
|
|
fetchPolicy: FetchPolicy = 'cache-first',
|
|
) => {
|
|
const client = useApolloMetadataClient();
|
|
|
|
const refreshObjectMetadataItems = async () => {
|
|
const result = await client.query<ObjectMetadataItemsQuery>({
|
|
query: FIND_MANY_OBJECT_METADATA_ITEMS,
|
|
variables: {},
|
|
fetchPolicy,
|
|
});
|
|
|
|
const objectMetadataItems =
|
|
mapPaginatedObjectMetadataItemsToObjectMetadataItems({
|
|
pagedObjectMetadataItems: result.data,
|
|
});
|
|
|
|
replaceObjectMetadataItemIfDifferent(objectMetadataItems);
|
|
};
|
|
|
|
const replaceObjectMetadataItemIfDifferent = useRecoilCallback(
|
|
({ set, snapshot }) =>
|
|
(toSetObjectMetadataItems: ObjectMetadataItem[]) => {
|
|
if (
|
|
!isDeeplyEqual(
|
|
snapshot.getLoadable(objectMetadataItemsState).getValue(),
|
|
toSetObjectMetadataItems,
|
|
)
|
|
) {
|
|
set(objectMetadataItemsState, toSetObjectMetadataItems);
|
|
set(isAppWaitingForFreshObjectMetadataState, false);
|
|
}
|
|
},
|
|
[],
|
|
);
|
|
return {
|
|
refreshObjectMetadataItems,
|
|
};
|
|
};
|