From 6b3298a29e0b9ab8e2df06adb59c89b42e8ff9e6 Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Thu, 15 Sep 2022 10:02:19 -0700 Subject: [PATCH] Reload plugins with updated sources Reviewed By: lblasa Differential Revision: D39540173 fbshipit-source-id: 65f5d0f0a325d6ca3ed5e1213e689490c6b650b2 --- .../flipper-ui-core/src/dispatcher/index.tsx | 2 + .../pluginsSourceUpdateListener.tsx | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 desktop/flipper-ui-core/src/dispatcher/pluginsSourceUpdateListener.tsx diff --git a/desktop/flipper-ui-core/src/dispatcher/index.tsx b/desktop/flipper-ui-core/src/dispatcher/index.tsx index fe5c21d3f..1e9090b38 100644 --- a/desktop/flipper-ui-core/src/dispatcher/index.tsx +++ b/desktop/flipper-ui-core/src/dispatcher/index.tsx @@ -19,6 +19,7 @@ import pluginMarketplace from './pluginMarketplace'; import pluginDownloads from './pluginDownloads'; import info from '../utils/info'; import pluginChangeListener from './pluginsChangeListener'; +import pluginsSourceUpdateListener from './pluginsSourceUpdateListener'; import {Logger} from 'flipper-common'; import {Store} from '../reducers/index'; @@ -40,6 +41,7 @@ export default function (store: Store, logger: Logger): () => Promise { pluginDownloads, info, pluginChangeListener, + pluginsSourceUpdateListener, ].filter(notNull); const globalCleanup = dispatchers .map((dispatcher) => dispatcher(store, logger)) diff --git a/desktop/flipper-ui-core/src/dispatcher/pluginsSourceUpdateListener.tsx b/desktop/flipper-ui-core/src/dispatcher/pluginsSourceUpdateListener.tsx new file mode 100644 index 000000000..77c7ddbeb --- /dev/null +++ b/desktop/flipper-ui-core/src/dispatcher/pluginsSourceUpdateListener.tsx @@ -0,0 +1,45 @@ +/** + * Copyright (c) Meta Platforms, Inc. and 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 {InstalledPluginDetails, Logger} from 'flipper-common'; +import {Store} from '../reducers'; +import {loadPlugin} from '../reducers/pluginManager'; +import {sideEffect} from '../utils/sideEffect'; + +export default (store: Store, _logger: Logger) => { + sideEffect( + store, + { + name: 'pluginsSourceUpdateListener', + throttleMs: 10, + fireImmediately: true, + }, + () => undefined, + (_state, _store) => { + window.addEventListener('message', (event) => { + if ( + typeof event.data === 'object' && + event.data.type === 'plugins-source-updated' && + Array.isArray(event.data.data) + ) { + const changedPlugins = event.data.data as InstalledPluginDetails[]; + for (const plugin of changedPlugins) { + store.dispatch( + loadPlugin({ + plugin, + enable: false, + notifyIfFailed: true, + }), + ); + } + } + }); + }, + ); +};