From 19f6862bb50c8fdfbf3fc741633e0dad0fbaaf3c Mon Sep 17 00:00:00 2001 From: David Lechner Date: Sat, 1 Apr 2023 10:19:21 -0500 Subject: [PATCH] hub/reducers: change hub runtime state when disconnecting When disconnect is requested, we should not longer allow interacting with the hub, so we say the runtime state is unknown until it is confirmed to be disconnected. Fixes: https://github.com/pybricks/support/issues/1021 --- CHANGELOG.md | 5 +++++ src/hub/reducers.test.ts | 19 +++++++++++++++++-- src/hub/reducers.ts | 13 +++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d89f60b2..33cf072e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ ## [Unreleased] +### Fixed +- Fixed run button active while hub is disconnecting ([support#1021]). + +[support#1021]: https://github.com/pybricks/support/issues/1021 + ## [2.2.0-beta.2] - 2023-03-24 ### Changed diff --git a/src/hub/reducers.test.ts b/src/hub/reducers.test.ts index a6886d96..a152953a 100644 --- a/src/hub/reducers.test.ts +++ b/src/hub/reducers.test.ts @@ -1,8 +1,12 @@ // SPDX-License-Identifier: MIT -// Copyright (c) 2021-2022 The Pybricks Authors +// Copyright (c) 2021-2023 The Pybricks Authors import { AnyAction } from 'redux'; -import { bleDidConnectPybricks, bleDidDisconnectPybricks } from '../ble/actions'; +import { + bleDidConnectPybricks, + bleDidDisconnectPybricks, + bleDisconnectPybricks, +} from '../ble/actions'; import { didReceiveStatusReport } from '../ble-pybricks-service/actions'; import { Status, statusToFlag } from '../ble-pybricks-service/protocol'; import { @@ -39,6 +43,17 @@ describe('runtime', () => { ).toBe(HubRuntimeState.Unknown); }); + test.each(Object.values(HubRuntimeState))( + 'bleDisconnectPybricks', + (startingState) => { + // all states are overridden by disconnect + expect( + reducers({ runtime: startingState } as State, bleDisconnectPybricks()) + .runtime, + ).toBe(HubRuntimeState.Unknown); + }, + ); + test.each(Object.values(HubRuntimeState))('didDisconnect', (startingState) => { // all states are overridden by disconnect expect( diff --git a/src/hub/reducers.ts b/src/hub/reducers.ts index 4791e33d..83e20e84 100644 --- a/src/hub/reducers.ts +++ b/src/hub/reducers.ts @@ -1,9 +1,13 @@ // SPDX-License-Identifier: MIT -// Copyright (c) 2020-2022 The Pybricks Authors +// Copyright (c) 2020-2023 The Pybricks Authors import { Reducer, combineReducers } from 'redux'; import * as semver from 'semver'; -import { bleDidConnectPybricks, bleDidDisconnectPybricks } from '../ble/actions'; +import { + bleDidConnectPybricks, + bleDidDisconnectPybricks, + bleDisconnectPybricks, +} from '../ble/actions'; import { HubType } from '../ble-lwp3-service/protocol'; import { blePybricksServiceDidNotReceiveHubCapabilities, @@ -62,6 +66,11 @@ const runtime: Reducer = ( return HubRuntimeState.Unknown; } + if (bleDisconnectPybricks.matches(action)) { + // disconnecting + return HubRuntimeState.Unknown; + } + if (bleDidDisconnectPybricks.matches(action)) { return HubRuntimeState.Disconnected; }