Files
twenty/packages/twenty-front/src/modules/views/components/QueryParamsViewIdEffect.tsx
Lucas Bordeau caff652df3 Fixed view reset on view change (#6897)
Fixes #6833 

The view states for unsaved changes were not reseted on view change.

The fix was to just add a call to the existing resetCurrentView when the
viewId changes in the related effect.
2024-09-05 10:23:42 +02:00

103 lines
3.5 KiB
TypeScript

import { useLastVisitedObjectMetadataItem } from '@/navigation/hooks/useLastVisitedObjectMetadataItem';
import { useLastVisitedView } from '@/navigation/hooks/useLastVisitedView';
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryParams';
import { useViewStates } from '@/views/hooks/internal/useViewStates';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { useResetCurrentView } from '@/views/hooks/useResetCurrentView';
import { isUndefined } from '@sniptt/guards';
import { useEffect } from 'react';
import { useRecoilState } from 'recoil';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
import { isDefined } from '~/utils/isDefined';
export const QueryParamsViewIdEffect = () => {
const { getFiltersFromQueryParams, viewIdQueryParam } =
useViewFromQueryParams();
const { currentViewIdState, componentId: objectNamePlural } = useViewStates();
const [currentViewId, setCurrentViewId] = useRecoilState(currentViewIdState);
const { viewsOnCurrentObject } = useGetCurrentView();
const { findObjectMetadataItemByNamePlural } =
useFilteredObjectMetadataItems();
const objectMetadataItemId =
findObjectMetadataItemByNamePlural(objectNamePlural);
const { getLastVisitedViewIdFromObjectNamePlural, setLastVisitedView } =
useLastVisitedView();
const { lastVisitedObjectMetadataItemId, setLastVisitedObjectMetadataItem } =
useLastVisitedObjectMetadataItem();
const lastVisitedViewId =
getLastVisitedViewIdFromObjectNamePlural(objectNamePlural);
const isLastVisitedObjectMetadataItemDifferent = !isDeeplyEqual(
objectMetadataItemId?.id,
lastVisitedObjectMetadataItemId,
);
const { resetCurrentView } = useResetCurrentView();
useEffect(() => {
if (isDefined(currentViewId)) {
resetCurrentView();
}
}, [resetCurrentView, currentViewId]);
useEffect(() => {
const indexView = viewsOnCurrentObject.find((view) => view.key === 'INDEX');
if (isUndefined(viewIdQueryParam) && isDefined(lastVisitedViewId)) {
if (isLastVisitedObjectMetadataItemDifferent) {
setLastVisitedObjectMetadataItem(objectNamePlural);
setLastVisitedView({
objectNamePlural,
viewId: lastVisitedViewId,
});
}
setCurrentViewId(lastVisitedViewId);
return;
}
if (isDefined(viewIdQueryParam)) {
if (isLastVisitedObjectMetadataItemDifferent) {
setLastVisitedObjectMetadataItem(objectNamePlural);
}
if (!isDeeplyEqual(viewIdQueryParam, lastVisitedViewId)) {
setLastVisitedView({
objectNamePlural,
viewId: viewIdQueryParam,
});
}
setCurrentViewId(viewIdQueryParam);
return;
}
if (isDefined(indexView)) {
if (isLastVisitedObjectMetadataItemDifferent) {
setLastVisitedObjectMetadataItem(objectNamePlural);
}
if (!isDeeplyEqual(indexView.id, lastVisitedViewId)) {
setLastVisitedView({
objectNamePlural,
viewId: indexView.id,
});
}
setCurrentViewId(indexView.id);
return;
}
}, [
currentViewId,
getFiltersFromQueryParams,
isLastVisitedObjectMetadataItemDifferent,
lastVisitedViewId,
objectMetadataItemId?.id,
objectNamePlural,
setCurrentViewId,
setLastVisitedObjectMetadataItem,
setLastVisitedView,
viewIdQueryParam,
viewsOnCurrentObject,
]);
return <></>;
};