import { DialogButton, DialogCheckbox, DialogCheckboxProps, Marquee, Menu, MenuItem, Module, findModule, showContextMenu, } from '@decky/ui'; import { FC, useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { FaChevronDown } from 'react-icons/fa'; // TODO add to dfl const dropDownControlButtonClasses = findModule((m: Module) => m?.DropDownControlButton && m?.['duration-app-launch']); const DropdownMultiselectItem: FC< { value: any; onSelect: (checked: boolean, value: any) => void; checked: boolean; } & DialogCheckboxProps > = ({ value, onSelect, checked: defaultChecked, ...rest }) => { const [checked, setChecked] = useState(defaultChecked); useEffect(() => { onSelect?.(checked, value); }, [checked, onSelect, value]); return ( setChecked((x) => !x)}> setChecked((x) => !x)} onChange={(checked) => setChecked(checked)} controlled checked={checked} /> ); }; const DropdownMultiselect: FC<{ items: { label: string; value: string; }[]; selected: string[]; onSelect: (selected: any[]) => void; label: string; }> = ({ label, items, selected, onSelect }) => { const [itemsSelected, setItemsSelected] = useState(selected); const { t } = useTranslation(); const handleItemSelect = useCallback((checked: boolean, value: any) => { setItemsSelected((x: any) => checked ? [...x.filter((y: any) => y !== value), value] : x.filter((y: any) => y !== value), ); }, []); useEffect(() => { onSelect(itemsSelected); }, [itemsSelected, onSelect]); return ( { evt.preventDefault(); showContextMenu( {/*FIXME: Hack for missing padding under label menu*/} {items.map((x) => ( ))} , evt.currentTarget ?? window, ); }} > {selected.length > 0 ? selected.map((x: any) => items[items.findIndex((v) => v.value === x)].label).join(', ') : '…'} ); }; export default DropdownMultiselect;