import type { BaseItemDto, MediaSourceInfo, } from "@jellyfin/sdk/lib/generated-client/models"; import { useCallback, useMemo } from "react"; import { Platform, TouchableOpacity, View } from "react-native"; const DropdownMenu = !Platform.isTV ? require("zeego/dropdown-menu") : null; import { useTranslation } from "react-i18next"; import { Text } from "./common/Text"; interface Props extends React.ComponentProps { item: BaseItemDto; onChange: (value: MediaSourceInfo) => void; selected?: MediaSourceInfo | null; } export const MediaSourceSelector: React.FC = ({ item, onChange, selected, ...props }) => { const isTv = Platform.isTV; const { t } = useTranslation(); const getDisplayName = useCallback((source: MediaSourceInfo) => { const videoStream = source.MediaStreams?.find((x) => x.Type === "Video"); if (videoStream?.DisplayTitle) { return videoStream.DisplayTitle; } // Fallback to source name if (source.Name) { return source.Name; } // Last resort fallback return `Source ${source.Id}`; }, []); const selectedName = useMemo(() => { if (!selected) return ""; return getDisplayName(selected); }, [selected, getDisplayName]); if (isTv) return null; return ( {t("item_card.video")} {selectedName} Media sources {item.MediaSources?.map((source, idx: number) => ( { onChange(source); }} > {getDisplayName(source)} ))} ); };