diff --git a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts index beed55d37..d1a4eb315 100644 --- a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts +++ b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts @@ -58,6 +58,7 @@ import { useOrigin } from '@/domain-manager/hooks/useOrigin'; import { useRedirect } from '@/domain-manager/hooks/useRedirect'; import { useRedirectToWorkspaceDomain } from '@/domain-manager/hooks/useRedirectToWorkspaceDomain'; import { domainConfigurationState } from '@/domain-manager/states/domainConfigurationState'; +import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItem'; import { workspaceAuthProvidersState } from '@/workspace/states/workspaceAuthProvidersState'; import { i18n } from '@lingui/core'; import { useNavigate, useSearchParams } from 'react-router-dom'; @@ -85,6 +86,8 @@ export const useAuth = () => { isEmailVerificationRequiredState, ); + const { refreshObjectMetadataItems } = useRefreshObjectMetadataItems(); + const setSignInUpStep = useSetRecoilState(signInUpStepState); const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState); const setWorkspaces = useSetRecoilState(workspacesState); @@ -379,9 +382,19 @@ export const useAuth = () => { ), ); + // TODO: We can't parallelize this yet because when loadCurrentUSer is loaded + // then UserProvider updates its children and PrefetchDataProvider is triggered + // which requires the correct metadata to be loaded (not the mocks) + await refreshObjectMetadataItems(); await loadCurrentUser(); }, - [getAuthTokensFromLoginToken, setTokenPair, loadCurrentUser, origin], + [ + getAuthTokensFromLoginToken, + setTokenPair, + loadCurrentUser, + origin, + refreshObjectMetadataItems, + ], ); const handleCredentialsSignIn = useCallback( diff --git a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx index e675caec6..1056e5b4a 100644 --- a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx +++ b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx @@ -5,28 +5,39 @@ import { currentUserState } from '@/auth/states/currentUserState'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { useLoadMockedObjectMetadataItems } from '@/object-metadata/hooks/useLoadMockedObjectMetadataItems'; import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItem'; +import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const ObjectMetadataItemsLoadEffect = () => { const currentUser = useRecoilValue(currentUserState); const currentWorkspace = useRecoilValue(currentWorkspaceState); + const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const { refreshObjectMetadataItems } = useRefreshObjectMetadataItems(); const { loadMockedObjectMetadataItems } = useLoadMockedObjectMetadataItems(); useEffect(() => { - if ( - isUndefinedOrNull(currentUser) || - !isWorkspaceActiveOrSuspended(currentWorkspace) - ) { - loadMockedObjectMetadataItems(); - } else { - refreshObjectMetadataItems(); + if (objectMetadataItems.length > 0) { + return; } + + const loadObjectMetadata = async () => { + if ( + isUndefinedOrNull(currentUser) || + !isWorkspaceActiveOrSuspended(currentWorkspace) + ) { + await loadMockedObjectMetadataItems(); + } else { + await refreshObjectMetadataItems(); + } + }; + + loadObjectMetadata(); }, [ currentUser, currentWorkspace, + objectMetadataItems.length, loadMockedObjectMetadataItems, refreshObjectMetadataItems, ]); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useRefreshObjectMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useRefreshObjectMetadataItem.ts index f4f0ef333..bd6620d16 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useRefreshObjectMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useRefreshObjectMetadataItem.ts @@ -4,14 +4,13 @@ import { isAppWaitingForFreshObjectMetadataState } from '@/object-metadata/state import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '@/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems'; +import { FetchPolicy } from '@apollo/client'; 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', + fetchPolicy: FetchPolicy = 'network-only', ) => { const client = useApolloMetadataClient();