const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('stremio-icons/dom'); const Button = require('stremio/common/Button'); const Popup = require('stremio/common/Popup'); const ModalDialog = require('stremio/common/ModalDialog'); const useBinaryState = require('stremio/common/useBinaryState'); const styles = require('./styles'); const Multiselect = ({ className, direction, title, disabled, dataset, modalOptions, renderLabelContent, renderLabelText, onOpen, onClose, onSelect, ...props }) => { const [menuOpen, , closeMenu, toggleMenu] = useBinaryState(false); const options = React.useMemo(() => { return Array.isArray(props.options) ? props.options.filter((option) => { return option && typeof option.value === 'string'; }) : []; }, [props.options]); const selected = React.useMemo(() => { return Array.isArray(props.selected) ? props.selected.filter((value) => { return typeof value === 'string'; }) : []; }, [props.selected]); const popupLabelOnClick = React.useCallback((event) => { if (typeof props.onClick === 'function') { props.onClick(event); } if (!event.nativeEvent.togglePopupPrevented) { toggleMenu(); } }, [props.onClick, toggleMenu]); const popupMenuOnClick = React.useCallback((event) => { event.nativeEvent.togglePopupPrevented = true; }, []); const popupMenuOnKeyDown = React.useCallback((event) => { event.nativeEvent.buttonClickPrevented = true; }, []); const optionOnClick = React.useCallback((event) => { if (typeof onSelect === 'function') { onSelect({ type: 'select', value: event.currentTarget.dataset.value, reactEvent: event, nativeEvent: event.nativeEvent, dataset: dataset }); } if (!event.nativeEvent.closeMenuPrevented) { closeMenu(); } }, [dataset, onSelect]); const mountedRef = React.useRef(false); React.useLayoutEffect(() => { if (mountedRef.current) { if (menuOpen) { if (typeof onOpen === 'function') { onOpen({ type: 'open', dataset: dataset }); } } else { if (typeof onClose === 'function') { onClose({ type: 'close', dataset: dataset }); } } } mountedRef.current = true; }, [menuOpen]); const renderLabel = React.useCallback(({ children, className, ...props }) => ( )); const renderOptions = React.useCallback((options) => { return ( options.length > 0 ? options.map(({ label, value }) => ( )) :