diff --git a/src/routes/MetaDetails/MetaDetails.js b/src/routes/MetaDetails/MetaDetails.js index 4b0ebeb82..4893994e0 100644 --- a/src/routes/MetaDetails/MetaDetails.js +++ b/src/routes/MetaDetails/MetaDetails.js @@ -2,43 +2,30 @@ const React = require('react'); const PropTypes = require('prop-types'); -const { VerticalNavBar, HorizontalNavBar, MetaPreview, ModalDialog, Image, useInLibrary } = require('stremio/common'); +const { useServices } = require('stremio/services'); +const { VerticalNavBar, HorizontalNavBar, MetaPreview, ModalDialog, Image } = require('stremio/common'); const StreamsList = require('./StreamsList'); const VideosList = require('./VideosList'); const useMetaDetails = require('./useMetaDetails'); -const useMetaExtensions = require('./useMetaExtensions'); +const useSeason = require('./useSeason'); +const useMetaExtensionTabs = require('./useMetaExtensionTabs'); const styles = require('./styles'); const MetaDetails = ({ urlParams, queryParams }) => { + const { core } = useServices(); const metaDetails = useMetaDetails(urlParams); - const { tabs, selectedMetaExtension, clearSelectedMetaExtension } = useMetaExtensions(metaDetails.meta_resources); - const metaResourceRef = React.useMemo(() => { - return metaDetails.selected !== null ? metaDetails.selected.meta_resources_ref : null; - }, [metaDetails.selected]); - const selectedMetaResource = React.useMemo(() => { - return metaDetails.meta_resources.reduceRight((result, metaResource) => { - if (metaResource.content.type === 'Ready') { - return metaResource; - } - - return result; - }, null); - }, [metaDetails]); - const streamsResourceRef = metaDetails.selected !== null ? metaDetails.selected.streams_resource_ref : null; - const streamsResources = metaDetails.streams_resources; - const seasonQueryParam = React.useMemo(() => { - return queryParams.has('season') && !isNaN(queryParams.get('season')) ? - parseInt(queryParams.get('season')) + const [season, setSeason] = useSeason(urlParams, queryParams); + const [tabs, metaExtension, clearMetaExtension] = useMetaExtensionTabs(metaDetails.metaExtensions); + const [metaPath, streamsPath] = React.useMemo(() => { + return metaDetails.selected !== null ? + [metaDetails.selected.metaPath, metaDetails.selected.streamsPath] : - null; - }, [queryParams]); - const seasonOnSelect = React.useCallback((event) => { - window.location.replace(`#/metadetails/${selectedMetaResource.request.path.type_name}/${selectedMetaResource.request.path.id}?season=${event.value}`); - }, [selectedMetaResource]); - const selectedVideo = React.useMemo(() => { - return streamsResourceRef !== null && selectedMetaResource !== null ? - selectedMetaResource.content.content.videos.reduce((result, video) => { - if (video.id === streamsResourceRef.id) { + [null, null]; + }, [metaDetails.selected]); + const video = React.useMemo(() => { + return streamsPath !== null && metaDetails.metaCatalog !== null && metaDetails.metaCatalog.content.type === 'Ready' ? + metaDetails.metaCatalog.content.content.videos.reduce((result, video) => { + if (video.id === streamsPath.id) { return video; } @@ -46,14 +33,42 @@ const MetaDetails = ({ urlParams, queryParams }) => { }, null) : null; - }, [selectedMetaResource, streamsResourceRef]); - const [inLibrary, toggleInLibrary] = useInLibrary(selectedMetaResource !== null ? selectedMetaResource.content.content : null); + }, [metaDetails.metaCatalog, streamsPath]); + const addToLibrary = React.useCallback(() => { + if (metaDetails.metaCatalog === null || metaDetails.metaCatalog.content.type !== 'Ready') { + return; + } + + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'AddToLibrary', + args: metaDetails.metaCatalog.content.content + } + }); + }, [metaDetails]); + const removeFromLibrary = React.useCallback(() => { + if (metaDetails.metaCatalog === null || metaDetails.metaCatalog.content.type !== 'Ready') { + return; + } + + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'RemoveFromLibrary', + args: metaDetails.metaCatalog.content.content.id + } + }); + }, [metaDetails]); + const seasonOnSelect = React.useCallback((event) => { + setSeason(event.value); + }, [setSeason]); return (
{ @@ -61,39 +76,41 @@ const MetaDetails = ({ urlParams, queryParams }) => { : null } { - metaResourceRef === null ? + metaPath === null ?
{'
No meta was selected!
: - metaDetails.meta_resources.length === 0 ? + metaDetails.metaCatalog === null ?
{'
No addons ware requested for this meta!
: - metaDetails.meta_resources.every((metaResource) => metaResource.content.type === 'Err') ? + metaDetails.metaCatalog.content.type === 'Err' ?
{'
No metadata was found!
: - selectedMetaResource !== null ? + metaDetails.metaCatalog.content.type === 'Loading' ? + + : { - typeof selectedMetaResource.content.content.background === 'string' && - selectedMetaResource.content.content.background.length > 0 ? + typeof metaDetails.metaCatalog.content.content.background === 'string' && + metaDetails.metaCatalog.content.content.background.length > 0 ?
{'
@@ -102,39 +119,37 @@ const MetaDetails = ({ urlParams, queryParams }) => { } 0 ? ` - ${video.title}` : '')} + logo={metaDetails.metaCatalog.content.content.logo} + runtime={metaDetails.metaCatalog.content.content.runtime} + releaseInfo={metaDetails.metaCatalog.content.content.releaseInfo} + released={metaDetails.metaCatalog.content.content.released} description={ - selectedVideo !== null && typeof selectedVideo.overview === 'string' && selectedVideo.overview.length > 0 ? - selectedVideo.overview + video !== null && typeof video.overview === 'string' && video.overview.length > 0 ? + video.overview : - selectedMetaResource.content.content.description + metaDetails.metaCatalog.content.content.description } - links={selectedMetaResource.content.content.links} - trailerStreams={selectedMetaResource.content.content.trailerStreams} - inLibrary={inLibrary} - toggleInLibrary={toggleInLibrary} + links={metaDetails.metaCatalog.content.content.links} + trailerStreams={metaDetails.metaCatalog.content.content.trailerStreams} + inLibrary={metaDetails.metaCatalog.content.content.inLibrary} + toggleInLibrary={metaDetails.metaCatalog.content.content.inLibrary ? removeFromLibrary : addToLibrary} />
- : - }
{ - streamsResourceRef !== null ? + streamsPath !== null ? : - metaResourceRef !== null ? + metaPath !== null ? : @@ -142,15 +157,15 @@ const MetaDetails = ({ urlParams, queryParams }) => { }
{ - selectedMetaExtension !== null ? + metaExtension !== null ? + title={metaExtension.name} + onCloseRequest={clearMetaExtension}>