src/app/devices/module/moduleDirectMethod/saga.ts (69 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 { invokeModuleDirectMethodAction, InvokeModuleMethodActionParameters } from './actions'; import { invokeModuleDirectMethod } from '../../../api/services/moduleService'; import { raiseNotificationToast } from '../../../notifications/components/notificationToast'; import { NotificationType } from '../../../api/models/notification'; import { ResourceKeys } from '../../../../localization/resourceKeys'; import { InvokeModuleMethodParameters } from '../../../api/parameters/moduleParameters'; export function* invokeModuleDirectMethodSagaWorker(action: Action<InvokeModuleMethodActionParameters>): SagaIterator { const toastId: number = Math.random(); try { const invokeMethodParameters: InvokeModuleMethodParameters = { ...action.payload, }; yield call(notifyModuleMethodInvokedHelper, toastId, invokeMethodParameters); const response = yield call(invokeModuleDirectMethod, invokeMethodParameters); const stringifiedResponse = typeof response === 'object' ? JSON.stringify(response) : response; yield call(raiseNotificationToast, { id: toastId, text: { translationKey: ResourceKeys.notifications.invokeModuleMethodOnSuccess, translationOptions: { deviceId: action.payload.deviceId, methodName: action.payload.methodName, moduleId: action.payload.moduleId, response: stringifiedResponse }, }, type: NotificationType.success }); yield put(invokeModuleDirectMethodAction.done({params: action.payload, result: stringifiedResponse})); } catch (error) { yield call(raiseNotificationToast, { id: toastId, text: { translationKey: ResourceKeys.notifications.invokeModuleMethodOnError, translationOptions: { deviceId: action.payload.deviceId, error, moduleId: action.payload.moduleId }, }, type: NotificationType.error }); yield put(invokeModuleDirectMethodAction.failed({params: action.payload, error})); } } export function* notifyModuleMethodInvokedHelper(toastId: number, payload: InvokeModuleMethodParameters) { if (payload) { yield call(raiseNotificationToast, { id: toastId, text: { translationKey: ResourceKeys.notifications.invokingModuleMethodWithPayload, translationOptions: { deviceId: payload.deviceId, methodName: payload.methodName, moduleId: payload.moduleId, payload: JSON.stringify(payload.payload), }, }, type: NotificationType.info }); return payload.payload; } } export function* invokeModuleDirectMethodSaga() { yield takeEvery(invokeModuleDirectMethodAction.started.type, invokeModuleDirectMethodSagaWorker); }