import { tc } from "@/utils/textTools"; import { MediaSourceInfo } from "@jellyfin/sdk/lib/generated-client/models"; import { useMemo, useState } from "react"; import { Platform, TouchableOpacity, View, Modal } from "react-native"; import { Text } from "./common/Text"; import { SubtitleHelper } from "@/utils/SubtitleHelper"; import { Ionicons } from "@expo/vector-icons"; interface Props extends React.ComponentProps { source?: MediaSourceInfo; onChange: (value: number) => void; selected?: number | undefined; isTranscoding?: boolean; } export const SubtitleTrackSelector: React.FC = ({ source, onChange, selected, isTranscoding, ...props }) => { const [isModalVisible, setIsModalVisible] = useState(false); const subtitleStreams = useMemo(() => { const subtitleHelper = new SubtitleHelper(source?.MediaStreams ?? []); if (isTranscoding && Platform.OS === "ios") { return subtitleHelper.getUniqueSubtitles(); } return subtitleHelper.getSubtitles(); }, [source, isTranscoding]); const selectedSubtitleSteam = useMemo( () => subtitleStreams.find((x) => x.Index === selected), [subtitleStreams, selected] ); if (subtitleStreams.length === 0) return null; return ( <> Subtitle setIsModalVisible(true)} > {selectedSubtitleSteam ? tc(selectedSubtitleSteam?.DisplayTitle, 7) : "None"} setIsModalVisible(false)} > setIsModalVisible(false)} > Subtitle Tracks { onChange(-1); setIsModalVisible(false); }} > None {selected === -1 && ( )} {subtitleStreams?.map((subtitle, idx: number) => ( { if ( subtitle.Index !== undefined && subtitle.Index !== null ) { onChange(subtitle.Index); setIsModalVisible(false); } }} > {subtitle.DisplayTitle} {subtitle.Index === selected && ( )} ))} setIsModalVisible(false)} > Cancel ); };