|
| 1 | +import { currentUserState } from '@/auth/states/currentUserState'; |
| 2 | +import { useLastVisitedObjectMetadataItem } from '@/navigation/hooks/useLastVisitedObjectMetadataItem'; |
| 3 | +import { ObjectPathInfo } from '@/navigation/types/ObjectPathInfo'; |
| 4 | +import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; |
| 5 | +import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; |
| 6 | +import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; |
| 7 | +import { AppPath } from '@/types/AppPath'; |
| 8 | +import { View } from '@/views/types/View'; |
| 9 | +import { useCallback, useMemo } from 'react'; |
| 10 | +import { useRecoilValue } from 'recoil'; |
| 11 | +import { isDefined } from '~/utils/isDefined'; |
| 12 | + |
| 13 | +export const useDefaultHomePagePath = () => { |
| 14 | + const currentUser = useRecoilValue(currentUserState); |
| 15 | + const { activeObjectMetadataItems, alphaSortedActiveObjectMetadataItems } = |
| 16 | + useFilteredObjectMetadataItems(); |
| 17 | + const { records: views } = usePrefetchedData<View>(PrefetchKey.AllViews); |
| 18 | + const { lastVisitedObjectMetadataItemId } = |
| 19 | + useLastVisitedObjectMetadataItem(); |
| 20 | + |
| 21 | + const getActiveObjectMetadataItemMatchingId = useCallback( |
| 22 | + (objectMetadataId: string) => { |
| 23 | + return activeObjectMetadataItems.find( |
| 24 | + (item) => item.id === objectMetadataId, |
| 25 | + ); |
| 26 | + }, |
| 27 | + [activeObjectMetadataItems], |
| 28 | + ); |
| 29 | + |
| 30 | + const getFirstView = useCallback( |
| 31 | + (objectMetadataItemId: string | undefined | null) => |
| 32 | + views.find((view) => view.objectMetadataId === objectMetadataItemId), |
| 33 | + [views], |
| 34 | + ); |
| 35 | + |
| 36 | + const firstObjectPathInfo = useMemo<ObjectPathInfo | null>(() => { |
| 37 | + const [firstObjectMetadataItem] = alphaSortedActiveObjectMetadataItems; |
| 38 | + |
| 39 | + if (!isDefined(firstObjectMetadataItem)) { |
| 40 | + return null; |
| 41 | + } |
| 42 | + |
| 43 | + const view = getFirstView(firstObjectMetadataItem?.id); |
| 44 | + |
| 45 | + return { objectMetadataItem: firstObjectMetadataItem, view }; |
| 46 | + }, [alphaSortedActiveObjectMetadataItems, getFirstView]); |
| 47 | + |
| 48 | + const defaultObjectPathInfo = useMemo<ObjectPathInfo | null>(() => { |
| 49 | + if (!isDefined(lastVisitedObjectMetadataItemId)) { |
| 50 | + return firstObjectPathInfo; |
| 51 | + } |
| 52 | + |
| 53 | + const lastVisitedObjectMetadataItem = getActiveObjectMetadataItemMatchingId( |
| 54 | + lastVisitedObjectMetadataItemId, |
| 55 | + ); |
| 56 | + |
| 57 | + if (isDefined(lastVisitedObjectMetadataItem)) { |
| 58 | + return { |
| 59 | + view: getFirstView(lastVisitedObjectMetadataItemId), |
| 60 | + objectMetadataItem: lastVisitedObjectMetadataItem, |
| 61 | + }; |
| 62 | + } |
| 63 | + |
| 64 | + return firstObjectPathInfo; |
| 65 | + }, [ |
| 66 | + firstObjectPathInfo, |
| 67 | + getActiveObjectMetadataItemMatchingId, |
| 68 | + getFirstView, |
| 69 | + lastVisitedObjectMetadataItemId, |
| 70 | + ]); |
| 71 | + |
| 72 | + const defaultHomePagePath = useMemo(() => { |
| 73 | + if (!isDefined(currentUser)) { |
| 74 | + return AppPath.SignInUp; |
| 75 | + } |
| 76 | + |
| 77 | + if (!isDefined(defaultObjectPathInfo)) { |
| 78 | + return AppPath.NotFound; |
| 79 | + } |
| 80 | + |
| 81 | + const namePlural = defaultObjectPathInfo.objectMetadataItem?.namePlural; |
| 82 | + const viewParam = defaultObjectPathInfo.view |
| 83 | + ? `?view=${defaultObjectPathInfo.view.id}` |
| 84 | + : ''; |
| 85 | + |
| 86 | + return `/objects/${namePlural}${viewParam}`; |
| 87 | + }, [currentUser, defaultObjectPathInfo]); |
| 88 | + |
| 89 | + return { defaultHomePagePath }; |
| 90 | +}; |
0 commit comments