mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-05-13 22:40:48 +00:00
120 lines
4.1 KiB
JavaScript
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;
|