reset main context store viewId and current view type on settings page (#11206)

closes https://github.com/twentyhq/core-team-issues/issues/588

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
nitin
2025-03-28 13:56:59 +05:30
committed by GitHub
parent 391392dd87
commit c294d967a3
3 changed files with 89 additions and 32 deletions

View File

@ -5,8 +5,8 @@ import { RESET_CONTEXT_TO_SELECTION } from '@/command-menu/constants/ResetContex
import { useMatchingCommandMenuCommands } from '@/command-menu/hooks/useMatchingCommandMenuCommands'; import { useMatchingCommandMenuCommands } from '@/command-menu/hooks/useMatchingCommandMenuCommands';
import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState'; import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState';
import { Command } from '@/command-menu/types/Command'; import { Command } from '@/command-menu/types/Command';
import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState'; import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useLingui } from '@lingui/react/macro'; import { useLingui } from '@lingui/react/macro';
@ -22,6 +22,7 @@ export const CommandMenu = () => {
const { t } = useLingui(); const { t } = useLingui();
const commandMenuSearch = useRecoilValue(commandMenuSearchState); const commandMenuSearch = useRecoilValue(commandMenuSearchState);
const { objectMetadataItems } = useObjectMetadataItems();
const { const {
noResults, noResults,
@ -42,8 +43,12 @@ export const CommandMenu = () => {
'command-menu-previous', 'command-menu-previous',
); );
const { objectMetadataItem: currentObjectMetadataItem } = const objectMetadataItemId = useRecoilComponentValueV2(
useContextStoreObjectMetadataItemOrThrow(); contextStoreCurrentObjectMetadataItemIdComponentState,
);
const currentObjectMetadataItem = objectMetadataItems.find(
(item) => item.id === objectMetadataItemId,
);
const commandGroups: CommandGroupConfig[] = [ const commandGroups: CommandGroupConfig[] = [
{ {

View File

@ -1,12 +1,13 @@
import { MainContextStoreProviderEffect } from '@/context-store/components/MainContextStoreProviderEffect'; import { MainContextStoreProviderEffect } from '@/context-store/components/MainContextStoreProviderEffect';
import { useIsSettingsPage } from '@/navigation/hooks/useIsSettingsPage';
import { useLastVisitedView } from '@/navigation/hooks/useLastVisitedView'; import { useLastVisitedView } from '@/navigation/hooks/useLastVisitedView';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { prefetchIndexViewIdFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector'; import { prefetchIndexViewIdFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector';
import { AppPath } from '@/types/AppPath'; import { AppPath } from '@/types/AppPath';
import { useParams, useSearchParams } from 'react-router-dom'; import { useParams, useSearchParams } from 'react-router-dom';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation';
const getViewId = ( const getViewId = (
viewIdFromQueryParams: string | null, viewIdFromQueryParams: string | null,
@ -32,12 +33,7 @@ export const MainContextStoreProvider = () => {
const { isMatchingLocation } = useIsMatchingLocation(); const { isMatchingLocation } = useIsMatchingLocation();
const isRecordIndexPage = isMatchingLocation(AppPath.RecordIndexPage); const isRecordIndexPage = isMatchingLocation(AppPath.RecordIndexPage);
const isRecordShowPage = isMatchingLocation(AppPath.RecordShowPage); const isRecordShowPage = isMatchingLocation(AppPath.RecordShowPage);
const isSettingsPage = useIsSettingsPage();
const pageName = isRecordIndexPage
? 'record-index'
: isRecordShowPage
? 'record-show'
: undefined;
const objectNamePlural = useParams().objectNamePlural ?? ''; const objectNamePlural = useParams().objectNamePlural ?? '';
const objectNameSingular = useParams().objectNameSingular ?? ''; const objectNameSingular = useParams().objectNameSingular ?? '';
@ -67,7 +63,10 @@ export const MainContextStoreProvider = () => {
const viewId = getViewId(viewIdQueryParam, indexViewId, lastVisitedViewId); const viewId = getViewId(viewIdQueryParam, indexViewId, lastVisitedViewId);
if (!isDefined(pageName) || !isDefined(objectMetadataItem)) { const shouldComputeContextStore =
isRecordIndexPage || isRecordShowPage || isSettingsPage;
if (!shouldComputeContextStore) {
return null; return null;
} }
@ -75,7 +74,9 @@ export const MainContextStoreProvider = () => {
<MainContextStoreProviderEffect <MainContextStoreProviderEffect
viewId={viewId} viewId={viewId}
objectMetadataItem={objectMetadataItem} objectMetadataItem={objectMetadataItem}
pageName={pageName} isRecordIndexPage={isRecordIndexPage}
isRecordShowPage={isRecordShowPage}
isSettingsPage={isSettingsPage}
/> />
); );
}; };

View File

@ -8,19 +8,26 @@ import { useSetLastVisitedViewForObjectMetadataNamePlural } from '@/navigation/h
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector';
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2'; import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
import { View } from '@/views/types/View';
import { ViewType } from '@/views/types/ViewType'; import { ViewType } from '@/views/types/ViewType';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
type MainContextStoreProviderEffectProps = {
viewId?: string;
objectMetadataItem?: ObjectMetadataItem;
isRecordIndexPage: boolean;
isRecordShowPage: boolean;
isSettingsPage: boolean;
};
export const MainContextStoreProviderEffect = ({ export const MainContextStoreProviderEffect = ({
viewId, viewId,
objectMetadataItem, objectMetadataItem,
pageName, isRecordIndexPage,
}: { isRecordShowPage,
viewId?: string; isSettingsPage,
objectMetadataItem: ObjectMetadataItem; }: MainContextStoreProviderEffectProps) => {
pageName: string;
}) => {
const { setLastVisitedViewForObjectMetadataNamePlural } = const { setLastVisitedViewForObjectMetadataNamePlural } =
useSetLastVisitedViewForObjectMetadataNamePlural(); useSetLastVisitedViewForObjectMetadataNamePlural();
@ -54,6 +61,11 @@ export const MainContextStoreProviderEffect = ({
); );
useEffect(() => { useEffect(() => {
if (!objectMetadataItem) {
setContextStoreCurrentObjectMetadataItemId(undefined);
return;
}
if (contextStoreCurrentObjectMetadataItemId !== objectMetadataItem.id) { if (contextStoreCurrentObjectMetadataItemId !== objectMetadataItem.id) {
setContextStoreCurrentObjectMetadataItemId(objectMetadataItem.id); setContextStoreCurrentObjectMetadataItemId(objectMetadataItem.id);
} }
@ -66,39 +78,78 @@ export const MainContextStoreProviderEffect = ({
setLastVisitedObjectMetadataId({ setLastVisitedObjectMetadataId({
objectMetadataItemId: objectMetadataItem.id, objectMetadataItemId: objectMetadataItem.id,
}); });
if (contextStoreCurrentViewId !== viewId) {
setContextStoreCurrentViewId(viewId);
}
}, [ }, [
contextStoreCurrentObjectMetadataItemId, contextStoreCurrentObjectMetadataItemId,
contextStoreCurrentViewId,
objectMetadataItem, objectMetadataItem,
objectMetadataItem.namePlural,
setContextStoreCurrentObjectMetadataItemId, setContextStoreCurrentObjectMetadataItemId,
setContextStoreCurrentViewId,
setLastVisitedObjectMetadataId, setLastVisitedObjectMetadataId,
setLastVisitedViewForObjectMetadataNamePlural, setLastVisitedViewForObjectMetadataNamePlural,
viewId, viewId,
]); ]);
useEffect(() => { useEffect(() => {
const viewType = if (isSettingsPage) {
pageName === 'record-show' setContextStoreCurrentViewId(undefined);
? ContextStoreViewType.ShowPage return;
: view && view.type === ViewType.Kanban }
? ContextStoreViewType.Kanban
: ContextStoreViewType.Table; if (contextStoreCurrentViewId !== viewId) {
setContextStoreCurrentViewId(viewId);
}
}, [
contextStoreCurrentViewId,
isSettingsPage,
setContextStoreCurrentViewId,
viewId,
]);
useEffect(() => {
const viewType = getViewType({
isSettingsPage,
isRecordShowPage,
isRecordIndexPage,
view,
});
if (contextStoreCurrentViewType !== viewType) { if (contextStoreCurrentViewType !== viewType) {
setContextStoreCurrentViewType(viewType); setContextStoreCurrentViewType(viewType);
} }
}, [ }, [
contextStoreCurrentViewType, contextStoreCurrentViewType,
pageName,
setContextStoreCurrentViewType, setContextStoreCurrentViewType,
view, view,
isSettingsPage,
isRecordShowPage,
isRecordIndexPage,
]); ]);
return null; return null;
}; };
const getViewType = ({
isSettingsPage,
isRecordShowPage,
isRecordIndexPage,
view,
}: {
isSettingsPage: boolean;
isRecordShowPage: boolean;
isRecordIndexPage: boolean;
view?: View;
}) => {
if (isSettingsPage) {
return null;
}
if (isRecordIndexPage) {
return view?.type === ViewType.Kanban
? ContextStoreViewType.Kanban
: ContextStoreViewType.Table;
}
if (isRecordShowPage) {
return ContextStoreViewType.ShowPage;
}
return null;
};