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;