src/app/devices/directMethod/saga.ts (66 lines of code) (raw):
/***********************************************************
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License
**********************************************************/
import { call, put, takeEvery } from 'redux-saga/effects';
import { SagaIterator } from 'redux-saga';
import { Action } from 'typescript-fsa';
import { invokeDirectMethodAction, InvokeMethodActionParameters } from './actions';
import { invokeDirectMethod } from '../../api/services/devicesService';
import { raiseNotificationToast } from '../../notifications/components/notificationToast';
import { NotificationType } from '../../api/models/notification';
import { ResourceKeys } from '../../../localization/resourceKeys';
import { InvokeMethodParameters } from '../../api/parameters/deviceParameters';
export function* invokeDirectMethodSagaWorker(action: Action<InvokeMethodActionParameters>): SagaIterator {
const toastId: number = Math.random();
try {
const invokeMethodParameters: InvokeMethodParameters = {
...action.payload,
};
yield call(notifyMethodInvokedHelper, toastId, invokeMethodParameters);
const response = yield call(invokeDirectMethod, invokeMethodParameters);
const stringifiedResponse = typeof response === 'object' ? JSON.stringify(response) : response;
yield call(raiseNotificationToast, {
id: toastId,
text: {
translationKey: ResourceKeys.notifications.invokeMethodOnSuccess,
translationOptions: {
deviceId: action.payload.deviceId,
methodName: action.payload.methodName,
response: stringifiedResponse
},
},
type: NotificationType.success
});
yield put(invokeDirectMethodAction.done({params: action.payload, result: stringifiedResponse}));
} catch (error) {
yield call(raiseNotificationToast, {
id: toastId,
text: {
translationKey: ResourceKeys.notifications.invokeMethodOnError,
translationOptions: {
deviceId: action.payload.deviceId,
error,
},
},
type: NotificationType.error
});
yield put(invokeDirectMethodAction.failed({params: action.payload, error}));
}
}
export function* notifyMethodInvokedHelper(toastId: number, payload: InvokeMethodParameters) {
if (payload) {
yield call(raiseNotificationToast, {
id: toastId,
text: {
translationKey: ResourceKeys.notifications.invokingMethodWithPayload,
translationOptions: {
deviceId: payload.deviceId,
methodName: payload.methodName,
payload: JSON.stringify(payload.payload),
},
},
type: NotificationType.info
});
return payload.payload;
}
}
export function* invokeDirectMethodSaga() {
yield takeEvery(invokeDirectMethodAction.started.type, invokeDirectMethodSagaWorker);
}