UNPKG

@iotize/ionic

Version:

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

119 lines 16.4 kB
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==