import { DialogButton, DialogCheckbox, DialogCheckboxProps, Marquee, Menu, MenuItem, findModuleChild, showContextMenu, } from 'decky-frontend-lib'; import { FC, useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { FaChevronDown } from 'react-icons/fa'; const dropDownControlButtonClass = findModuleChild((m) => { if (typeof m !== 'object') return undefined; for (const prop in m) { if (m[prop]?.toString()?.includes('gamepaddropdown_DropDownControlButton')) { return m[prop]; } } }); 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, value) => { 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;