From 957e60714a68f594dc3ccbd1ed5894ee31b72266 Mon Sep 17 00:00:00 2001 From: stenlan <14372001+stenlan@users.noreply.github.com> Date: Wed, 3 Sep 2025 21:45:15 +0200 Subject: [PATCH] fix: BaseItemDto/BaseItemPerson routing bug (#1030) --- .../[actorId].tsx => persons/[personId].tsx} | 14 +++++++------- components/common/TouchableItemRouter.tsx | 14 ++++---------- components/series/CastAndCrew.tsx | 18 +++++++++++++----- components/stacks/NestedTabPageStack.tsx | 2 +- 4 files changed, 25 insertions(+), 23 deletions(-) rename app/(auth)/(tabs)/(home,libraries,search,favorites)/{actors/[actorId].tsx => persons/[personId].tsx} (93%) diff --git a/app/(auth)/(tabs)/(home,libraries,search,favorites)/actors/[actorId].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/persons/[personId].tsx similarity index 93% rename from app/(auth)/(tabs)/(home,libraries,search,favorites)/actors/[actorId].tsx rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/persons/[personId].tsx index d95488fa..f2f8dcaf 100644 --- a/app/(auth)/(tabs)/(home,libraries,search,favorites)/actors/[actorId].tsx +++ b/app/(auth)/(tabs)/(home,libraries,search,favorites)/persons/[personId].tsx @@ -22,21 +22,21 @@ import { getUserItemData } from "@/utils/jellyfin/user-library/getUserItemData"; const page: React.FC = () => { const local = useLocalSearchParams(); - const { actorId } = local as { actorId: string }; + const { personId } = local as { personId: string }; const { t } = useTranslation(); const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const { data: item, isLoading: l1 } = useQuery({ - queryKey: ["item", actorId], + queryKey: ["item", personId], queryFn: async () => await getUserItemData({ api, userId: user?.Id, - itemId: actorId, + itemId: personId, }), - enabled: !!actorId && !!api, + enabled: !!personId && !!api, staleTime: 60, }); @@ -50,7 +50,7 @@ const page: React.FC = () => { const response = await getItemsApi(api).getItems({ userId: user.Id, - personIds: [actorId], + personIds: [personId], startIndex: pageParam, limit: 16, sortOrder: ["Descending", "Descending", "Ascending"], @@ -68,7 +68,7 @@ const page: React.FC = () => { return response.data; }, - [api, user?.Id, actorId], + [api, user?.Id, personId], ); const backdropUrl = useMemo( @@ -131,7 +131,7 @@ const page: React.FC = () => { )} queryFn={fetchItems} - queryKey={["actor", "movies", actorId]} + queryKey={["actor", "movies", personId]} /> diff --git a/components/common/TouchableItemRouter.tsx b/components/common/TouchableItemRouter.tsx index 614e5bb7..b84dfae1 100644 --- a/components/common/TouchableItemRouter.tsx +++ b/components/common/TouchableItemRouter.tsx @@ -1,8 +1,5 @@ import { useActionSheet } from "@expo/react-native-action-sheet"; -import type { - BaseItemDto, - BaseItemPerson, -} from "@jellyfin/sdk/lib/generated-client/models"; +import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import { useRouter, useSegments } from "expo-router"; import { type PropsWithChildren, useCallback } from "react"; import { TouchableOpacity, type TouchableOpacityProps } from "react-native"; @@ -14,10 +11,7 @@ interface Props extends TouchableOpacityProps { isOffline?: boolean; } -export const itemRouter = ( - item: BaseItemDto | BaseItemPerson, - from: string, -) => { +export const itemRouter = (item: BaseItemDto, from: string) => { if ("CollectionType" in item && item.CollectionType === "livetv") { return `/(auth)/(tabs)/${from}/livetv`; } @@ -26,8 +20,8 @@ export const itemRouter = ( return `/(auth)/(tabs)/${from}/series/${item.Id}`; } - if (item.Type === "Person" || item.Type === "Actor") { - return `/(auth)/(tabs)/${from}/actors/${item.Id}`; + if (item.Type === "Person") { + return `/(auth)/(tabs)/${from}/persons/${item.Id}`; } if (item.Type === "BoxSet") { diff --git a/components/series/CastAndCrew.tsx b/components/series/CastAndCrew.tsx index 18365635..15568451 100644 --- a/components/series/CastAndCrew.tsx +++ b/components/series/CastAndCrew.tsx @@ -27,16 +27,18 @@ export const CastAndCrew: React.FC = ({ item, loading, ...props }) => { const from = segments[2]; const destinctPeople = useMemo(() => { - const people: BaseItemPerson[] = []; + const people: Record = {}; item?.People?.forEach((person) => { - const existingPerson = people.find((p) => p.Id === person.Id); + if (!person.Id) return; + + const existingPerson = people[person.Id]; if (existingPerson) { existingPerson.Role = `${existingPerson.Role}, ${person.Role}`; } else { - people.push(person); + people[person.Id] = person; } }); - return people; + return Object.values(people); }, [item?.People]); if (!from) return null; @@ -54,7 +56,13 @@ export const CastAndCrew: React.FC = ({ item, loading, ...props }) => { renderItem={(i) => ( { - const url = itemRouter(i, from); + const url = itemRouter( + { + Id: i.Id, + Type: "Person", + }, + from, + ); // @ts-expect-error router.push(url); }} diff --git a/components/stacks/NestedTabPageStack.tsx b/components/stacks/NestedTabPageStack.tsx index 8e66e0bf..6c151b0f 100644 --- a/components/stacks/NestedTabPageStack.tsx +++ b/components/stacks/NestedTabPageStack.tsx @@ -17,7 +17,7 @@ export const commonScreenOptions: ICommonScreenOptions = { headerLeft: () => , }; -const routes = ["actors/[actorId]", "items/page", "series/[id]"]; +const routes = ["persons/[personId]", "items/page", "series/[id]"]; export const nestedTabPageScreenOptions: Record = Object.fromEntries(routes.map((route) => [route, commonScreenOptions]));