import { TouchableOpacityProps, View, ViewProps } from "react-native"; import { Text } from "@/components/common/Text"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { getPrimaryImageUrl } from "@/utils/jellyfin/image/getPrimaryImageUrl"; import { useAtom } from "jotai"; import { useEffect, useMemo, useState } from "react"; import { TouchableItemRouter } from "../common/TouchableItemRouter"; import { BaseItemDto, BaseItemKind, CollectionType, } from "@jellyfin/sdk/lib/generated-client/models"; import { Image } from "expo-image"; import { getColors, ImageColorsResult } from "react-native-image-colors"; import { useQuery } from "@tanstack/react-query"; import { getItemsApi } from "@jellyfin/sdk/lib/utils/api"; import { sortBy } from "lodash"; import { useSettings } from "@/utils/atoms/settings"; import { Ionicons } from "@expo/vector-icons"; interface Props extends TouchableOpacityProps { library: BaseItemDto; } type LibraryColor = { dominantColor: string; averageColor: string; secondary: string; }; type IconName = React.ComponentProps["name"]; const icons: Record = { movies: "film", tvshows: "tv", music: "musical-notes", books: "book", homevideos: "videocam", boxsets: "albums", playlists: "list", folders: "folder", livetv: "tv", musicvideos: "musical-notes", photos: "images", trailers: "videocam", unknown: "help-circle", } as const; export const LibraryItemCard: React.FC = ({ library, ...props }) => { const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const [settings] = useSettings(); const [imageInfo, setImageInfo] = useState({ dominantColor: "#fff", averageColor: "#fff", secondary: "#fff", }); const url = useMemo( () => getPrimaryImageUrl({ api, item: library, }), [library] ); const { data: itemsCount } = useQuery({ queryKey: ["library-count", library.Id], queryFn: async () => { if (!api) return null; const response = await getItemsApi(api).getItems({ userId: user?.Id, parentId: library.Id, limit: 0, }); return response.data.TotalRecordCount; }, }); useEffect(() => { if (url) { getColors(url, { fallback: "#fff", cache: true, key: url, }) .then((colors) => { let dominantColor: string = "#fff"; let averageColor: string = "#fff"; let secondary: string = "#fff"; if (colors.platform === "android") { dominantColor = colors.dominant; averageColor = colors.average; secondary = colors.muted; } else if (colors.platform === "ios") { dominantColor = colors.primary; averageColor = colors.background; secondary = colors.detail; } setImageInfo({ dominantColor, averageColor, secondary, }); }) .catch((error) => { console.log("Error getting colors", error); }); } }, [url]); if (!url) return null; if (settings?.libraryOptions?.display === "row") { return ( {library.Name} {settings?.libraryOptions?.showStats && ( {itemsCount} items )} ); } if (settings?.libraryOptions?.imageStyle === "cover") { return ( {settings?.libraryOptions?.showTitles && ( {library.Name} )} {settings?.libraryOptions?.showStats && ( {itemsCount} items )} ); } return ( {library.Name} {settings?.libraryOptions?.showStats && ( {itemsCount} items )} ); };