Enable workflow in lab (#9997)
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" />
This commit is contained in:
@ -1,12 +1,29 @@
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { isWorkflowSubObjectMetadata } from '@/object-metadata/utils/isWorkflowSubObjectMetadata';
|
||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
||||
import { FeatureFlagKey } from '~/generated-metadata/graphql';
|
||||
|
||||
export const useFilteredObjectMetadataItems = () => {
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
const isWorkflowEnabled = useIsFeatureEnabled(
|
||||
FeatureFlagKey.IsWorkflowEnabled,
|
||||
);
|
||||
|
||||
const isWorkflowToBeFiltered = (nameSingular: string) => {
|
||||
return (
|
||||
!isWorkflowEnabled &&
|
||||
(nameSingular === CoreObjectNameSingular.Workflow ||
|
||||
isWorkflowSubObjectMetadata(nameSingular))
|
||||
);
|
||||
};
|
||||
|
||||
const activeObjectMetadataItems = objectMetadataItems.filter(
|
||||
({ isActive, isSystem }) => isActive && !isSystem,
|
||||
({ isActive, isSystem, nameSingular }) =>
|
||||
isActive && !isSystem && !isWorkflowToBeFiltered(nameSingular),
|
||||
);
|
||||
|
||||
const alphaSortedActiveObjectMetadataItems = activeObjectMetadataItems.sort(
|
||||
|
||||
@ -5,6 +5,10 @@ import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objec
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { isWorkflowSubObjectMetadata } from '@/object-metadata/utils/isWorkflowSubObjectMetadata';
|
||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
||||
import { FeatureFlagKey } from '~/generated-metadata/graphql';
|
||||
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
||||
|
||||
export const useObjectMetadataItem = ({
|
||||
@ -17,8 +21,23 @@ export const useObjectMetadataItem = ({
|
||||
}),
|
||||
);
|
||||
|
||||
const isWorkflowEnabled = useIsFeatureEnabled(
|
||||
FeatureFlagKey.IsWorkflowEnabled,
|
||||
);
|
||||
|
||||
const isWorkflowToBeFiltered =
|
||||
!isWorkflowEnabled &&
|
||||
(objectNameSingular === CoreObjectNameSingular.Workflow ||
|
||||
isWorkflowSubObjectMetadata(objectNameSingular));
|
||||
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
if (isWorkflowToBeFiltered) {
|
||||
throw new Error(
|
||||
'Workflow is not enabled. If you want to use it, please enable it in the lab.',
|
||||
);
|
||||
}
|
||||
|
||||
if (!isDefined(objectMetadataItem)) {
|
||||
throw new ObjectMetadataItemNotFoundError(
|
||||
objectNameSingular,
|
||||
|
||||
@ -2,16 +2,10 @@ import { FIND_MANY_OBJECT_METADATA_ITEMS } from '@/object-metadata/graphql/queri
|
||||
import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient';
|
||||
import { isAppWaitingForFreshObjectMetadataState } from '@/object-metadata/states/isAppWaitingForFreshObjectMetadataState';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { isWorkflowSubObjectMetadata } from '@/object-metadata/utils/isWorkflowSubObjectMetadata';
|
||||
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '@/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
|
||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
||||
import { useRecoilCallback } from 'recoil';
|
||||
import {
|
||||
FeatureFlagKey,
|
||||
ObjectMetadataItemsQuery,
|
||||
} from '~/generated-metadata/graphql';
|
||||
import { ObjectMetadataItemsQuery } from '~/generated-metadata/graphql';
|
||||
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
||||
|
||||
type FetchPolicy = 'network-only' | 'cache-first';
|
||||
@ -20,9 +14,6 @@ export const useRefreshObjectMetadataItems = (
|
||||
fetchPolicy: FetchPolicy = 'cache-first',
|
||||
) => {
|
||||
const client = useApolloMetadataClient();
|
||||
const isWorkflowEnabled = useIsFeatureEnabled(
|
||||
FeatureFlagKey.IsWorkflowEnabled,
|
||||
);
|
||||
|
||||
const refreshObjectMetadataItems = async () => {
|
||||
const result = await client.query<ObjectMetadataItemsQuery>({
|
||||
@ -36,15 +27,7 @@ export const useRefreshObjectMetadataItems = (
|
||||
pagedObjectMetadataItems: result.data,
|
||||
});
|
||||
|
||||
const filteredObjectMetadataItems = objectMetadataItems.filter((object) => {
|
||||
return (
|
||||
isWorkflowEnabled ||
|
||||
(object.nameSingular !== CoreObjectNameSingular.Workflow &&
|
||||
!isWorkflowSubObjectMetadata(object.nameSingular))
|
||||
);
|
||||
});
|
||||
|
||||
replaceObjectMetadataItemIfDifferent(filteredObjectMetadataItems);
|
||||
replaceObjectMetadataItemIfDifferent(objectMetadataItems);
|
||||
};
|
||||
|
||||
const replaceObjectMetadataItemIfDifferent = useRecoilCallback(
|
||||
|
||||
Reference in New Issue
Block a user