diff --git a/src/routes/Discover/Discover.js b/src/routes/Discover/Discover.js index cafd7b98a..9ded90303 100644 --- a/src/routes/Discover/Discover.js +++ b/src/routes/Discover/Discover.js @@ -4,50 +4,41 @@ 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, useDeepEqualEffect } = require('stremio/common'); +const { AddonDetailsModal, Button, MainNavBars, MetaItem, Image, MetaPreview, Multiselect, ModalDialog, PaginationInput, CONSTANTS, useBinaryState, useDeepEqualEffect, useToggleInLibrary } = require('stremio/common'); const useDiscover = require('./useDiscover'); const useSelectableInputs = require('./useSelectableInputs'); const styles = require('./styles'); -const getMetaItemAtIndex = (catalog, index) => { - return index !== null && - isFinite(index) && - catalog !== null && - catalog.content.type === 'Ready' && - catalog.content.content[index] ? - catalog.content.content[index] - : - null; -}; - const Discover = ({ urlParams, queryParams }) => { const discover = useDiscover(urlParams, queryParams); const [selectInputs, paginationInput] = useSelectableInputs(discover); const [inputsModalOpen, openInputsModal, closeInputsModal] = useBinaryState(false); const [addonModalOpen, openAddonModal, closeAddonModal] = useBinaryState(false); - const [selectedMetaItem, setSelectedMetaItem] = React.useState(() => { - return getMetaItemAtIndex(discover.catalog, 0); - }); + 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 toggleInLibrary = useToggleInLibrary(selectedMetaItem); const metaItemsOnFocusCapture = React.useCallback((event) => { if (event.target.dataset.index !== null && !isNaN(event.target.dataset.index)) { - const metaItem = getMetaItemAtIndex(discover.catalog, event.target.dataset.index); - setSelectedMetaItem(metaItem); + setSelectedMetaItemIndex(parseInt(event.target.dataset.index)); } - }, [discover.catalog]); + }, []); const metaItemOnClick = React.useCallback((event) => { - const metaItem = getMetaItemAtIndex(discover.catalog, event.currentTarget.dataset.index); - if (metaItem !== selectedMetaItem) { + if (event.currentTarget.dataset.index !== selectedMetaItemIndex.toString()) { event.preventDefault(); event.currentTarget.focus(); } - }, [discover.catalog, selectedMetaItem]); - React.useLayoutEffect(() => { - const metaItem = getMetaItemAtIndex(discover.catalog, 0); - setSelectedMetaItem(metaItem); - }, [discover.catalog]); + }, [selectedMetaItemIndex]); useDeepEqualEffect(() => { closeInputsModal(); closeAddonModal(); + setSelectedMetaItemIndex(0); }, [discover.selected]); return ( @@ -136,12 +127,12 @@ const Discover = ({ urlParams, queryParams }) => { {discover.catalog.content.content.map((metaItem, index) => ( { released={selectedMetaItem.released} description={selectedMetaItem.description} trailerStreams={selectedMetaItem.trailerStreams} + inLibrary={selectedMetaItem.inLibrary} + toggleInLibrary={toggleInLibrary} /> : discover.catalog !== null && discover.catalog.content.type === 'Loading' ? diff --git a/src/routes/Discover/useDiscover.js b/src/routes/Discover/useDiscover.js index 3afe130d5..18db17401 100644 --- a/src/routes/Discover/useDiscover.js +++ b/src/routes/Discover/useDiscover.js @@ -27,17 +27,8 @@ const map = (discover) => ({ content: { ...discover.catalog.content, content: discover.catalog.content.content.map((metaItem) => ({ - type: metaItem.type, - name: metaItem.name, - logo: metaItem.logo, - poster: metaItem.poster, - posterShape: metaItem.posterShape === 'landscape' ? 'square' : metaItem.posterShape, - runtime: metaItem.runtime, - releaseInfo: metaItem.releaseInfo, + ...metaItem, released: new Date(typeof metaItem.released === 'string' ? metaItem.released : NaN), - description: metaItem.description, - trailerStreams: metaItem.trailerStreams, - deepLinks: metaItem.deepLinks })) } }