// Copyright (C) 2017-2022 Smart code 203358507 const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('@stremio/stremio-icons/dom'); const { useServices } = require('stremio/services'); const { AddonDetailsModal, Button, MainNavBars, MetaItem, Image, MetaPreview, Multiselect, ModalDialog, PaginationInput, CONSTANTS, useBinaryState } = require('stremio/common'); const useDiscover = require('./useDiscover'); const useSelectableInputs = require('./useSelectableInputs'); const styles = require('./styles'); const Discover = ({ urlParams, queryParams }) => { const { core } = useServices(); const discover = useDiscover(urlParams, queryParams); const [selectInputs, paginationInput] = useSelectableInputs(discover); const [inputsModalOpen, openInputsModal, closeInputsModal] = useBinaryState(false); const [addonModalOpen, openAddonModal, closeAddonModal] = useBinaryState(false); const [selectedMetaItemIndex, setSelectedMetaItemIndex] = React.useState(0); const selectedMetaItem = React.useMemo(() => { return discover.catalog !== null && discover.catalog.content.type === 'Ready' && discover.catalog.content.content[selectedMetaItemIndex] ? discover.catalog.content.content[selectedMetaItemIndex] : null; }, [discover.catalog, selectedMetaItemIndex]); const addToLibrary = React.useCallback(() => { if (selectedMetaItem === null) { return; } core.transport.dispatch({ action: 'Ctx', args: { action: 'AddToLibrary', args: selectedMetaItem } }); }, [selectedMetaItem]); const removeFromLibrary = React.useCallback(() => { if (selectedMetaItem === null) { return; } core.transport.dispatch({ action: 'Ctx', args: { action: 'RemoveFromLibrary', args: selectedMetaItem.id } }); }, [selectedMetaItem]); const metaItemsOnFocusCapture = React.useCallback((event) => { if (event.target.dataset.index !== null && !isNaN(event.target.dataset.index)) { setSelectedMetaItemIndex(parseInt(event.target.dataset.index, 10)); } }, []); const metaItemOnClick = React.useCallback((event) => { if (event.currentTarget.dataset.index !== selectedMetaItemIndex.toString()) { event.preventDefault(); event.currentTarget.focus(); } }, [selectedMetaItemIndex]); React.useEffect(() => { closeInputsModal(); closeAddonModal(); setSelectedMetaItemIndex(0); }, [discover.selected]); const metaItemsContainerRef = React.useRef(); React.useEffect(() => { if (discover.catalog?.content.type === 'Loading') { metaItemsContainerRef.current.scrollTop = 0; } }, [discover.catalog]); return (
{ discover.defaultRequest ?
{selectInputs.map(({ title, options, selected, renderLabelText, onSelect }, index) => ( ))}
{ paginationInput !== null ? : }
: null } { discover.catalog !== null && !discover.catalog.installed ?
Addon is not installed. Install now?
: null } { discover.catalog === null ?
{'
No catalog selected!
: discover.catalog.content.type === 'Err' ?
{'
{discover.catalog.content.content}
: discover.catalog.content.type === 'Loading' ?
{Array(CONSTANTS.CATALOG_PAGE_SIZE).fill(null).map((_, index) => (
))}
:
{discover.catalog.content.content.map((metaItem, index) => ( ))}
}
{ selectedMetaItem !== null ? : discover.catalog !== null && discover.catalog.content.type === 'Loading' ?
: null }
{ inputsModalOpen && discover.defaultRequest ?
{selectInputs.map(({ title, options, selected, renderLabelText, onSelect }, index) => ( ))}
: null } { addonModalOpen && discover.selected !== null ? : null } ); }; Discover.propTypes = { urlParams: PropTypes.shape({ transportUrl: PropTypes.string, type: PropTypes.string, catalogId: PropTypes.string }), queryParams: PropTypes.instanceOf(URLSearchParams) }; module.exports = Discover;