Fix active library highlighting for items

This commit is contained in:
Bill Thornton
2026-03-19 12:59:03 -04:00
parent 2757cf7ace
commit ef109c452f
3 changed files with 63 additions and 4 deletions
@@ -1,4 +1,5 @@
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';
import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind';
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
import ArrowDropDown from '@mui/icons-material/ArrowDropDown';
import Favorite from '@mui/icons-material/Favorite';
@@ -11,7 +12,8 @@ import { Link, useLocation, useSearchParams } from 'react-router-dom';
import LibraryIcon from 'apps/experimental/components/LibraryIcon';
import { MetaView } from 'apps/experimental/constants/metaView';
import { isLibraryPath } from 'apps/experimental/features/libraries/utils/path';
import { useAncestors } from 'apps/experimental/features/libraries/hooks/api/useAncestors';
import { isDetailsPath, isLibraryPath } from 'apps/experimental/features/libraries/utils/path';
import { appRouter } from 'components/router/appRouter';
import { useApi } from 'hooks/useApi';
import useCurrentTab from 'hooks/useCurrentTab';
@@ -37,7 +39,7 @@ const getCurrentUserView = (
collectionType: string | null,
tab: number
) => {
const isUserViewPath = isLibraryPath(pathname) || [HOME_PATH, LIST_PATH].includes(pathname);
const isUserViewPath = isDetailsPath(pathname) || isLibraryPath(pathname) || [HOME_PATH, LIST_PATH].includes(pathname);
if (!isUserViewPath) return undefined;
if (collectionType === CollectionType.Livetv) {
@@ -55,6 +57,7 @@ const getCurrentUserView = (
const UserViewNav = () => {
const location = useLocation();
const [ searchParams ] = useSearchParams();
const itemId = searchParams.get('id') || undefined;
const libraryId = searchParams.get('topParentId') || searchParams.get('parentId');
const collectionType = searchParams.get('collectionType');
const { activeTab } = useCurrentTab();
@@ -78,6 +81,14 @@ const UserViewNav = () => {
isPending
} = useUserViews(user?.Id);
const {
data: ancestors
} = useAncestors({ itemId });
const ancestorLibraryId = useMemo(() => {
return ancestors?.find(ancestor => ancestor.Type === BaseItemKind.CollectionFolder)?.Id || null;
}, [ ancestors ]);
const primaryViews = useMemo(() => (
userViews?.Items?.slice(0, maxViews)
), [ maxViews, userViews ]);
@@ -98,8 +109,8 @@ const UserViewNav = () => {
}, []);
const currentUserView = useMemo(() => (
getCurrentUserView(userViews?.Items, location.pathname, libraryId, collectionType, activeTab)
), [ activeTab, collectionType, libraryId, location.pathname, userViews ]);
getCurrentUserView(userViews?.Items, location.pathname, libraryId || ancestorLibraryId, collectionType, activeTab)
), [ activeTab, collectionType, libraryId, ancestorLibraryId, location.pathname, userViews ]);
if (isPending) return null;
@@ -0,0 +1,41 @@
import type { Api } from '@jellyfin/sdk/lib/api';
import type { LibraryApiGetAncestorsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api';
import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api';
import { queryOptions, useQuery } from '@tanstack/react-query';
import type { AxiosRequestConfig } from 'axios';
import { useApi } from 'hooks/useApi';
interface AncestorsParams {
itemId?: string;
userId?: string;
}
const fetchAncestors = async (
api: Api,
params: LibraryApiGetAncestorsRequest,
options?: AxiosRequestConfig
) => {
const response = await getLibraryApi(api).getAncestors(params, options);
return response.data;
};
/** Query options for fetching the hierarchy of ancestors of a given item. */
export const getAncestorsQuery = (
api?: Api,
params?: AncestorsParams
) => queryOptions({
queryKey: [ 'Items', params?.itemId, 'Ancestors' ],
queryFn: ({ signal }) => fetchAncestors(api!, params as LibraryApiGetAncestorsRequest, { signal }),
staleTime: Infinity, // Ancestors are unlikely to change
enabled: !!api && !!params?.itemId
});
/** Hook to fetch the hierarchy of ancestors of a given item. */
export const useAncestors = (
params: AncestorsParams
) => {
const apiContext = useApi();
const { api } = apiContext;
return useQuery(getAncestorsQuery(api, params));
};
@@ -2,6 +2,13 @@ import * as userSettings from 'scripts/settings/userSettings';
import { LibraryRoutes } from '../constants/libraryRoutes';
/**
* Utility function to check if a path is a details path.
*/
export const isDetailsPath = (path: string) => (
path === '/details'
);
/**
* Utility function to check if a path is a library path.
*/