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 (