From 15ecdf998d58de23885c3319d40f02e195bd7fe1 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Fri, 15 Jul 2022 13:47:37 -0500 Subject: [PATCH] ble/sagas: use alerts for unexpected error instead of notifications --- src/ble/sagas.test.ts | 42 ++++++++++++++++++ src/ble/sagas.ts | 75 +++++++++++++++++++++++++++++++++ src/notifications/sagas.test.ts | 8 ++-- src/notifications/sagas.ts | 3 -- 4 files changed, 121 insertions(+), 7 deletions(-) diff --git a/src/ble/sagas.test.ts b/src/ble/sagas.test.ts index 7d567ba7..ed7dfd3a 100644 --- a/src/ble/sagas.test.ts +++ b/src/ble/sagas.test.ts @@ -296,6 +296,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.Connect); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -322,6 +325,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.Connect); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -355,6 +361,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.Connect); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -371,6 +380,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.Connect); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -389,6 +401,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceiveFirmwareRevision); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -405,6 +420,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceiveFirmwareRevision); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -434,6 +452,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceiveSoftwareRevision); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -469,6 +490,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -485,6 +509,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -501,6 +528,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -537,6 +567,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -555,6 +588,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -571,6 +607,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, @@ -587,6 +626,9 @@ describe('connect action is dispatched', () => { await runConnectUntil(saga, ConnectRunPoint.DidReceivePnpId); + await expect(saga.take()).resolves.toEqual( + alertsShowAlert('alerts', 'unexpectedError', { error: testError }), + ); await expect(saga.take()).resolves.toEqual( bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Unknown, diff --git a/src/ble/sagas.ts b/src/ble/sagas.ts index 86c844bb..0d60a6ca 100644 --- a/src/ble/sagas.ts +++ b/src/ble/sagas.ts @@ -131,6 +131,11 @@ function* handleBleConnectPybricks(): Generator { // this can happen if the use cancels the dialog yield* put(bleDidFailToConnectPybricks({ reason: Reason.Canceled })); } else { + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -158,6 +163,11 @@ function* handleBleConnectPybricks(): Generator { server = yield* call([device.gatt, 'connect']); } catch (err) { disconnectChannel.close(); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -183,6 +193,11 @@ function* handleBleConnectPybricks(): Generator { bleDidFailToConnectPybricks({ reason: Reason.NoDeviceInfoService }), ); } else { + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -202,6 +217,11 @@ function* handleBleConnectPybricks(): Generator { } catch (err) { server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -217,6 +237,11 @@ function* handleBleConnectPybricks(): Generator { } catch (err) { server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -235,6 +260,11 @@ function* handleBleConnectPybricks(): Generator { } catch (err) { server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -250,6 +280,11 @@ function* handleBleConnectPybricks(): Generator { } catch (err) { server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -277,6 +312,11 @@ function* handleBleConnectPybricks(): Generator { } catch (err) { server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -301,6 +341,11 @@ function* handleBleConnectPybricks(): Generator { bleDidFailToConnectPybricks({ reason: Reason.NoPybricksService }), ); } else { + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -320,6 +365,11 @@ function* handleBleConnectPybricks(): Generator { } catch (err) { server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -364,6 +414,11 @@ function* handleBleConnectPybricks(): Generator { pybricksControlChannel.close(); server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -388,6 +443,11 @@ function* handleBleConnectPybricks(): Generator { bleDidFailToConnectPybricks({ reason: Reason.NoPybricksService }), ); } else { + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -406,6 +466,11 @@ function* handleBleConnectPybricks(): Generator { pybricksControlChannel.close(); server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -423,6 +488,11 @@ function* handleBleConnectPybricks(): Generator { pybricksControlChannel.close(); server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, @@ -460,6 +530,11 @@ function* handleBleConnectPybricks(): Generator { pybricksControlChannel.close(); server.disconnect(); yield* takeMaybe(disconnectChannel); + yield* put( + alertsShowAlert('alerts', 'unexpectedError', { + error: ensureError(err), + }), + ); yield* put( bleDidFailToConnectPybricks({ reason: Reason.Unknown, diff --git a/src/notifications/sagas.test.ts b/src/notifications/sagas.test.ts index 4f022c5d..0d84a6e1 100644 --- a/src/notifications/sagas.test.ts +++ b/src/notifications/sagas.test.ts @@ -68,10 +68,6 @@ test.each([ bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.NoPybricksService, }), - bleDidFailToConnectPybricks({ - reason: BleDeviceFailToConnectReasonType.Unknown, - err: { name: 'test', message: 'unknown' }, - }), bootloaderDidFailToConnect(BootloaderConnectionFailureReason.Unknown, { message: 'test', }), @@ -134,6 +130,10 @@ test.each([ reason: BleDeviceFailToConnectReasonType.NoBluetooth, }), bleDidFailToConnectPybricks({ reason: BleDeviceFailToConnectReasonType.Canceled }), + bleDidFailToConnectPybricks({ + reason: BleDeviceFailToConnectReasonType.Unknown, + err: { name: 'test', message: 'unknown' }, + }), bootloaderDidFailToConnect(BootloaderConnectionFailureReason.NoWebBluetooth), bootloaderDidFailToConnect(BootloaderConnectionFailureReason.NoBluetooth), bootloaderDidFailToConnect(BootloaderConnectionFailureReason.Canceled), diff --git a/src/notifications/sagas.ts b/src/notifications/sagas.ts index fc0ff50b..002b0a19 100644 --- a/src/notifications/sagas.ts +++ b/src/notifications/sagas.ts @@ -190,9 +190,6 @@ function* showBleDeviceDidFailToConnectError( hubName: 'Pybricks Hub', }); break; - case BleDeviceFailToConnectReasonType.Unknown: - yield* showUnexpectedError(I18nId.BleUnexpectedError, action.err); - break; } }