From d7da816e36edccbb2d6c822cd8d559da560efc7e Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 17 Sep 2021 07:21:25 -0700 Subject: [PATCH] Fixed issue where plugins weren't reset properly when reconnecting a device Summary: If a device disconnects and reconnects while keeping the plugin open, a new pluginInstance is available, but the React component would not be remounted since both the old and new pluginInstance have the same identifier (device/client/plugin). This change makes sure that if a different pluginInstance arrives, the rendering will be reinitialised as well. Reviewed By: lblasa Differential Revision: D31018845 fbshipit-source-id: ac09e7ac519c7aebfb4f8dc0cc7c6cda6fbbf633 --- desktop/flipper-plugin/src/plugin/PluginBase.tsx | 4 ++++ desktop/flipper-plugin/src/plugin/PluginRenderer.tsx | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/desktop/flipper-plugin/src/plugin/PluginBase.tsx b/desktop/flipper-plugin/src/plugin/PluginBase.tsx index 31569c906..778f7511f 100644 --- a/desktop/flipper-plugin/src/plugin/PluginBase.tsx +++ b/desktop/flipper-plugin/src/plugin/PluginBase.tsx @@ -147,6 +147,8 @@ export function registerStorageAtom( } } +let staticInstanceId = 1; + export abstract class BasePluginInstance { /** generally available Flipper APIs */ readonly flipperLib: FlipperLib; @@ -179,6 +181,8 @@ export abstract class BasePluginInstance { menuEntries: NormalizedMenuEntry[] = []; logListeners: Symbol[] = []; + readonly instanceId = ++staticInstanceId; + constructor( flipperLib: FlipperLib, definition: SandyPluginDefinition, diff --git a/desktop/flipper-plugin/src/plugin/PluginRenderer.tsx b/desktop/flipper-plugin/src/plugin/PluginRenderer.tsx index a89040b14..ce2e27005 100644 --- a/desktop/flipper-plugin/src/plugin/PluginRenderer.tsx +++ b/desktop/flipper-plugin/src/plugin/PluginRenderer.tsx @@ -35,7 +35,9 @@ export const SandyPluginRenderer = memo(({plugin}: Props) => { return ( - {createElement(plugin.definition.module.Component)} + {createElement(plugin.definition.module.Component, { + key: plugin.instanceId, + })} );