import { TouchableOpacity, View, Modal } from "react-native"; import { Text } from "./common/Text"; import { useMemo, useState } from "react"; import { Ionicons } from "@expo/vector-icons"; export type Bitrate = { key: string; value: number | undefined; }; export const BITRATES: Bitrate[] = [ { key: "Max", value: undefined, }, { key: "8 Mb/s", value: 8000000, height: 1080, }, { key: "4 Mb/s", value: 4000000, height: 1080, }, { key: "2 Mb/s", value: 2000000, }, { key: "500 Kb/s", value: 500000, }, { key: "250 Kb/s", value: 250000, }, ].sort((a, b) => (b.value || Infinity) - (a.value || Infinity)); interface Props extends React.ComponentProps { onChange: (value: Bitrate) => void; selected?: Bitrate | null; inverted?: boolean | null; } export const BitrateSelector: React.FC = ({ onChange, selected, inverted, ...props }) => { const [isModalVisible, setIsModalVisible] = useState(false); const sorted = useMemo(() => { if (inverted) return BITRATES.sort( (a, b) => (a.value || Infinity) - (b.value || Infinity) ); return BITRATES.sort( (a, b) => (b.value || Infinity) - (a.value || Infinity) ); }, [inverted]); return ( <> Quality setIsModalVisible(true)} > {BITRATES.find((b) => b.value === selected?.value)?.key} setIsModalVisible(false)} > setIsModalVisible(false)} > Select Quality {sorted.map((bitrate) => ( { onChange(bitrate); setIsModalVisible(false); }} > {bitrate.key} {bitrate.value === selected?.value && ( )} ))} setIsModalVisible(false)} > Cancel ); };