stremio-web/src/routes/Discover/useDiscover.js

75 lines
2.5 KiB
JavaScript

// Copyright (C) 2017-2023 Smart code 203358507
const React = require('react');
const UrlUtils = require('url');
const { useServices } = require('stremio/services');
const { useModelState } = require('stremio/common');
const map = (discover) => ({
...discover,
catalog: discover.catalog !== null && discover.catalog.content.type === 'Ready' ?
{
...discover.catalog,
content: {
...discover.catalog.content,
content: discover.catalog.content.content.map((metaItem) => ({
...metaItem,
released: new Date(typeof metaItem.released === 'string' ? metaItem.released : NaN),
}))
}
}
:
discover.catalog
});
const useDiscover = (urlParams, queryParams) => {
const { core } = useServices();
const loadNextPage = React.useCallback(() => {
core.transport.dispatch({
action: 'CatalogWithFilters',
args: {
action: 'LoadNextPage'
}
}, 'discover');
}, []);
const action = React.useMemo(() => {
if (typeof urlParams.transportUrl === 'string' && typeof urlParams.type === 'string' && typeof urlParams.catalogId === 'string') {
const { hostname } = UrlUtils.parse(urlParams.transportUrl);
if (typeof hostname === 'string' && hostname.length > 0) {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: {
base: urlParams.transportUrl,
path: {
resource: 'catalog',
type: urlParams.type,
id: urlParams.catalogId,
extra: Array.from(queryParams.entries())
}
}
}
}
};
}
} else {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: null
}
};
}
return {
action: 'Unload'
};
}, [urlParams, queryParams]);
const discover = useModelState({ model: 'discover', action, map, deps: ['ctx'] });
return [discover, loadNextPage];
};
module.exports = useDiscover;