const DropdownMenu = !Platform.isTV ? require("zeego/dropdown-menu") : null; import { Platform, TouchableOpacity, View, ViewProps } from "react-native"; import { Text } from "@/components/common/Text"; import React, { PropsWithChildren, ReactNode, useEffect, useState, } from "react"; 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; multi?: boolean; } const Dropdown = ({ data, disabled, placeholderText, keyExtractor, titleExtractor, title, label, onSelected, multi = false, ...props }: PropsWithChildren & ViewProps>) => { if (Platform.isTV) return null; const [selected, setSelected] = useState(); useEffect(() => { if (selected !== undefined) { onSelected(...selected); } }, [selected]); return ( {typeof title === "string" ? ( {title} {selected?.length !== undefined ? selected.map(titleExtractor).join(",") : placeholderText} ) : ( <>{title} )} {label} {data.map((item, idx) => multi ? ( keyExtractor(s) == keyExtractor(item)) ? "on" : "off" } key={keyExtractor(item)} onValueChange={(next, previous) => 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;