// Copyright (C) 2017-2020 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, useDeepEqualEffect } = 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)); } }, []); const metaItemOnClick = React.useCallback((event) => { if (event.currentTarget.dataset.index !== selectedMetaItemIndex.toString()) { event.preventDefault(); event.currentTarget.focus(); } }, [selectedMetaItemIndex]); useDeepEqualEffect(() => { closeInputsModal(); closeAddonModal(); setSelectedMetaItemIndex(0); }, [discover.selected]); 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' ?
{'
{`Error(${discover.catalog.content.content.type})`}
{ discover.catalog.content.content.type === 'UnexpectedResponse' ?
{discover.catalog.content.content.content}
: discover.catalog.content.content.type === 'Env' ?
{discover.catalog.content.content.content.message}
: null }
: 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, isRequired, options, selected, renderLabelText, onSelect }, index) => (
{title} {isRequired ? '*' : null}
))}
: 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;