@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
119 lines • 16.4 kB
JavaScript
import { inject, 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 "./tap-config-item-state.service";
export class TapConfigurationModeService {
tapConfigItemStateService;
_version;
_loadingCounter = 0;
tapService = inject(CurrentDeviceService);
tapInfoCacheService = inject(TapInfoCacheService);
editMode = false;
configurationModeChange = this.tapInfoCacheService
.valueChange(TapInfo.configVersion)
.pipe(map((v) => {
return v === CONFIGURATION_MODE_VERSION;
}), tap((v) => {
this.editMode = v;
}), shareReplay(1));
get loading() {
return this._loadingCounter > 0;
}
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);
}
}));
constructor(tapConfigItemStateService) {
this.tapConfigItemStateService = tapConfigItemStateService;
}
_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 */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapConfigurationModeService, deps: [{ token: i1.TapConfigItemStateService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapConfigurationModeService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapConfigurationModeService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i1.TapConfigItemStateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWNvbmZpZ3VyYXRpb24tbW9kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL2NvbmZpZy9zcmMvbGliL3RhcC1jb25maWd1cmF0aW9uLW1vZGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLG9CQUFvQixFQUNwQiwwQkFBMEIsRUFDMUIsT0FBTyxFQUNQLG1CQUFtQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGVBQWUsR0FFaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7O0FBSzVFLE1BQU0sT0FBTywyQkFBMkI7SUE0Q2xCO0lBM0NaLFFBQVEsQ0FBVTtJQUVsQixlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLFVBQVUsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUUxQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUUxRCxRQUFRLEdBQVksS0FBSyxDQUFDO0lBRTFCLHVCQUF1QixHQUF3QixJQUFJLENBQUMsbUJBQW1CO1NBQ3BFLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1NBQ2xDLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNSLE9B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QkFBZ0IsRUFBRTtnQkFDeEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUU7YUFDN0MsQ0FBQyxDQUFDO1lBQ0wsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3ZELENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQzsySEF6SFUsMkJBQTJCOytIQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTs7NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ09ORklHVVJBVElPTl9NT0RFX1ZFUlNJT04sXG4gIEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICBGQUNUT1JZX1JFU0VUX01PREVfVkVSU0lPTixcbiAgVGFwSW5mbyxcbiAgVGFwSW5mb0NhY2hlU2VydmljZSxcbn0gZnJvbSAnQGlvdGl6ZS9pb25pYyc7XG5pbXBvcnQgeyBBRE1JTl9VU0VSIH0gZnJvbSAnQGlvdGl6ZS90YXAvY29uZmlndXJhdG9yJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25TdGF0ZSxcbiAgQ29ubmVjdGlvblN0YXRlQ2hhbmdlRXZlbnQsXG59IGZyb20gJ0Bpb3RpemUvdGFwL3Byb3RvY29sL2FwaSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUYXBDb25maWdJdGVtU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi90YXAtY29uZmlnLWl0ZW0tc3RhdGUuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBDb25maWd1cmF0aW9uTW9kZVNlcnZpY2Uge1xuICBwcml2YXRlIF92ZXJzaW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2xvYWRpbmdDb3VudGVyID0gMDtcblxuICBwcml2YXRlIHRhcFNlcnZpY2UgPSBpbmplY3QoQ3VycmVudERldmljZVNlcnZpY2UpO1xuXG4gIHByaXZhdGUgdGFwSW5mb0NhY2hlU2VydmljZSA9IGluamVjdChUYXBJbmZvQ2FjaGVTZXJ2aWNlKTtcblxuICBlZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbmZpZ3VyYXRpb25Nb2RlQ2hhbmdlOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlXG4gICAgLnZhbHVlQ2hhbmdlKFRhcEluZm8uY29uZmlnVmVyc2lvbilcbiAgICAucGlwZShcbiAgICAgIG1hcCgodikgPT4ge1xuICAgICAgICByZXR1cm4gdiA9PT0gQ09ORklHVVJBVElPTl9NT0RFX1ZFUlNJT047XG4gICAgICB9KSxcbiAgICAgIHRhcCgodikgPT4ge1xuICAgICAgICB0aGlzLmVkaXRNb2RlID0gdjtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nQ291bnRlciA+IDA7XG4gIH1cblxuICBpc0NvbmZpZ3VyYXRpb25Nb2RlQXZhaWxhYmxlID0gdGhpcy50YXBTZXJ2aWNlLmNvbm5lY3Rpb25TdGF0ZVJlcGxheS5waXBlKFxuICAgIHN3aXRjaE1hcCgoZXZlbnQ6IENvbm5lY3Rpb25TdGF0ZUNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQubmV3U3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5DT05ORUNURUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFwU2VydmljZS5zZXNzaW9uU3RhdGUucGlwZShcbiAgICAgICAgICBtYXAoKHNlc3Npb25TdGF0ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgc2Vzc2lvblN0YXRlLm5hbWUgPT09IEFETUlOX1VTRVIudXNlcm5hbWUgfHxcbiAgICAgICAgICAgICAgc2Vzc2lvblN0YXRlLmdyb3VwSWQgPT09IEFETUlOX1VTRVIuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2U6IFRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2UpIHt9XG5cbiAgcHJpdmF0ZSBfc2V0Q29uZmlndXJhdGlvblZlcnNpb24odjogc3RyaW5nKSB7XG4gICAgdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLnNldEtleVZhbHVlKHsga2V5OiBUYXBJbmZvLmNvbmZpZ1ZlcnNpb24gfSwgdik7XG4gIH1cblxuICBhc3luYyBlbmFibGVDb25maWd1cmF0aW9uTW9kZSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ZXIrKztcbiAgICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXA7XG4gICAgICBjb25zdCBbZ2V0VmVyc2lvbkNhbGwsIHB1dFZlcnNpb25DYWxsXSA9XG4gICAgICAgIGF3YWl0IHRhcC5zZXJ2aWNlLmludGVyZmFjZS5leGVjdXRlTXVsdGlwbGVDYWxscyhbXG4gICAgICAgICAgdGFwLnNlcnZpY2UuaW50ZXJmYWNlLmdldENvbmZpZ1ZlcnNpb25DYWxsKCksXG4gICAgICAgICAgdGFwLnNlcnZpY2UuaW50ZXJmYWNlLnB1dENvbmZpZ1ZlcnNpb25DYWxsKFxuICAgICAgICAgICAgQ09ORklHVVJBVElPTl9NT0RFX1ZFUlNJT05cbiAgICAgICAgICApLFxuICAgICAgICBdKTtcblxuICAgICAgdGhpcy5fdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb25DYWxsLmJvZHkoKTtcbiAgICAgIHB1dFZlcnNpb25DYWxsLnN1Y2Nlc3NmdWwoKTtcbiAgICAgIHRoaXMuX3NldENvbmZpZ3VyYXRpb25WZXJzaW9uKENPTkZJR1VSQVRJT05fTU9ERV9WRVJTSU9OKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ZXItLTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhcHBseUNvbmZpZ3VyYXRpb25Nb2RlKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9sb2FkaW5nQ291bnRlcisrO1xuICAgICAgY29uc3QgdGFwID0gdGhpcy50YXBTZXJ2aWNlLnRhcDtcbiAgICAgIGF3YWl0IHRoaXMudGFwQ29uZmlnSXRlbVN0YXRlU2VydmljZS5zYXZlUGVuZGluZ0NoYW5nZXMoKTtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25DaGFuZ2UgPSB0aGlzLnRhcENvbmZpZ0l0ZW1TdGF0ZVNlcnZpY2VcbiAgICAgICAgLmdldFBlbmRpbmdDaGFuZ2VzU25hcHNob3QoKVxuICAgICAgICAuZmluZCgoeyBrZXkgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBrZXkua2V5ID09PSBUYXBJbmZvLmNvbmZpZ1ZlcnNpb247XG4gICAgICAgIH0pO1xuICAgICAgbGV0IG5ld1ZlcnNpb246IHN0cmluZztcbiAgICAgIGlmIChuZXdWZXJzaW9uQ2hhbmdlKSB7XG4gICAgICAgIG5ld1ZlcnNpb24gPSBuZXdWZXJzaW9uQ2hhbmdlLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb24gfHwgJzEuMC4wJztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbmV3VmVyc2lvbiA9PT0gQ09ORklHVVJBVElPTl9NT0RFX1ZFUlNJT04gfHxcbiAgICAgICAgbmV3VmVyc2lvbiA9PT0gRkFDVE9SWV9SRVNFVF9NT0RFX1ZFUlNJT05cbiAgICAgICkge1xuICAgICAgICBuZXdWZXJzaW9uID0gJzEuMC4wJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IFthcHBseUNvbmZpZywgcmVsb2FkQ29uZmlnXSA9XG4gICAgICAgIGF3YWl0IHRhcC5zZXJ2aWNlLmludGVyZmFjZS5leGVjdXRlTXVsdGlwbGVDYWxscyhbXG4gICAgICAgICAgdGFwLnNlcnZpY2UuaW50ZXJmYWNlLnB1dENvbmZpZ1ZlcnNpb25DYWxsKG5ld1ZlcnNpb24pLFxuICAgICAgICAgIHRhcC5zZXJ2aWNlLmludGVyZmFjZS5yZWxvYWRDb25maWdDYWxsKCksXG4gICAgICAgIF0pO1xuICAgICAgYXBwbHlDb25maWcuc3VjY2Vzc2Z1bCgpO1xuICAgICAgcmVsb2FkQ29uZmlnLnN1Y2Nlc3NmdWwoKTtcbiAgICAgIHRoaXMudGFwQ29uZmlnSXRlbVN0YXRlU2VydmljZS5jbGVhclBlbmRpbmdDaGFuZ2VzKCk7XG4gICAgICB0aGlzLl9zZXRDb25maWd1cmF0aW9uVmVyc2lvbihuZXdWZXJzaW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ZXItLTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjYW5jZWxDb25maWd1cmF0aW9uTW9kZSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ZXIrKztcbiAgICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXA7XG4gICAgICBjb25zdCBbcmVsb2FkQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uXSA9XG4gICAgICAgIGF3YWl0IHRhcC5zZXJ2aWNlLmludGVyZmFjZS5leGVjdXRlTXVsdGlwbGVDYWxscyhbXG4gICAgICAgICAgdGFwLnNlcnZpY2UuaW50ZXJmYWNlLnJlbG9hZENvbmZpZ0NhbGwoKSxcbiAgICAgICAgICB0YXAuc2VydmljZS5pbnRlcmZhY2UuZ2V0Q29uZmlnVmVyc2lvbkNhbGwoKSxcbiAgICAgICAgXSk7XG4gICAgICByZWxvYWRDb25maWcuc3VjY2Vzc2Z1bCgpO1xuICAgICAgdGhpcy5fc2V0Q29uZmlndXJhdGlvblZlcnNpb24oZ2V0Q29uZmlnVmVyc2lvbi5ib2R5KCkpO1xuICAgICAgdGhpcy50YXBDb25maWdJdGVtU3RhdGVTZXJ2aWNlLmNsZWFyUGVuZGluZ0NoYW5nZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ZXItLTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==