@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
118 lines • 16.6 kB
JavaScript
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=