const DropdownMenu = !Platform.isTV ? require("zeego/dropdown-menu") : null; import { type PropsWithChildren, type ReactNode, useEffect, useState, } from "react"; import { Platform, TouchableOpacity, View, type ViewProps } from "react-native"; import { Text } from "@/components/common/Text"; import DisabledSetting from "@/components/settings/DisabledSetting"; interface Props { data: T[]; disabled?: boolean; placeholderText?: string; keyExtractor: (item: T) => string; titleExtractor: (item: T) => string | undefined; title: string | ReactNode; label: string; onSelected: (...item: T[]) => void; multiple?: boolean; } const Dropdown = ({ data, disabled, placeholderText, keyExtractor, titleExtractor, title, label, onSelected, multiple = false, ...props }: PropsWithChildren & ViewProps>) => { const isTv = Platform.isTV; const [selected, setSelected] = useState(); useEffect(() => { if (selected !== undefined) { onSelected(...selected); } }, [selected, onSelected]); if (isTv) return null; return ( {typeof title === "string" ? ( {title} {selected?.length !== undefined ? selected.map(titleExtractor).join(",") : placeholderText} ) : ( title )} {label} {data.map((item, _idx) => multiple ? ( keyExtractor(s) === keyExtractor(item)) ? "on" : "off" } key={keyExtractor(item)} onValueChange={( next: "on" | "off", _previous: "on" | "off", ) => { setSelected((p) => { const prev = p || []; if (next === "on") { return [...prev, item]; } return [ ...prev.filter( (p) => keyExtractor(p) !== keyExtractor(item), ), ]; }); }} > {titleExtractor(item)} ) : ( setSelected([item])} > {titleExtractor(item)} ), )} ); }; export default Dropdown;