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
@@ -7,11 +7,9 @@ import { currentUserWorkspaceState } from '@/auth/states/currentUserWorkspaceSta
import { useDefaultHomePagePath } from '@/navigation/hooks/useDefaultHomePagePath';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { AggregateOperations } from '@/object-record/record-table/constants/AggregateOperations';
import { arePrefetchViewsLoadedState } from '@/prefetch/states/arePrefetchViewsLoaded';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { AppPath } from '@/types/AppPath';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewType } from '@/views/types/ViewType';
import { coreViewsState } from '@/views/states/coreViewState';
import { ViewOpenRecordIn, ViewType } from '~/generated/graphql';
import { getMockCompanyObjectMetadataItem } from '~/testing/mock-data/companies';
import { mockedUserData } from '~/testing/mock-data/users';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
@@ -32,39 +30,33 @@ const renderHooks = ({
const setObjectMetadataItems = useSetRecoilState(
objectMetadataItemsState,
);
const setPrefetchViews = useSetRecoilState(prefetchViewsState);
const setArePrefetchViewsLoaded = useSetRecoilState(
arePrefetchViewsLoadedState,
);
const setCoreViews = useSetRecoilState(coreViewsState);
useEffect(() => {
setObjectMetadataItems(generatedMockObjectMetadataItems);
setArePrefetchViewsLoaded(true);
if (withExistingView) {
setPrefetchViews([
setCoreViews([
{
id: 'viewId',
name: 'Test View',
objectMetadataId: getMockCompanyObjectMetadataItem().id,
type: ViewType.Table,
type: ViewType.TABLE,
key: null,
isCompact: false,
openRecordIn: ViewOpenRecordInType.SIDE_PANEL,
openRecordIn: ViewOpenRecordIn.SIDE_PANEL,
viewFields: [],
viewGroups: [],
viewSorts: [],
kanbanFieldMetadataId: '',
kanbanAggregateOperation: AggregateOperations.COUNT,
icon: '',
kanbanAggregateOperationFieldMetadataId: '',
position: 0,
viewFilters: [],
__typename: 'View',
},
]);
} else {
setPrefetchViews([]);
setCoreViews([]);
}
if (withCurrentUser) {
@@ -75,8 +67,7 @@ const renderHooks = ({
setCurrentUser,
setCurrentUserWorkspace,
setObjectMetadataItems,
setPrefetchViews,
setArePrefetchViewsLoaded,
setCoreViews,
]);
return useDefaultHomePagePath();
@@ -3,37 +3,26 @@ import { lastVisitedObjectMetadataItemIdState } from '@/navigation/states/lastVi
import { type ObjectPathInfo } from '@/navigation/types/ObjectPathInfo';
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { arePrefetchViewsLoadedState } from '@/prefetch/states/arePrefetchViewsLoaded';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { getObjectPermissionsFromMapByObjectMetadataId } from '@/settings/roles/role-permissions/objects-permissions/utils/getObjectPermissionsFromMapByObjectMetadataId';
import { AppPath } from '@/types/AppPath';
import { SettingsPath } from '@/types/SettingsPath';
import { coreViewsState } from '@/views/states/coreViewState';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { useFeatureFlagsMap } from '@/workspace/hooks/useFeatureFlagsMap';
import isEmpty from 'lodash.isempty';
import { useCallback, useMemo } from 'react';
import { useRecoilCallback, useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared/utils';
import { FeatureFlagKey } from '~/generated/graphql';
import { getAppPath } from '~/utils/navigation/getAppPath';
export const useDefaultHomePagePath = () => {
const currentUser = useRecoilValue(currentUserState);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const featureFlagsMap = useFeatureFlagsMap();
const isCoreViewEnabled =
featureFlagsMap[FeatureFlagKey.IS_CORE_VIEW_ENABLED];
const {
activeNonSystemObjectMetadataItems,
alphaSortedActiveNonSystemObjectMetadataItems,
} = useFilteredObjectMetadataItems();
const arePrefetchViewsLoaded = useRecoilValue(arePrefetchViewsLoadedState);
const readableAlphaSortedActiveNonSystemObjectMetadataItems = useMemo(() => {
return alphaSortedActiveNonSystemObjectMetadataItems.filter((item) => {
const objectPermissions = getObjectPermissionsFromMapByObjectMetadataId({
@@ -56,27 +45,18 @@ export const useDefaultHomePagePath = () => {
[activeNonSystemObjectMetadataItems],
);
const getFirstView = useRecoilCallback(
({ snapshot }) => {
return (objectMetadataItemId: string | undefined | null) => {
if (!arePrefetchViewsLoaded) {
return undefined;
}
const getFirstView = useRecoilCallback(({ snapshot }) => {
return (objectMetadataItemId: string | undefined | null) => {
const views = snapshot
.getLoadable(coreViewsState)
.getValue()
.map(convertCoreViewToView);
const views = isCoreViewEnabled
? snapshot
.getLoadable(coreViewsState)
.getValue()
.map(convertCoreViewToView)
: snapshot.getLoadable(prefetchViewsState).getValue();
return views.find(
(view) => view.objectMetadataId === objectMetadataItemId,
);
};
},
[arePrefetchViewsLoaded, isCoreViewEnabled],
);
return views.find(
(view) => view.objectMetadataId === objectMetadataItemId,
);
};
}, []);
const firstObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
const [firstObjectMetadataItem] =
@@ -132,10 +112,6 @@ export const useDefaultHomePagePath = () => {
);
const defaultHomePagePath = useMemo(() => {
if (!arePrefetchViewsLoaded) {
return undefined;
}
if (!isDefined(currentUser)) {
return AppPath.SignInUp;
}
@@ -159,7 +135,6 @@ export const useDefaultHomePagePath = () => {
viewId ? { viewId } : undefined,
);
}, [
arePrefetchViewsLoaded,
currentUser,
getDefaultObjectPathInfo,
readableAlphaSortedActiveNonSystemObjectMetadataItems,
@@ -1,7 +1,7 @@
import { lastVisitedViewPerObjectMetadataItemState } from '@/navigation/states/lastVisitedViewPerObjectMetadataItemState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { type View } from '@/views/types/View';
import { coreViewsState } from '@/views/states/coreViewState';
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared/utils';
@@ -15,9 +15,11 @@ export const useSetLastVisitedViewForObjectMetadataNamePlural = () => {
objectNamePlural: string;
viewId: string;
}) => {
const views = snapshot.getLoadable(prefetchViewsState).getValue();
const views = snapshot.getLoadable(coreViewsState).getValue();
const view = views.find((view: View) => view.id === viewId);
const view = views.find(
(view: CoreViewWithRelations) => view.id === viewId,
);
const objectMetadataItems = snapshot
.getLoadable(objectMetadataItemsState)