@doolehealth/service-lib 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +112 -13
  2. package/esm2022/lib/configuration.mjs +1 -1
  3. package/esm2022/lib/models/notifications/notification-options.mjs +192 -0
  4. package/esm2022/lib/models/shared-care-plan.mjs +223 -0
  5. package/esm2022/lib/models/user.mjs +1 -1
  6. package/esm2022/lib/service-lib.component.mjs +5 -5
  7. package/esm2022/lib/service-lib.module.mjs +4 -4
  8. package/esm2022/lib/services/analytics.service.mjs +20 -11
  9. package/esm2022/lib/services/api-endpoints.service.mjs +22 -6
  10. package/esm2022/lib/services/authentication.service.mjs +74 -52
  11. package/esm2022/lib/services/change-endpoints.service.mjs +46 -22
  12. package/esm2022/lib/services/date.service.mjs +106 -45
  13. package/esm2022/lib/services/doole.service.mjs +658 -221
  14. package/esm2022/lib/services/encryption.service.mjs +3 -3
  15. package/esm2022/lib/services/error.service.mjs +3 -3
  16. package/esm2022/lib/services/events.service.mjs +5 -5
  17. package/esm2022/lib/services/firebase/auth/firebase-auth.service.mjs +154 -0
  18. package/esm2022/lib/services/firebase/auth/firebase-profile.model.mjs +7 -0
  19. package/esm2022/lib/services/health.service.mjs +303 -0
  20. package/esm2022/lib/services/highcharts.service.mjs +37 -67
  21. package/esm2022/lib/services/http.service.mjs +14 -14
  22. package/esm2022/lib/services/language.model.mjs +3 -0
  23. package/esm2022/lib/services/language.service.mjs +6 -6
  24. package/esm2022/lib/services/loading.service.mjs +3 -3
  25. package/esm2022/lib/services/logging.service.mjs +4 -4
  26. package/esm2022/lib/services/navigation.service.mjs +108 -9
  27. package/esm2022/lib/services/network.service.mjs +7 -7
  28. package/esm2022/lib/services/notification.service.mjs +10 -96
  29. package/esm2022/lib/services/opentok.service.mjs +10 -7
  30. package/esm2022/lib/services/permission.service.mjs +94 -0
  31. package/esm2022/lib/services/roles.service.mjs +9 -8
  32. package/esm2022/lib/services/shared-care-plan/shared-care-plan.service.mjs +103 -0
  33. package/esm2022/lib/services/storage.service.mjs +3 -3
  34. package/esm2022/lib/services/token.service.mjs +7 -7
  35. package/esm2022/lib/utils/chatParameters.mjs +17 -0
  36. package/esm2022/lib/utils/data-store.mjs +62 -0
  37. package/esm2022/lib/utils/query-string-parameters.mjs +11 -0
  38. package/esm2022/lib/utils/url-builder.mjs +15 -0
  39. package/esm2022/public-api.mjs +8 -9
  40. package/fesm2022/doolehealth-service-lib.mjs +2055 -1228
  41. package/fesm2022/doolehealth-service-lib.mjs.map +1 -1
  42. package/lib/configuration.d.ts +4 -2
  43. package/lib/{util → models/notifications}/notification-options.d.ts +0 -32
  44. package/lib/models/shared-care-plan.d.ts +206 -0
  45. package/lib/models/user.d.ts +2 -0
  46. package/lib/service-lib.component.d.ts +1 -1
  47. package/lib/services/analytics.service.d.ts +6 -3
  48. package/lib/services/api-endpoints.service.d.ts +3 -0
  49. package/lib/services/authentication.service.d.ts +27 -25
  50. package/lib/services/change-endpoints.service.d.ts +1 -0
  51. package/lib/services/date.service.d.ts +15 -8
  52. package/lib/services/doole.service.d.ts +64 -23
  53. package/lib/services/{auth → firebase/auth}/firebase-auth.service.d.ts +1 -1
  54. package/lib/services/{auth → firebase/auth}/firebase-profile.model.d.ts +1 -1
  55. package/lib/services/health.service.d.ts +49 -0
  56. package/lib/services/highcharts.service.d.ts +1 -2
  57. package/lib/services/http.service.d.ts +1 -1
  58. package/lib/services/language.service.d.ts +1 -1
  59. package/lib/services/navigation.service.d.ts +6 -1
  60. package/lib/services/notification.service.d.ts +2 -7
  61. package/lib/services/permission.service.d.ts +33 -0
  62. package/lib/services/roles.service.d.ts +3 -2
  63. package/lib/services/shared-care-plan/shared-care-plan.service.d.ts +20 -0
  64. package/lib/{util → utils}/data-store.d.ts +3 -1
  65. package/package.json +2 -15
  66. package/public-api.d.ts +7 -8
  67. package/esm2022/lib/services/auth/firebase-auth.service.mjs +0 -155
  68. package/esm2022/lib/services/auth/firebase-profile.model.mjs +0 -7
  69. package/esm2022/lib/services/pusher/pusher-alarm.service.mjs +0 -39
  70. package/esm2022/lib/services/pusher/pusher-challenge-notifications.service.mjs +0 -110
  71. package/esm2022/lib/services/pusher/pusher-connection.service.mjs +0 -73
  72. package/esm2022/lib/services/pusher/pusher-message.service.mjs +0 -27
  73. package/esm2022/lib/services/pusher/pusher-notification.service.mjs +0 -116
  74. package/esm2022/lib/util/chatParameters.mjs +0 -17
  75. package/esm2022/lib/util/data-store.mjs +0 -54
  76. package/esm2022/lib/util/environment.mjs +0 -29
  77. package/esm2022/lib/util/language.model.mjs +0 -3
  78. package/esm2022/lib/util/notification-options.mjs +0 -245
  79. package/esm2022/lib/util/query-string-parameters.mjs +0 -11
  80. package/esm2022/lib/util/url-builder.mjs +0 -15
  81. package/lib/services/pusher/pusher-alarm.service.d.ts +0 -16
  82. package/lib/services/pusher/pusher-challenge-notifications.service.d.ts +0 -40
  83. package/lib/services/pusher/pusher-connection.service.d.ts +0 -24
  84. package/lib/services/pusher/pusher-message.service.d.ts +0 -13
  85. package/lib/services/pusher/pusher-notification.service.d.ts +0 -32
  86. package/lib/util/environment.d.ts +0 -18
  87. /package/lib/{util → services}/language.model.d.ts +0 -0
  88. /package/lib/{util → utils}/chatParameters.d.ts +0 -0
  89. /package/lib/{util → utils}/query-string-parameters.d.ts +0 -0
  90. /package/lib/{util → utils}/url-builder.d.ts +0 -0
@@ -19,10 +19,10 @@ export class EncryptionService {
19
19
  return encryptedData;
20
20
  }
21
21
  }
22
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: EncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
23
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: EncryptionService, providedIn: 'root' }); }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
23
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EncryptionService, providedIn: 'root' }); }
24
24
  }
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: EncryptionService, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EncryptionService, decorators: [{
26
26
  type: Injectable,
27
27
  args: [{
28
28
  providedIn: 'root'
@@ -37,10 +37,10 @@ export class ErrorService {
37
37
  // handle stack trace
38
38
  return 'stack';
39
39
  }
40
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
41
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ErrorService, providedIn: 'root' }); }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
41
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorService, providedIn: 'root' }); }
42
42
  }
