actions: refactor actions

The pattern we were using for actions required actions to be defined in
three places, an enum member containing the type string, an type
definition and a function. This combines all three of these into one by
using a helper function based on the ideas from [1].

[1]: https://phryneas.de/redux-typescript-no-discriminating-union
This commit is contained in:
David Lechner
2022-02-25 17:58:30 -06:00
parent 8f377b3909
commit 9641898a75
55 changed files with 1440 additions and 2509 deletions
+27 -38
View File
@@ -1,74 +1,63 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020-2021 The Pybricks Authors
// Copyright (c) 2020-2022 The Pybricks Authors
import { takeEvery } from 'typed-redux-saga/macro';
import { didFailToWrite as bleUartDidFailToWrite } from '../ble-nordic-uart-service/actions';
import { eventProtocolError as pybricksEventProtocolError } from '../ble-pybricks-service/actions';
import {
BleUartActionType,
BleUartDidFailToWriteAction,
} from '../ble-nordic-uart-service/actions';
import {
BlePybricksServiceEventActionType,
BlePybricksServiceEventProtocolErrorAction,
} from '../ble-pybricks-service/actions';
import {
BleDeviceActionType,
BleDeviceDidFailToConnectAction,
BleDeviceFailToConnectReasonType,
didFailToConnect as bleDeviceDidFailToConnect,
} from '../ble/actions';
import { didFailToFetchList } from '../licenses/actions';
import {
LicenseActionType,
LicenseDidFailToFetchListAction,
} from '../licenses/actions';
import {
BootloaderConnectionActionType,
BootloaderConnectionDidErrorAction,
BootloaderConnectionDidFailToConnectAction,
BootloaderConnectionFailureReason,
didError as bootloaderDidError,
didFailToConnect as bootloaderDidFailToConnect,
} from '../lwp3-bootloader/actions';
function bleDeviceDidFailToConnect(action: BleDeviceDidFailToConnectAction): void {
function handleBleDeviceDidFailToConnect(
action: ReturnType<typeof bleDeviceDidFailToConnect>,
): void {
if (action.reason === BleDeviceFailToConnectReasonType.Unknown) {
console.error(action.err);
}
}
function pybricksProtocolError(
action: BlePybricksServiceEventProtocolErrorAction,
function handlePybricksEventProtocolError(
action: ReturnType<typeof pybricksEventProtocolError>,
): void {
console.error(action.err);
}
function bleDataDidFailToWrite(action: BleUartDidFailToWriteAction): void {
function handleBleUartDidFailToWrite(
action: ReturnType<typeof bleUartDidFailToWrite>,
): void {
console.error(action.err);
}
function bootloaderDidFailToConnect(
action: BootloaderConnectionDidFailToConnectAction,
function handleBootloaderDidFailToConnect(
action: ReturnType<typeof bootloaderDidFailToConnect>,
): void {
if (action.reason === BootloaderConnectionFailureReason.Unknown) {
console.error(action.err);
}
}
function bootloaderDidError(action: BootloaderConnectionDidErrorAction): void {
function handleBootloaderDidError(action: ReturnType<typeof bootloaderDidError>): void {
console.error(action.err);
}
function licenseDidFailToFetch(action: LicenseDidFailToFetchListAction): void {
function handleLicenseDidFailToFetch(
action: ReturnType<typeof didFailToFetchList>,
): void {
console.error(`Failed to fetch licenses: ${action.reason.statusText}`);
}
export default function* (): Generator {
yield* takeEvery(BleDeviceActionType.DidFailToConnect, bleDeviceDidFailToConnect);
yield* takeEvery(
BlePybricksServiceEventActionType.ProtocolError,
pybricksProtocolError,
);
yield* takeEvery(BleUartActionType.DidFailToWrite, bleDataDidFailToWrite);
yield* takeEvery(
BootloaderConnectionActionType.DidFailToConnect,
bootloaderDidFailToConnect,
);
yield* takeEvery(BootloaderConnectionActionType.DidError, bootloaderDidError);
yield* takeEvery(LicenseActionType.DidFailToFetchList, licenseDidFailToFetch);
yield* takeEvery(bleDeviceDidFailToConnect, handleBleDeviceDidFailToConnect);
yield* takeEvery(pybricksEventProtocolError, handlePybricksEventProtocolError);
yield* takeEvery(bleUartDidFailToWrite, handleBleUartDidFailToWrite);
yield* takeEvery(bootloaderDidFailToConnect, handleBootloaderDidFailToConnect);
yield* takeEvery(bootloaderDidError, handleBootloaderDidError);
yield* takeEvery(didFailToFetchList, handleLicenseDidFailToFetch);
}