From 43f7720214a415ca61cd09862feb83f50bd76750 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 7 Oct 2022 14:33:38 +0200 Subject: [PATCH] Listen on the client's port change event If the board select dialog is listening on the backend's event, the frontend might miss the event when it comes up, although boards are connected and ports are discovered. Closes #573 Signed-off-by: Akos Kitta --- .../src/browser/boards/boards-config.tsx | 14 ++++++++------ .../browser/boards/boards-service-provider.ts | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index a4533fdf2..91cae2e29 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -6,7 +6,6 @@ import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Board, Port, - AttachedBoardsChangeEvent, BoardWithPackage, } from '../../common/protocol/boards-service'; import { NotificationCenter } from '../notification-center'; @@ -113,11 +112,14 @@ export class BoardsConfig extends React.Component< ); } }), - this.props.notificationCenter.onAttachedBoardsDidChange((event) => - this.updatePorts( - event.newState.ports, - AttachedBoardsChangeEvent.diff(event).detached.ports - ) + this.props.boardsServiceProvider.onAvailablePortsChanged( + ({ newState, oldState }) => { + const removedPorts = oldState.filter( + (oldPort) => + !newState.find((newPort) => Port.sameAs(newPort, oldPort)) + ); + this.updatePorts(newState, removedPorts); + } ), this.props.boardsServiceProvider.onBoardsConfigChanged( ({ selectedBoard, selectedPort }) => { diff --git a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts index 7f5f6b923..e1951962e 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -63,7 +63,10 @@ export class BoardsServiceProvider protected readonly onAvailableBoardsChangedEmitter = new Emitter< AvailableBoard[] >(); - protected readonly onAvailablePortsChangedEmitter = new Emitter(); + protected readonly onAvailablePortsChangedEmitter = new Emitter<{ + newState: Port[]; + oldState: Port[]; + }>(); private readonly inheritedConfig = new Deferred(); /** @@ -120,8 +123,12 @@ export class BoardsServiceProvider const { boards: attachedBoards, ports: availablePorts } = AvailablePorts.split(state); this._attachedBoards = attachedBoards; + const oldState = this._availablePorts.slice(); this._availablePorts = availablePorts; - this.onAvailablePortsChangedEmitter.fire(this._availablePorts); + this.onAvailablePortsChangedEmitter.fire({ + newState: this._availablePorts.slice(), + oldState, + }); await this.reconcileAvailableBoards(); @@ -229,8 +236,12 @@ export class BoardsServiceProvider } this._attachedBoards = event.newState.boards; + const oldState = this._availablePorts.slice(); this._availablePorts = event.newState.ports; - this.onAvailablePortsChangedEmitter.fire(this._availablePorts); + this.onAvailablePortsChangedEmitter.fire({ + newState: this._availablePorts.slice(), + oldState, + }); this.reconcileAvailableBoards().then(() => { const { uploadInProgress } = event; // avoid attempting "auto-selection" while an