Remove old view implementation step 1 (#14189)

Let's move forward and get rid of the past... !

Removing prefetchViewState and the prefetch view query.

Next steps:
- renaming Selectors to remove prefetch keywork
- remove old view type and coreViewToView util
- rework optimistic rendering for coreViews
This commit is contained in:
Charles Bochet
2025-09-01 10:25:16 +02:00
committed by GitHub
parent 1e9723a6b7
commit 988f6ee1fa
31 changed files with 120 additions and 1212 deletions
@@ -1,12 +1,10 @@
import { PrefetchRunFavoriteQueriesEffect } from '@/prefetch/components/PrefetchRunFavoriteQueriesEffect';
import { PrefetchRunViewQueryEffect } from '@/prefetch/components/PrefetchRunViewQueryEffect';
import React from 'react';
export const PrefetchDataProvider = ({ children }: React.PropsWithChildren) => {
return (
<>
<PrefetchRunFavoriteQueriesEffect />
<PrefetchRunViewQueryEffect />
{children}
</>
);
@@ -1,64 +0,0 @@
import { useEffect } from 'react';
import { useRecoilCallback, useRecoilValue } from 'recoil';
import { currentUserState } from '@/auth/states/currentUserState';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { findAllViewsOperationSignatureFactory } from '@/prefetch/graphql/operation-signatures/factories/findAllViewsOperationSignatureFactory';
import { arePrefetchViewsLoadedState } from '@/prefetch/states/arePrefetchViewsLoaded';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { isPersistingViewFieldsState } from '@/views/states/isPersistingViewFieldsState';
import { type View } from '@/views/types/View';
import { useIsWorkspaceActivationStatusEqualsTo } from '@/workspace/hooks/useIsWorkspaceActivationStatusEqualsTo';
import { isDefined } from 'twenty-shared/utils';
import { WorkspaceActivationStatus } from 'twenty-shared/workspace';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
export const PrefetchRunViewQueryEffect = () => {
const currentUser = useRecoilValue(currentUserState);
const isWorkspaceActive = useIsWorkspaceActivationStatusEqualsTo(
WorkspaceActivationStatus.ACTIVE,
);
const { objectMetadataItems } = useObjectMetadataItems();
const findAllViewsOperationSignature = findAllViewsOperationSignatureFactory({
objectMetadataItem: objectMetadataItems.find(
(item) => item.nameSingular === CoreObjectNameSingular.View,
),
});
const { records } = useFindManyRecords({
objectNameSingular: CoreObjectNameSingular.View,
filter: findAllViewsOperationSignature.variables.filter,
recordGqlFields: findAllViewsOperationSignature.fields,
skip: !currentUser || !isWorkspaceActive,
});
const setPrefetchViewsState = useRecoilCallback(
({ set, snapshot }) =>
(views: View[]) => {
const existingViews = snapshot
.getLoadable(prefetchViewsState)
.getValue();
if (!isDeeplyEqual(existingViews, views)) {
set(prefetchViewsState, views);
set(arePrefetchViewsLoadedState, true);
}
},
[],
);
const isPersistingViewFields = useRecoilValue(isPersistingViewFieldsState);
useEffect(() => {
if (isDefined(records) && !isPersistingViewFields) {
setPrefetchViewsState(records as View[]);
}
}, [isPersistingViewFields, records, setPrefetchViewsState]);
return <></>;
};
@@ -1,6 +0,0 @@
import { createState } from 'twenty-ui/utilities';
export const arePrefetchViewsLoadedState = createState<boolean>({
key: 'arePrefetchViewsLoadedState',
defaultValue: false,
});
@@ -1,7 +0,0 @@
import { type View } from '@/views/types/View';
import { createState } from 'twenty-ui/utilities';
export const prefetchViewsState = createState<View[]>({
key: 'prefetchViewsState',
defaultValue: [],
});
@@ -1,11 +1,7 @@
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { coreViewsState } from '@/views/states/coreViewState';
import { ViewKey } from '@/views/types/ViewKey';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { extractFeatureFlagMapFromWorkspace } from '@/workspace/utils/extractFeatureFlagMapFromWorkspace';
import { selectorFamily } from 'recoil';
import { FeatureFlagKey } from '~/generated/graphql';
export const prefetchIndexViewIdFromObjectMetadataItemFamilySelector =
selectorFamily<string | undefined, { objectMetadataItemId: string }>({
@@ -13,19 +9,9 @@ export const prefetchIndexViewIdFromObjectMetadataItemFamilySelector =
get:
({ objectMetadataItemId }) =>
({ get }) => {
const prefetchedViews = get(prefetchViewsState);
const coreViews = get(coreViewsState);
const currentWorkspace = get(currentWorkspaceState);
const featureFlags =
extractFeatureFlagMapFromWorkspace(currentWorkspace);
const isCoreViewEnabled =
featureFlags[FeatureFlagKey.IS_CORE_VIEW_ENABLED];
const views = isCoreViewEnabled
? coreViews.map(convertCoreViewToView)
: prefetchedViews;
const views = coreViews.map(convertCoreViewToView);
return views?.find(
(view) =>
@@ -1,11 +1,7 @@
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { coreViewsState } from '@/views/states/coreViewState';
import { type View } from '@/views/types/View';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { extractFeatureFlagMapFromWorkspace } from '@/workspace/utils/extractFeatureFlagMapFromWorkspace';
import { selectorFamily } from 'recoil';
import { FeatureFlagKey } from '~/generated/graphql';
export const prefetchViewFromViewIdFamilySelector = selectorFamily<
View | undefined,
@@ -15,19 +11,9 @@ export const prefetchViewFromViewIdFamilySelector = selectorFamily<
get:
({ viewId }) =>
({ get }) => {
const prefetchedViews = get(prefetchViewsState);
const coreViews = get(coreViewsState);
const currentWorkspace = get(currentWorkspaceState);
const featureFlags = extractFeatureFlagMapFromWorkspace(currentWorkspace);
const isCoreViewEnabled =
featureFlags[FeatureFlagKey.IS_CORE_VIEW_ENABLED];
const views = isCoreViewEnabled
? coreViews.map(convertCoreViewToView)
: prefetchedViews;
const views = coreViews.map(convertCoreViewToView);
return views?.find((view) => view.id === viewId);
},
});
@@ -1,10 +1,6 @@
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { coreViewsState } from '@/views/states/coreViewState';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { extractFeatureFlagMapFromWorkspace } from '@/workspace/utils/extractFeatureFlagMapFromWorkspace';
import { selectorFamily } from 'recoil';
import { FeatureFlagKey } from '~/generated/graphql';
export const prefetchViewIdsFromObjectMetadataItemFamilySelector =
selectorFamily<string[], { objectMetadataItemId: string }>({
@@ -12,19 +8,9 @@ export const prefetchViewIdsFromObjectMetadataItemFamilySelector =
get:
({ objectMetadataItemId }) =>
({ get }) => {
const prefetchedViews = get(prefetchViewsState);
const coreViews = get(coreViewsState);
const currentWorkspace = get(currentWorkspaceState);
const featureFlags =
extractFeatureFlagMapFromWorkspace(currentWorkspace);
const isCoreViewEnabled =
featureFlags[FeatureFlagKey.IS_CORE_VIEW_ENABLED];
const views = isCoreViewEnabled
? coreViews.map(convertCoreViewToView)
: prefetchedViews;
const views = coreViews.map(convertCoreViewToView);
return views
.filter((view) => view.objectMetadataId === objectMetadataItemId)
@@ -1,26 +1,11 @@
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { coreViewsState } from '@/views/states/coreViewState';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { extractFeatureFlagMapFromWorkspace } from '@/workspace/utils/extractFeatureFlagMapFromWorkspace';
import { selector } from 'recoil';
import { FeatureFlagKey } from '~/generated/graphql';
export const prefetchViewLengthSelector = selector<number>({
key: 'prefetchViewLengthSelector',
get: ({ get }) => {
const prefetchedViews = get(prefetchViewsState);
const coreViews = get(coreViewsState);
const currentWorkspace = get(currentWorkspaceState);
const featureFlags = extractFeatureFlagMapFromWorkspace(currentWorkspace);
const isCoreViewEnabled = featureFlags[FeatureFlagKey.IS_CORE_VIEW_ENABLED];
const views = isCoreViewEnabled
? coreViews.map(convertCoreViewToView)
: prefetchedViews;
return views?.length ?? 0;
return coreViews?.length ?? 0;
},
});
@@ -1,11 +1,7 @@
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { coreViewsState } from '@/views/states/coreViewState';
import { type View } from '@/views/types/View';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { extractFeatureFlagMapFromWorkspace } from '@/workspace/utils/extractFeatureFlagMapFromWorkspace';
import { selectorFamily } from 'recoil';
import { FeatureFlagKey } from '~/generated/graphql';
export const prefetchViewsFromObjectMetadataItemFamilySelector = selectorFamily<
View[],
@@ -15,18 +11,9 @@ export const prefetchViewsFromObjectMetadataItemFamilySelector = selectorFamily<
get:
({ objectMetadataItemId }) =>
({ get }) => {
const prefetchedViews = get(prefetchViewsState);
const coreViews = get(coreViewsState);
const currentWorkspace = get(currentWorkspaceState);
const featureFlags = extractFeatureFlagMapFromWorkspace(currentWorkspace);
const isCoreViewEnabled =
featureFlags[FeatureFlagKey.IS_CORE_VIEW_ENABLED];
const views = isCoreViewEnabled
? coreViews.map(convertCoreViewToView)
: prefetchedViews;
const views = coreViews.map(convertCoreViewToView);
const filteredViews = views.filter(
(view) => view.objectMetadataId === objectMetadataItemId,