Use selectors to compute plugin lists according to the selected device and app

Summary: Use selectors to re-compute and cache plugin lists according to the selected device and app.

Reviewed By: mweststrate

Differential Revision: D29247845

fbshipit-source-id: 4bc669d5d441d605c4090086c4ce59b6d9684a4c
This commit is contained in:
Anton Nikolaev
2021-06-29 13:00:18 -07:00
committed by Facebook GitHub Bot
parent 1d26faeacb
commit ff5d8ba29f
20 changed files with 294 additions and 358 deletions

View File

@@ -23,7 +23,7 @@ import reactNative from './reactNative';
import pluginMarketplace from './fb-stubs/pluginMarketplace';
import pluginDownloads from './pluginDownloads';
import info from '../utils/info';
import pluginLists from './pluginLists';
import pluginChangeListener from './pluginsChangeListener';
import {Logger} from '../fb-interfaces/Logger';
import {Store} from '../reducers/index';
@@ -52,7 +52,7 @@ export default function (store: Store, logger: Logger): () => Promise<void> {
pluginMarketplace,
pluginDownloads,
info,
pluginLists,
pluginChangeListener,
].filter(notNull);
const globalCleanup = dispatchers
.map((dispatcher) => dispatcher(store, logger))

View File

@@ -1,120 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import Client from '../Client';
import {Logger} from '../fb-interfaces/Logger';
import {Store} from '../reducers';
import {pluginListsChanged} from '../reducers/pluginLists';
import {computePluginLists} from '../utils/pluginUtils';
import {sideEffect} from '../utils/sideEffect';
export default (store: Store, _logger: Logger) => {
const recomputePluginList = () => {
store.dispatch(
pluginListsChanged(
computePluginLists(
store.getState().connections,
store.getState().plugins,
),
),
);
};
let prevClient: null | Client = null;
sideEffect(
store,
{name: 'computePluginLists', throttleMs: 100, fireImmediately: true},
(state) => {
const {
activeClient,
activeDevice,
metroDevice,
enabledDevicePlugins,
enabledPlugins,
} = state.connections;
const {
bundledPlugins,
marketplacePlugins,
loadedPlugins,
devicePlugins,
disabledPlugins,
gatekeepedPlugins,
failedPlugins,
clientPlugins,
} = state.plugins;
return {
activeClient,
activeDevice,
metroDevice,
enabledDevicePlugins,
enabledPlugins,
bundledPlugins,
marketplacePlugins,
loadedPlugins,
devicePlugins,
disabledPlugins,
gatekeepedPlugins,
failedPlugins,
clientPlugins,
};
},
(
{
activeClient,
activeDevice,
metroDevice,
enabledDevicePlugins,
enabledPlugins,
bundledPlugins,
marketplacePlugins,
loadedPlugins,
devicePlugins,
disabledPlugins,
gatekeepedPlugins,
failedPlugins,
clientPlugins,
},
store,
) => {
store.dispatch(
pluginListsChanged(
computePluginLists(
{
activeClient,
activeDevice,
metroDevice,
enabledDevicePlugins,
enabledPlugins,
},
{
bundledPlugins,
marketplacePlugins,
loadedPlugins,
devicePlugins,
disabledPlugins,
gatekeepedPlugins,
failedPlugins,
clientPlugins,
},
),
),
);
if (activeClient !== prevClient) {
if (prevClient) {
prevClient.off('plugins-change', recomputePluginList);
}
prevClient = activeClient;
if (prevClient) {
prevClient.on('plugins-change', recomputePluginList);
}
}
},
);
};

View File

@@ -0,0 +1,40 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import Client from '../Client';
import {Logger} from '../fb-interfaces/Logger';
import {Store} from '../reducers';
import {appPluginListChanged} from '../reducers/connections';
import {getActiveClient} from '../selectors/connections';
import {sideEffect} from '../utils/sideEffect';
export default (store: Store, _logger: Logger) => {
let prevClient: null | Client = null;
const onActiveAppPluginListChanged = () => {
store.dispatch(appPluginListChanged());
};
sideEffect(
store,
{name: 'pluginsChangeListener', throttleMs: 100, fireImmediately: true},
getActiveClient,
(activeClient, _store) => {
if (activeClient !== prevClient) {
if (prevClient) {
prevClient.off('plugins-change', onActiveAppPluginListChanged);
}
prevClient = activeClient;
if (prevClient) {
prevClient.on('plugins-change', onActiveAppPluginListChanged);
}
}
},
);
};