From c657caf74f7211f60ed76cfb5d718e82b1ed99d6 Mon Sep 17 00:00:00 2001 From: Etienne <45695613+etiennejouan@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:54:48 +0200 Subject: [PATCH] force cache refresh for views after new object creation (#11806) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Context** When creating a new object, it creates the "All ...." view associated. After new object is created, in `PrefetchRunViewQueryEffect`, findManyViews returns cached results WITHOUT the new view. git bisect - regression introduced with https://github.com/twentyhq/twenty/pull/10272 **Attempt** : Update to 'network-only' fetch policy in `PrefetchRunViewQueryEffect` -> not working on useQuery apollo hook (🤯) : query is handle by cache and not network **Solution** Based on pattern used for view creation (`useCreateViewFromCurrentView`), refreshing the view cache with a `useLazyFindManyRecords` solves the issue. Then, `prefetchViewsState` is updated in `PrefetchRunViewQueryEffect` closes : https://github.com/twentyhq/core-team-issues/issues/845 --- .../hooks/useCreateOneObjectMetadataItem.ts | 5 +++- .../modules/views/hooks/useRefreshViews.ts | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 packages/twenty-front/src/modules/views/hooks/useRefreshViews.ts diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts index 1ad8af448..935897ab3 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneObjectMetadataItem.ts @@ -9,9 +9,12 @@ import { import { CREATE_ONE_OBJECT_METADATA_ITEM } from '../graphql/mutations'; import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItem'; +import { useRefreshCachedViews } from '@/views/hooks/useRefreshViews'; import { useApolloMetadataClient } from './useApolloMetadataClient'; export const useCreateOneObjectMetadataItem = () => { + const { refreshCachedViews } = useRefreshCachedViews(); + const apolloMetadataClient = useApolloMetadataClient(); const { refreshObjectMetadataItems } = useRefreshObjectMetadataItems('network-only'); @@ -31,7 +34,7 @@ export const useCreateOneObjectMetadataItem = () => { }); await refreshObjectMetadataItems(); - + refreshCachedViews(); return createdObjectMetadata; }; diff --git a/packages/twenty-front/src/modules/views/hooks/useRefreshViews.ts b/packages/twenty-front/src/modules/views/hooks/useRefreshViews.ts new file mode 100644 index 000000000..0f2b04750 --- /dev/null +++ b/packages/twenty-front/src/modules/views/hooks/useRefreshViews.ts @@ -0,0 +1,25 @@ +import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; +import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; +import { useLazyFindManyRecords } from '@/object-record/hooks/useLazyFindManyRecords'; +import { findAllViewsOperationSignatureFactory } from '@/prefetch/graphql/operation-signatures/factories/findAllViewsOperationSignatureFactory'; + +export const useRefreshCachedViews = () => { + const { objectMetadataItems } = useObjectMetadataItems(); + + const findAllViewsOperationSignature = findAllViewsOperationSignatureFactory({ + objectMetadataItem: objectMetadataItems.find( + (item) => item.nameSingular === CoreObjectNameSingular.View, + ), + }); + + const { findManyRecords: refreshCachedViews } = useLazyFindManyRecords({ + objectNameSingular: CoreObjectNameSingular.View, + filter: findAllViewsOperationSignature.variables.filter, + recordGqlFields: findAllViewsOperationSignature.fields, + fetchPolicy: 'network-only', + }); + + return { + refreshCachedViews, + }; +};