UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

118 lines 16.6 kB
import { Injectable } from '@angular/core'; import { CONFIGURATION_MODE_VERSION, CurrentDeviceService, FACTORY_RESET_MODE_VERSION, TapInfo, TapInfoCacheService, } from '@iotize/ionic'; import { ADMIN_USER } from '@iotize/tap/configurator'; import { ConnectionState, } from '@iotize/tap/protocol/api'; import { of } from 'rxjs'; import { map, shareReplay, switchMap, tap } from 'rxjs/operators'; import { TapConfigItemStateService } from './tap-config-item-state.service'; import * as i0 from "@angular/core"; import * as i1 from "@iotize/ionic"; import * as i2 from "./tap-config-item-state.service"; export class TapConfigurationModeService { get loading() { return this._loadingCounter > 0; } constructor(tapService, tapInfoCacheService, tapConfigItemStateService) { this.tapService = tapService; this.tapInfoCacheService = tapInfoCacheService; this.tapConfigItemStateService = tapConfigItemStateService; this._loadingCounter = 0; this.configurationModeChange = this.tapInfoCacheService .valueChange(TapInfo.configVersion) .pipe(map((v) => { return v === CONFIGURATION_MODE_VERSION; }), tap((v) => { this.editMode = v; }), shareReplay(1)); this.editMode = false; this.isConfigurationModeAvailable = this.tapService.connectionStateReplay.pipe(switchMap((event) => { if (event.newState === ConnectionState.CONNECTED) { return this.tapService.sessionState.pipe(map((sessionState) => { return (sessionState.name === ADMIN_USER.username || sessionState.groupId === ADMIN_USER.id); })); } else { return of(false); } })); } _setConfigurationVersion(v) { this.tapInfoCacheService.setKeyValue({ key: TapInfo.configVersion }, v); } async enableConfigurationMode() { try { this._loadingCounter++; const tap = this.tapService.tap; const [getVersionCall, putVersionCall] = await tap.service.interface.executeMultipleCalls([ tap.service.interface.getConfigVersionCall(), tap.service.interface.putConfigVersionCall(CONFIGURATION_MODE_VERSION), ]); this._version = await getVersionCall.body(); putVersionCall.successful(); this._setConfigurationVersion(CONFIGURATION_MODE_VERSION); } finally { this._loadingCounter--; } } async applyConfigurationMode() { try { this._loadingCounter++; const tap = this.tapService.tap; await this.tapConfigItemStateService.savePendingChanges(); const newVersionChange = this.tapConfigItemStateService .getPendingChangesSnapshot() .find(({ key }) => { return key.key === TapInfo.configVersion; }); let newVersion; if (newVersionChange) { newVersion = newVersionChange.value; } else { newVersion = this._version || '1.0.0'; } if (newVersion === CONFIGURATION_MODE_VERSION || newVersion === FACTORY_RESET_MODE_VERSION) { newVersion = '1.0.0'; } const [applyConfig, reloadConfig] = await tap.service.interface.executeMultipleCalls([ tap.service.interface.putConfigVersionCall(newVersion), tap.service.interface.reloadConfigCall(), ]); applyConfig.successful(); reloadConfig.successful(); this.tapConfigItemStateService.clearPendingChanges(); this._setConfigurationVersion(newVersion); } finally { this._loadingCounter--; } } async cancelConfigurationMode() { try { this._loadingCounter++; const tap = this.tapService.tap; const [reloadConfig, getConfigVersion] = await tap.service.interface.executeMultipleCalls([ tap.service.interface.reloadConfigCall(), tap.service.interface.getConfigVersionCall(), ]); reloadConfig.successful(); this._setConfigurationVersion(getConfigVersion.body()); this.tapConfigItemStateService.clearPendingChanges(); } finally { this._loadingCounter--; } } } /** @nocollapse */ TapConfigurationModeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapConfigurationModeService, deps: [{ token: i1.CurrentDeviceService }, { token: i1.TapInfoCacheService }, { token: i2.TapConfigItemStateService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ TapConfigurationModeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapConfigurationModeService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapConfigurationModeService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.CurrentDeviceService }, { type: i1.TapInfoCacheService }, { type: i2.TapConfigItemStateService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWNvbmZpZ3VyYXRpb24tbW9kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL2NvbmZpZy9zcmMvbGliL3RhcC1jb25maWd1cmF0aW9uLW1vZGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLDBCQUEwQixFQUMxQixPQUFPLEVBQ1AsbUJBQW1CLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsZUFBZSxHQUVoQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBSzVFLE1BQU0sT0FBTywyQkFBMkI7SUFtQnRDLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQW1CRCxZQUNVLFVBQWdDLEVBQ2hDLG1CQUF3QyxFQUN4Qyx5QkFBb0Q7UUFGcEQsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7UUFDaEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBeEN0RCxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUU1Qiw0QkFBdUIsR0FBd0IsSUFBSSxDQUFDLG1CQUFtQjthQUNwRSxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEs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QUF3QixDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDdEQ7Z0JBQVM7WUFDUixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzs0SUF6SFUsMkJBQTJCO2dKQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTs0RkFFUCwyQkFBMkI7a0JBSHZDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ09ORklHVVJBVElPTl9NT0RFX1ZFUlNJT04sXG4gIEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICBGQUNUT1JZX1JFU0VUX01PREVfVkVSU0lPTixcbiAgVGFwSW5mbyxcbiAgVGFwSW5mb0NhY2hlU2VydmljZSxcbn0gZnJvbSAnQGlvdGl6ZS9pb25pYyc7XG5pbXBvcnQgeyBBRE1JTl9VU0VSIH0gZnJvbSAnQGlvdGl6ZS90YXAvY29uZmlndXJhdG9yJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25TdGF0ZSxcbiAgQ29ubmVjdGlvblN0YXRlQ2hhbmdlRXZlbnQsXG59IGZyb20gJ0Bpb3RpemUvdGFwL3Byb3RvY29sL2FwaSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUYXBDb25maWdJdGVtU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi90YXAtY29uZmlnLWl0ZW0tc3RhdGUuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBDb25maWd1cmF0aW9uTW9kZVNlcnZpY2Uge1xuICBwcml2YXRlIF92ZXJzaW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2xvYWRpbmdDb3VudGVyID0gMDtcblxuICBjb25maWd1cmF0aW9uTW9kZUNoYW5nZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMudGFwSW5mb0NhY2hlU2VydmljZVxuICAgIC52YWx1ZUNoYW5nZShUYXBJbmZvLmNvbmZpZ1ZlcnNpb24pXG4gICAgLnBpcGUoXG4gICAgICBtYXAoKHYpID0+IHtcbiAgICAgICAgcmV0dXJuIHYgPT09IENPTkZJR1VSQVRJT05fTU9ERV9WRVJTSU9OO1xuICAgICAgfSksXG4gICAgICB0YXAoKHYpID0+IHtcbiAgICAgICAgdGhpcy5lZGl0TW9kZSA9IHY7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcblxuICBlZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nQ291bnRlciA+IDA7XG4gIH1cblxuICBpc0NvbmZpZ3VyYXRpb25Nb2RlQXZhaWxhYmxlID0gdGhpcy50YXBTZXJ2aWNlLmNvbm5lY3Rpb25TdGF0ZVJlcGxheS5waXBlKFxuICAgIHN3aXRjaE1hcCgoZXZlbnQ6IENvbm5lY3Rpb25TdGF0ZUNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQubmV3U3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5DT05ORUNURUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFwU2VydmljZS5zZXNzaW9uU3RhdGUucGlwZShcbiAgICAgICAgICBtYXAoKHNlc3Npb25TdGF0ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgc2Vzc2lvblN0YXRlLm5hbWUgPT09IEFETUlOX1VTRVIudXNlcm5hbWUgfHxcbiAgICAgICAgICAgICAgc2Vzc2lvblN0YXRlLmdyb3VwSWQgPT09IEFETUlOX1VTRVIuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRhcFNlcnZpY2U6IEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwSW5mb0NhY2hlU2VydmljZTogVGFwSW5mb0NhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIHRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2U6IFRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaXZhdGUgX3NldENvbmZpZ3VyYXRpb25WZXJzaW9uKHY6IHN0cmluZykge1xuICAgIHRoaXMudGFwSW5mb0NhY2hlU2VydmljZS5zZXRLZXlWYWx1ZSh7IGtleTogVGFwSW5mby5jb25maWdWZXJzaW9uIH0sIHYpO1xuICB9XG5cbiAgYXN5bmMgZW5hYmxlQ29uZmlndXJhdGlvbk1vZGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmdDb3VudGVyKys7XG4gICAgICBjb25zdCB0YXAgPSB0aGlzLnRhcFNlcnZpY2UudGFwO1xuICAgICAgY29uc3QgW2dldFZlcnNpb25DYWxsLCBwdXRWZXJzaW9uQ2FsbF0gPVxuICAgICAgICBhd2FpdCB0YXAuc2VydmljZS5pbnRlcmZhY2UuZXhlY3V0ZU11bHRpcGxlQ2FsbHMoW1xuICAgICAgICAgIHRhcC5zZXJ2aWNlLmludGVyZmFjZS5nZXRDb25maWdWZXJzaW9uQ2FsbCgpLFxuICAgICAgICAgIHRhcC5zZXJ2aWNlLmludGVyZmFjZS5wdXRDb25maWdWZXJzaW9uQ2FsbChcbiAgICAgICAgICAgIENPTkZJR1VSQVRJT05fTU9ERV9WRVJTSU9OXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG5cbiAgICAgIHRoaXMuX3ZlcnNpb24gPSBhd2FpdCBnZXRWZXJzaW9uQ2FsbC5ib2R5KCk7XG4gICAgICBwdXRWZXJzaW9uQ2FsbC5zdWNjZXNzZnVsKCk7XG4gICAgICB0aGlzLl9zZXRDb25maWd1cmF0aW9uVmVyc2lvbihDT05GSUdVUkFUSU9OX01PREVfVkVSU0lPTik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmdDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXBwbHlDb25maWd1cmF0aW9uTW9kZSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ZXIrKztcbiAgICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXA7XG4gICAgICBhd2FpdCB0aGlzLnRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2Uuc2F2ZVBlbmRpbmdDaGFuZ2VzKCk7XG4gICAgICBjb25zdCBuZXdWZXJzaW9uQ2hhbmdlID0gdGhpcy50YXBDb25maWdJdGVtU3RhdGVTZXJ2aWNlXG4gICAgICAgIC5nZXRQZW5kaW5nQ2hhbmdlc1NuYXBzaG90KClcbiAgICAgICAgLmZpbmQoKHsga2V5IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga2V5LmtleSA9PT0gVGFwSW5mby5jb25maWdWZXJzaW9uO1xuICAgICAgICB9KTtcbiAgICAgIGxldCBuZXdWZXJzaW9uOiBzdHJpbmc7XG4gICAgICBpZiAobmV3VmVyc2lvbkNoYW5nZSkge1xuICAgICAgICBuZXdWZXJzaW9uID0gbmV3VmVyc2lvbkNoYW5nZS52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uIHx8ICcxLjAuMCc7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIG5ld1ZlcnNpb24gPT09IENPTkZJR1VSQVRJT05fTU9ERV9WRVJTSU9OIHx8XG4gICAgICAgIG5ld1ZlcnNpb24gPT09IEZBQ1RPUllfUkVTRVRfTU9ERV9WRVJTSU9OXG4gICAgICApIHtcbiAgICAgICAgbmV3VmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICB9XG4gICAgICBjb25zdCBbYXBwbHlDb25maWcsIHJlbG9hZENvbmZpZ10gPVxuICAgICAgICBhd2FpdCB0YXAuc2VydmljZS5pbnRlcmZhY2UuZXhlY3V0ZU11bHRpcGxlQ2FsbHMoW1xuICAgICAgICAgIHRhcC5zZXJ2aWNlLmludGVyZmFjZS5wdXRDb25maWdWZXJzaW9uQ2FsbChuZXdWZXJzaW9uKSxcbiAgICAgICAgICB0YXAuc2VydmljZS5pbnRlcmZhY2UucmVsb2FkQ29uZmlnQ2FsbCgpLFxuICAgICAgICBdKTtcbiAgICAgIGFwcGx5Q29uZmlnLnN1Y2Nlc3NmdWwoKTtcbiAgICAgIHJlbG9hZENvbmZpZy5zdWNjZXNzZnVsKCk7XG4gICAgICB0aGlzLnRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2UuY2xlYXJQZW5kaW5nQ2hhbmdlcygpO1xuICAgICAgdGhpcy5fc2V0Q29uZmlndXJhdGlvblZlcnNpb24obmV3VmVyc2lvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmdDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2FuY2VsQ29uZmlndXJhdGlvbk1vZGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmdDb3VudGVyKys7XG4gICAgICBjb25zdCB0YXAgPSB0aGlzLnRhcFNlcnZpY2UudGFwO1xuICAgICAgY29uc3QgW3JlbG9hZENvbmZpZywgZ2V0Q29uZmlnVmVyc2lvbl0gPVxuICAgICAgICBhd2FpdCB0YXAuc2VydmljZS5pbnRlcmZhY2UuZXhlY3V0ZU11bHRpcGxlQ2FsbHMoW1xuICAgICAgICAgIHRhcC5zZXJ2aWNlLmludGVyZmFjZS5yZWxvYWRDb25maWdDYWxsKCksXG4gICAgICAgICAgdGFwLnNlcnZpY2UuaW50ZXJmYWNlLmdldENvbmZpZ1ZlcnNpb25DYWxsKCksXG4gICAgICAgIF0pO1xuICAgICAgcmVsb2FkQ29uZmlnLnN1Y2Nlc3NmdWwoKTtcbiAgICAgIHRoaXMuX3NldENvbmZpZ3VyYXRpb25WZXJzaW9uKGdldENvbmZpZ1ZlcnNpb24uYm9keSgpKTtcbiAgICAgIHRoaXMudGFwQ29uZmlnSXRlbVN0YXRlU2VydmljZS5jbGVhclBlbmRpbmdDaGFuZ2VzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmdDb3VudGVyLS07XG4gICAgfVxuICB9XG59XG4iXX0=