stremio-web/src/routes/Addons/useAddons.js
2020-02-05 13:46:21 +02:00

106 lines
3.5 KiB
JavaScript

const React = require('react');
const { useServices } = require('stremio/services');
const { useModelState } = require('stremio/common');
const initAddonsState = () => ({
selectable: {
types: [],
catalogs: []
},
catalog_resource: null
});
const mapAddonsStateWithCtx = (addons, ctx) => {
const selectable = {
types: addons.selectable.types,
catalogs: addons.selectable.catalogs
};
// TODO replace catalog content if resource catalog id is MY
const catalog_resource = addons.catalog_resource !== null && addons.catalog_resource.content.type === 'Ready' ?
{
request: addons.catalog_resource.request,
content: {
type: addons.catalog_resource.content.type,
content: addons.catalog_resource.content.content.map((addon) => ({
transportUrl: addon.transportUrl,
installed: ctx.profile.addons.some(({ transportUrl }) => transportUrl === addon.transportUrl),
manifest: {
id: addon.manifest.id,
name: addon.manifest.name,
version: addon.manifest.version,
logo: addon.manifest.logo,
description: addon.manifest.description,
types: addon.manifest.types
}
}))
}
}
:
addons.catalog_resource;
return { selectable, catalog_resource };
};
const onNewAddonsState = (addons) => {
if (addons.catalog_resource === null && addons.selectable.catalogs.length > 0) {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: addons.selectable.catalogs[0].request
}
}
};
}
};
const useAddons = (urlParams) => {
const { core } = useServices();
const loadAddonsAction = React.useMemo(() => {
if (typeof urlParams.transportUrl === 'string' && typeof urlParams.catalogId === 'string' && typeof urlParams.type === 'string') {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: {
base: urlParams.transportUrl,
path: {
resource: 'addon_catalog',
type_name: urlParams.type,
id: urlParams.catalogId,
extra: []
}
}
}
}
};
} else {
const addons = core.getState('addons');
if (addons.selectable.catalogs.length > 0) {
return {
action: 'Load',
args: {
model: 'CatalogWithFilters',
args: {
request: addons.selectable.catalogs[0].request
}
}
};
} else {
return {
action: 'Unload'
};
}
}
}, [urlParams]);
return useModelState({
model: 'addons',
action: loadAddonsAction,
mapWithCtx: mapAddonsStateWithCtx,
init: initAddonsState,
onNewState: onNewAddonsState
});
};
module.exports = useAddons;