diff --git a/src/common/MetaItem/MetaItem.js b/src/common/MetaItem/MetaItem.js index acce287ad..95885a018 100644 --- a/src/common/MetaItem/MetaItem.js +++ b/src/common/MetaItem/MetaItem.js @@ -23,8 +23,23 @@ const ICON_FOR_TYPE = new Map([ ['other', 'ic_movies'], ]); -const MetaItem = React.memo(({ className, type, name, poster, posterShape, playIcon, progress, options, dataset, optionOnSelect, ...props }) => { +const MetaItem = React.memo(({ className, type, name, poster, posterShape, playIcon, progress, options, deepLinks, dataset, optionOnSelect, ...props }) => { const [menuOpen, onMenuOpen, onMenuClose] = useBinaryState(false); + const href = React.useMemo(() => { + return deepLinks ? + typeof deepLinks.player === 'string' ? + deepLinks.player + : + typeof deepLinks.meta_details_streams === 'string' ? + deepLinks.meta_details_streams + : + typeof deepLinks.meta_details_videos === 'string' ? + deepLinks.meta_details_videos + : + null + : + null; + }, [deepLinks]); const metaItemOnClick = React.useCallback((event) => { if (typeof props.onClick === 'function') { props.onClick(event); @@ -58,7 +73,7 @@ const MetaItem = React.memo(({ className, type, name, poster, posterShape, playI ), []); return ( - @@ -69,7 +69,9 @@ MetaRow.propTypes = { posterShape: PropTypes.string })), itemComponent: PropTypes.elementType, - href: PropTypes.string + deepLinks: PropTypes.shape({ + discover: PropTypes.string + }) }; module.exports = MetaRow; diff --git a/src/common/MetaRow/MetaRowPlaceholder/MetaRowPlaceholder.js b/src/common/MetaRow/MetaRowPlaceholder/MetaRowPlaceholder.js index 9f0398b9f..79de6b370 100644 --- a/src/common/MetaRow/MetaRowPlaceholder/MetaRowPlaceholder.js +++ b/src/common/MetaRow/MetaRowPlaceholder/MetaRowPlaceholder.js @@ -6,7 +6,7 @@ const Button = require('stremio/common/Button'); const CONSTANTS = require('stremio/common/CONSTANTS'); const styles = require('./styles'); -const MetaRowPlaceholder = ({ className, title, href }) => { +const MetaRowPlaceholder = ({ className, title, deepLinks }) => { return (
@@ -14,8 +14,8 @@ const MetaRowPlaceholder = ({ className, title, href }) => { {typeof title === 'string' && title.length > 0 ? title : null}
{ - typeof href === 'string' && href.length > 0 ? - @@ -40,7 +40,9 @@ const MetaRowPlaceholder = ({ className, title, href }) => { MetaRowPlaceholder.propTypes = { className: PropTypes.string, title: PropTypes.string, - href: PropTypes.string + deepLinks: PropTypes.shape({ + discover: PropTypes.string + }) }; module.exports = MetaRowPlaceholder; diff --git a/src/routes/Board/Board.js b/src/routes/Board/Board.js index 9cc5f26e5..f21536db7 100644 --- a/src/routes/Board/Board.js +++ b/src/routes/Board/Board.js @@ -24,7 +24,6 @@ const Board = () => { null } {board.catalog_resources.map((catalog_resource, index) => { - const href = `#/discover/${encodeURIComponent(catalog_resource.request.base)}/${encodeURIComponent(catalog_resource.request.path.type_name)}/${encodeURIComponent(catalog_resource.request.path.id)}`; const title = `${catalog_resource.origin} - ${catalog_resource.request.path.id} ${catalog_resource.request.path.type_name}`; switch (catalog_resource.content.type) { case 'Ready': { @@ -39,7 +38,7 @@ const Board = () => { title={title} items={catalog_resource.content.content} itemComponent={MetaItem} - href={href} + deepLinks={catalog_resource.deepLinks} /> ); } @@ -51,7 +50,7 @@ const Board = () => { className={styles['board-row']} title={title} message={message} - href={href} + deepLinks={catalog_resource.deepLinks} /> ); } @@ -61,7 +60,7 @@ const Board = () => { key={index} className={classnames(styles['board-row'], styles['board-row-poster'])} title={title} - href={href} + deepLinks={catalog_resource.deepLinks} /> ); } diff --git a/src/routes/Board/useBoard.js b/src/routes/Board/useBoard.js index 8064c6da7..b59629b38 100644 --- a/src/routes/Board/useBoard.js +++ b/src/routes/Board/useBoard.js @@ -1,5 +1,5 @@ const React = require('react'); -const { useModelState } = require('stremio/common'); +const { deepLinking, useModelState } = require('stremio/common'); const initBoardState = () => ({ selected: null, @@ -18,7 +18,7 @@ const mapBoardStateWithCtx = (board, ctx) => { name: metaItem.name, poster: metaItem.poster, posterShape: metaItems[0].posterShape, - href: `#/metadetails/${encodeURIComponent(metaItem.type)}/${encodeURIComponent(metaItem.id)}` // TODO this should redirect with videoId at some cases + deepLinks: deepLinking.withMetaItem({ metaItem }) })) } : @@ -33,7 +33,8 @@ const mapBoardStateWithCtx = (board, ctx) => { return origin; }, catalog_resource.request.base); - return { request, content, origin }; + const deepLinks = deepLinking.withCatalog({ request }); + return { request, content, origin, deepLinks }; }); return { selected, catalog_resources }; }; diff --git a/src/routes/Search/Search.js b/src/routes/Search/Search.js index 8efe60f96..0e653b79b 100644 --- a/src/routes/Search/Search.js +++ b/src/routes/Search/Search.js @@ -47,8 +47,6 @@ const Search = ({ queryParams }) => {
: search.catalog_resources.map((catalog_resource, index) => { - const queryString = new URLSearchParams([['search', query]]).toString(); - const href = `#/discover/${encodeURIComponent(catalog_resource.request.base)}/${encodeURIComponent(catalog_resource.request.path.type_name)}/${encodeURIComponent(catalog_resource.request.path.id)}?${queryString}`; const title = `${catalog_resource.origin} - ${catalog_resource.request.path.id} ${catalog_resource.request.path.type_name}`; switch (catalog_resource.content.type) { case 'Ready': { @@ -63,7 +61,7 @@ const Search = ({ queryParams }) => { title={title} items={catalog_resource.content.content} itemComponent={MetaItem} - href={href} + deepLinks={catalog_resource.deepLinks} /> ); } @@ -75,7 +73,7 @@ const Search = ({ queryParams }) => { className={styles['search-row']} title={title} message={message} - href={href} + deepLinks={catalog_resource.deepLinks} /> ); } @@ -85,7 +83,7 @@ const Search = ({ queryParams }) => { key={index} className={classnames(styles['search-row'], styles['search-row-poster'])} title={title} - href={href} + deepLinks={catalog_resource.deepLinks} /> ); } diff --git a/src/routes/Search/useSearch.js b/src/routes/Search/useSearch.js index d8e9d03b5..bf0346990 100644 --- a/src/routes/Search/useSearch.js +++ b/src/routes/Search/useSearch.js @@ -1,5 +1,5 @@ const React = require('react'); -const { useModelState } = require('stremio/common'); +const { deepLinking, useModelState } = require('stremio/common'); const initSearchState = () => ({ selected: null, @@ -18,7 +18,7 @@ const mapSearchStateWithCtx = (search, ctx) => { name: metaItem.name, poster: metaItem.poster, posterShape: metaItems[0].posterShape, - href: `#/metadetails/${encodeURIComponent(metaItem.type)}/${encodeURIComponent(metaItem.id)}` // TODO this should redirect with videoId at some cases + deepLinks: deepLinking.withMetaItem({ metaItem }) })) } : @@ -33,7 +33,8 @@ const mapSearchStateWithCtx = (search, ctx) => { return origin; }, catalog_resource.request.base); - return { request, content, origin }; + const deepLinks = deepLinking.withCatalog({ request }); + return { request, content, origin, deepLinks }; }); return { selected, catalog_resources }; };