Refactor plugin lists computations

Summary: This is purely refactoring change. Before that we computed plugin lists in-place in PluginList component. Now we will be re-computing them as side effect and will keep computed lists in redux. This makes it easier to re-use plugin lists in other places outside of PluginList component, e.g. in the upcoming Marketplace UI.

Reviewed By: mweststrate

Differential Revision: D29161719

fbshipit-source-id: 5cb06d4d8a553aa856101c78b2311fbc078c6bd7
This commit is contained in:
Anton Nikolaev
2021-06-17 07:38:51 -07:00
committed by Facebook GitHub Bot
parent 0d6262aa5e
commit ac9ef7620a
10 changed files with 325 additions and 190 deletions

View File

@@ -83,15 +83,7 @@ export function getExportablePlugins(
device: BaseDevice | undefined | null,
client?: Client,
): {id: string; label: string}[] {
const availablePlugins = computePluginLists(
device ?? undefined,
undefined,
client,
state.plugins,
state.connections.enabledPlugins,
state.connections.enabledDevicePlugins,
);
const availablePlugins = computePluginLists(state.connections, state.plugins);
return [
...availablePlugins.devicePlugins.filter((plugin) => {
return isExportablePlugin(state, device, client, plugin);
@@ -180,14 +172,38 @@ export function getPluginTooltip(details: PluginDetails): string {
}
export function computePluginLists(
device: BaseDevice | undefined,
metroDevice: BaseDevice | undefined,
client: Client | undefined,
plugins: State['plugins'],
enabledPluginsState: State['connections']['enabledPlugins'],
enabledDevicePluginsState: Set<string>,
_pluginsChanged?: number, // this argument is purely used to invalidate the memoization cache
) {
connections: Pick<
State['connections'],
| 'activeDevice'
| 'activeClient'
| 'metroDevice'
| 'enabledDevicePlugins'
| 'enabledPlugins'
>,
plugins: Pick<
State['plugins'],
| 'bundledPlugins'
| 'marketplacePlugins'
| 'loadedPlugins'
| 'devicePlugins'
| 'disabledPlugins'
| 'gatekeepedPlugins'
| 'failedPlugins'
| 'clientPlugins'
>,
): {
devicePlugins: DevicePluginDefinition[];
metroPlugins: DevicePluginDefinition[];
enabledPlugins: ClientPluginDefinition[];
disabledPlugins: PluginDefinition[];
unavailablePlugins: [plugin: PluginDetails, reason: string][];
downloadablePlugins: (DownloadablePluginDetails | BundledPluginDetails)[];
} {
const device = connections.activeDevice;
const client = connections.activeClient;
const metroDevice = connections.metroDevice;
const enabledDevicePluginsState = connections.enabledDevicePlugins;
const enabledPluginsState = connections.enabledPlugins;
const uninstalledMarketplacePlugins = getLatestCompatibleVersionOfEachPlugin([
...plugins.bundledPlugins.values(),
...plugins.marketplacePlugins,