use addons return only remote addon catalogs

This commit is contained in:
nklhrstv 2020-09-14 10:57:08 +03:00
parent 214b32103e
commit d7b2588bb8
3 changed files with 112 additions and 165 deletions

View file

@ -6,7 +6,7 @@ const { useRouteFocused } = require('stremio-router');
const Icon = require('@stremio/stremio-icons/dom');
const { AddonDetailsModal, Button, Image, Multiselect, MainNavBars, TextInput, SearchBar, SharePrompt, ModalDialog, useBinaryState } = require('stremio/common');
const Addon = require('./Addon');
const useAddons = require('./useAddons');
const useRemoteAddons = require('./useRemoteAddons');
const useSelectableInputs = require('./useSelectableInputs');
const styles = require('./styles');
@ -35,9 +35,9 @@ const Addons = ({ urlParams, queryParams }) => {
window.location.replace(`#/addons${nextPath}?${nextQueryParams}`);
}, [routeFocused, urlParams, queryParams]);
const addons = useAddons(urlParams);
const remoteAddons = useRemoteAddons(urlParams);
const detailsTransportUrl = queryParams.get('addon');
const selectInputs = useSelectableInputs(addons, navigate);
const selectInputs = useSelectableInputs(remoteAddons, navigate);
const [addAddonModalOpen, openAddAddonModal, closeAddAddonModal] = useBinaryState(false);
const addAddonUrlInputRef = React.useRef(null);
const addAddonOnSubmit = React.useCallback(() => {
@ -113,29 +113,29 @@ const Addons = ({ urlParams, queryParams }) => {
/>
</div>
{
addons.selectable.catalogs.length === 0 && addons.catalog_resource === null ?
remoteAddons.selectable.catalogs.length === 0 && remoteAddons.catalog_resource === null ?
<div className={styles['message-container']}>
No addons
</div>
:
addons.catalog_resource === null ?
remoteAddons.catalog_resource === null ?
<div className={styles['message-container']}>
No select
</div>
:
addons.catalog_resource.content.type === 'Err' ?
remoteAddons.catalog_resource.content.type === 'Err' ?
<div className={styles['message-container']}>
Addons could not be loaded
</div>
:
addons.catalog_resource.content.type === 'Loading' ?
remoteAddons.catalog_resource.content.type === 'Loading' ?
<div className={styles['message-container']}>
Loading
</div>
:
<div className={styles['addons-list-container']}>
{
addons.catalog_resource.content.content
remoteAddons.catalog_resource.content.content
.filter((addon) => {
return search.length === 0 ||
(

View file

@ -1,157 +0,0 @@
// Copyright (C) 2017-2020 Smart code 203358507
const React = require('react');
const { useServices } = require('stremio/services');
const { useModelState } = require('stremio/common');
const INSTALLED_CATALOG_ID = 'INSTALLED';
const INSTALLED_CATALOG_BASE = 'http://demo/';
const initAddonsState = () => ({
selectable: {
types: [],
catalogs: []
},
catalog_resource: null
});
const mapAddonsStateWithCtx = (addons, ctx) => {
const installedSelectableTypes = ctx.profile.addons.map((addon) => addon.manifest.types)
.flat(2)
.filter((type, index, types) => types.indexOf(type) === index)
.map((type) => ({
name: type,
request: {
base: INSTALLED_CATALOG_BASE,
path: {
resource: 'addon_catalog',
type_name: type,
id: INSTALLED_CATALOG_ID,
extra: []
}
}
}));
const selectable = {
types: addons.selected !== null && addons.selected.request.base === INSTALLED_CATALOG_BASE && addons.selected.request.path.id === INSTALLED_CATALOG_ID ? installedSelectableTypes : addons.selectable.types,
catalogs: addons.selectable.catalogs.concat({
name: 'Installed',
addon_name: '',
request: {
base: INSTALLED_CATALOG_BASE,
path: {
resource: 'addon_catalog',
type_name: installedSelectableTypes[0].request.path.type_name,
id: INSTALLED_CATALOG_ID,
extra: []
}
}
})
};
const catalog_resource = addons.selected !== null && addons.selected.request.base === INSTALLED_CATALOG_BASE && addons.selected.request.path.id === INSTALLED_CATALOG_ID ?
{
request: addons.selected.request,
content: {
type: 'Ready',
content: ctx.profile.addons.filter((addon) => addon.manifest.types.includes(addons.selected.request.path.type_name)).map((addon) => ({
transportUrl: addon.transportUrl,
installed: true,
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 !== 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.transport.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;

View file

@ -0,0 +1,104 @@
// Copyright (C) 2017-2020 Smart code 203358507
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 = addons.selectable;
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 useRemoteAddons = (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.transport.getState('remote_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: 'remote_addons',
action: loadAddonsAction,
mapWithCtx: mapAddonsStateWithCtx,
init: initAddonsState,
onNewState: onNewAddonsState
});
};
module.exports = useRemoteAddons;