Refactor Views by cleaning the code, relying on apolloCache and improving performances (#4516)

* Wip refactoring view

* Post merge conflicts

* Fix review

* Add create view capability

* Fix create object missing view

* Fix tests
This commit is contained in:
Charles Bochet
2024-03-20 14:21:58 +01:00
committed by GitHub
parent 20e14cb455
commit cfb0cce9b8
392 changed files with 3474 additions and 4410 deletions

View File

@ -0,0 +1,107 @@
import { useEffect } from 'react';
import { useRecoilValue, useSetRecoilState } from 'recoil';
import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData';
import { PrefetchKey } from '@/prefetch/types/PrefetchKey';
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
import { useViewStates } from '@/views/hooks/internal/useViewStates';
import { ViewScopeInternalContext } from '@/views/scopes/scope-internal-context/ViewScopeInternalContext';
import { GraphQLView } from '@/views/types/GraphQLView';
import { combinedViewFilters } from '@/views/utils/combinedViewFilters';
import { combinedViewSorts } from '@/views/utils/combinedViewSorts';
import { isDefined } from '~/utils/isDefined';
export const useGetCurrentView = (viewBarComponentId?: string) => {
const componentId = useAvailableScopeIdOrThrow(
ViewScopeInternalContext,
viewBarComponentId,
);
const { records: views } = usePrefetchedData<GraphQLView>(
PrefetchKey.AllViews,
);
const {
currentViewIdState,
viewObjectMetadataIdState,
unsavedToUpsertViewFiltersState,
unsavedToDeleteViewFilterIdsState,
unsavedToDeleteViewSortIdsState,
unsavedToUpsertViewSortsState,
isCurrentViewKeyIndexState,
} = useViewStates(componentId);
const currentViewId = useRecoilValue(currentViewIdState);
const viewObjectMetadataId = useRecoilValue(viewObjectMetadataIdState);
const setIsCurrentViewKeyIndex = useSetRecoilState(
isCurrentViewKeyIndexState,
);
const currentViewFromCurrentViewId = views.find(
(view) => view.id === currentViewId,
);
const indexView = views.find(
(view) =>
view.key === 'INDEX' && view.objectMetadataId === viewObjectMetadataId,
);
const currentView = currentViewId ? currentViewFromCurrentViewId : indexView;
useEffect(() => {
setIsCurrentViewKeyIndex(currentView?.key === 'INDEX');
}, [currentView, setIsCurrentViewKeyIndex]);
const viewsOnCurrentObject = views
.filter((view) => view.objectMetadataId === viewObjectMetadataId)
.map((view) => ({
id: view.id,
name: view.name,
type: view.type,
key: view.key,
objectMetadataId: view.objectMetadataId,
icon: view.icon,
}));
const unsavedToUpsertViewFilters = useRecoilValue(
unsavedToUpsertViewFiltersState,
);
const unsavedToUpsertViewSorts = useRecoilValue(
unsavedToUpsertViewSortsState,
);
const unsavedToDeleteViewFilterIds = useRecoilValue(
unsavedToDeleteViewFilterIdsState,
);
const unsavedToDeleteViewSortIds = useRecoilValue(
unsavedToDeleteViewSortIdsState,
);
if (!isDefined(currentView)) {
return {
componentId,
currentViewWithSavedFiltersAndSorts: undefined,
currentViewWithCombinedFiltersAndSorts: undefined,
viewsOnCurrentObject: viewsOnCurrentObject ?? [],
};
}
const currentViewWithCombinedFiltersAndSorts = {
...currentView,
viewFilters: combinedViewFilters(
currentView.viewFilters,
unsavedToUpsertViewFilters,
unsavedToDeleteViewFilterIds,
),
viewSorts: combinedViewSorts(
currentView.viewSorts,
unsavedToUpsertViewSorts,
unsavedToDeleteViewSortIds,
),
};
return {
componentId,
currentViewWithSavedFiltersAndSorts: currentView,
currentViewWithCombinedFiltersAndSorts,
viewsOnCurrentObject: viewsOnCurrentObject ?? [],
};
};