From 718939cd6bd93974d9ef55bda7f7330cca8e5731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20B=C3=BCchele?= Date: Tue, 25 Jun 2019 07:47:56 -0700 Subject: [PATCH] disconnect client instead of removing it Summary: When an Android device disconnects, the device is marked as offline. In this diff, we want to make sure the client for the disconnected apps is not removed, but converted into a "disconnected" client. This makes sure plugins are still shown for the disconnected app. Reviewed By: passy Differential Revision: D15985424 fbshipit-source-id: 650ef1344b8be4411794b0344805cb75ceae4a83 --- src/dispatcher/server.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/dispatcher/server.js b/src/dispatcher/server.js index 3057bac8f..3802f25cb 100644 --- a/src/dispatcher/server.js +++ b/src/dispatcher/server.js @@ -11,6 +11,7 @@ import type {Store} from '../reducers/index.js'; import type {Logger} from '../fb-interfaces/Logger.js'; import type Client from '../Client.js'; import type {UninitializedClient} from '../UninitializedClient'; +import type BaseDevice from '../devices/BaseDevice'; export default (store: Store, logger: Logger) => { const server = new Server(logger, store); @@ -31,6 +32,31 @@ export default (store: Store, logger: Logger) => { }); server.addListener('removed-client', (id: string) => { + const client: ?Client = store + .getState() + .connections.clients.find((client: Client) => client.id === id); + if (client) { + const device: ?BaseDevice = store + .getState() + .connections.devices.find( + (device: BaseDevice) => device.serial === client.query.device_id, + ); + + if (device && !device.isArchived && device.os === 'Android') { + client.connected = false; + client.connection = null; + // find all plugins for this client that store data in persistedState + client.plugins = Object.keys(store.getState().pluginStates) + .filter(key => key.startsWith(id)) + .map(key => key.split('#').pop()); + + // don't remove client if it still has plugins + if (client.plugins.length > 0) { + return; + } + } + } + store.dispatch({ type: 'CLIENT_REMOVED', payload: id,