From d7b2588bb852079129cd18661f15cbcac88dfce4 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Mon, 14 Sep 2020 10:57:08 +0300 Subject: [PATCH] use addons return only remote addon catalogs --- src/routes/Addons/Addons.js | 16 +-- src/routes/Addons/useAddons.js | 157 --------------------------- src/routes/Addons/useRemoteAddons.js | 104 ++++++++++++++++++ 3 files changed, 112 insertions(+), 165 deletions(-) delete mode 100644 src/routes/Addons/useAddons.js create mode 100644 src/routes/Addons/useRemoteAddons.js diff --git a/src/routes/Addons/Addons.js b/src/routes/Addons/Addons.js index ca3cf39d2..047a8a885 100644 --- a/src/routes/Addons/Addons.js +++ b/src/routes/Addons/Addons.js @@ -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 }) => { /> { - addons.selectable.catalogs.length === 0 && addons.catalog_resource === null ? + remoteAddons.selectable.catalogs.length === 0 && remoteAddons.catalog_resource === null ?
No addons
: - addons.catalog_resource === null ? + remoteAddons.catalog_resource === null ?
No select
: - addons.catalog_resource.content.type === 'Err' ? + remoteAddons.catalog_resource.content.type === 'Err' ?
Addons could not be loaded
: - addons.catalog_resource.content.type === 'Loading' ? + remoteAddons.catalog_resource.content.type === 'Loading' ?
Loading
:
{ - addons.catalog_resource.content.content + remoteAddons.catalog_resource.content.content .filter((addon) => { return search.length === 0 || ( diff --git a/src/routes/Addons/useAddons.js b/src/routes/Addons/useAddons.js deleted file mode 100644 index 9eb14b7f5..000000000 --- a/src/routes/Addons/useAddons.js +++ /dev/null @@ -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; diff --git a/src/routes/Addons/useRemoteAddons.js b/src/routes/Addons/useRemoteAddons.js new file mode 100644 index 000000000..17dc40b5e --- /dev/null +++ b/src/routes/Addons/useRemoteAddons.js @@ -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;