Files
twenty/packages/twenty-front/src/modules/navigation/hooks/useDefaultHomePagePath.ts
T
nitin 819b3c6c0d followup #12033 (#12150)
follow up #12033

in #12033, SettingsDataModelFieldRelationForm I changed the the use of
objectMetadataItems to activeObjectMetadataItems, which filtered out
system objects. The naming was one factor for this confusion
Renaming it everywhere to specify that they don't include system objects

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
2025-05-21 11:45:33 +02:00

98 lines
3.1 KiB
TypeScript

import { currentUserState } from '@/auth/states/currentUserState';
import { lastVisitedObjectMetadataItemIdState } from '@/navigation/states/lastVisitedObjectMetadataItemIdState';
import { ObjectPathInfo } from '@/navigation/types/ObjectPathInfo';
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
import { AppPath } from '@/types/AppPath';
import { useCallback, useMemo } from 'react';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared/utils';
import { getAppPath } from '~/utils/navigation/getAppPath';
export const useDefaultHomePagePath = () => {
const currentUser = useRecoilValue(currentUserState);
const {
activeNonSystemObjectMetadataItems,
alphaSortedActiveNonSystemObjectMetadataItems,
} = useFilteredObjectMetadataItems();
const prefetchViews = useRecoilValue(prefetchViewsState);
const lastVisitedObjectMetadataItemId = useRecoilValue(
lastVisitedObjectMetadataItemIdState,
);
const getActiveObjectMetadataItemMatchingId = useCallback(
(objectMetadataId: string) => {
return activeNonSystemObjectMetadataItems.find(
(item) => item.id === objectMetadataId,
);
},
[activeNonSystemObjectMetadataItems],
);
const getFirstView = useCallback(
(objectMetadataItemId: string | undefined | null) =>
prefetchViews.find(
(view) => view.objectMetadataId === objectMetadataItemId,
),
[prefetchViews],
);
const firstObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
const [firstObjectMetadataItem] =
alphaSortedActiveNonSystemObjectMetadataItems;
if (!isDefined(firstObjectMetadataItem)) {
return null;
}
const view = getFirstView(firstObjectMetadataItem?.id);
return { objectMetadataItem: firstObjectMetadataItem, view };
}, [alphaSortedActiveNonSystemObjectMetadataItems, getFirstView]);
const defaultObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
if (!isDefined(lastVisitedObjectMetadataItemId)) {
return firstObjectPathInfo;
}
const lastVisitedObjectMetadataItem = getActiveObjectMetadataItemMatchingId(
lastVisitedObjectMetadataItemId,
);
if (isDefined(lastVisitedObjectMetadataItem)) {
return {
view: getFirstView(lastVisitedObjectMetadataItemId),
objectMetadataItem: lastVisitedObjectMetadataItem,
};
}
return firstObjectPathInfo;
}, [
firstObjectPathInfo,
getActiveObjectMetadataItemMatchingId,
getFirstView,
lastVisitedObjectMetadataItemId,
]);
const defaultHomePagePath = useMemo(() => {
if (!isDefined(currentUser)) {
return AppPath.SignInUp;
}
if (!isDefined(defaultObjectPathInfo)) {
return AppPath.NotFound;
}
const namePlural = defaultObjectPathInfo.objectMetadataItem?.namePlural;
const viewId = defaultObjectPathInfo.view?.id;
return getAppPath(
AppPath.RecordIndexPage,
{ objectNamePlural: namePlural },
viewId ? { viewId } : undefined,
);
}, [currentUser, defaultObjectPathInfo]);
return { defaultHomePagePath };
};