From 99b10942bb944d3916819aac41a5ede94c93fead 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 a4533fdf..91cae2e2 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 7f5f6b92..e1951962 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