summaryrefslogtreecommitdiff
path: root/sw-ui/src/sagas/errors.ts
diff options
context:
space:
mode:
Diffstat (limited to 'sw-ui/src/sagas/errors.ts')
-rw-r--r--sw-ui/src/sagas/errors.ts36
1 files changed, 36 insertions, 0 deletions
diff --git a/sw-ui/src/sagas/errors.ts b/sw-ui/src/sagas/errors.ts
new file mode 100644
index 00000000..b27dfa95
--- /dev/null
+++ b/sw-ui/src/sagas/errors.ts
@@ -0,0 +1,36 @@
+import {Toaster} from '@blueprintjs/core';
+import {Channel, eventChannel} from 'redux-saga';
+import {apply, cancelled, take} from 'redux-saga/effects';
+import {ApiError} from '../api/model';
+import {SevenWondersSession} from '../api/sevenWondersApi';
+
+const ErrorToaster = Toaster.create();
+
+export function* errorHandlingSaga(session: SevenWondersSession): any {
+ const errorChannel: Channel<ApiError> = yield eventChannel(session.watchErrors());
+ try {
+ while (true) {
+ const error: ApiError = yield take(errorChannel);
+ yield* handleOneError(error);
+ }
+ } finally {
+ if (yield cancelled()) {
+ console.log('Error management saga cancelled');
+ yield apply(errorChannel, errorChannel.close);
+ }
+ }
+}
+
+function* handleOneError(err: ApiError): any {
+ console.error('Error received on web socket channel', err);
+ const msg = buildMsg(err);
+ yield apply(ErrorToaster, ErrorToaster.show, [{ intent: 'danger', icon: 'error', message: msg }]);
+}
+
+function buildMsg(err: ApiError): string {
+ if (err.details.length > 0) {
+ return err.details.map(d => d.message).join('\n');
+ } else {
+ return err.message;
+ }
+}
bgstack15