// 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 { AddonDetailsModal, Button, MainNavBars, MetaItem, Image, MetaPreview, Multiselect, ModalDialog, PaginationInput, CONSTANTS, useBinaryState, useProfile } = require('stremio/common'); const useDiscover = require('./useDiscover'); const useSelectableInputs = require('./useSelectableInputs'); const styles = require('./styles'); const getMetaItemAtIndex = (catalog_resource, index) => { return index !== null && isFinite(index) && catalog_resource !== null && catalog_resource.content.type === 'Ready' && catalog_resource.content.content[index] ? catalog_resource.content.content[index] : null; }; const Discover = ({ urlParams, queryParams }) => { const discover = useDiscover(urlParams, queryParams); const [selectInputs, paginationInput] = useSelectableInputs(discover); const profile = useProfile(); const [inputsModalOpen, openInputsModal, closeInputsModal] = useBinaryState(false); const [addonModalOpen, openAddonModal, closeAddonModal] = useBinaryState(false); const [selectedMetaItem, setSelectedMetaItem] = React.useState(() => { return getMetaItemAtIndex(discover.catalog_resource, 0); }); const metaItemsOnFocusCapture = React.useCallback((event) => { const metaItem = getMetaItemAtIndex(discover.catalog_resource, event.target.dataset.index); setSelectedMetaItem(metaItem); }, [discover.catalog_resource]); const metaItemOnClick = React.useCallback((event) => { const metaItem = getMetaItemAtIndex(discover.catalog_resource, event.currentTarget.dataset.index); if (metaItem !== selectedMetaItem) { event.preventDefault(); event.currentTarget.focus(); } }, [discover.catalog_resource, selectedMetaItem]); const available = React.useMemo(() => { return discover.selectable.types.length > 0 || discover.catalog_resource !== null; }, [discover]); React.useLayoutEffect(() => { const metaItem = getMetaItemAtIndex(discover.catalog_resource, 0); setSelectedMetaItem(metaItem); }, [discover.catalog_resource]); React.useLayoutEffect(() => { closeInputsModal(); closeAddonModal(); }, [discover.selected]); return (
{ available ?
{selectInputs.map(({ title, options, selected, renderLabelText, onSelect }, index) => ( ))}
{ paginationInput !== null ? : }
: null } { discover.catalog_resource !== null && discover.catalog_resource.content.type === 'Ready' && !profile.addons.some((addon) => addon.transportUrl === discover.catalog_resource.request.base) ?
Addon is not installed. Install now?
: null } { !available ?
{'
No catalogs available!
: discover.catalog_resource === null ?
{'
No catalog selected!
: discover.catalog_resource.content.type === 'Err' ?
{'
{`Error(${discover.catalog_resource.content.content.type})${typeof discover.catalog_resource.content.content.content.message === 'string' ? ` - ${discover.catalog_resource.content.content.content.message}` : ''}`}
: discover.catalog_resource.content.type === 'Loading' ?
{Array(CONSTANTS.CATALOG_PAGE_SIZE).fill(null).map((_, index) => (
))}
:
{discover.catalog_resource.content.content.map((metaItem, index) => ( ))}
}
{ available ? selectedMetaItem !== null ? :
: null }
{ inputsModalOpen ? {selectInputs.map(({ title, isRequired, options, selected, renderLabelText, onSelect }, index) => (
{title} {isRequired ? '*' : null}
))}
: null } { addonModalOpen && discover.catalog_resource !== null ? : null } ); }; Discover.propTypes = { urlParams: PropTypes.shape({ transportUrl: PropTypes.string, type: PropTypes.string, catalogId: PropTypes.string }), queryParams: PropTypes.instanceOf(URLSearchParams) }; module.exports = Discover;