// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const { useTranslation } = require('react-i18next'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const { default: Icon } = require('@stremio/stremio-icons/react'); const { Button } = require('stremio/components'); const Popup = require('stremio/components/Popup'); const ModalDialog = require('stremio/components/ModalDialog'); const useBinaryState = require('stremio/common/useBinaryState'); const styles = require('./styles'); const Multiselect = ({ className, mode, direction, title, disabled, dataset, options, renderLabelContent, renderLabelText, onOpen, onClose, onSelect, ...props }) => { const { t } = useTranslation(); const [menuOpen, , closeMenu, toggleMenu] = useBinaryState(false); const filteredOptions = React.useMemo(() => { return Array.isArray(options) ? options.filter((option) => { return option && (typeof option.value === 'string' || option.value === null); }) : []; }, [options]); const selected = React.useMemo(() => { return Array.isArray(props.selected) ? props.selected.filter((value) => { return typeof value === 'string' || value === null; }) : []; }, [props.selected]); const labelOnClick = React.useCallback((event) => { if (typeof props.onClick === 'function') { props.onClick(event); } if (!event.nativeEvent.toggleMenuPrevented) { toggleMenu(); } }, [props.onClick, toggleMenu]); const menuOnClick = React.useCallback((event) => { event.nativeEvent.toggleMenuPrevented = true; }, []); const menuOnKeyDown = 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 }) => ( ), [menuOpen, title, disabled, filteredOptions, selected, labelOnClick, renderLabelContent, renderLabelText]); const renderMenu = React.useCallback(() => (