stremio-web/src/routes/Discover/useDiscover.js
2020-05-15 17:26:33 +03:00

120 lines
4.1 KiB
JavaScript

// Copyright (C) 2017-2020 Smart code 203358507
const React = require('react');
const { useServices } = require('stremio/services');
const { CONSTANTS, deepLinking, useModelState, comparatorWithPriorities } = require('stremio/common');
const initDiscoverState = () => ({
selected: null,
selectable: {
types: [],
catalogs: [],
extra: [],
has_next_page: false,
has_prev_page: false
},
catalog_resource: null
});
const mapDiscoverState = (discover) => {
const selected = discover.selected;
const selectable = {
types: discover.selectable.types.sort((t1, t2) => {
return comparatorWithPriorities(CONSTANTS.TYPE_PRIORITIES)(t1.name, t2.name);
}),
catalogs: discover.selectable.catalogs,
extra: discover.selectable.extra,
has_next_page: discover.selectable.has_next_page,
has_prev_page: discover.selectable.has_prev_page,
};
const catalog_resource = discover.catalog_resource !== null && discover.catalog_resource.content.type === 'Ready' ?
{
request: discover.catalog_resource.request,
content: {
type: 'Ready',
content: discover.catalog_resource.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,
released: new Date(metaItem.released),
description: metaItem.description,
trailer: metaItem.trailer,
deepLinks: deepLinking.withMetaItem({ metaItem })
}))
}
}
:
discover.catalog_resource;
return { selected, selectable, catalog_resource };
};
const onNewDiscoverState = (discover) => {
if (discover.catalog_resource === null && discover.selectable.types.length > 0) {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: discover.selectable.types[0].request
}
}
};
} else {
return null;
}
};
const useDiscover = (urlParams, queryParams) => {
const { core } = useServices();
const loadDiscoverAction = React.useMemo(() => {
if (typeof urlParams.transportUrl === 'string' && typeof urlParams.type === 'string' && typeof urlParams.catalogId === 'string') {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: {
base: urlParams.transportUrl,
path: {
resource: 'catalog',
type_name: urlParams.type,
id: urlParams.catalogId,
extra: Array.from(queryParams.entries())
}
}
}
}
};
} else {
const discover = core.transport.getState('discover');
if (discover.selectable.types.length > 0) {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: discover.selectable.types[0].request
}
}
};
} else {
return {
action: 'Unload'
};
}
}
}, [urlParams, queryParams]);
return useModelState({
model: 'discover',
action: loadDiscoverAction,
map: mapDiscoverState,
init: initDiscoverState,
onNewState: onNewDiscoverState
});
};
module.exports = useDiscover;