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.
103 lines
3.5 KiB
TypeScript
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 <></>;
|
|
};
|