43
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ErrorService, decorators: [{
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorService, decorators: [{
44
44
  type: Injectable,
45
45
  args: [{
46
46
  providedIn: 'root'
@@ -18,7 +18,7 @@ export class Events {
18
18
  * @returns Subscription from which you can unsubscribe to release memory resources and to prevent memory leak.
19
19
  */
20
20
  subscribe(topic, observer) {
21
- console.log("subscribe topic: ", topic);
21
+ //console.log("subscribe topic: ", topic);
22
22
  if (!this.channels[topic]) {
23
23
  // You can also use ReplaySubject with one concequence
24
24
  this.channels[topic] = new Subject();
@@ -51,13 +51,13 @@ export class Events {
51
51
  subject.complete();
52
52
  delete this.channels[topic];
53
53
  }
54
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: Events, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
55
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: Events, providedIn: 'root' }); }
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Events, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
55
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Events, providedIn: 'root' }); }
56
56
  }
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: Events, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Events, decorators: [{
58
58
  type: Injectable,
59
59
  args: [{
60
60
  providedIn: 'root'
61
61
  }]
62
62
  }] });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlLWxpYi9zcmMvbGliL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQzs7QUFFM0M7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxNQUFNO0lBSG5CO1FBS1ksYUFBUSxHQUFxQyxFQUFFLENBQUM7S0FnRDNEO0lBOUNHOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUFhLEVBQUUsUUFBMEI7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLHNEQUFzRDtZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsS0FBYSxFQUFFLElBQVU7UUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCx5REFBeUQ7WUFDekQsT0FBTztRQUNYLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLEtBQWE7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDOytHQWpEUSxNQUFNO21IQUFOLE1BQU0sY0FGSCxNQUFNOzs0RkFFVCxNQUFNO2tCQUhsQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQSBjdXN0b20gRXZlbnRzIHNlcnZpY2UganVzdCBsaWtlIElvbmljIDMgRXZlbnRzIGh0dHBzOi8vaW9uaWNmcmFtZXdvcmsuY29tL2RvY3MvdjMvYXBpL3V0aWwvRXZlbnRzLyB3aGljaCBnb3QgcmVtb3ZlZCBpbiBJb25pYyA1LlxuICpcbiAqIEBhdXRob3IgU2hhc2hhbmsgQWdyYXdhbFxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV2ZW50cyB7XG5cbiAgICBwcml2YXRlIGNoYW5uZWxzOiB7IFtrZXk6IHN0cmluZ106IFN1YmplY3Q8YW55PjsgfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIGEgdG9waWMgYW5kIHByb3ZpZGUgYSBzaW5nbGUgaGFuZGxlci9vYnNlcnZlci5cbiAgICAgKiBAcGFyYW0gdG9waWMgVGhlIG5hbWUgb2YgdGhlIHRvcGljIHRvIHN1YnNjcmliZSB0by5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgVGhlIG9ic2VydmVyIG9yIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGxpc3RlbiB3aGVuIGNoYW5nZXMgYXJlIHB1Ymxpc2hlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFN1YnNjcmlwdGlvbiBmcm9tIHdoaWNoIHlvdSBjYW4gdW5zdWJzY3JpYmUgdG8gcmVsZWFzZSBtZW1vcnkgcmVzb3VyY2VzIGFuZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrLlxuICAgICAqL1xuICAgIHN1YnNjcmliZSh0b3BpYzogc3RyaW5nLCBvYnNlcnZlcjogKF86IGFueSkgPT4gdm9pZCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlIHRvcGljOiBcIiwgdG9waWMpO1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbdG9waWNdKSB7XG4gICAgICAgICAgICAvLyBZb3UgY2FuIGFsc28gdXNlIFJlcGxheVN1YmplY3Qgd2l0aCBvbmUgY29uY2VxdWVuY2VcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNbdG9waWNdID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbdG9waWNdLnN1YnNjcmliZShvYnNlcnZlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaCBzb21lIGRhdGEgdG8gdGhlIHN1YnNjcmliZXJzIG9mIHRoZSBnaXZlbiB0b3BpYy5cbiAgICAgKiBAcGFyYW0gdG9waWMgVGhlIG5hbWUgb2YgdGhlIHRvcGljIHRvIGVtaXQgZGF0YSB0by5cbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGluIGFueSBmb3JtYXQgdG8gcGFzcyBvbi5cbiAgICAgKi9cbiAgICBwdWJsaXNoKHRvcGljOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuY2hhbm5lbHNbdG9waWNdO1xuICAgICAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgICAgICAgIC8vIE9yIHlvdSBjYW4gY3JlYXRlIGEgbmV3IHN1YmplY3QgZm9yIGZ1dHVyZSBzdWJzY3JpYmVyc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3ViamVjdC5uZXh0KGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4geW91IGFyZSBzdXJlIHRoYXQgeW91IGFyZSBkb25lIHdpdGggdGhlIHRvcGljIGFuZCB0aGUgc3Vic2NyaWJlcnMgbm8gbG9uZ2VyIG5lZWRzIHRvIGxpc3RlbiB0byBhIHBhcnRpY3VsYXIgdG9waWMsIHlvdSBjYW5cbiAgICAgKiBkZXN0cm95IHRoZSBvYnNlcnZhYmxlIG9mIHRoZSB0b3BpYyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gdG9waWMgVGhlIG5hbWUgb2YgdGhlIHRvcGljIHRvIGRlc3Ryb3kuXG4gICAgICovXG4gICAgZGVzdHJveSh0b3BpYzogc3RyaW5nKTogYW55IHtcbiAgICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuY2hhbm5lbHNbdG9waWNdO1xuICAgICAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICBkZWxldGUgdGhpcy5jaGFubmVsc1t0b3BpY107XG4gICAgfVxufSJdfQ==
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlLWxpYi9zcmMvbGliL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQzs7QUFFM0M7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxNQUFNO0lBSG5CO1FBS1ksYUFBUSxHQUFxQyxFQUFFLENBQUM7S0FnRDNEO0lBOUNHOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUFhLEVBQUUsUUFBMEI7UUFDL0MsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsc0RBQXNEO1lBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxLQUFhLEVBQUUsSUFBVTtRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLHlEQUF5RDtZQUN6RCxPQUFPO1FBQ1gsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsS0FBYTtRQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7K0dBakRRLE1BQU07bUhBQU4sTUFBTSxjQUZILE1BQU07OzRGQUVULE1BQU07a0JBSGxCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBBIGN1c3RvbSBFdmVudHMgc2VydmljZSBqdXN0IGxpa2UgSW9uaWMgMyBFdmVudHMgaHR0cHM6Ly9pb25pY2ZyYW1ld29yay5jb20vZG9jcy92My9hcGkvdXRpbC9FdmVudHMvIHdoaWNoIGdvdCByZW1vdmVkIGluIElvbmljIDUuXG4gKlxuICogQGF1dGhvciBTaGFzaGFuayBBZ3Jhd2FsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRXZlbnRzIHtcblxuICAgIHByaXZhdGUgY2hhbm5lbHM6IHsgW2tleTogc3RyaW5nXTogU3ViamVjdDxhbnk+OyB9ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gYSB0b3BpYyBhbmQgcHJvdmlkZSBhIHNpbmdsZSBoYW5kbGVyL29ic2VydmVyLlxuICAgICAqIEBwYXJhbSB0b3BpYyBUaGUgbmFtZSBvZiB0aGUgdG9waWMgdG8gc3Vic2NyaWJlIHRvLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlciBUaGUgb2JzZXJ2ZXIgb3IgY2FsbGJhY2sgZnVuY3Rpb24gdG8gbGlzdGVuIHdoZW4gY2hhbmdlcyBhcmUgcHVibGlzaGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU3Vic2NyaXB0aW9uIGZyb20gd2hpY2ggeW91IGNhbiB1bnN1YnNjcmliZSB0byByZWxlYXNlIG1lbW9yeSByZXNvdXJjZXMgYW5kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsuXG4gICAgICovXG4gICAgc3Vic2NyaWJlKHRvcGljOiBzdHJpbmcsIG9ic2VydmVyOiAoXzogYW55KSA9PiB2b2lkKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInN1YnNjcmliZSB0b3BpYzogXCIsIHRvcGljKTtcbiAgICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzW3RvcGljXSkge1xuICAgICAgICAgICAgLy8gWW91IGNhbiBhbHNvIHVzZSBSZXBsYXlTdWJqZWN0IHdpdGggb25lIGNvbmNlcXVlbmNlXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzW3RvcGljXSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzW3RvcGljXS5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1Ymxpc2ggc29tZSBkYXRhIHRvIHRoZSBzdWJzY3JpYmVycyBvZiB0aGUgZ2l2ZW4gdG9waWMuXG4gICAgICogQHBhcmFtIHRvcGljIFRoZSBuYW1lIG9mIHRoZSB0b3BpYyB0byBlbWl0IGRhdGEgdG8uXG4gICAgICogQHBhcmFtIGRhdGEgZGF0YSBpbiBhbnkgZm9ybWF0IHRvIHBhc3Mgb24uXG4gICAgICovXG4gICAgcHVibGlzaCh0b3BpYzogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLmNoYW5uZWxzW3RvcGljXTtcbiAgICAgICAgaWYgKCFzdWJqZWN0KSB7XG4gICAgICAgICAgICAvLyBPciB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IGZvciBmdXR1cmUgc3Vic2NyaWJlcnNcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YmplY3QubmV4dChkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHlvdSBhcmUgc3VyZSB0aGF0IHlvdSBhcmUgZG9uZSB3aXRoIHRoZSB0b3BpYyBhbmQgdGhlIHN1YnNjcmliZXJzIG5vIGxvbmdlciBuZWVkcyB0byBsaXN0ZW4gdG8gYSBwYXJ0aWN1bGFyIHRvcGljLCB5b3UgY2FuXG4gICAgICogZGVzdHJveSB0aGUgb2JzZXJ2YWJsZSBvZiB0aGUgdG9waWMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAgICogQHBhcmFtIHRvcGljIFRoZSBuYW1lIG9mIHRoZSB0b3BpYyB0byBkZXN0cm95LlxuICAgICAqL1xuICAgIGRlc3Ryb3kodG9waWM6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5jaGFubmVsc1t0b3BpY107XG4gICAgICAgIGlmICghc3ViamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxzW3RvcGljXTtcbiAgICB9XG59Il19
@@ -0,0 +1,154 @@
1
+ import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
2
+ import { Subject, from, of } from 'rxjs';
3
+ import { FirebaseProfileModel } from './firebase-profile.model';
4
+ import { filter, map } from 'rxjs/operators';
5
+ import firebase from "firebase/compat/app";
6
+ //import { cfaSignIn, cfaSignOut } from 'capacitor-firebase-auth';
7
+ import { isPlatformBrowser } from '@angular/common';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/fire/compat/auth";
10
+ import * as i2 from "@ionic/angular";
11
+ export class FirebaseAuthService {
12
+ constructor(angularFire, platform, platformId) {
13
+ this.angularFire = angularFire;
14
+ this.platform = platform;
15
+ this.platformId = platformId;
16
+ this.redirectResult = new Subject();
17
+ if (isPlatformBrowser(this.platformId)) {
18
+ this.angularFire.onAuthStateChanged((user) => {
19
+ if (user) {
20
+ // User is signed in.
21
+ this.currentUser = user;
22
+ }
23
+ else {
24
+ // No user is signed in.
25
+ this.currentUser = null;
26
+ }
27
+ });
28
+ if (!this.platform.is('capacitor')) {
29
+ // when using signInWithRedirect, this listens for the redirect results
30
+ this.angularFire.getRedirectResult()
31
+ .then((result) => {
32
+ // result.credential.accessToken gives you the Provider Access Token. You can use it to access the Provider API.
33
+ if (result.user) {
34
+ this.userProviderAdditionalInfo = result.additionalUserInfo.profile;
35
+ this.redirectResult.next(result);
36
+ }
37
+ }, (error) => {
38
+ this.redirectResult.next({ error: error.code });
39
+ });
40
+ }
41
+ }
42
+ }
43
+ getRedirectResult() {
44
+ return this.redirectResult.asObservable();
45
+ }
46
+ getPhotoURL(signInProviderId, photoURL) {
47
+ // Default imgs are too small and our app needs a bigger image
48
+ switch (signInProviderId) {
49
+ case 'facebook.com':
50
+ return photoURL + '?height=400';
51
+ case 'password':
52
+ return 'https://s3-us-west-2.amazonaws.com/ionicthemes/otros/avatar-placeholder.png';
53
+ case 'twitter.com':
54
+ return photoURL.replace('_normal', '_400x400');
55
+ case 'google.com':
56
+ return photoURL.split('=')[0];
57
+ default:
58
+ return photoURL;
59
+ }
60
+ }
61
+ signOut() {
62
+ if (this.platform.is('capacitor')) {
63
+ //return cfaSignOut();
64
+ }
65
+ else {
66
+ return from(this.angularFire.signOut());
67
+ }
68
+ return null;
69
+ }
70
+ signInWithEmail(email, password) {
71
+ return this.angularFire.signInWithEmailAndPassword(email, password);
72
+ }
73
+ signUpWithEmail(email, password) {
74
+ return this.angularFire.createUserWithEmailAndPassword(email, password);
75
+ }
76
+ socialSignIn(providerName, scopes) {
77
+ if (this.platform.is('capacitor')) {
78
+ //return cfaSignIn(providerName);
79
+ }
80
+ else {
81
+ const provider = new firebase.auth.OAuthProvider(providerName);
82
+ ////console.log("provider. ", provider);
83
+ if (scopes) {
84
+ scopes.forEach(scope => {
85
+ provider.addScope(scope);
86
+ });
87
+ }
88
+ if (this.platform.is('desktop')) {
89
+ return from(this.angularFire.signInWithPopup(provider));
90
+ }
91
+ else {
92
+ // web but not desktop, for example mobile PWA
93
+ return from(this.angularFire.signInWithRedirect(provider));
94
+ }
95
+ }
96
+ return null;
97
+ }
98
+ signInWithGoogle() {
99
+ const provider = new firebase.auth.GoogleAuthProvider();
100
+ ////console.log("provider: ", provider);
101
+ const scopes = ['profile', 'email'];
102
+ return this.socialSignIn(provider.providerId, scopes);
103
+ }
104
+ signInWithTwitter() {
105
+ const provider = new firebase.auth.TwitterAuthProvider();
106
+ return this.socialSignIn(provider.providerId);
107
+ }
108
+ getProfileDataSource() {
109
+ // we need to do this differentiation because there is a bug in
110
+ // platform capacitor ios when executing this.angularFire.user
111
+ if (this.platform.is('capacitor')) {
112
+ return of(this.setUserModelForProfile());
113
+ }
114
+ else {
115
+ return this.angularFire.user
116
+ .pipe(filter((user) => user != null), map((user) => {
117
+ return this.setUserModelForProfile();
118
+ }));
119
+ }
120
+ }
121
+ setUserModelForProfile() {
122
+ const userModel = new FirebaseProfileModel();
123
+ const provierData = this.currentUser.providerData[0];
124
+ const userData = this.userProviderAdditionalInfo ? this.userProviderAdditionalInfo : provierData;
125
+ userModel.image = this.getPhotoURL(provierData.providerId, provierData.photoURL);
126
+ userModel.name = userData.name || userData.displayName || 'What\'s your name?';
127
+ userModel.role = 'How would you describe yourself?';
128
+ userModel.description = userData.description || 'Anything else you would like to share with the world?';
129
+ userModel.phoneNumber = userData.phoneNumber || 'Is there a number where I can reach you?';
130
+ userModel.email = userData.email || 'Where can I send you emails?';
131
+ userModel.provider = (provierData.providerId !== 'password') ? provierData.providerId : 'Credentials';
132
+ return userModel;
133
+ }
134
+ getProfileStore(dataSource) {
135
+ // Initialize the model specifying that it is a shell model
136
+ const shellModel = new FirebaseProfileModel();
137
+ //this.profileDataStore = new DataStore(shellModel);
138
+ // Trigger the loading mechanism (with shell) in the dataStore
139
+ this.profileDataStore.load(dataSource);
140
+ return this.profileDataStore;
141
+ }
142
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FirebaseAuthService, deps: [{ token: i1.AngularFireAuth }, { token: i2.Platform }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
143
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FirebaseAuthService, providedIn: 'root' }); }
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FirebaseAuthService, decorators: [{
146
+ type: Injectable,
147
+ args: [{
148
+ providedIn: 'root'
149
+ }]
150
+ }], ctorParameters: () => [{ type: i1.AngularFireAuth }, { type: i2.Platform }, { type: undefined, decorators: [{
151
+ type: Inject,
152
+ args: [PLATFORM_ID]
153
+ }] }] });
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2UtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2VydmljZS1saWIvc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9hdXRoL2ZpcmViYXNlLWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEUsT0FBTyxFQUFjLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxRQUFRLE1BQU0scUJBQXFCLENBQUM7QUFDM0Msa0VBQWtFO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBTXBELE1BQU0sT0FBTyxtQkFBbUI7SUFROUIsWUFDUyxXQUE0QixFQUM1QixRQUFrQixFQUNJLFVBQWtCO1FBRnhDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ0ksZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQU5qRCxtQkFBYyxHQUFpQixJQUFJLE9BQU8sRUFBTyxDQUFDO1FBUWhELElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMzQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULHFCQUFxQjtvQkFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLENBQUM7cUJBQU0sQ0FB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O1FBQ2pFLDJEQUEyRDtRQUMzRCxNQUFNLFVBQVUsR0FBeUIsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BFLG9EQUFvRDtRQUNwRCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOytHQXZKVSxtQkFBbUIseUVBV3BCLFdBQVc7bUhBWFYsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVlJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJGaXJlQXV0aCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvY29tcGF0L2F1dGgnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGFTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RhdGEtc3RvcmUnO1xuaW1wb3J0IHsgRmlyZWJhc2VQcm9maWxlTW9kZWwgfSBmcm9tICcuL2ZpcmViYXNlLXByb2ZpbGUubW9kZWwnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IGZpcmViYXNlIGZyb20gXCJmaXJlYmFzZS9jb21wYXQvYXBwXCI7XG4vL2ltcG9ydCB7IGNmYVNpZ25JbiwgY2ZhU2lnbk91dCB9IGZyb20gJ2NhcGFjaXRvci1maXJlYmFzZS1hdXRoJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFVzZXIsIEF1dGggfSBmcm9tICdmaXJlYmFzZS9hdXRoJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VBdXRoU2VydmljZSB7XG5cbiAgY3VycmVudFVzZXI6IFVzZXI7XG4gIHVzZXJQcm92aWRlckFkZGl0aW9uYWxJbmZvOiBhbnk7XG4gIHByb2ZpbGVEYXRhU3RvcmU6IERhdGFTdG9yZTxGaXJlYmFzZVByb2ZpbGVNb2RlbD47XG4gIHJlZGlyZWN0UmVzdWx0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYW5ndWxhckZpcmU6IEFuZ3VsYXJGaXJlQXV0aCxcbiAgICBwdWJsaWMgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogb2JqZWN0XG4gICkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmFuZ3VsYXJGaXJlLm9uQXV0aFN0YXRlQ2hhbmdlZCgodXNlcikgPT4ge1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIC8vIFVzZXIgaXMgc2lnbmVkIGluLlxuICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB1c2VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHVzZXIgaXMgc2lnbmVkIGluLlxuICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgICAvLyB3aGVuIHVzaW5nIHNpZ25JbldpdGhSZWRpcmVjdCwgdGhpcyBsaXN0ZW5zIGZvciB0aGUgcmVkaXJlY3QgcmVzdWx0c1xuICAgICAgICB0aGlzLmFuZ3VsYXJGaXJlLmdldFJlZGlyZWN0UmVzdWx0KClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3VsdC5jcmVkZW50aWFsLmFjY2Vzc1Rva2VuIGdpdmVzIHlvdSB0aGUgUHJvdmlkZXIgQWNjZXNzIFRva2VuLiBZb3UgY2FuIHVzZSBpdCB0byBhY2Nlc3MgdGhlIFByb3ZpZGVyIEFQSS5cbiAgICAgICAgICBpZiAocmVzdWx0LnVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXNlclByb3ZpZGVyQWRkaXRpb25hbEluZm8gPSByZXN1bHQuYWRkaXRpb25hbFVzZXJJbmZvLnByb2ZpbGU7XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0UmVzdWx0Lm5leHQocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMucmVkaXJlY3RSZXN1bHQubmV4dCh7ZXJyb3I6IGVycm9yLmNvZGV9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVkaXJlY3RSZXN1bHQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFJlc3VsdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFBob3RvVVJMKHNpZ25JblByb3ZpZGVySWQ6IHN0cmluZywgcGhvdG9VUkw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gRGVmYXVsdCBpbWdzIGFyZSB0b28gc21hbGwgYW5kIG91ciBhcHAgbmVlZHMgYSBiaWdnZXIgaW1hZ2VcbiAgICBzd2l0Y2ggKHNpZ25JblByb3ZpZGVySWQpIHtcbiAgICAgIGNhc2UgJ2ZhY2Vib29rLmNvbSc6XG4gICAgICAgIHJldHVybiBwaG90b1VSTCArICc/aGVpZ2h0PTQwMCc7XG4gICAgICBjYXNlICdwYXNzd29yZCc6XG4gICAgICAgIHJldHVybiAnaHR0cHM6Ly9zMy11cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9pb25pY3RoZW1lcy9vdHJvcy9hdmF0YXItcGxhY2Vob2xkZXIucG5nJztcbiAgICAgIGNhc2UgJ3R3aXR0ZXIuY29tJzpcbiAgICAgICAgcmV0dXJuIHBob3RvVVJMLnJlcGxhY2UoJ19ub3JtYWwnLCAnXzQwMHg0MDAnKTtcbiAgICAgIGNhc2UgJ2dvb2dsZS5jb20nOlxuICAgICAgICByZXR1cm4gcGhvdG9VUkwuc3BsaXQoJz0nKVswXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwaG90b1VSTDtcbiAgICB9XG4gIH1cblxuICBzaWduT3V0KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoJ2NhcGFjaXRvcicpKSB7XG4gICAgICAvL3JldHVybiBjZmFTaWduT3V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuYW5ndWxhckZpcmUuc2lnbk91dCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHNpZ25JbldpdGhFbWFpbChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxmaXJlYmFzZS5hdXRoLlVzZXJDcmVkZW50aWFsPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5ndWxhckZpcmUuc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoZW1haWwsIHBhc3N3b3JkKTtcbiAgfVxuXG4gIHNpZ25VcFdpdGhFbWFpbChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxmaXJlYmFzZS5hdXRoLlVzZXJDcmVkZW50aWFsPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5ndWxhckZpcmUuY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCk7XG4gIH1cblxuICBzb2NpYWxTaWduSW4ocHJvdmlkZXJOYW1lOiBzdHJpbmcsIHNjb3Blcz86IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgLy9yZXR1cm4gY2ZhU2lnbkluKHByb3ZpZGVyTmFtZSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZmlyZWJhc2UuYXV0aC5PQXV0aFByb3ZpZGVyKHByb3ZpZGVyTmFtZSk7XG4gICAgICAvLy8vY29uc29sZS5sb2coXCJwcm92aWRlci4gXCIsIHByb3ZpZGVyKTtcbiAgICAgIGlmIChzY29wZXMpIHtcbiAgICAgICAgc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xuICAgICAgICAgIHByb3ZpZGVyLmFkZFNjb3BlKHNjb3BlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cblxuICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoJ2Rlc2t0b3AnKSkge1xuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmFuZ3VsYXJGaXJlLnNpZ25JbldpdGhQb3B1cChwcm92aWRlcikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2ViIGJ1dCBub3QgZGVza3RvcCwgZm9yIGV4YW1wbGUgbW9iaWxlIFBXQVxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmFuZ3VsYXJGaXJlLnNpZ25JbldpdGhSZWRpcmVjdChwcm92aWRlcikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgc2lnbkluV2l0aEdvb2dsZSgpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBmaXJlYmFzZS5hdXRoLkdvb2dsZUF1dGhQcm92aWRlcigpO1xuICAgIC8vLy9jb25zb2xlLmxvZyhcInByb3ZpZGVyOiBcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IHNjb3BlcyA9IFsncHJvZmlsZScsICdlbWFpbCddO1xuICAgIHJldHVybiB0aGlzLnNvY2lhbFNpZ25Jbihwcm92aWRlci5wcm92aWRlcklkLCBzY29wZXMpO1xuICB9XG5cbiAgc2lnbkluV2l0aFR3aXR0ZXIoKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZmlyZWJhc2UuYXV0aC5Ud2l0dGVyQXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIHRoaXMuc29jaWFsU2lnbkluKHByb3ZpZGVyLnByb3ZpZGVySWQpO1xuICB9XG5cbiAgcHVibGljIGdldFByb2ZpbGVEYXRhU291cmNlKCk6IE9ic2VydmFibGU8RmlyZWJhc2VQcm9maWxlTW9kZWw+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgZGlmZmVyZW50aWF0aW9uIGJlY2F1c2UgdGhlcmUgaXMgYSBidWcgaW5cbiAgICAvLyBwbGF0Zm9ybSBjYXBhY2l0b3IgaW9zIHdoZW4gZXhlY3V0aW5nIHRoaXMuYW5ndWxhckZpcmUudXNlclxuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuc2V0VXNlck1vZGVsRm9yUHJvZmlsZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYW5ndWxhckZpcmUudXNlclxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigodXNlcjogVXNlcikgPT4gdXNlciAhPSBudWxsKSxcbiAgICAgICAgbWFwKCh1c2VyOiBVc2VyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2V0VXNlck1vZGVsRm9yUHJvZmlsZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFVzZXJNb2RlbEZvclByb2ZpbGUoKTogRmlyZWJhc2VQcm9maWxlTW9kZWwge1xuICAgIGNvbnN0IHVzZXJNb2RlbCA9IG5ldyBGaXJlYmFzZVByb2ZpbGVNb2RlbCgpO1xuICAgIGNvbnN0IHByb3ZpZXJEYXRhID0gdGhpcy5jdXJyZW50VXNlci5wcm92aWRlckRhdGFbMF07XG4gICAgY29uc3QgdXNlckRhdGEgPSB0aGlzLnVzZXJQcm92aWRlckFkZGl0aW9uYWxJbmZvID8gdGhpcy51c2VyUHJvdmlkZXJBZGRpdGlvbmFsSW5mbyA6IHByb3ZpZXJEYXRhO1xuICAgIHVzZXJNb2RlbC5pbWFnZSA9IHRoaXMuZ2V0UGhvdG9VUkwocHJvdmllckRhdGEucHJvdmlkZXJJZCwgcHJvdmllckRhdGEucGhvdG9VUkwpO1xuICAgIHVzZXJNb2RlbC5uYW1lID0gdXNlckRhdGEubmFtZSB8fCB1c2VyRGF0YS5kaXNwbGF5TmFtZSB8fCAnV2hhdFxcJ3MgeW91ciBuYW1lPyc7XG4gICAgdXNlck1vZGVsLnJvbGUgPSAnSG93IHdvdWxkIHlvdSBkZXNjcmliZSB5b3Vyc2VsZj8nO1xuICAgIHVzZXJNb2RlbC5kZXNjcmlwdGlvbiA9IHVzZXJEYXRhLmRlc2NyaXB0aW9uIHx8ICdBbnl0aGluZyBlbHNlIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHdpdGggdGhlIHdvcmxkPyc7XG4gICAgdXNlck1vZGVsLnBob25lTnVtYmVyID0gdXNlckRhdGEucGhvbmVOdW1iZXIgfHwgJ0lzIHRoZXJlIGEgbnVtYmVyIHdoZXJlIEkgY2FuIHJlYWNoIHlvdT8nO1xuICAgIHVzZXJNb2RlbC5lbWFpbCA9IHVzZXJEYXRhLmVtYWlsIHx8ICdXaGVyZSBjYW4gSSBzZW5kIHlvdSBlbWFpbHM/JztcbiAgICB1c2VyTW9kZWwucHJvdmlkZXIgPSAocHJvdmllckRhdGEucHJvdmlkZXJJZCAhPT0gJ3Bhc3N3b3JkJykgPyBwcm92aWVyRGF0YS5wcm92aWRlcklkIDogJ0NyZWRlbnRpYWxzJztcblxuICAgIHJldHVybiB1c2VyTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvZmlsZVN0b3JlKGRhdGFTb3VyY2U6IE9ic2VydmFibGU8RmlyZWJhc2VQcm9maWxlTW9kZWw+KTogRGF0YVN0b3JlPEZpcmViYXNlUHJvZmlsZU1vZGVsPiB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgbW9kZWwgc3BlY2lmeWluZyB0aGF0IGl0IGlzIGEgc2hlbGwgbW9kZWxcbiAgICBjb25zdCBzaGVsbE1vZGVsOiBGaXJlYmFzZVByb2ZpbGVNb2RlbCA9IG5ldyBGaXJlYmFzZVByb2ZpbGVNb2RlbCgpO1xuICAgIC8vdGhpcy5wcm9maWxlRGF0YVN0b3JlID0gbmV3IERhdGFTdG9yZShzaGVsbE1vZGVsKTtcbiAgICAvLyBUcmlnZ2VyIHRoZSBsb2FkaW5nIG1lY2hhbmlzbSAod2l0aCBzaGVsbCkgaW4gdGhlIGRhdGFTdG9yZVxuICAgIHRoaXMucHJvZmlsZURhdGFTdG9yZS5sb2FkKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiB0aGlzLnByb2ZpbGVEYXRhU3RvcmU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { ShellModel } from '../../../utils/data-store';
2
+ export class FirebaseProfileModel extends ShellModel {
3
+ constructor() {
4
+ super();
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2UtcHJvZmlsZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZpY2UtbGliL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2UvYXV0aC9maXJlYmFzZS1wcm9maWxlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsVUFBVTtJQVNsRDtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hlbGxNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RhdGEtc3RvcmUnO1xuXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VQcm9maWxlTW9kZWwgZXh0ZW5kcyBTaGVsbE1vZGVsIHtcbiAgaW1hZ2U6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICByb2xlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,303 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { NativeMarket } from "@capacitor-community/native-market";
3
+ import { CONFIGURACION_TOKEN } from '../configuration';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@awesome-cordova-plugins/device/ngx";
6
+ import * as i2 from "@ionic/angular";
7
+ import * as i3 from "./doole.service";
8
+ import * as i4 from "@angular/router";
9
+ import * as i5 from "@ngx-translate/core";
10
+ import * as i6 from "./language.service";
11
+ import * as i7 from "./authentication.service";
12
+ export class HealthService {
13
+ constructor(device, platform, dooleService, router, translate, languageService, constants, authService, alertController) {
14
+ this.device = device;
15
+ this.platform = platform;
16
+ this.dooleService = dooleService;
17
+ this.router = router;
18
+ this.translate = translate;
19
+ this.languageService = languageService;
20
+ this.constants = constants;
21
+ this.authService = authService;
22
+ this.alertController = alertController;
23
+ //private dataTypes = ['distance', 'steps', 'weight', 'blood_glucose', 'heart_rate' ];
24
+ this.dataTypes = ['distance', 'steps', 'weight', 'heart_rate'];
25
+ this.enableHealthConnectSettings = false;
26
+ this.isHealthConnect = true;
27
+ this.hideButtonHealthConnect = false;
28
+ if (this.platform.is('android') && !this.platform.is('mobileweb')) {
29
+ //this.setPrivacyPolicy();
30
+ this.btnDowloadHealthConnect();
31
+ // if(this.device.sdkVersion == '34'){
32
+ // this.isHealthConnect = false;
33
+ // }else{
34
+ // this.isHealthConnect = true;
35
+ // }
36
+ }
37
+ }
38
+ btnDowloadHealthConnect() {
39
+ if (this.platform.is("cordova")) {
40
+ cordova.plugins.health.isAvailable((available) => {
41
+ if (available) {
42
+ this.hideButtonHealthConnect = true;
43
+ }
44
+ }, (e) => {
45
+ //this.presentAlertConfirm(e);
46
+ console.error('[HealthService] connect(): error', e);
47
+ });
48
+ }
49
+ }
50
+ setHealthConnect() {
51
+ }
52
+ downloadHealthConnect() {
53
+ NativeMarket.openStoreListing({
54
+ appId: /* this.constants.healthconnectPackageID */ 'com.google.android.apps.healthdata'
55
+ });
56
+ /* cordova.plugins.health.getHealthConnectFromStore(
57
+ (success)=>{console.log("All good: ", success)},
58
+ (error)=>{console.log("Wrong error", error)} ); */
59
+ }
60
+ downloadGoogleFit() {
61
+ NativeMarket.openStoreListing({
62
+ appId: this.constants.googleFitPackageID
63
+ });
64
+ }
65
+ setPrivacyPolicy() {
66
+ cordova.plugins.health.setPrivacyPolicyURL(/* this.constants.privacyPolicies */ 'https://doolehealth.com/en/privacy-policy/', () => { }, () => { });
67
+ }
68
+ openHealthServices() {
69
+ cordova.plugins.health.openHealthSettings((success) => { }, (error) => { });
70
+ }
71
+ connect(comesFromSettings) {
72
+ //console.log('HealthService requestAuthorization() connect:', comesFromSettings)
73
+ if (this.platform.is("cordova")) {
74
+ cordova.plugins.health.isAvailable((available) => {
75
+ //console.log('HealthService requestAuthorization() available:', available)
76
+ if (available) {
77
+ cordova.plugins.health.isAuthorized({ read: this.dataTypes }, (authorized) => {
78
+ if (!authorized) {
79
+ cordova.plugins.health.requestAuthorization({ read: this.dataTypes }, (success) => {
80
+ //console.log('HealthService requestAuthorization() success:', success)
81
+ this.loadingData = true;
82
+ this.authService.setShowHealthConnectLocalstorage();
83
+ this.authService.setCanceledHealthConnectLocalstorage("true");
84
+ this.readDataFromApp(30);
85
+ if (comesFromSettings) {
86
+ this.router.navigate(['settings'], { replaceUrl: true });
87
+ }
88
+ else {
89
+ this.router.navigate(['home'], { replaceUrl: true });
90
+ }
91
+ this.enableHealthConnectSettings = true;
92
+ }, (error) => {
93
+ //console.log('HealthService requestAuthorization() error:', error)
94
+ this.enableHealthConnectSettings = false;
95
+ });
96
+ }
97
+ else {
98
+ this.loadingData = true;
99
+ this.authService.setShowHealthConnectLocalstorage();
100
+ this.authService.setCanceledHealthConnectLocalstorage("true");
101
+ this.readDataFromApp(30);
102
+ this.router.navigate(['home']);
103
+ this.enableHealthConnectSettings = true;
104
+ }
105
+ }, (error) => {
106
+ this.presentAlertConfirm();
107
+ //console.log(error);
108
+ });
109
+ }
110
+ else {
111
+ this.enableHealthConnectSettings = false;
112
+ this.presentAlertConfirm();
113
+ //console.log("Health plugin not available");
114
+ }
115
+ }, (e) => {
116
+ //this.presentAlertConfirm(e);
117
+ console.error('[HealthService] connect(): error', e);
118
+ this.downloadHealthConnect();
119
+ });
120
+ }
121
+ }
122
+ retrieveData() {
123
+ if (this.platform.is("cordova")) {
124
+ cordova.plugins.health.isAvailable((available) => {
125
+ if (available) {
126
+ cordova.plugins.health.isAuthorized({ read: this.dataTypes }, (authorized) => {
127
+ if (authorized) {
128
+ this.loadingData = true;
129
+ this.authService.setShowHealthConnectLocalstorage();
130
+ this.authService.setCanceledHealthConnectLocalstorage("true");
131
+ this.readDataFromApp(30);
132
+ this.enableHealthConnectSettings = true;
133
+ }
134
+ else {
135
+ this.enableHealthConnectSettings = false;
136
+ }
137
+ }, (error) => {
138
+ this.presentAlertConfirm();
139
+ //console.log(error);
140
+ });
141
+ }
142
+ }, (e) => {
143
+ //this.presentAlertConfirm(e);
144
+ console.error('[HealthService] connect(): error', e);
145
+ });
146
+ }
147
+ }
148
+ readDataFromApp(days) {
149
+ let startDate = new Date(new Date().getTime() - days * 24 * 60 * 60 * 1000);
150
+ let endDate = new Date(); // now
151
+ //console.log("Entering for reading data")
152
+ this.readData(startDate, endDate);
153
+ // this.readBloodGlucose(startDate, endDate);
154
+ // this.readSteps(startDate, endDate);
155
+ // this.readDistance(startDate, endDate);
156
+ //this.readHeartRate(startDate, endDate);
157
+ // this.readWeightData(startDate, endDate);
158
+ // setTimeout(()=> this.readBloodGlucose(startDate, endDate), 500);
159
+ // setTimeout(()=> this.readSteps(startDate, endDate), 1500);
160
+ // setTimeout(()=> this.readDistance(startDate, endDate), 1500);
161
+ // setTimeout(()=> this.readWeightData(startDate, endDate), 1500);
162
+ // setTimeout(()=> this.readHeartRate(startDate, endDate), 500);
163
+ }
164
+ async readData(startDate, endDate) {
165
+ await this.platform.ready();
166
+ //console.log("[HealthService] Entering for reading health data");
167
+ for (const element of this.dataTypes) {
168
+ const config = { startDate: startDate, endDate: endDate, dataType: element };
169
+ if (element === 'distance' || element === 'steps') {
170
+ config['bucket'] = 'hour';
171
+ try {
172
+ const data = await this.queryAggregatedHealthData(config);
173
+ //console.log(`DATA HEALTH CONNECT (${element}): `, JSON.stringify(data));
174
+ await this.postHealth(element, data);
175
+ }
176
+ catch (error) {
177
+ console.error(`Error for posting ${element} data: `, error);
178
+ }
179
+ }
180
+ else {
181
+ try {
182
+ const data = await this.queryHealthData(config);
183
+ //console.log(`DATA HEALTH CONNECT (${element}): `, JSON.stringify(data));
184
+ await this.postHealth(element, data);
185
+ }
186
+ catch (error) {
187
+ console.error(`Error for posting ${element} data: `, error);
188
+ }
189
+ }
190
+ }
191
+ }
192
+ queryAggregatedHealthData(config) {
193
+ return new Promise((resolve, reject) => {
194
+ cordova.plugins.health.queryAggregated(config, (data) => resolve(data), (error) => reject(error));
195
+ });
196
+ }
197
+ queryHealthData(config) {
198
+ return new Promise((resolve, reject) => {
199
+ cordova.plugins.health.query(config, (data) => resolve(data), (error) => reject(error));
200
+ });
201
+ }
202
+ readWeightData(startDate, endDate) {
203
+ //console.log("[HealthService] Entering for reading weight data")
204
+ //cordova.plugins.health.query({startDate: startDate, endDate: endDate , dataType: 'weight'}, (data)=> {this.postHealth('weight', data);}, ()=> {console.error()})
205
+ cordova.plugins.health.query({
206
+ startDate: startDate, endDate: endDate,
207
+ dataType: 'weight'
208
+ }, (data) => { this.postHealth('weight', data); }, (error) => { console.error("Error for posting weight data: ", error); });
209
+ }
210
+ readBloodGlucose(startDate, endDate) {
211
+ //console.log("[HealthService] Entering for reading blood_glucose data")
212
+ cordova.plugins.health.query({
213
+ startDate: startDate, endDate: endDate,
214
+ dataType: 'blood_glucose'
215
+ }, (data) => { this.postHealth('blood_glucose', data); }, (error) => { console.error("Error for posting blood_glucose data ", error); });
216
+ }
217
+ readSteps(startDate, endDate) {
218
+ //console.log("[HealthService] Entering for reading steps data")
219
+ cordova.plugins.health.queryAggregated({ startDate: startDate, endDate: endDate, dataType: 'steps', bucket: 'day' }, (data) => { this.postHealth('steps', data); }, (error) => { console.error("Error for posting steps data ", error); });
220
+ }
221
+ readDistance(startDate, endDate) {
222
+ //console.log("[HealthService] Entering for reading distance data")
223
+ cordova.plugins.health.queryAggregated({ startDate: startDate, endDate: endDate, dataType: 'distance', bucket: 'day' }, (data) => { this.postHealth('distance', data); }, (error) => { console.error("Error for posting distance data ", error); })
224
+ .then(data => {
225
+ //console.log("[HealthService] Entering for reading distance data1", data)
226
+ });
227
+ }
228
+ readHeartRate(startDate, endDate) {
229
+ //console.log("[HealthService] Entering for reading heart_rate data")
230
+ cordova.plugins.health.query({
231
+ startDate: startDate, endDate: endDate,
232
+ dataType: 'heart_rate'
233
+ }, (data) => { this.postHealth('heart_rate', data); }, () => { console.error(); });
234
+ }
235
+ //To send POST with health data to api
236
+ async postHealth(type, data) {
237
+ //console.log("[HealthService] postHealth()", type, data);
238
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
239
+ //console.log('[HealthService] syncData', timezone);
240
+ const postData = {
241
+ timezone: timezone,
242
+ type: type,
243
+ vals: JSON.stringify(data),
244
+ };
245
+ //console.log('[HealthService] postObject', postData);
246
+ if (this.authService?.deviceToken) {
247
+ postData['device_token'] = this.authService.deviceToken;
248
+ }
249
+ try {
250
+ const response = await this.dooleService.post('user/element/sync', postData).toPromise();
251
+ //console.log('[HealthService] apiRes', JSON.stringify(response));
252
+ }
253
+ catch (error) {
254
+ //console.log('[HealthService] apiErr', JSON.stringify(error));
255
+ throw error;
256
+ }
257
+ }
258
+ async presentAlertConfirm(error) {
259
+ const alert = await this.alertController.create({
260
+ cssClass: 'my-alert-class',
261
+ header: this.getErrorMessage(error),
262
+ buttons: [
263
+ {
264
+ text: this.translate.instant("alert.button_cancel"),
265
+ role: 'cancel',
266
+ cssClass: 'secondary',
267
+ handler: async (blah) => {
268
+ //console.log('Confirm Cancel: blah');
269
+ }
270
+ }, {
271
+ text: this.translate.instant("health-connect.return_home"),
272
+ handler: () => {
273
+ this.authService.setShowHealthConnectLocalstorage();
274
+ if (this.router.url.includes('landing'))
275
+ this.router.navigate(['landing']);
276
+ else
277
+ this.router.navigate(['home']);
278
+ }
279
+ }
280
+ ]
281
+ });
282
+ await alert.present();
283
+ }
284
+ getErrorMessage(e) {
285
+ if (e && e === 'Health Connect is not installed') {
286
+ return this.translate.instant("health-connect.error_msg_not_install");
287
+ }
288
+ else
289
+ return this.translate.instant("health-connect.error_msg");
290
+ }
291
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HealthService, deps: [{ token: i1.Device }, { token: i2.Platform }, { token: i3.DooleService }, { token: i4.Router }, { token: i5.TranslateService }, { token: i6.LanguageService }, { token: CONFIGURACION_TOKEN }, { token: i7.AuthenticationService }, { token: i2.AlertController }], target: i0.ɵɵFactoryTarget.Injectable }); }
292
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HealthService, providedIn: 'root' }); }
293
+ }
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HealthService, decorators: [{
295
+ type: Injectable,
296
+ args: [{
297
+ providedIn: 'root'
298
+ }]
299
+ }], ctorParameters: () => [{ type: i1.Device }, { type: i2.Platform }, { type: i3.DooleService }, { type: i4.Router }, { type: i5.TranslateService }, { type: i6.LanguageService }, { type: undefined, decorators: [{
300
+ type: Inject,
301
+ args: [CONFIGURACION_TOKEN]
302
+ }] }, { type: i7.AuthenticationService }, { type: i2.AlertController }] });
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlLWxpYi9zcmMvbGliL3NlcnZpY2VzL2hlYWx0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7OztBQWF0RSxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUFvQixNQUFjLEVBQVMsUUFBa0IsRUFBVSxZQUEwQixFQUFTLE1BQWMsRUFBVSxTQUEyQixFQUFTLGVBQWdDLEVBQXVDLFNBQXdCLEVBQVMsV0FBa0MsRUFBVSxlQUFnQztRQUF0VSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQXVDLGNBQVMsR0FBVCxTQUFTLENBQWU7UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFQMVYsdUZBQXVGO1FBQy9FLGNBQVMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUcsUUFBUSxFQUFFLFlBQVksQ0FBRSxDQUFDO1FBQ3BFLGdDQUEyQixHQUFZLEtBQUssQ0FBQztRQUU3QyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFJOUIsSUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUks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a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFTME0sTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJy4vbGFuZ3VhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmF0aXZlTWFya2V0IH0gZnJvbSBcIkBjYXBhY2l0b3ItY29tbXVuaXR5L25hdGl2ZS1tYXJrZXRcIjtcbmltcG9ydCB7IENPTkZJR1VSQUNJT05fVE9LRU4sIENvbmZpZ3VyYWNpb24gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBEb29sZVNlcnZpY2UgfSBmcm9tICcuL2Rvb2xlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IERldmljZSB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kZXZpY2Uvbmd4JztcblxuXG5kZWNsYXJlIGxldCBjb3Jkb3ZhOiBhbnk7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBIZWFsdGhTZXJ2aWNlIHtcbiAgLy9wcml2YXRlIGRhdGFUeXBlcyA9IFsnZGlzdGFuY2UnLCAnc3RlcHMnLCAgJ3dlaWdodCcsICdibG9vZF9nbHVjb3NlJywgJ2hlYXJ0X3JhdGUnIF07XG4gIHByaXZhdGUgZGF0YVR5cGVzID0gWydkaXN0YW5jZScsICdzdGVwcycsICAnd2VpZ2h0JywgJ2hlYXJ0X3JhdGUnIF07XG4gIGVuYWJsZUhlYWx0aENvbm5lY3RTZXR0aW5nczogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2FkaW5nRGF0YTogYm9vbGVhbjtcbiAgaXNIZWFsdGhDb25uZWN0OiBib29sZWFuID0gdHJ1ZTtcbiAgaGlkZUJ1dHRvbkhlYWx0aENvbm5lY3QgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRldmljZTogRGV2aWNlLCBwdWJsaWMgcGxhdGZvcm06IFBsYXRmb3JtLCBwcml2YXRlIGRvb2xlU2VydmljZTogRG9vbGVTZXJ2aWNlLCBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBwdWJsaWMgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsIEBJbmplY3QoQ09ORklHVVJBQ0lPTl9UT0tFTikgcHJpdmF0ZSBjb25zdGFudHM6IENvbmZpZ3VyYWNpb24sIHB1YmxpYyBhdXRoU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLCBwcml2YXRlIGFsZXJ0Q29udHJvbGxlcjogQWxlcnRDb250cm9sbGVyKSB7IFxuICAgIFxuICAgIGlmKHRoaXMucGxhdGZvcm0uaXMoJ2FuZHJvaWQnKSAmJiAhdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxld2ViJykpe1xuICAgICAgLy90aGlzLnNldFByaXZhY3lQb2xpY3koKTtcbiAgICAgIHRoaXMuYnRuRG93bG9hZEhlYWx0aENvbm5lY3QoKTtcbiAgICAgIFxuXG4gICAgICAvLyBpZih0aGlzLmRldmljZS5zZGtWZXJzaW9uID09ICczNCcpe1xuICAgICAgLy8gICB0aGlzLmlzSGVhbHRoQ29ubmVjdCA9IGZhbHNlO1xuICAgICAgLy8gfWVsc2V7XG4gICAgICAvLyAgIHRoaXMuaXNIZWFsdGhDb25uZWN0ID0gdHJ1ZTtcbiAgICAgIC8vIH1cbiAgICAgIFxuICAgIH1cblxuICB9XG5cbiAgYnRuRG93bG9hZEhlYWx0aENvbm5lY3QoKXtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pcyhcImNvcmRvdmFcIikpIHtcbiAgICAgIGNvcmRvdmEucGx1Z2lucy5oZWFsdGguaXNBdmFpbGFibGUoKGF2YWlsYWJsZSkgPT4ge1xuICAgICAgICBpZiAoYXZhaWxhYmxlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlQnV0dG9uSGVhbHRoQ29ubmVjdD0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICB9LCAoZSkgPT4ge1xuICAgICAgICAvL3RoaXMucHJlc2VudEFsZXJ0Q29uZmlybShlKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0hlYWx0aFNlcnZpY2VdIGNvbm5lY3QoKTogZXJyb3InLCBlKVxuICAgICAgfSk7XG4gICAgIH1cbiAgfVxuICBzZXRIZWFsdGhDb25uZWN0KCl7XG4gICAgXG4gIH1cblxuICBkb3dubG9hZEhlYWx0aENvbm5lY3QoKSB7XG4gICAgTmF0aXZlTWFya2V0Lm9wZW5TdG9yZUxpc3Rpbmcoe1xuICAgICAgYXBwSWQ6IC8qIHRoaXMuY29uc3RhbnRzLmhlYWx0aGNvbm5lY3RQYWNrYWdlSUQgKi8gJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmhlYWx0aGRhdGEnXG4gICAgfSk7XG4gICAgLyogY29yZG92YS5wbHVnaW5zLmhlYWx0aC5nZXRIZWFsdGhDb25uZWN0RnJvbVN0b3JlKFxuICAgICAgKHN1Y2Nlc3MpPT57Y29uc29sZS5sb2coXCJBbGwgZ29vZDogXCIsIHN1Y2Nlc3MpfSxcbiAgICAgIChlcnJvcik9Pntjb25zb2xlLmxvZyhcIldyb25nIGVycm9yXCIsIGVycm9yKX0gKTsgKi9cbiAgfVxuXG4gIGRvd25sb2FkR29vZ2xlRml0KCkge1xuICAgIE5hdGl2ZU1hcmtldC5vcGVuU3RvcmVMaXN0aW5nKHtcbiAgICAgIGFwcElkOiB0aGlzLmNvbnN0YW50cy5nb29nbGVGaXRQYWNrYWdlSURcbiAgICB9KTtcbiAgfVxuXG4gIHNldFByaXZhY3lQb2xpY3koKSB7XG4gICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5zZXRQcml2YWN5UG9saWN5VVJMKC8qIHRoaXMuY29uc3RhbnRzLnByaXZhY3lQb2xpY2llcyAqLyAnaHR0cHM6Ly9kb29sZWhlYWx0aC5jb20vZW4vcHJpdmFjeS1wb2xpY3kvJywgKCk9PnsvKmNvbnNvbGUubG9nKFwic3VjY2VzZnVseSBzaG93blwiKSovfSwgICgpPT57Lypjb25zb2xlLmxvZyhcIm5vdCBkaXNwbGF5c1wiKSovfSlcbiAgfVxuXG4gIG9wZW5IZWFsdGhTZXJ2aWNlcygpIHtcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLm9wZW5IZWFsdGhTZXR0aW5ncyhcbiAgICAgIChzdWNjZXNzKT0+ey8qY29uc29sZS5sb2coJ1tIZWFsdGhTZXJ2aWNlXSBvcGVuSGVhbHRoU2V0dGluZ3MoKSBzdWNjZXNzOiAnLCBzdWNjZXNzKSovfSwgIFxuICAgICAgKGVycm9yKT0+ey8qY29uc29sZS5sb2coJ1tIZWFsdGhTZXJ2aWNlXSBvcGVuSGVhbHRoU2V0dGluZ3MoKSBlcnJvcjogJywgZXJyb3IpKi99XG4gICAgKVxuICB9XG5cbiAgcHVibGljIGNvbm5lY3QoY29tZXNGcm9tU2V0dGluZ3M/OiBib29sZWFuKSB7XG4gICAgLy9jb25zb2xlLmxvZygnSGVhbHRoU2VydmljZSByZXF1ZXN0QXV0aG9yaXphdGlvbigpIGNvbm5lY3Q6JywgY29tZXNGcm9tU2V0dGluZ3MpXG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoXCJjb3Jkb3ZhXCIpKSB7XG4gICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLmlzQXZhaWxhYmxlKChhdmFpbGFibGUpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnSGVhbHRoU2VydmljZSByZXF1ZXN0QXV0aG9yaXphdGlvbigpIGF2YWlsYWJsZTonLCBhdmFpbGFibGUpXG4gICAgICAgIGlmIChhdmFpbGFibGUpIHtcblxuICAgICAgICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLmlzQXV0aG9yaXplZCh7IHJlYWQgOiB0aGlzLmRhdGFUeXBlcyB9LCAoYXV0aG9yaXplZCkgPT4ge1xuICAgICAgICAgICAgIGlmICghYXV0aG9yaXplZCkge1xuXG5cbiAgICAgICAgICAgICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5yZXF1ZXN0QXV0aG9yaXphdGlvbiggeyByZWFkIDogdGhpcy5kYXRhVHlwZXN9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWNjZXNzKT0+e1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdIZWFsdGhTZXJ2aWNlIHJlcXVlc3RBdXRob3JpemF0aW9uKCkgc3VjY2VzczonLCBzdWNjZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldFNob3dIZWFsdGhDb25uZWN0TG9jYWxzdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldENhbmNlbGVkSGVhbHRoQ29ubmVjdExvY2Fsc3RvcmFnZShcInRydWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWREYXRhRnJvbUFwcCgzMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tZXNGcm9tU2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzZXR0aW5ncyddLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydob21lJ10sIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSGVhbHRoU2VydmljZSByZXF1ZXN0QXV0aG9yaXphdGlvbigpIGVycm9yOicsIGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUhlYWx0aENvbm5lY3RTZXR0aW5ncyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0U2hvd0hlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRDYW5jZWxlZEhlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICB0aGlzLnJlYWREYXRhRnJvbUFwcCgzMCk7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaG9tZSddKTtcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSB0cnVlXG4gICAgICAgICAgIH1cbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJlc2VudEFsZXJ0Q29uZmlybSgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnByZXNlbnRBbGVydENvbmZpcm0oKTtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiSGVhbHRoIHBsdWdpbiBub3QgYXZhaWxhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICB9LCAoZSkgPT4ge1xuICAgICAgICAvL3RoaXMucHJlc2VudEFsZXJ0Q29uZmlybShlKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0hlYWx0aFNlcnZpY2VdIGNvbm5lY3QoKTogZXJyb3InLCBlKVxuICAgICAgIHRoaXMuZG93bmxvYWRIZWFsdGhDb25uZWN0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXRyaWV2ZURhdGEoKSB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoXCJjb3Jkb3ZhXCIpKSB7XG4gICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLmlzQXZhaWxhYmxlKChhdmFpbGFibGUpID0+IHtcbiAgICAgICAgaWYgKGF2YWlsYWJsZSkge1xuXG4gICAgICAgICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5pc0F1dGhvcml6ZWQoeyByZWFkIDogdGhpcy5kYXRhVHlwZXN9LCAoYXV0aG9yaXplZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0U2hvd0hlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRDYW5jZWxlZEhlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICB0aGlzLnJlYWREYXRhRnJvbUFwcCgzMCk7XG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlSGVhbHRoQ29ubmVjdFNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJlc2VudEFsZXJ0Q29uZmlybSgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgIC8vdGhpcy5wcmVzZW50QWxlcnRDb25maXJtKGUpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbSGVhbHRoU2VydmljZV0gY29ubmVjdCgpOiBlcnJvcicsIGUpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWFkRGF0YUZyb21BcHAoZGF5cykge1xuICAgIGxldCBzdGFydERhdGUgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBsZXQgZW5kRGF0ZSA9IG5ldyBEYXRlKCk7IC8vIG5vd1xuXG4gICAgLy9jb25zb2xlLmxvZyhcIkVudGVyaW5nIGZvciByZWFkaW5nIGRhdGFcIilcbiAgICAgdGhpcy5yZWFkRGF0YShzdGFydERhdGUsIGVuZERhdGUpOyBcbiAgICAvLyB0aGlzLnJlYWRCbG9vZEdsdWNvc2Uoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICAvLyAgdGhpcy5yZWFkU3RlcHMoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICAvLyAgdGhpcy5yZWFkRGlzdGFuY2Uoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICAvL3RoaXMucmVhZEhlYXJ0UmF0ZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIC8vIHRoaXMucmVhZFdlaWdodERhdGEoc3RhcnREYXRlLCBlbmREYXRlKTtcblxuXG4gICAgLy8gc2V0VGltZW91dCgoKT0+IHRoaXMucmVhZEJsb29kR2x1Y29zZShzdGFydERhdGUsIGVuZERhdGUpLCA1MDApOyBcbiAgICAvLyBzZXRUaW1lb3V0KCgpPT4gdGhpcy5yZWFkU3RlcHMoc3RhcnREYXRlLCBlbmREYXRlKSwgMTUwMCk7IFxuICAgIC8vIHNldFRpbWVvdXQoKCk9PiB0aGlzLnJlYWREaXN0YW5jZShzdGFydERhdGUsIGVuZERhdGUpLCAxNTAwKTsgXG4gICAgLy8gc2V0VGltZW91dCgoKT0+IHRoaXMucmVhZFdlaWdodERhdGEoc3RhcnREYXRlLCBlbmREYXRlKSwgMTUwMCk7IFxuICAgIC8vIHNldFRpbWVvdXQoKCk9PiB0aGlzLnJlYWRIZWFydFJhdGUoc3RhcnREYXRlLCBlbmREYXRlKSwgNTAwKTsgXG4gIH1cblxuICBhc3luYyByZWFkRGF0YShzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpIHtcbiAgICBhd2FpdCB0aGlzLnBsYXRmb3JtLnJlYWR5KCk7XG5cbiAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIEVudGVyaW5nIGZvciByZWFkaW5nIGhlYWx0aCBkYXRhXCIpO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZGF0YVR5cGVzKSB7XG4gICAgICBjb25zdCBjb25maWc6IGFueSA9IHsgc3RhcnREYXRlOiBzdGFydERhdGUsIGVuZERhdGU6IGVuZERhdGUsIGRhdGFUeXBlOiBlbGVtZW50IH07XG5cbiAgICAgIGlmIChlbGVtZW50ID09PSAnZGlzdGFuY2UnIHx8IGVsZW1lbnQgPT09ICdzdGVwcycpIHtcbiAgICAgICAgY29uZmlnWydidWNrZXQnXSA9ICdob3VyJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5xdWVyeUFnZ3JlZ2F0ZWRIZWFsdGhEYXRhKGNvbmZpZyk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhgREFUQSBIRUFMVEggQ09OTkVDVCAoJHtlbGVtZW50fSk6IGAsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBvc3RIZWFsdGgoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZm9yIHBvc3RpbmcgJHtlbGVtZW50fSBkYXRhOiBgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucXVlcnlIZWFsdGhEYXRhKGNvbmZpZyk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhgREFUQSBIRUFMVEggQ09OTkVDVCAoJHtlbGVtZW50fSk6IGAsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBvc3RIZWFsdGgoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZm9yIHBvc3RpbmcgJHtlbGVtZW50fSBkYXRhOiBgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWVyeUFnZ3JlZ2F0ZWRIZWFsdGhEYXRhKGNvbmZpZzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5xdWVyeUFnZ3JlZ2F0ZWQoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgKGRhdGE6IGFueSkgPT4gcmVzb2x2ZShkYXRhKSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHJlamVjdChlcnJvcilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBxdWVyeUhlYWx0aERhdGEoY29uZmlnOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5KFxuICAgICAgICBjb25maWcsXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHJlc29sdmUoZGF0YSksXG4gICAgICAgIChlcnJvcjogYW55KSA9PiByZWplY3QoZXJyb3IpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFdlaWdodERhdGEoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIltIZWFsdGhTZXJ2aWNlXSBFbnRlcmluZyBmb3IgcmVhZGluZyB3ZWlnaHQgZGF0YVwiKVxuICAgIC8vY29yZG92YS5wbHVnaW5zLmhlYWx0aC5xdWVyeSh7c3RhcnREYXRlOiBzdGFydERhdGUsICBlbmREYXRlOiBlbmREYXRlICwgIGRhdGFUeXBlOiAnd2VpZ2h0J30sIChkYXRhKT0+IHt0aGlzLnBvc3RIZWFsdGgoJ3dlaWdodCcsIGRhdGEpO30sICgpPT4ge2NvbnNvbGUuZXJyb3IoKX0pXG4gICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5xdWVyeSh7XG4gICAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSwgIGVuZERhdGU6IGVuZERhdGUsXG4gICAgICBkYXRhVHlwZTogJ3dlaWdodCd9LCBcbiAgICAgIChkYXRhOiBhbnkpPT4ge3RoaXMucG9zdEhlYWx0aCgnd2VpZ2h0JywgZGF0YSl9LCBcbiAgICAgIChlcnJvcik9PiB7Y29uc29sZS5lcnJvcihcIkVycm9yIGZvciBwb3N0aW5nIHdlaWdodCBkYXRhOiBcIiwgZXJyb3IpfVxuICAgIClcbiAgfVxuXG4gIHJlYWRCbG9vZEdsdWNvc2Uoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIltIZWFsdGhTZXJ2aWNlXSBFbnRlcmluZyBmb3IgcmVhZGluZyBibG9vZF9nbHVjb3NlIGRhdGFcIilcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5KHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlLCBcbiAgICAgIGRhdGFUeXBlOiAnYmxvb2RfZ2x1Y29zZSd9LCBcbiAgICAgIChkYXRhKT0+IHt0aGlzLnBvc3RIZWFsdGgoJ2Jsb29kX2dsdWNvc2UnLCBkYXRhKX0sIFxuICAgICAgKGVycm9yKT0+IHtjb25zb2xlLmVycm9yKFwiRXJyb3IgZm9yIHBvc3RpbmcgYmxvb2RfZ2x1Y29zZSBkYXRhIFwiLCBlcnJvcil9KVxuICB9XG5cbiAgcmVhZFN0ZXBzKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSkge1xuICAgIC8vY29uc29sZS5sb2coXCJbSGVhbHRoU2VydmljZV0gRW50ZXJpbmcgZm9yIHJlYWRpbmcgc3RlcHMgZGF0YVwiKVxuICAgIGNvcmRvdmEucGx1Z2lucy5oZWFsdGgucXVlcnlBZ2dyZWdhdGVkKFxuICAgICAge3N0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlLCBkYXRhVHlwZTogJ3N0ZXBzJywgYnVja2V0OiAnZGF5J30sIFxuICAgICAgKGRhdGEpPT4ge3RoaXMucG9zdEhlYWx0aCgnc3RlcHMnLCBkYXRhKX0sIFxuICAgICAgKGVycm9yKT0+IHtjb25zb2xlLmVycm9yKFwiRXJyb3IgZm9yIHBvc3Rpbmcgc3RlcHMgZGF0YSBcIiwgZXJyb3IpfSlcbiAgfVxuXG4gIHJlYWREaXN0YW5jZShzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIEVudGVyaW5nIGZvciByZWFkaW5nIGRpc3RhbmNlIGRhdGFcIilcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5QWdncmVnYXRlZChcbiAgICAgIHtzdGFydERhdGU6IHN0YXJ0RGF0ZSwgZW5kRGF0ZTogZW5kRGF0ZSwgZGF0YVR5cGU6ICdkaXN0YW5jZScsIGJ1Y2tldDogJ2RheSd9LCBcbiAgICAgIChkYXRhKT0+IHsgdGhpcy5wb3N0SGVhbHRoKCdkaXN0YW5jZScsIGRhdGEpfSwgXG4gICAgICAoZXJyb3IpPT4ge2NvbnNvbGUuZXJyb3IoXCJFcnJvciBmb3IgcG9zdGluZyBkaXN0YW5jZSBkYXRhIFwiLCBlcnJvcil9KVxuICAgICAgLnRoZW4oIGRhdGEgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIEVudGVyaW5nIGZvciByZWFkaW5nIGRpc3RhbmNlIGRhdGExXCIsIGRhdGEpXG4gICAgICB9KTtcbiAgfVxuXG4gIHJlYWRIZWFydFJhdGUoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIltIZWFsdGhTZXJ2aWNlXSBFbnRlcmluZyBmb3IgcmVhZGluZyBoZWFydF9yYXRlIGRhdGFcIilcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5KHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlLFxuICAgICAgZGF0YVR5cGU6ICdoZWFydF9yYXRlJ30sIFxuICAgICAgKGRhdGEpPT4ge3RoaXMucG9zdEhlYWx0aCgnaGVhcnRfcmF0ZScsIGRhdGEpfSwgKCk9PiB7Y29uc29sZS5lcnJvcigpfSlcbiAgfVxuXG4gIC8vVG8gc2VuZCBQT1NUIHdpdGggaGVhbHRoIGRhdGEgdG8gYXBpXG4gIGFzeW5jIHBvc3RIZWFsdGgodHlwZTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIHBvc3RIZWFsdGgoKVwiLCB0eXBlLCBkYXRhKTtcbiAgICBjb25zdCB0aW1lem9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgICAvL2NvbnNvbGUubG9nKCdbSGVhbHRoU2VydmljZV0gc3luY0RhdGEnLCB0aW1lem9uZSk7XG4gICAgY29uc3QgcG9zdERhdGE6IGFueSA9IHtcbiAgICAgIHRpbWV6b25lOiB0aW1lem9uZSxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICB2YWxzOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9O1xuICAgIC8vY29uc29sZS5sb2coJ1tIZWFsdGhTZXJ2aWNlXSBwb3N0T2JqZWN0JywgcG9zdERhdGEpO1xuICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlPy5kZXZpY2VUb2tlbikge1xuICAgICAgcG9zdERhdGFbJ2RldmljZV90b2tlbiddID0gdGhpcy5hdXRoU2VydmljZS5kZXZpY2VUb2tlbjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kb29sZVNlcnZpY2UucG9zdCgndXNlci9lbGVtZW50L3N5bmMnLCBwb3N0RGF0YSkudG9Qcm9taXNlKCk7XG4gICAgICAvL2NvbnNvbGUubG9nKCdbSGVhbHRoU2VydmljZV0gYXBpUmVzJywgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy9jb25zb2xlLmxvZygnW0hlYWx0aFNlcnZpY2VdIGFwaUVycicsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcmVzZW50QWxlcnRDb25maXJtKGVycm9yPykge1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNzc0NsYXNzOiAnbXktYWxlcnQtY2xhc3MnLFxuICAgICAgaGVhZGVyOiB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiYWxlcnQuYnV0dG9uX2NhbmNlbFwiKSxcbiAgICAgICAgICByb2xlOiAnY2FuY2VsJyxcbiAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKGJsYWgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0NvbmZpcm0gQ2FuY2VsOiBibGFoJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImhlYWx0aC1jb25uZWN0LnJldHVybl9ob21lXCIpLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0U2hvd0hlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoKVxuICAgICAgICAgICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnbGFuZGluZycpKSBcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsYW5kaW5nJ10pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2hvbWUnXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICB9XG5cbiAgZ2V0RXJyb3JNZXNzYWdlKGU/KTpzdHJpbmd7XG4gICAgaWYoZSAmJiBlID09PSAnSGVhbHRoIENvbm5lY3QgaXMgbm90IGluc3RhbGxlZCcpe1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJoZWFsdGgtY29ubmVjdC5lcnJvcl9tc2dfbm90X2luc3RhbGxcIilcbiAgICB9ZWxzZVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJoZWFsdGgtY29ubmVjdC5lcnJvcl9tc2dcIilcbiAgfVxufVxuIl19