import type { BaseItemDto, MediaSourceInfo, } from "@jellyfin/sdk/lib/generated-client/models"; import { 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 }) => { if (Platform.isTV) return null; const selectedName = useMemo( () => item.MediaSources?.find((x) => x.Id === selected?.Id)?.MediaStreams?.find( (x) => x.Type === "Video", )?.DisplayTitle || "", [item, selected], ); const { t } = useTranslation(); const commonPrefix = useMemo(() => { const mediaSources = item.MediaSources || []; if (!mediaSources.length) return ""; let commonPrefix = ""; for (let i = 0; i < mediaSources[0].Name!.length; i++) { const char = mediaSources[0].Name![i]; if (mediaSources.every((source) => source.Name![i] === char)) { commonPrefix += char; } else { commonPrefix = commonPrefix.slice(0, -1); break; } } return commonPrefix; }, [item.MediaSources]); const name = (name?: string | null) => { return name?.replace(commonPrefix, "").toLowerCase(); }; return ( {t("item_card.video")} {selectedName} Media sources {item.MediaSources?.map((source, idx: number) => ( { onChange(source); }} > {`${name(source.Name)}`} ))} ); };