@careevolution/mydatahelps-js 3.2.2 → 3.3.0

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.
package/MyDataHelps.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as Model from "./types";
2
2
  export declare class MyDataHelps {
3
3
  baseUrl: string;
4
+ language: string;
4
5
  token: Model.Token;
5
6
  tokenExpires: number;
6
7
  startSurvey(surveyName: string): void;
@@ -30,17 +31,22 @@ export declare class MyDataHelps {
30
31
  queryDeviceData(queryParameters: Model.DeviceDataPointQuery): Promise<Model.DeviceDataPointsPage>;
31
32
  persistDeviceData(deviceDataPoints: Model.PersistableDeviceDataPoint[]): Promise<void>;
32
33
  getExternalAccountProviders(search: string | null, category: string | null, pageSize: number, pageNumber: number): Promise<Model.ExternalAccountProvidersPage>;
33
- connectExternalAccount(externalAccountProviderID: number): void;
34
+ connectExternalAccount(externalAccountProviderID: number, standaloneModeFinalRedirectPath?: string): void;
34
35
  getExternalAccounts(): Promise<Model.ExternalAccount[]>;
35
36
  refreshExternalAccount(accountID: number): Promise<void>;
36
37
  deleteExternalAccount(accountID: number): Promise<any>;
37
38
  queryNotifications(queryParameters: Model.NotificationQueryParameters): Promise<Model.NotificationsPage>;
38
39
  queryFitbitDailySummaries(queryParameters: Model.FitbitQuery): Promise<Model.FitbitDailySummariesPage>;
39
40
  queryFitbitSleepLogs(queryParameters: Model.FitbitQuery): Promise<Model.FitbitSleepLogsPage>;
41
+ queryAppleHealthActivitySummaries(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthActivitySummaryPage>;
42
+ queryAppleHealthWorkouts(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthWorkoutPage>;
40
43
  connect(): Promise<void>;
41
44
  setParticipantAccessToken(token: Model.Token, baseUrl: string): void;
45
+ isStandaloneMode(): boolean;
46
+ enableStandaloneMode(): void;
42
47
  setStatusBarStyle(style: Model.StatusBarStyle): void;
43
48
  getDeviceInfo(): Promise<Model.DeviceInfo>;
49
+ setCurrentLanguage(language: string): void;
44
50
  getCurrentLanguage(): string;
45
51
  showGoogleFitSettings(): void;
46
52
  requestReview(cooldownDays?: number): void;
@@ -48,7 +54,7 @@ export declare class MyDataHelps {
48
54
  getDataCollectionSettings(): Promise<Model.DataCollectionSettings>;
49
55
  invokeCustomApi(customApi: string, method: string, queryParameters: string, jsonResponse: boolean): Promise<any>;
50
56
  constructor();
51
- private readonly allowedApplicationHosts;
57
+ private readonly acceptableParentDomains;
52
58
  private readonly accessTokenRenewalBufferSeconds;
53
59
  private readonly apiBasePath;
54
60
  private readonly unsupportedActions;
@@ -57,6 +63,7 @@ export declare class MyDataHelps {
57
63
  private messageHandlers;
58
64
  private registeredEventHandlers;
59
65
  private refreshTokenPromise;
66
+ private standaloneMode;
60
67
  private nextMessageID;
61
68
  private getBaseUrl;
62
69
  private makeUrl;
package/MyDataHelps.js CHANGED
@@ -1,6 +1,6 @@
1
1
  class MyDataHelps {
2
2
  constructor() {
3
- this.allowedApplicationHosts = [
3
+ this.acceptableParentDomains = [
4
4
  'localhost',
5
5
  'careevolution.com',
6
6
  'internal',
@@ -8,7 +8,8 @@ class MyDataHelps {
8
8
  'mydatahelps.org',
9
9
  'platform.joinallofus.org',
10
10
  'careevolution.dev',
11
- 'ce.dev'
11
+ 'ce.dev',
12
+ 'mydatahelps.dev'
12
13
  ];
13
14
  this.accessTokenRenewalBufferSeconds = 120;
14
15
  this.apiBasePath = 'api/v1/delegated/';
@@ -18,6 +19,7 @@ class MyDataHelps {
18
19
  this.messageHandlers = [];
19
20
  this.registeredEventHandlers = {};
20
21
  this.refreshTokenPromise = null;
22
+ this.standaloneMode = false;
21
23
  let mdh = this;
22
24
  let applicationHost = getParentOrigin();
23
25
  let supportedActions;
@@ -32,8 +34,8 @@ class MyDataHelps {
32
34
  if (origin === '*')
33
35
  return true;
34
36
  let sourceURL = new URL(origin);
35
- for (let k = 0; k < mdh.allowedApplicationHosts.length; k++) {
36
- if (sourceURL.hostname === mdh.allowedApplicationHosts[k] || sourceURL.hostname.endsWith("." + mdh.allowedApplicationHosts[k])) {
37
+ for (let k = 0; k < mdh.acceptableParentDomains.length; k++) {
38
+ if (sourceURL.hostname === mdh.acceptableParentDomains[k] || sourceURL.hostname.endsWith("." + mdh.acceptableParentDomains[k])) {
37
39
  return true;
38
40
  }
39
41
  }
@@ -45,6 +47,11 @@ class MyDataHelps {
45
47
  }
46
48
  return message.origin === applicationHost;
47
49
  }
50
+ function addActions(actions) {
51
+ for (let action in actions) {
52
+ window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: actions[action] };
53
+ }
54
+ }
48
55
  function receiveWindowMessage(message) {
49
56
  if (!validateWindowMessageOrigin(message)) {
50
57
  console.error("message.origin '" + message.origin + "' is not allowed.");
@@ -57,9 +64,21 @@ class MyDataHelps {
57
64
  mdh.triggerEvent(message.data);
58
65
  }
59
66
  }
67
+ function windowHasAnyActions() {
68
+ for (let action in supportedActions) {
69
+ if (window.webkit.messageHandlers[action]) {
70
+ return true;
71
+ }
72
+ }
73
+ for (let action in mdh.unsupportedActions) {
74
+ if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {
75
+ return true;
76
+ }
77
+ }
78
+ return false;
79
+ }
60
80
  if (!acceptableOrigin(applicationHost)) {
61
- console.error("Application is not hosted at an approved origin.");
62
- throw "Application is not hosted at an approved origin.";
81
+ console.log("Detected unsupported parent origin domain.");
63
82
  }
64
83
  if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {
65
84
  supportedActions = {
@@ -68,9 +87,6 @@ class MyDataHelps {
68
87
  name: 'GetDelegatedAccessToken',
69
88
  messageID: data.messageID
70
89
  }, applicationHost);
71
- },
72
- "GetDeviceInfo": function (data) {
73
- window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);
74
90
  }
75
91
  };
76
92
  }
@@ -161,36 +177,23 @@ class MyDataHelps {
161
177
  }
162
178
  };
163
179
  }
164
- function windowHasAnyActions() {
165
- for (let action in supportedActions) {
166
- if (window.webkit.messageHandlers[action]) {
167
- return true;
168
- }
169
- }
170
- for (let action in mdh.unsupportedActions) {
171
- if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {
172
- return true;
173
- }
174
- }
175
- return false;
176
- }
177
180
  if (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {
178
181
  window.webkit = {
179
182
  messageHandlers: {}
180
183
  };
181
184
  }
182
- for (let action in supportedActions) {
183
- window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: supportedActions[action] };
184
- }
185
+ addActions(supportedActions);
185
186
  window.addEventListener("message", receiveWindowMessage, false);
186
187
  }
187
188
  // Surveys
188
189
  startSurvey(surveyName) {
189
- let messageID = this.nextMessageID();
190
- window.webkit.messageHandlers.StartParticipantSurvey.postMessage({
191
- messageID: messageID,
192
- surveyName: surveyName
193
- });
190
+ if (window.webkit.messageHandlers.StartParticipantSurvey) {
191
+ let messageID = this.nextMessageID();
192
+ window.webkit.messageHandlers.StartParticipantSurvey.postMessage({
193
+ messageID: messageID,
194
+ surveyName: surveyName
195
+ });
196
+ }
194
197
  }
195
198
  completeStep(answer) {
196
199
  if (answer === undefined || answer === null)
@@ -288,50 +291,68 @@ class MyDataHelps {
288
291
  }
289
292
  // Navigation
290
293
  openExternalUrl(url) {
291
- window.webkit.messageHandlers.OpenExternalLink.postMessage(url);
294
+ if (window.webkit.messageHandlers.OpenExternalLink) {
295
+ window.webkit.messageHandlers.OpenExternalLink.postMessage(url);
296
+ }
292
297
  }
293
298
  openEmbeddedUrl(url) {
294
- window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);
299
+ if (window.webkit.messageHandlers.OpenEmbeddedLink) {
300
+ window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);
301
+ }
295
302
  }
296
303
  showTab(tabKey) {
297
- window.webkit.messageHandlers.ShowTab.postMessage(tabKey);
304
+ if (window.webkit.messageHandlers.ShowTab) {
305
+ window.webkit.messageHandlers.ShowTab.postMessage(tabKey);
306
+ }
298
307
  }
299
308
  openApplication(url, options) {
300
- let messageID = this.nextMessageID();
301
- window.webkit.messageHandlers.OpenExternalApplication.postMessage({
302
- messageID: messageID,
303
- url: url,
304
- modal: !!(options && options.modal)
305
- });
309
+ if (window.webkit.messageHandlers.OpenExternalApplication) {
310
+ let messageID = this.nextMessageID();
311
+ window.webkit.messageHandlers.OpenExternalApplication.postMessage({
312
+ messageID: messageID,
313
+ url: url,
314
+ modal: !!(options && options.modal)
315
+ });
316
+ }
306
317
  }
307
318
  dismiss() {
308
- window.webkit.messageHandlers.Dismiss.postMessage({});
319
+ if (window.webkit.messageHandlers.Dismiss) {
320
+ window.webkit.messageHandlers.Dismiss.postMessage({});
321
+ }
309
322
  }
310
323
  back() {
311
- window.webkit.messageHandlers.PopNavigation.postMessage({});
324
+ if (window.webkit.messageHandlers.PopNavigation) {
325
+ window.webkit.messageHandlers.PopNavigation.postMessage({});
326
+ }
312
327
  }
313
328
  showDashboard(dashboardKey, options) {
314
- window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({
315
- dashboardKey: dashboardKey,
316
- modal: !!(options && options.modal),
317
- title: options && options.title ? options.title : undefined
318
- });
329
+ if (window.webkit.messageHandlers.ShowParticipantDashboard) {
330
+ window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({
331
+ dashboardKey: dashboardKey,
332
+ modal: !!(options && options.modal),
333
+ title: options && options.title ? options.title : undefined
334
+ });
335
+ }
319
336
  }
320
337
  showWebVisualization(visualizationKey, parameters, options) {
321
- window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({
322
- visualizationKey: visualizationKey,
323
- parameters: parameters,
324
- modal: !!(options && options.modal),
325
- title: options && options.title ? options.title : undefined
326
- });
338
+ if (window.webkit.messageHandlers.ShowParticipantWebVisualization) {
339
+ window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({
340
+ visualizationKey: visualizationKey,
341
+ parameters: parameters,
342
+ modal: !!(options && options.modal),
343
+ title: options && options.title ? options.title : undefined
344
+ });
345
+ }
327
346
  }
328
347
  showWebVisualizationPdf(visualizationKey, parameters, options) {
329
- window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({
330
- visualizationKey: visualizationKey,
331
- parameters: parameters,
332
- landscape: !!(options && options.landscape),
333
- htmlViewerZoom: options && options.htmlViewerZoom
334
- });
348
+ if (window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF) {
349
+ window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({
350
+ visualizationKey: visualizationKey,
351
+ parameters: parameters,
352
+ landscape: !!(options && options.landscape),
353
+ htmlViewerZoom: options && options.htmlViewerZoom
354
+ });
355
+ }
335
356
  }
336
357
  showProject(projectCode) {
337
358
  if (window.webkit.messageHandlers.ShowProject) {
@@ -474,8 +495,29 @@ class MyDataHelps {
474
495
  return response.json();
475
496
  });
476
497
  }
477
- connectExternalAccount(externalAccountProviderID) {
478
- if (window.webkit.messageHandlers.ConnectExternalAccount) {
498
+ connectExternalAccount(externalAccountProviderID, standaloneModeFinalRedirectPath) {
499
+ if (this.standaloneMode) {
500
+ standaloneModeFinalRedirectPath = standaloneModeFinalRedirectPath || window.location.href;
501
+ const searchParameters = { finalRedirectPath: standaloneModeFinalRedirectPath };
502
+ const queryString = new URLSearchParams(searchParameters).toString();
503
+ const endpoint = "externalaccountproviders/" + externalAccountProviderID + "/connect?" + queryString;
504
+ const mdh = this;
505
+ this
506
+ .connect()
507
+ .then(function () {
508
+ return mdh.makeRequest(endpoint, 'POST', null);
509
+ })
510
+ .then(function (response) {
511
+ return MyDataHelps.validateResponse(response);
512
+ })
513
+ .then(function (response) {
514
+ return response.text();
515
+ })
516
+ .then(function (redirectUrl) {
517
+ window.top.location = redirectUrl.replace(/['"]+/g, '');
518
+ });
519
+ }
520
+ else if (window.webkit.messageHandlers.ConnectExternalAccount) {
479
521
  window.webkit.messageHandlers.ConnectExternalAccount.postMessage({ externalAccountProviderID: externalAccountProviderID });
480
522
  }
481
523
  }
@@ -510,18 +552,29 @@ class MyDataHelps {
510
552
  });
511
553
  }
512
554
  deleteExternalAccount(accountID) {
513
- let mdh = this;
555
+ const endpoint = 'externalaccounts/delete/' + encodeURIComponent(accountID);
556
+ const mdh = this;
557
+ if (this.isStandaloneMode()) {
558
+ return this
559
+ .connect()
560
+ .then(function () {
561
+ return mdh.makeRequest(endpoint, 'DELETE', null);
562
+ })
563
+ .then(function (response) {
564
+ return MyDataHelps.validateResponse(response);
565
+ });
566
+ }
514
567
  return new Promise(function (resolve, reject) {
515
- let messageID = mdh.nextMessageID();
516
- mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {
517
- if (!deleteProviderAccountResponse.success) {
518
- reject(deleteProviderAccountResponse);
519
- }
520
- else {
521
- resolve(deleteProviderAccountResponse);
522
- }
523
- };
524
568
  if (window.webkit.messageHandlers.DeleteProviderAccount) {
569
+ const messageID = mdh.nextMessageID();
570
+ mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {
571
+ if (!deleteProviderAccountResponse.success) {
572
+ reject(deleteProviderAccountResponse);
573
+ }
574
+ else {
575
+ resolve(deleteProviderAccountResponse);
576
+ }
577
+ };
525
578
  window.webkit.messageHandlers.DeleteProviderAccount.postMessage({
526
579
  messageID: messageID,
527
580
  accountID: accountID
@@ -603,6 +656,53 @@ class MyDataHelps {
603
656
  return response.json();
604
657
  });
605
658
  }
659
+ // AppleHealth
660
+ queryAppleHealthActivitySummaries(queryParameters) {
661
+ queryParameters = Object.assign({}, queryParameters);
662
+ if (queryParameters.hasOwnProperty("startDate")) {
663
+ queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);
664
+ }
665
+ if (queryParameters.hasOwnProperty("endDate")) {
666
+ queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);
667
+ }
668
+ const queryString = new URLSearchParams(queryParameters).toString();
669
+ const endpoint = 'appleHealth/activitySummaries?' + queryString;
670
+ const mdh = this;
671
+ return this
672
+ .connect()
673
+ .then(function () {
674
+ return mdh.makeRequest(endpoint, 'GET', null);
675
+ })
676
+ .then(function (response) {
677
+ return MyDataHelps.validateResponse(response);
678
+ })
679
+ .then(function (response) {
680
+ return response.json();
681
+ });
682
+ }
683
+ queryAppleHealthWorkouts(queryParameters) {
684
+ queryParameters = Object.assign({}, queryParameters);
685
+ if (queryParameters.hasOwnProperty("startDate")) {
686
+ queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);
687
+ }
688
+ if (queryParameters.hasOwnProperty("endDate")) {
689
+ queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);
690
+ }
691
+ const queryString = new URLSearchParams(queryParameters).toString();
692
+ const endpoint = 'appleHealth/workouts?' + queryString;
693
+ const mdh = this;
694
+ return this
695
+ .connect()
696
+ .then(function () {
697
+ return mdh.makeRequest(endpoint, 'GET', null);
698
+ })
699
+ .then(function (response) {
700
+ return MyDataHelps.validateResponse(response);
701
+ })
702
+ .then(function (response) {
703
+ return response.json();
704
+ });
705
+ }
606
706
  // Authorization
607
707
  connect() {
608
708
  const mdh = this;
@@ -631,6 +731,11 @@ class MyDataHelps {
631
731
  if (this.token && Date.now() < this.tokenExpires) {
632
732
  return Promise.resolve();
633
733
  }
734
+ if (this.isStandaloneMode()) {
735
+ let error = this.token ? "access token is expired or invalid" : "access token must be explicitly provided using the setParticipantAccess method";
736
+ console.log(error);
737
+ return Promise.reject(error);
738
+ }
634
739
  if (!this.refreshTokenPromise) {
635
740
  refreshDelegatedAccessToken();
636
741
  }
@@ -638,6 +743,7 @@ class MyDataHelps {
638
743
  return this.refreshTokenPromise;
639
744
  }
640
745
  setParticipantAccessToken(token, baseUrl) {
746
+ this.enableStandaloneMode();
641
747
  this.token = token;
642
748
  if (baseUrl) {
643
749
  this.baseUrl = baseUrl;
@@ -649,6 +755,15 @@ class MyDataHelps {
649
755
  }, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));
650
756
  }
651
757
  // Miscellaneous
758
+ isStandaloneMode() {
759
+ return this.standaloneMode;
760
+ }
761
+ enableStandaloneMode() {
762
+ this.standaloneMode = true;
763
+ if (window.webkit) {
764
+ window.webkit.messageHandlers = {};
765
+ }
766
+ }
652
767
  setStatusBarStyle(style) {
653
768
  if (window.webkit.messageHandlers.SetStatusBarStyle) {
654
769
  window.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });
@@ -657,11 +772,14 @@ class MyDataHelps {
657
772
  getDeviceInfo() {
658
773
  let mdh = this;
659
774
  return new Promise(function (resolve, reject) {
660
- let messageID = mdh.nextMessageID();
661
- mdh.messageHandlers[messageID] = function (deviceInfoResponse) {
662
- resolve(deviceInfoResponse.data);
663
- };
664
- if (window.webkit.messageHandlers.GetDeviceInfo) {
775
+ if (mdh.isStandaloneMode()) {
776
+ resolve(null);
777
+ }
778
+ else if (window.webkit.messageHandlers.GetDeviceInfo) {
779
+ let messageID = mdh.nextMessageID();
780
+ mdh.messageHandlers[messageID] = function (deviceInfoResponse) {
781
+ resolve(deviceInfoResponse.data);
782
+ };
665
783
  window.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });
666
784
  }
667
785
  else {
@@ -669,14 +787,15 @@ class MyDataHelps {
669
787
  }
670
788
  });
671
789
  }
790
+ setCurrentLanguage(language) {
791
+ this.language = language;
792
+ }
672
793
  getCurrentLanguage() {
673
794
  let searchParams = new URLSearchParams(window.location.search);
674
795
  if (searchParams.has("lang")) {
675
796
  return searchParams.get("lang");
676
797
  }
677
- else {
678
- return navigator.language;
679
- }
798
+ return this.language || navigator.language;
680
799
  }
681
800
  showGoogleFitSettings() {
682
801
  if (window.webkit.messageHandlers.ShowGoogleFitSettings) {
@@ -1,2 +1,2 @@
1
- class e{constructor(){this.allowedApplicationHosts=["localhost","careevolution.com","internal","b3-deploys.com","mydatahelps.org","platform.joinallofus.org","careevolution.dev","ce.dev"],this.accessTokenRenewalBufferSeconds=120,this.apiBasePath="api/v1/delegated/",this.unsupportedActions=["SetHeight","ResearchKit"],this.supportedEvents=["surveyDidFinish","applicationDidBecomeVisible","externalAccountSyncComplete","tokenWillExpire"],this.currentMessageID=1,this.messageHandlers=[],this.registeredEventHandlers={},this.refreshTokenPromise=null;let e,t=this,n=function(){let e=document.location.ancestorOrigins;if(e&&e[0])return e[0];return"*"}();function s(e){if("*"===e)return!0;let n=new URL(e);for(let e=0;e<t.allowedApplicationHosts.length;e++)if(n.hostname===t.allowedApplicationHosts[e]||n.hostname.endsWith("."+t.allowedApplicationHosts[e]))return!0;return!1}if(!s(n))throw console.error("Application is not hosted at an approved origin."),"Application is not hosted at an approved origin.";e=window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.ResearchKit?{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)}}:{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)},StartParticipantSurvey:function(e){window.parent.postMessage({name:"StartParticipantSurvey",messageID:e.messageID,surveyName:e.surveyName},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},OpenExternalApplication:function(e){window.parent.postMessage({name:"OpenApplication",messageID:e.messageID,url:e.url,modal:e.modal},n)},Dismiss:function(){window.parent.postMessage({name:"Dismiss"},n)},PopNavigation:function(){window.parent.postMessage({name:"Back"},n)},ShowTab:function(e){window.parent.postMessage({name:"ShowTab",tabKey:e},n)},ShowParticipantDashboard:function(e){window.parent.postMessage({name:"ShowParticipantDashboard",dashboardKey:e.dashboardKey,modal:e.modal},n)},ShowParticipantWebVisualization:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualization",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal},n)},ShowParticipantWebVisualizationPDF:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualizationPDF",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal,landscape:e.landscape,htmlViewerZoom:e.htmlViewerZoom},n)},DeleteProviderAccount:function(e){window.parent.postMessage({name:"DeleteProviderAccount",messageID:e.messageID,accountID:e.accountID},n)},ConnectExternalAccount:function(e){window.parent.postMessage({name:"ConnectExternalAccount",externalAccountProviderID:e.externalAccountProviderID},n)},ShowProject:function(e){window.parent.postMessage({name:"ShowProject",code:e.code},n)},JoinProject:function(e){window.parent.postMessage({name:"JoinProject",code:e.code},n)}},window.webkit&&window.webkit.messageHandlers&&function(){for(let t in e)if(window.webkit.messageHandlers[t])return!0;for(let e in t.unsupportedActions)if(window.webkit.messageHandlers[t.unsupportedActions[e]])return!0;return!1}()||(window.webkit={messageHandlers:{}});for(let t in e)window.webkit.messageHandlers[t]=window.webkit.messageHandlers[t]||{postMessage:e[t]};window.addEventListener("message",(function(e){if(!function(e){return"*"===n?s(e.origin):e.origin===n}(e))throw console.error("message.origin '"+e.origin+"' is not allowed."),"message.origin '"+e.origin+"' is not allowed.";e.data.messageID?t.setActionResult(e.data):t.triggerEvent(e.data)}),!1)}startSurvey(e){let t=this.nextMessageID();window.webkit.messageHandlers.StartParticipantSurvey.postMessage({messageID:t,surveyName:e})}completeStep(e){null==e&&(e=""),window.webkit.messageHandlers.ResearchKit&&window.webkit.messageHandlers.ResearchKit.postMessage(e)}querySurveyAnswers(t){(t=Object.assign({},t)).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("stepIdentifier")&&(t.stepIdentifier=e.reduceArrayAndEscape(t.stepIdentifier)),t.hasOwnProperty("resultIdentifier")&&(t.resultIdentifier=e.reduceArrayAndEscape(t.resultIdentifier)),t.hasOwnProperty("answer")&&(t.answer=e.reduceArrayAndEscape(t.answer)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after));const n="surveyanswers?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteSurveyResult(t){const n="surveyresults/"+encodeURIComponent(t),s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}querySurveyTasks(t){(t=Object.assign({},t)).hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status)),t.hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName));const n="surveytasks?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}startEmbeddedSurvey(e,t,n){n||(n=this.getCurrentLanguage());let s=this.getBaseUrl()+"mydatahelps/"+e+"/surveylink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}startEmbeddedTask(e,t,n){n||(n=this.getCurrentLanguage());let s=this.getBaseUrl()+"mydatahelps/"+e+"/tasklink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}openExternalUrl(e){window.webkit.messageHandlers.OpenExternalLink.postMessage(e)}openEmbeddedUrl(e){window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(e)}showTab(e){window.webkit.messageHandlers.ShowTab.postMessage(e)}openApplication(e,t){let n=this.nextMessageID();window.webkit.messageHandlers.OpenExternalApplication.postMessage({messageID:n,url:e,modal:!(!t||!t.modal)})}dismiss(){window.webkit.messageHandlers.Dismiss.postMessage({})}back(){window.webkit.messageHandlers.PopNavigation.postMessage({})}showDashboard(e,t){window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({dashboardKey:e,modal:!(!t||!t.modal),title:t&&t.title?t.title:void 0})}showWebVisualization(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({visualizationKey:e,parameters:t,modal:!(!n||!n.modal),title:n&&n.title?n.title:void 0})}showWebVisualizationPdf(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({visualizationKey:e,parameters:t,landscape:!(!n||!n.landscape),htmlViewerZoom:n&&n.htmlViewerZoom})}showProject(e){window.webkit.messageHandlers.ShowProject&&window.webkit.messageHandlers.ShowProject.postMessage({code:e})}joinProject(e){window.webkit.messageHandlers.JoinProject&&window.webkit.messageHandlers.JoinProject.postMessage({code:e})}on(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");this.registeredEventHandlers[e]||(this.registeredEventHandlers[e]=[]),this.registeredEventHandlers[e].push(t)}off(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");if(!this.registeredEventHandlers[e])return;let n=this.registeredEventHandlers[e].indexOf(t);-1!==n&&this.registeredEventHandlers[e].splice(n,1)}triggerEvent(e){let t=e.type;this.supportedEvents.includes(t)&&this.registeredEventHandlers[t]&&this.registeredEventHandlers[t].forEach((function(t){t(e)}))}setActionResult(e){this.messageHandlers[e.messageID](e)}getParticipantInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("participant","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getProjectInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("project","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceData(t){(t=Object.assign({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter));const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistDeviceData(t){const n=this;return this.connect().then((function(){return n.makeRequest("devicedata","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getExternalAccountProviders(t,n,s,a){let r={};t&&(r.search=t),n&&(r.category=n),s&&(r.pageSize=s),a&&(r.pageNumber=a);const o="externalaccountproviders?"+new URLSearchParams(r).toString(),i=this;return this.connect().then((function(){return i.makeRequest(o,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connectExternalAccount(e){window.webkit.messageHandlers.ConnectExternalAccount&&window.webkit.messageHandlers.ConnectExternalAccount.postMessage({externalAccountProviderID:e})}getExternalAccounts(){const t=this;return this.connect().then((function(){return t.makeRequest("externalaccounts","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}refreshExternalAccount(t){const n="externalaccounts/refresh/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}deleteExternalAccount(e){let t=this;return new Promise((function(n,s){let a=t.nextMessageID();t.messageHandlers[a]=function(e){e.success?n(e):s(e)},window.webkit.messageHandlers.DeleteProviderAccount?window.webkit.messageHandlers.DeleteProviderAccount.postMessage({messageID:a,accountID:e}):s()}))}queryNotifications(t){(t=Object.assign({},t)).hasOwnProperty("sentBefore")&&(t.sentBefore=e.convertDateToIsoString(t.sentBefore)),t.hasOwnProperty("sentAfter")&&(t.sentAfter=e.convertDateToIsoString(t.sentAfter));const n="notifications?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitDailySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/dailySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitSleepLogs(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/sleepLogs?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connect(){const e=this;let t=function(){e.token=null,e.refreshTokenPromise=new Promise((function(n,s){let a=e.nextMessageID();e.messageHandlers[a]=function(r){r.success?(e.tokenExpires=Date.now()+1e3*r.data.expires_in,e.token=r.data,e.baseUrl=r.baseUrl,setTimeout(t,1e3*(r.data.expires_in-e.accessTokenRenewalBufferSeconds)),n(null)):(e.token=null,s(r.message)),e.messageHandlers[a]=null,e.refreshTokenPromise=null},window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({messageID:a})}))};return this.token&&Date.now()<this.tokenExpires?Promise.resolve():(this.refreshTokenPromise||t(),this.refreshTokenPromise)}setParticipantAccessToken(e,t){this.token=e,t&&(this.baseUrl=t),this.tokenExpires=Date.now()+1e3*this.token.expires_in;const n=this;setTimeout((function(){n.triggerEvent({type:"tokenWillExpire"})}),1e3*(this.token.expires_in-this.accessTokenRenewalBufferSeconds))}setStatusBarStyle(e){window.webkit.messageHandlers.SetStatusBarStyle&&window.webkit.messageHandlers.SetStatusBarStyle.postMessage({style:e})}getDeviceInfo(){let e=this;return new Promise((function(t,n){let s=e.nextMessageID();e.messageHandlers[s]=function(e){t(e.data)},window.webkit.messageHandlers.GetDeviceInfo?window.webkit.messageHandlers.GetDeviceInfo.postMessage({messageID:s}):n()}))}getCurrentLanguage(){let e=new URLSearchParams(window.location.search);return e.has("lang")?e.get("lang"):navigator.language}showGoogleFitSettings(){window.webkit.messageHandlers.ShowGoogleFitSettings&&window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({})}requestReview(e){window.webkit.messageHandlers.RequestReview&&window.webkit.messageHandlers.RequestReview.postMessage({cooldownDays:e})}trackCustomEvent(t){const n=this;return this.connect().then((function(){return n.makeRequest("customevents","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDataCollectionSettings(){const t=this;return this.connect().then((function(){return t.makeRequest("datacollectionsettings","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}invokeCustomApi(t,n,s,a){if(t.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+t;if(n=n.toUpperCase(),null!=s&&("GET"===n||"DELETE"===n)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,n,s)})).then((function(t){return e.validateResponse(t)})).then((function(e){return a?e.json():void 0}))}nextMessageID(){return this.currentMessageID++}getBaseUrl(){return this.baseUrl||"https://mydatahelps.org/"}makeUrl(e){if(!this.baseUrl)throw console.error("Cannot use makeUrl without MyDataHelps.baseUrl."),"Cannot use makeUrl without MyDataHelps.baseUrl.";return this.baseUrl+this.apiBasePath+e}makeRequest(e,t,n){if(!this.token||!this.token.access_token)throw"No access_token available for request authorization.";let s=this.makeUrl(e),a=new Headers;a.append("Authorization","Bearer "+this.token.access_token),a.append("Accept","application/json, text/javascript, */*; q=0.01"),a.append("Accept-Language",this.getCurrentLanguage()),n&&a.append("Content-Type","application/json");let r={method:t,headers:a};return n&&(r.body=JSON.stringify(n)),fetch(s,r)}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replace("\\","\\\\").replace(",","\\,")}static reduceArrayAndEscape(t){if(Array.isArray(t)){return t.map((function(t){return e.escapeParam(t)})).join(",")}return this.escapeParam(t)}static convertDateToIsoString(e){let t=new Date(e);if(isNaN(t.getTime()))throw"Cannot interpret parameter as Date";return t.toISOString()}startEmbeddedSurveyInternal(e){let t="mydatahelps-survey-modal",n=this;return new Promise((function(s,a){if(document.getElementById(t))return void a("Survey already in progress");window.addEventListener("message",(function e(a){if(a.origin!==new URL(n.getBaseUrl()).origin)return;let r=document.getElementById("mydatahelps-survey-frame").contentWindow;a.source===r&&("SurveyWindowInitialized"===a.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===a.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s(a.data)))}),!0);let r=document.createElement("div");r.className="mydatahelps-survey-modal",r.id=t,r.innerHTML="<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='"+e+"'></iframe></div>",document.body.append(r),document.body.className+=" no-scroll"}))}}const t=new e;window.MyDataHelps=t,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{e as MyDataHelps,t as default};
1
+ class e{constructor(){this.acceptableParentDomains=["localhost","careevolution.com","internal","b3-deploys.com","mydatahelps.org","platform.joinallofus.org","careevolution.dev","ce.dev","mydatahelps.dev"],this.accessTokenRenewalBufferSeconds=120,this.apiBasePath="api/v1/delegated/",this.unsupportedActions=["SetHeight","ResearchKit"],this.supportedEvents=["surveyDidFinish","applicationDidBecomeVisible","externalAccountSyncComplete","tokenWillExpire"],this.currentMessageID=1,this.messageHandlers=[],this.registeredEventHandlers={},this.refreshTokenPromise=null,this.standaloneMode=!1;let e,t=this,n=function(){let e=document.location.ancestorOrigins;if(e&&e[0])return e[0];return"*"}();function s(e){if("*"===e)return!0;let n=new URL(e);for(let e=0;e<t.acceptableParentDomains.length;e++)if(n.hostname===t.acceptableParentDomains[e]||n.hostname.endsWith("."+t.acceptableParentDomains[e]))return!0;return!1}s(n)||console.log("Detected unsupported parent origin domain."),e=window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.ResearchKit?{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)}}:{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)},StartParticipantSurvey:function(e){window.parent.postMessage({name:"StartParticipantSurvey",messageID:e.messageID,surveyName:e.surveyName},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},OpenExternalApplication:function(e){window.parent.postMessage({name:"OpenApplication",messageID:e.messageID,url:e.url,modal:e.modal},n)},Dismiss:function(){window.parent.postMessage({name:"Dismiss"},n)},PopNavigation:function(){window.parent.postMessage({name:"Back"},n)},ShowTab:function(e){window.parent.postMessage({name:"ShowTab",tabKey:e},n)},ShowParticipantDashboard:function(e){window.parent.postMessage({name:"ShowParticipantDashboard",dashboardKey:e.dashboardKey,modal:e.modal},n)},ShowParticipantWebVisualization:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualization",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal},n)},ShowParticipantWebVisualizationPDF:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualizationPDF",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal,landscape:e.landscape,htmlViewerZoom:e.htmlViewerZoom},n)},DeleteProviderAccount:function(e){window.parent.postMessage({name:"DeleteProviderAccount",messageID:e.messageID,accountID:e.accountID},n)},ConnectExternalAccount:function(e){window.parent.postMessage({name:"ConnectExternalAccount",externalAccountProviderID:e.externalAccountProviderID},n)},ShowProject:function(e){window.parent.postMessage({name:"ShowProject",code:e.code},n)},JoinProject:function(e){window.parent.postMessage({name:"JoinProject",code:e.code},n)}},window.webkit&&window.webkit.messageHandlers&&function(){for(let t in e)if(window.webkit.messageHandlers[t])return!0;for(let e in t.unsupportedActions)if(window.webkit.messageHandlers[t.unsupportedActions[e]])return!0;return!1}()||(window.webkit={messageHandlers:{}}),function(e){for(let t in e)window.webkit.messageHandlers[t]=window.webkit.messageHandlers[t]||{postMessage:e[t]}}(e),window.addEventListener("message",(function(e){if(!function(e){return"*"===n?s(e.origin):e.origin===n}(e))throw console.error("message.origin '"+e.origin+"' is not allowed."),"message.origin '"+e.origin+"' is not allowed.";e.data.messageID?t.setActionResult(e.data):t.triggerEvent(e.data)}),!1)}startSurvey(e){if(window.webkit.messageHandlers.StartParticipantSurvey){let t=this.nextMessageID();window.webkit.messageHandlers.StartParticipantSurvey.postMessage({messageID:t,surveyName:e})}}completeStep(e){null==e&&(e=""),window.webkit.messageHandlers.ResearchKit&&window.webkit.messageHandlers.ResearchKit.postMessage(e)}querySurveyAnswers(t){(t=Object.assign({},t)).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("stepIdentifier")&&(t.stepIdentifier=e.reduceArrayAndEscape(t.stepIdentifier)),t.hasOwnProperty("resultIdentifier")&&(t.resultIdentifier=e.reduceArrayAndEscape(t.resultIdentifier)),t.hasOwnProperty("answer")&&(t.answer=e.reduceArrayAndEscape(t.answer)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after));const n="surveyanswers?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteSurveyResult(t){const n="surveyresults/"+encodeURIComponent(t),s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}querySurveyTasks(t){(t=Object.assign({},t)).hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status)),t.hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName));const n="surveytasks?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}startEmbeddedSurvey(e,t,n){n||(n=this.getCurrentLanguage());let s=this.getBaseUrl()+"mydatahelps/"+e+"/surveylink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}startEmbeddedTask(e,t,n){n||(n=this.getCurrentLanguage());let s=this.getBaseUrl()+"mydatahelps/"+e+"/tasklink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}openExternalUrl(e){window.webkit.messageHandlers.OpenExternalLink&&window.webkit.messageHandlers.OpenExternalLink.postMessage(e)}openEmbeddedUrl(e){window.webkit.messageHandlers.OpenEmbeddedLink&&window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(e)}showTab(e){window.webkit.messageHandlers.ShowTab&&window.webkit.messageHandlers.ShowTab.postMessage(e)}openApplication(e,t){if(window.webkit.messageHandlers.OpenExternalApplication){let n=this.nextMessageID();window.webkit.messageHandlers.OpenExternalApplication.postMessage({messageID:n,url:e,modal:!(!t||!t.modal)})}}dismiss(){window.webkit.messageHandlers.Dismiss&&window.webkit.messageHandlers.Dismiss.postMessage({})}back(){window.webkit.messageHandlers.PopNavigation&&window.webkit.messageHandlers.PopNavigation.postMessage({})}showDashboard(e,t){window.webkit.messageHandlers.ShowParticipantDashboard&&window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({dashboardKey:e,modal:!(!t||!t.modal),title:t&&t.title?t.title:void 0})}showWebVisualization(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualization&&window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({visualizationKey:e,parameters:t,modal:!(!n||!n.modal),title:n&&n.title?n.title:void 0})}showWebVisualizationPdf(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF&&window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({visualizationKey:e,parameters:t,landscape:!(!n||!n.landscape),htmlViewerZoom:n&&n.htmlViewerZoom})}showProject(e){window.webkit.messageHandlers.ShowProject&&window.webkit.messageHandlers.ShowProject.postMessage({code:e})}joinProject(e){window.webkit.messageHandlers.JoinProject&&window.webkit.messageHandlers.JoinProject.postMessage({code:e})}on(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");this.registeredEventHandlers[e]||(this.registeredEventHandlers[e]=[]),this.registeredEventHandlers[e].push(t)}off(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");if(!this.registeredEventHandlers[e])return;let n=this.registeredEventHandlers[e].indexOf(t);-1!==n&&this.registeredEventHandlers[e].splice(n,1)}triggerEvent(e){let t=e.type;this.supportedEvents.includes(t)&&this.registeredEventHandlers[t]&&this.registeredEventHandlers[t].forEach((function(t){t(e)}))}setActionResult(e){this.messageHandlers[e.messageID](e)}getParticipantInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("participant","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getProjectInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("project","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceData(t){(t=Object.assign({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter));const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistDeviceData(t){const n=this;return this.connect().then((function(){return n.makeRequest("devicedata","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getExternalAccountProviders(t,n,s,a){let r={};t&&(r.search=t),n&&(r.category=n),s&&(r.pageSize=s),a&&(r.pageNumber=a);const o="externalaccountproviders?"+new URLSearchParams(r).toString(),i=this;return this.connect().then((function(){return i.makeRequest(o,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connectExternalAccount(t,n){if(this.standaloneMode){n=n||window.location.href;const s="externalaccountproviders/"+t+"/connect?"+new URLSearchParams({finalRedirectPath:n}).toString(),a=this;this.connect().then((function(){return a.makeRequest(s,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.text()})).then((function(e){window.top.location=e.replace(/['"]+/g,"")}))}else window.webkit.messageHandlers.ConnectExternalAccount&&window.webkit.messageHandlers.ConnectExternalAccount.postMessage({externalAccountProviderID:t})}getExternalAccounts(){const t=this;return this.connect().then((function(){return t.makeRequest("externalaccounts","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}refreshExternalAccount(t){const n="externalaccounts/refresh/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}deleteExternalAccount(t){const n="externalaccounts/delete/"+encodeURIComponent(t),s=this;return this.isStandaloneMode()?this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})):new Promise((function(e,n){if(window.webkit.messageHandlers.DeleteProviderAccount){const a=s.nextMessageID();s.messageHandlers[a]=function(t){t.success?e(t):n(t)},window.webkit.messageHandlers.DeleteProviderAccount.postMessage({messageID:a,accountID:t})}else n()}))}queryNotifications(t){(t=Object.assign({},t)).hasOwnProperty("sentBefore")&&(t.sentBefore=e.convertDateToIsoString(t.sentBefore)),t.hasOwnProperty("sentAfter")&&(t.sentAfter=e.convertDateToIsoString(t.sentAfter));const n="notifications?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitDailySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/dailySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitSleepLogs(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/sleepLogs?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryAppleHealthActivitySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="appleHealth/activitySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryAppleHealthWorkouts(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="appleHealth/workouts?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connect(){const e=this;let t=function(){e.token=null,e.refreshTokenPromise=new Promise((function(n,s){let a=e.nextMessageID();e.messageHandlers[a]=function(r){r.success?(e.tokenExpires=Date.now()+1e3*r.data.expires_in,e.token=r.data,e.baseUrl=r.baseUrl,setTimeout(t,1e3*(r.data.expires_in-e.accessTokenRenewalBufferSeconds)),n(null)):(e.token=null,s(r.message)),e.messageHandlers[a]=null,e.refreshTokenPromise=null},window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({messageID:a})}))};if(this.token&&Date.now()<this.tokenExpires)return Promise.resolve();if(this.isStandaloneMode()){let e=this.token?"access token is expired or invalid":"access token must be explicitly provided using the setParticipantAccess method";return console.log(e),Promise.reject(e)}return this.refreshTokenPromise||t(),this.refreshTokenPromise}setParticipantAccessToken(e,t){this.enableStandaloneMode(),this.token=e,t&&(this.baseUrl=t),this.tokenExpires=Date.now()+1e3*this.token.expires_in;const n=this;setTimeout((function(){n.triggerEvent({type:"tokenWillExpire"})}),1e3*(this.token.expires_in-this.accessTokenRenewalBufferSeconds))}isStandaloneMode(){return this.standaloneMode}enableStandaloneMode(){this.standaloneMode=!0,window.webkit&&(window.webkit.messageHandlers={})}setStatusBarStyle(e){window.webkit.messageHandlers.SetStatusBarStyle&&window.webkit.messageHandlers.SetStatusBarStyle.postMessage({style:e})}getDeviceInfo(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetDeviceInfo){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetDeviceInfo.postMessage({messageID:n})}else n()}))}setCurrentLanguage(e){this.language=e}getCurrentLanguage(){let e=new URLSearchParams(window.location.search);return e.has("lang")?e.get("lang"):this.language||navigator.language}showGoogleFitSettings(){window.webkit.messageHandlers.ShowGoogleFitSettings&&window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({})}requestReview(e){window.webkit.messageHandlers.RequestReview&&window.webkit.messageHandlers.RequestReview.postMessage({cooldownDays:e})}trackCustomEvent(t){const n=this;return this.connect().then((function(){return n.makeRequest("customevents","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDataCollectionSettings(){const t=this;return this.connect().then((function(){return t.makeRequest("datacollectionsettings","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}invokeCustomApi(t,n,s,a){if(t.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+t;if(n=n.toUpperCase(),null!=s&&("GET"===n||"DELETE"===n)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,n,s)})).then((function(t){return e.validateResponse(t)})).then((function(e){return a?e.json():void 0}))}nextMessageID(){return this.currentMessageID++}getBaseUrl(){return this.baseUrl||"https://mydatahelps.org/"}makeUrl(e){if(!this.baseUrl)throw console.error("Cannot use makeUrl without MyDataHelps.baseUrl."),"Cannot use makeUrl without MyDataHelps.baseUrl.";return this.baseUrl+this.apiBasePath+e}makeRequest(e,t,n){if(!this.token||!this.token.access_token)throw"No access_token available for request authorization.";let s=this.makeUrl(e),a=new Headers;a.append("Authorization","Bearer "+this.token.access_token),a.append("Accept","application/json, text/javascript, */*; q=0.01"),a.append("Accept-Language",this.getCurrentLanguage()),n&&a.append("Content-Type","application/json");let r={method:t,headers:a};return n&&(r.body=JSON.stringify(n)),fetch(s,r)}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replace("\\","\\\\").replace(",","\\,")}static reduceArrayAndEscape(t){if(Array.isArray(t)){return t.map((function(t){return e.escapeParam(t)})).join(",")}return this.escapeParam(t)}static convertDateToIsoString(e){let t=new Date(e);if(isNaN(t.getTime()))throw"Cannot interpret parameter as Date";return t.toISOString()}startEmbeddedSurveyInternal(e){let t="mydatahelps-survey-modal",n=this;return new Promise((function(s,a){if(document.getElementById(t))return void a("Survey already in progress");window.addEventListener("message",(function e(a){if(a.origin!==new URL(n.getBaseUrl()).origin)return;let r=document.getElementById("mydatahelps-survey-frame").contentWindow;a.source===r&&("SurveyWindowInitialized"===a.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===a.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s(a.data)))}),!0);let r=document.createElement("div");r.className="mydatahelps-survey-modal",r.id=t,r.innerHTML="<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='"+e+"'></iframe></div>",document.body.append(r),document.body.className+=" no-scroll"}))}}const t=new e;window.MyDataHelps=t,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{e as MyDataHelps,t as default};
2
2
  //# sourceMappingURL=MyDataHelps.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MyDataHelps.min.js","sources":["../MyDataHelps.js"],"sourcesContent":["export class MyDataHelps {\n constructor() {\n this.allowedApplicationHosts = [\n 'localhost',\n 'careevolution.com',\n 'internal',\n 'b3-deploys.com',\n 'mydatahelps.org',\n 'platform.joinallofus.org',\n 'careevolution.dev',\n 'ce.dev'\n ];\n this.accessTokenRenewalBufferSeconds = 120;\n this.apiBasePath = 'api/v1/delegated/';\n this.unsupportedActions = [\"SetHeight\", \"ResearchKit\"];\n this.supportedEvents = [\"surveyDidFinish\", \"applicationDidBecomeVisible\", \"externalAccountSyncComplete\", \"tokenWillExpire\"];\n this.currentMessageID = 1;\n this.messageHandlers = [];\n this.registeredEventHandlers = {};\n this.refreshTokenPromise = null;\n let mdh = this;\n let applicationHost = getParentOrigin();\n let supportedActions;\n function getParentOrigin() {\n let ancestorOrigins = document.location.ancestorOrigins;\n if (ancestorOrigins && ancestorOrigins[0]) {\n return ancestorOrigins[0];\n }\n return '*';\n }\n function acceptableOrigin(origin) {\n if (origin === '*')\n return true;\n let sourceURL = new URL(origin);\n for (let k = 0; k < mdh.allowedApplicationHosts.length; k++) {\n if (sourceURL.hostname === mdh.allowedApplicationHosts[k] || sourceURL.hostname.endsWith(\".\" + mdh.allowedApplicationHosts[k])) {\n return true;\n }\n }\n return false;\n }\n function validateWindowMessageOrigin(message) {\n if (applicationHost === \"*\") {\n return acceptableOrigin(message.origin);\n }\n return message.origin === applicationHost;\n }\n function receiveWindowMessage(message) {\n if (!validateWindowMessageOrigin(message)) {\n console.error(\"message.origin '\" + message.origin + \"' is not allowed.\");\n throw \"message.origin '\" + message.origin + \"' is not allowed.\";\n }\n if (message.data.messageID) {\n mdh.setActionResult(message.data);\n }\n else {\n mdh.triggerEvent(message.data);\n }\n }\n if (!acceptableOrigin(applicationHost)) {\n console.error(\"Application is not hosted at an approved origin.\");\n throw \"Application is not hosted at an approved origin.\";\n }\n if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n }\n };\n }\n else {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n },\n \"StartParticipantSurvey\": function (data) {\n window.parent.postMessage({\n name: 'StartParticipantSurvey',\n messageID: data.messageID,\n surveyName: data.surveyName\n }, applicationHost);\n },\n \"OpenExternalLink\": function (data) {\n window.parent.postMessage({ name: 'OpenExternalUrl', url: data }, applicationHost);\n },\n \"OpenEmbeddedLink\": function (data) {\n window.parent.postMessage({ name: 'OpenEmbeddedUrl', url: data }, applicationHost);\n },\n \"OpenExternalApplication\": function (data) {\n window.parent.postMessage({\n name: 'OpenApplication',\n messageID: data.messageID,\n url: data.url,\n modal: data.modal\n }, applicationHost);\n },\n \"Dismiss\": function () {\n window.parent.postMessage({ name: 'Dismiss' }, applicationHost);\n },\n \"PopNavigation\": function () {\n window.parent.postMessage({ name: 'Back' }, applicationHost);\n },\n \"ShowTab\": function (data) {\n window.parent.postMessage({ name: 'ShowTab', tabKey: data }, applicationHost);\n },\n \"ShowParticipantDashboard\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantDashboard',\n dashboardKey: data.dashboardKey,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualization\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualization',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualizationPDF\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualizationPDF',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal,\n landscape: data.landscape,\n htmlViewerZoom: data.htmlViewerZoom\n }, applicationHost);\n },\n \"DeleteProviderAccount\": function (data) {\n window.parent.postMessage({\n name: 'DeleteProviderAccount',\n messageID: data.messageID,\n accountID: data.accountID\n }, applicationHost);\n },\n \"ConnectExternalAccount\": function (data) {\n window.parent.postMessage({\n name: 'ConnectExternalAccount',\n externalAccountProviderID: data.externalAccountProviderID\n }, applicationHost);\n },\n \"ShowProject\": function (data) {\n window.parent.postMessage({ name: 'ShowProject', code: data.code }, applicationHost);\n },\n \"JoinProject\": function (data) {\n window.parent.postMessage({ name: 'JoinProject', code: data.code }, applicationHost);\n }\n };\n }\n function windowHasAnyActions() {\n for (let action in supportedActions) {\n if (window.webkit.messageHandlers[action]) {\n return true;\n }\n }\n for (let action in mdh.unsupportedActions) {\n if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {\n return true;\n }\n }\n return false;\n }\n if (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {\n window.webkit = {\n messageHandlers: {}\n };\n }\n for (let action in supportedActions) {\n window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: supportedActions[action] };\n }\n window.addEventListener(\"message\", receiveWindowMessage, false);\n }\n // Surveys\n startSurvey(surveyName) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.StartParticipantSurvey.postMessage({\n messageID: messageID,\n surveyName: surveyName\n });\n }\n completeStep(answer) {\n if (answer === undefined || answer === null)\n answer = '';\n if (window.webkit.messageHandlers.ResearchKit) {\n window.webkit.messageHandlers.ResearchKit.postMessage(answer);\n }\n }\n querySurveyAnswers(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"surveyName\")) {\n queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n }\n if (queryParameters.hasOwnProperty(\"stepIdentifier\")) {\n queryParameters.stepIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.stepIdentifier);\n }\n if (queryParameters.hasOwnProperty(\"resultIdentifier\")) {\n queryParameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.resultIdentifier);\n }\n if (queryParameters.hasOwnProperty(\"answer\")) {\n queryParameters.answer = MyDataHelps.reduceArrayAndEscape(queryParameters.answer);\n }\n if (queryParameters.hasOwnProperty(\"before\")) {\n queryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n }\n if (queryParameters.hasOwnProperty(\"after\")) {\n queryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'surveyanswers?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n deleteSurveyResult(resultID) {\n const endpoint = 'surveyresults/' + encodeURIComponent(resultID);\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'DELETE', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n querySurveyTasks(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"status\")) {\n queryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status);\n }\n if (queryParameters.hasOwnProperty(\"surveyName\")) {\n queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'surveytasks?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n startEmbeddedSurvey(linkIdentifier, surveyName, language) {\n if (!language) {\n language = this.getCurrentLanguage();\n }\n let surveyUrl = this.getBaseUrl() + \"mydatahelps/\" + linkIdentifier + '/surveylink/' + surveyName + \"?lang=\" + language;\n return this.startEmbeddedSurveyInternal(surveyUrl);\n }\n startEmbeddedTask(linkIdentifier, taskLinkIdentifier, language) {\n if (!language) {\n language = this.getCurrentLanguage();\n }\n let surveyUrl = this.getBaseUrl() + \"mydatahelps/\" + linkIdentifier + '/tasklink/' + taskLinkIdentifier + \"?lang=\" + language;\n return this.startEmbeddedSurveyInternal(surveyUrl);\n }\n // Navigation\n openExternalUrl(url) {\n window.webkit.messageHandlers.OpenExternalLink.postMessage(url);\n }\n openEmbeddedUrl(url) {\n window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);\n }\n showTab(tabKey) {\n window.webkit.messageHandlers.ShowTab.postMessage(tabKey);\n }\n openApplication(url, options) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.OpenExternalApplication.postMessage({\n messageID: messageID,\n url: url,\n modal: !!(options && options.modal)\n });\n }\n dismiss() {\n window.webkit.messageHandlers.Dismiss.postMessage({});\n }\n back() {\n window.webkit.messageHandlers.PopNavigation.postMessage({});\n }\n showDashboard(dashboardKey, options) {\n window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({\n dashboardKey: dashboardKey,\n modal: !!(options && options.modal),\n title: options && options.title ? options.title : undefined\n });\n }\n showWebVisualization(visualizationKey, parameters, options) {\n window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({\n visualizationKey: visualizationKey,\n parameters: parameters,\n modal: !!(options && options.modal),\n title: options && options.title ? options.title : undefined\n });\n }\n showWebVisualizationPdf(visualizationKey, parameters, options) {\n window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({\n visualizationKey: visualizationKey,\n parameters: parameters,\n landscape: !!(options && options.landscape),\n htmlViewerZoom: options && options.htmlViewerZoom\n });\n }\n showProject(projectCode) {\n if (window.webkit.messageHandlers.ShowProject) {\n window.webkit.messageHandlers.ShowProject.postMessage({ code: projectCode });\n }\n }\n joinProject(projectCode) {\n if (window.webkit.messageHandlers.JoinProject) {\n window.webkit.messageHandlers.JoinProject.postMessage({ code: projectCode });\n }\n }\n //Events\n on(eventName, callback) {\n if (!this.supportedEvents.includes(eventName)) {\n throw new Error(eventName + \" is not a supported event type.\");\n }\n if (!this.registeredEventHandlers[eventName]) {\n this.registeredEventHandlers[eventName] = [];\n }\n this.registeredEventHandlers[eventName].push(callback);\n }\n off(eventName, callback) {\n if (!this.supportedEvents.includes(eventName)) {\n throw new Error(eventName + \" is not a supported event type.\");\n }\n if (!this.registeredEventHandlers[eventName])\n return;\n let eventHandlerIndex = this.registeredEventHandlers[eventName].indexOf(callback);\n if (eventHandlerIndex !== -1) {\n this.registeredEventHandlers[eventName].splice(eventHandlerIndex, 1);\n }\n }\n triggerEvent(event) {\n let eventName = event.type;\n if (this.supportedEvents.includes(eventName) && this.registeredEventHandlers[eventName]) {\n this.registeredEventHandlers[eventName].forEach(function (handler) {\n handler(event);\n });\n }\n }\n setActionResult(data) {\n this.messageHandlers[data.messageID](data);\n }\n // Participant Info\n getParticipantInfo() {\n const mdh = this;\n const endpoint = 'participant';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n getProjectInfo() {\n const mdh = this;\n const endpoint = 'project';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Device Data\n queryDeviceData(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"type\")) {\n queryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type);\n }\n if (queryParameters.hasOwnProperty(\"observedBefore\")) {\n queryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n }\n if (queryParameters.hasOwnProperty(\"observedAfter\")) {\n queryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'devicedata?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n persistDeviceData(deviceDataPoints) {\n const endpoint = 'devicedata';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', deviceDataPoints);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n // External Accounts\n getExternalAccountProviders(search, category, pageSize, pageNumber) {\n let searchParameters = {};\n if (!!search)\n searchParameters.search = search;\n if (!!category)\n searchParameters.category = category;\n if (!!pageSize)\n searchParameters.pageSize = pageSize;\n if (!!pageNumber)\n searchParameters.pageNumber = pageNumber;\n const queryString = new URLSearchParams(searchParameters).toString();\n const endpoint = 'externalaccountproviders?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n connectExternalAccount(externalAccountProviderID) {\n if (window.webkit.messageHandlers.ConnectExternalAccount) {\n window.webkit.messageHandlers.ConnectExternalAccount.postMessage({ externalAccountProviderID: externalAccountProviderID });\n }\n }\n getExternalAccounts() {\n const endpoint = 'externalaccounts';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n refreshExternalAccount(accountID) {\n const endpoint = 'externalaccounts/refresh/' + accountID;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n deleteExternalAccount(accountID) {\n let mdh = this;\n return new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {\n if (!deleteProviderAccountResponse.success) {\n reject(deleteProviderAccountResponse);\n }\n else {\n resolve(deleteProviderAccountResponse);\n }\n };\n if (window.webkit.messageHandlers.DeleteProviderAccount) {\n window.webkit.messageHandlers.DeleteProviderAccount.postMessage({\n messageID: messageID,\n accountID: accountID\n });\n }\n else {\n reject();\n }\n });\n }\n // Notifications\n queryNotifications(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"sentBefore\")) {\n queryParameters.sentBefore = MyDataHelps.convertDateToIsoString(queryParameters.sentBefore);\n }\n if (queryParameters.hasOwnProperty(\"sentAfter\")) {\n queryParameters.sentAfter = MyDataHelps.convertDateToIsoString(queryParameters.sentAfter);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'notifications?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Fitbit\n queryFitbitDailySummaries(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'fitbit/dailySummaries?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n queryFitbitSleepLogs(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'fitbit/sleepLogs?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Authorization\n connect() {\n const mdh = this;\n let refreshDelegatedAccessToken = function () {\n mdh.token = null;\n mdh.refreshTokenPromise = new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (tokenResponse) {\n if (tokenResponse.success) {\n mdh.tokenExpires = Date.now() + (tokenResponse.data.expires_in * 1000);\n mdh.token = tokenResponse.data;\n mdh.baseUrl = tokenResponse.baseUrl;\n setTimeout(refreshDelegatedAccessToken, ((tokenResponse.data.expires_in - mdh.accessTokenRenewalBufferSeconds) * 1000));\n resolve(null);\n }\n else {\n mdh.token = null;\n reject(tokenResponse.message);\n }\n mdh.messageHandlers[messageID] = null;\n mdh.refreshTokenPromise = null;\n };\n window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({ messageID: messageID });\n });\n };\n if (this.token && Date.now() < this.tokenExpires) {\n return Promise.resolve();\n }\n if (!this.refreshTokenPromise) {\n refreshDelegatedAccessToken();\n }\n // Re-use promise if refresh already in progress\n return this.refreshTokenPromise;\n }\n setParticipantAccessToken(token, baseUrl) {\n this.token = token;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n this.tokenExpires = Date.now() + (this.token.expires_in * 1000);\n const mdh = this;\n setTimeout(function () {\n mdh.triggerEvent({ type: \"tokenWillExpire\" });\n }, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));\n }\n // Miscellaneous\n setStatusBarStyle(style) {\n if (window.webkit.messageHandlers.SetStatusBarStyle) {\n window.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });\n }\n }\n getDeviceInfo() {\n let mdh = this;\n return new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (deviceInfoResponse) {\n resolve(deviceInfoResponse.data);\n };\n if (window.webkit.messageHandlers.GetDeviceInfo) {\n window.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });\n }\n else {\n reject();\n }\n });\n }\n getCurrentLanguage() {\n let searchParams = new URLSearchParams(window.location.search);\n if (searchParams.has(\"lang\")) {\n return searchParams.get(\"lang\");\n }\n else {\n return navigator.language;\n }\n }\n showGoogleFitSettings() {\n if (window.webkit.messageHandlers.ShowGoogleFitSettings) {\n window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({});\n }\n }\n requestReview(cooldownDays) {\n if (window.webkit.messageHandlers.RequestReview) {\n window.webkit.messageHandlers.RequestReview.postMessage({ cooldownDays: cooldownDays });\n }\n }\n trackCustomEvent(event) {\n const endpoint = 'customevents';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', event);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n getDataCollectionSettings() {\n const mdh = this;\n const endpoint = 'datacollectionsettings';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n invokeCustomApi(customApi, method, queryParameters, jsonResponse) {\n if (customApi.includes('?')) {\n throw new Error(\"Cannot include query parameters directly in the \\\"customApi\\\" string. Provide as an argument for \\\"queryParameters\\\" instead.\");\n }\n let endpoint = 'custom/' + customApi;\n method = method.toUpperCase();\n if (queryParameters !== null && queryParameters !== undefined && (method === 'GET' || method === 'DELETE')) {\n let parameterString = new URLSearchParams(queryParameters).toString();\n endpoint += \"?\" + parameterString;\n queryParameters = null;\n }\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, method, queryParameters);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return jsonResponse ? response.json() : undefined;\n });\n }\n nextMessageID() {\n return this.currentMessageID++;\n }\n getBaseUrl() {\n return this.baseUrl || 'https://mydatahelps.org/';\n }\n makeUrl(endpoint) {\n if (!this.baseUrl) {\n console.error(\"Cannot use makeUrl without MyDataHelps.baseUrl.\");\n throw \"Cannot use makeUrl without MyDataHelps.baseUrl.\";\n }\n return this.baseUrl + this.apiBasePath + endpoint;\n }\n makeRequest(endpoint, method, body) {\n if (!this.token || !this.token.access_token) {\n throw \"No access_token available for request authorization.\";\n }\n let url = this.makeUrl(endpoint);\n let headers = new Headers();\n headers.append('Authorization', 'Bearer ' + this.token.access_token);\n headers.append('Accept', 'application/json, text/javascript, */*; q=0.01');\n headers.append('Accept-Language', this.getCurrentLanguage());\n if (!!body) {\n headers.append('Content-Type', 'application/json');\n }\n let init = {\n method: method,\n headers: headers\n };\n if (!!body) {\n init.body = JSON.stringify(body);\n }\n return fetch(url, init);\n }\n static validateResponse(response) {\n if (!response.ok) {\n throw response.statusText;\n }\n return response;\n }\n static escapeParam(param) {\n return String(param)\n .replace(\"\\\\\", \"\\\\\\\\\")\n .replace(\",\", \"\\\\,\");\n }\n static reduceArrayAndEscape(param) {\n if (Array.isArray(param)) {\n let escapedParams = param.map(function (elem) {\n return MyDataHelps.escapeParam(elem);\n });\n return escapedParams.join(\",\");\n }\n return this.escapeParam(param);\n }\n static convertDateToIsoString(date) {\n let paramAsDate = new Date(date);\n if (isNaN(paramAsDate.getTime())) {\n throw \"Cannot interpret parameter as Date\";\n }\n return paramAsDate.toISOString();\n }\n startEmbeddedSurveyInternal(surveyUrl) {\n let mdhSurveyModalId = 'mydatahelps-survey-modal';\n let mdh = this;\n return new Promise(function (resolve, reject) {\n if (document.getElementById(mdhSurveyModalId)) {\n reject(\"Survey already in progress\");\n return;\n }\n window.addEventListener(\"message\", function listener(message) {\n if (message.origin !== new URL(mdh.getBaseUrl()).origin) {\n return;\n }\n let frame = document.getElementById('mydatahelps-survey-frame').contentWindow;\n if (message.source !== frame) {\n return;\n }\n if (message.data.name === 'SurveyWindowInitialized') {\n document.getElementById(mdhSurveyModalId).className += \" loaded\";\n }\n else if (message.data.name === 'SurveyFinished') {\n document.getElementById(mdhSurveyModalId).remove();\n document.body.className = document.body.className.replace(\"no-scroll\", \"\");\n window.removeEventListener(\"message\", listener, true);\n resolve(message.data);\n }\n }, true);\n let surveyModal = document.createElement('div');\n surveyModal.className = 'mydatahelps-survey-modal';\n surveyModal.id = mdhSurveyModalId;\n surveyModal.innerHTML = \"<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='\" + surveyUrl + \"'></iframe></div>\";\n document.body.append(surveyModal);\n document.body.className += ' no-scroll';\n });\n }\n}\n//iOS/Android directly invoke window.MyDataHelps and window.RKStudioClient\n//so it's necessary to explicitly ensure they are present on the window\nconst mdh = new MyDataHelps();\nwindow.MyDataHelps = mdh;\n// For backwards compatibility\nwindow.RKStudioClient = {};\nwindow.RKStudioClient.setActionResult = function (data) {\n window.MyDataHelps.setActionResult(data);\n};\nexport default mdh;\nexport * from './types';\n"],"names":["MyDataHelps","constructor","this","allowedApplicationHosts","accessTokenRenewalBufferSeconds","apiBasePath","unsupportedActions","supportedEvents","currentMessageID","messageHandlers","registeredEventHandlers","refreshTokenPromise","supportedActions","mdh","applicationHost","ancestorOrigins","document","location","getParentOrigin","acceptableOrigin","origin","sourceURL","URL","k","length","hostname","endsWith","console","error","window","webkit","ResearchKit","GetDelegatedAccessToken","data","parent","postMessage","name","messageID","GetDeviceInfo","StartParticipantSurvey","surveyName","OpenExternalLink","url","OpenEmbeddedLink","OpenExternalApplication","modal","Dismiss","PopNavigation","ShowTab","tabKey","ShowParticipantDashboard","dashboardKey","ShowParticipantWebVisualization","visualizationKey","parameters","ShowParticipantWebVisualizationPDF","landscape","htmlViewerZoom","DeleteProviderAccount","accountID","ConnectExternalAccount","externalAccountProviderID","ShowProject","code","JoinProject","action","windowHasAnyActions","addEventListener","message","validateWindowMessageOrigin","setActionResult","triggerEvent","startSurvey","nextMessageID","completeStep","answer","querySurveyAnswers","queryParameters","Object","assign","hasOwnProperty","reduceArrayAndEscape","stepIdentifier","resultIdentifier","before","convertDateToIsoString","after","endpoint","URLSearchParams","toString","connect","then","makeRequest","response","validateResponse","json","deleteSurveyResult","resultID","encodeURIComponent","querySurveyTasks","status","startEmbeddedSurvey","linkIdentifier","language","getCurrentLanguage","surveyUrl","getBaseUrl","startEmbeddedSurveyInternal","startEmbeddedTask","taskLinkIdentifier","openExternalUrl","openEmbeddedUrl","showTab","openApplication","options","dismiss","back","showDashboard","title","undefined","showWebVisualization","showWebVisualizationPdf","showProject","projectCode","joinProject","on","eventName","callback","includes","Error","push","off","eventHandlerIndex","indexOf","splice","event","type","forEach","handler","getParticipantInfo","getProjectInfo","queryDeviceData","observedBefore","observedAfter","persistDeviceData","deviceDataPoints","getExternalAccountProviders","search","category","pageSize","pageNumber","searchParameters","connectExternalAccount","getExternalAccounts","refreshExternalAccount","deleteExternalAccount","Promise","resolve","reject","deleteProviderAccountResponse","success","queryNotifications","sentBefore","sentAfter","queryFitbitDailySummaries","startDate","endDate","queryFitbitSleepLogs","refreshDelegatedAccessToken","token","tokenResponse","tokenExpires","Date","now","expires_in","baseUrl","setTimeout","setParticipantAccessToken","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","deviceInfoResponse","searchParams","has","get","navigator","showGoogleFitSettings","ShowGoogleFitSettings","requestReview","cooldownDays","RequestReview","trackCustomEvent","getDataCollectionSettings","invokeCustomApi","customApi","method","jsonResponse","toUpperCase","parameterString","makeUrl","body","access_token","headers","Headers","append","init","JSON","stringify","fetch","static","ok","statusText","param","String","replace","Array","isArray","map","elem","escapeParam","join","date","paramAsDate","isNaN","getTime","toISOString","mdhSurveyModalId","getElementById","listener","frame","contentWindow","source","className","remove","removeEventListener","surveyModal","createElement","id","innerHTML","RKStudioClient"],"mappings":"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"}
1
+ {"version":3,"file":"MyDataHelps.min.js","sources":["../MyDataHelps.js"],"sourcesContent":["export class MyDataHelps {\n constructor() {\n this.acceptableParentDomains = [\n 'localhost',\n 'careevolution.com',\n 'internal',\n 'b3-deploys.com',\n 'mydatahelps.org',\n 'platform.joinallofus.org',\n 'careevolution.dev',\n 'ce.dev',\n 'mydatahelps.dev'\n ];\n this.accessTokenRenewalBufferSeconds = 120;\n this.apiBasePath = 'api/v1/delegated/';\n this.unsupportedActions = [\"SetHeight\", \"ResearchKit\"];\n this.supportedEvents = [\"surveyDidFinish\", \"applicationDidBecomeVisible\", \"externalAccountSyncComplete\", \"tokenWillExpire\"];\n this.currentMessageID = 1;\n this.messageHandlers = [];\n this.registeredEventHandlers = {};\n this.refreshTokenPromise = null;\n this.standaloneMode = false;\n let mdh = this;\n let applicationHost = getParentOrigin();\n let supportedActions;\n function getParentOrigin() {\n let ancestorOrigins = document.location.ancestorOrigins;\n if (ancestorOrigins && ancestorOrigins[0]) {\n return ancestorOrigins[0];\n }\n return '*';\n }\n function acceptableOrigin(origin) {\n if (origin === '*')\n return true;\n let sourceURL = new URL(origin);\n for (let k = 0; k < mdh.acceptableParentDomains.length; k++) {\n if (sourceURL.hostname === mdh.acceptableParentDomains[k] || sourceURL.hostname.endsWith(\".\" + mdh.acceptableParentDomains[k])) {\n return true;\n }\n }\n return false;\n }\n function validateWindowMessageOrigin(message) {\n if (applicationHost === \"*\") {\n return acceptableOrigin(message.origin);\n }\n return message.origin === applicationHost;\n }\n function addActions(actions) {\n for (let action in actions) {\n window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: actions[action] };\n }\n }\n function receiveWindowMessage(message) {\n if (!validateWindowMessageOrigin(message)) {\n console.error(\"message.origin '\" + message.origin + \"' is not allowed.\");\n throw \"message.origin '\" + message.origin + \"' is not allowed.\";\n }\n if (message.data.messageID) {\n mdh.setActionResult(message.data);\n }\n else {\n mdh.triggerEvent(message.data);\n }\n }\n function windowHasAnyActions() {\n for (let action in supportedActions) {\n if (window.webkit.messageHandlers[action]) {\n return true;\n }\n }\n for (let action in mdh.unsupportedActions) {\n if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {\n return true;\n }\n }\n return false;\n }\n if (!acceptableOrigin(applicationHost)) {\n console.log(\"Detected unsupported parent origin domain.\");\n }\n if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n }\n };\n }\n else {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n },\n \"StartParticipantSurvey\": function (data) {\n window.parent.postMessage({\n name: 'StartParticipantSurvey',\n messageID: data.messageID,\n surveyName: data.surveyName\n }, applicationHost);\n },\n \"OpenExternalLink\": function (data) {\n window.parent.postMessage({ name: 'OpenExternalUrl', url: data }, applicationHost);\n },\n \"OpenEmbeddedLink\": function (data) {\n window.parent.postMessage({ name: 'OpenEmbeddedUrl', url: data }, applicationHost);\n },\n \"OpenExternalApplication\": function (data) {\n window.parent.postMessage({\n name: 'OpenApplication',\n messageID: data.messageID,\n url: data.url,\n modal: data.modal\n }, applicationHost);\n },\n \"Dismiss\": function () {\n window.parent.postMessage({ name: 'Dismiss' }, applicationHost);\n },\n \"PopNavigation\": function () {\n window.parent.postMessage({ name: 'Back' }, applicationHost);\n },\n \"ShowTab\": function (data) {\n window.parent.postMessage({ name: 'ShowTab', tabKey: data }, applicationHost);\n },\n \"ShowParticipantDashboard\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantDashboard',\n dashboardKey: data.dashboardKey,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualization\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualization',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualizationPDF\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualizationPDF',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal,\n landscape: data.landscape,\n htmlViewerZoom: data.htmlViewerZoom\n }, applicationHost);\n },\n \"DeleteProviderAccount\": function (data) {\n window.parent.postMessage({\n name: 'DeleteProviderAccount',\n messageID: data.messageID,\n accountID: data.accountID\n }, applicationHost);\n },\n \"ConnectExternalAccount\": function (data) {\n window.parent.postMessage({\n name: 'ConnectExternalAccount',\n externalAccountProviderID: data.externalAccountProviderID\n }, applicationHost);\n },\n \"ShowProject\": function (data) {\n window.parent.postMessage({ name: 'ShowProject', code: data.code }, applicationHost);\n },\n \"JoinProject\": function (data) {\n window.parent.postMessage({ name: 'JoinProject', code: data.code }, applicationHost);\n }\n };\n }\n if (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {\n window.webkit = {\n messageHandlers: {}\n };\n }\n addActions(supportedActions);\n window.addEventListener(\"message\", receiveWindowMessage, false);\n }\n // Surveys\n startSurvey(surveyName) {\n if (window.webkit.messageHandlers.StartParticipantSurvey) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.StartParticipantSurvey.postMessage({\n messageID: messageID,\n surveyName: surveyName\n });\n }\n }\n completeStep(answer) {\n if (answer === undefined || answer === null)\n answer = '';\n if (window.webkit.messageHandlers.ResearchKit) {\n window.webkit.messageHandlers.ResearchKit.postMessage(answer);\n }\n }\n querySurveyAnswers(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"surveyName\")) {\n queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n }\n if (queryParameters.hasOwnProperty(\"stepIdentifier\")) {\n queryParameters.stepIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.stepIdentifier);\n }\n if (queryParameters.hasOwnProperty(\"resultIdentifier\")) {\n queryParameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.resultIdentifier);\n }\n if (queryParameters.hasOwnProperty(\"answer\")) {\n queryParameters.answer = MyDataHelps.reduceArrayAndEscape(queryParameters.answer);\n }\n if (queryParameters.hasOwnProperty(\"before\")) {\n queryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n }\n if (queryParameters.hasOwnProperty(\"after\")) {\n queryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'surveyanswers?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n deleteSurveyResult(resultID) {\n const endpoint = 'surveyresults/' + encodeURIComponent(resultID);\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'DELETE', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n querySurveyTasks(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"status\")) {\n queryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status);\n }\n if (queryParameters.hasOwnProperty(\"surveyName\")) {\n queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'surveytasks?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n startEmbeddedSurvey(linkIdentifier, surveyName, language) {\n if (!language) {\n language = this.getCurrentLanguage();\n }\n let surveyUrl = this.getBaseUrl() + \"mydatahelps/\" + linkIdentifier + '/surveylink/' + surveyName + \"?lang=\" + language;\n return this.startEmbeddedSurveyInternal(surveyUrl);\n }\n startEmbeddedTask(linkIdentifier, taskLinkIdentifier, language) {\n if (!language) {\n language = this.getCurrentLanguage();\n }\n let surveyUrl = this.getBaseUrl() + \"mydatahelps/\" + linkIdentifier + '/tasklink/' + taskLinkIdentifier + \"?lang=\" + language;\n return this.startEmbeddedSurveyInternal(surveyUrl);\n }\n // Navigation\n openExternalUrl(url) {\n if (window.webkit.messageHandlers.OpenExternalLink) {\n window.webkit.messageHandlers.OpenExternalLink.postMessage(url);\n }\n }\n openEmbeddedUrl(url) {\n if (window.webkit.messageHandlers.OpenEmbeddedLink) {\n window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);\n }\n }\n showTab(tabKey) {\n if (window.webkit.messageHandlers.ShowTab) {\n window.webkit.messageHandlers.ShowTab.postMessage(tabKey);\n }\n }\n openApplication(url, options) {\n if (window.webkit.messageHandlers.OpenExternalApplication) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.OpenExternalApplication.postMessage({\n messageID: messageID,\n url: url,\n modal: !!(options && options.modal)\n });\n }\n }\n dismiss() {\n if (window.webkit.messageHandlers.Dismiss) {\n window.webkit.messageHandlers.Dismiss.postMessage({});\n }\n }\n back() {\n if (window.webkit.messageHandlers.PopNavigation) {\n window.webkit.messageHandlers.PopNavigation.postMessage({});\n }\n }\n showDashboard(dashboardKey, options) {\n if (window.webkit.messageHandlers.ShowParticipantDashboard) {\n window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({\n dashboardKey: dashboardKey,\n modal: !!(options && options.modal),\n title: options && options.title ? options.title : undefined\n });\n }\n }\n showWebVisualization(visualizationKey, parameters, options) {\n if (window.webkit.messageHandlers.ShowParticipantWebVisualization) {\n window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({\n visualizationKey: visualizationKey,\n parameters: parameters,\n modal: !!(options && options.modal),\n title: options && options.title ? options.title : undefined\n });\n }\n }\n showWebVisualizationPdf(visualizationKey, parameters, options) {\n if (window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF) {\n window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({\n visualizationKey: visualizationKey,\n parameters: parameters,\n landscape: !!(options && options.landscape),\n htmlViewerZoom: options && options.htmlViewerZoom\n });\n }\n }\n showProject(projectCode) {\n if (window.webkit.messageHandlers.ShowProject) {\n window.webkit.messageHandlers.ShowProject.postMessage({ code: projectCode });\n }\n }\n joinProject(projectCode) {\n if (window.webkit.messageHandlers.JoinProject) {\n window.webkit.messageHandlers.JoinProject.postMessage({ code: projectCode });\n }\n }\n //Events\n on(eventName, callback) {\n if (!this.supportedEvents.includes(eventName)) {\n throw new Error(eventName + \" is not a supported event type.\");\n }\n if (!this.registeredEventHandlers[eventName]) {\n this.registeredEventHandlers[eventName] = [];\n }\n this.registeredEventHandlers[eventName].push(callback);\n }\n off(eventName, callback) {\n if (!this.supportedEvents.includes(eventName)) {\n throw new Error(eventName + \" is not a supported event type.\");\n }\n if (!this.registeredEventHandlers[eventName])\n return;\n let eventHandlerIndex = this.registeredEventHandlers[eventName].indexOf(callback);\n if (eventHandlerIndex !== -1) {\n this.registeredEventHandlers[eventName].splice(eventHandlerIndex, 1);\n }\n }\n triggerEvent(event) {\n let eventName = event.type;\n if (this.supportedEvents.includes(eventName) && this.registeredEventHandlers[eventName]) {\n this.registeredEventHandlers[eventName].forEach(function (handler) {\n handler(event);\n });\n }\n }\n setActionResult(data) {\n this.messageHandlers[data.messageID](data);\n }\n // Participant Info\n getParticipantInfo() {\n const mdh = this;\n const endpoint = 'participant';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n getProjectInfo() {\n const mdh = this;\n const endpoint = 'project';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Device Data\n queryDeviceData(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"type\")) {\n queryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type);\n }\n if (queryParameters.hasOwnProperty(\"observedBefore\")) {\n queryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n }\n if (queryParameters.hasOwnProperty(\"observedAfter\")) {\n queryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'devicedata?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n persistDeviceData(deviceDataPoints) {\n const endpoint = 'devicedata';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', deviceDataPoints);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n // External Accounts\n getExternalAccountProviders(search, category, pageSize, pageNumber) {\n let searchParameters = {};\n if (!!search)\n searchParameters.search = search;\n if (!!category)\n searchParameters.category = category;\n if (!!pageSize)\n searchParameters.pageSize = pageSize;\n if (!!pageNumber)\n searchParameters.pageNumber = pageNumber;\n const queryString = new URLSearchParams(searchParameters).toString();\n const endpoint = 'externalaccountproviders?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n connectExternalAccount(externalAccountProviderID, standaloneModeFinalRedirectPath) {\n if (this.standaloneMode) {\n standaloneModeFinalRedirectPath = standaloneModeFinalRedirectPath || window.location.href;\n const searchParameters = { finalRedirectPath: standaloneModeFinalRedirectPath };\n const queryString = new URLSearchParams(searchParameters).toString();\n const endpoint = \"externalaccountproviders/\" + externalAccountProviderID + \"/connect?\" + queryString;\n const mdh = this;\n this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.text();\n })\n .then(function (redirectUrl) {\n window.top.location = redirectUrl.replace(/['\"]+/g, '');\n });\n }\n else if (window.webkit.messageHandlers.ConnectExternalAccount) {\n window.webkit.messageHandlers.ConnectExternalAccount.postMessage({ externalAccountProviderID: externalAccountProviderID });\n }\n }\n getExternalAccounts() {\n const endpoint = 'externalaccounts';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n refreshExternalAccount(accountID) {\n const endpoint = 'externalaccounts/refresh/' + accountID;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n deleteExternalAccount(accountID) {\n const endpoint = 'externalaccounts/delete/' + encodeURIComponent(accountID);\n const mdh = this;\n if (this.isStandaloneMode()) {\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'DELETE', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n });\n }\n return new Promise(function (resolve, reject) {\n if (window.webkit.messageHandlers.DeleteProviderAccount) {\n const messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {\n if (!deleteProviderAccountResponse.success) {\n reject(deleteProviderAccountResponse);\n }\n else {\n resolve(deleteProviderAccountResponse);\n }\n };\n window.webkit.messageHandlers.DeleteProviderAccount.postMessage({\n messageID: messageID,\n accountID: accountID\n });\n }\n else {\n reject();\n }\n });\n }\n // Notifications\n queryNotifications(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"sentBefore\")) {\n queryParameters.sentBefore = MyDataHelps.convertDateToIsoString(queryParameters.sentBefore);\n }\n if (queryParameters.hasOwnProperty(\"sentAfter\")) {\n queryParameters.sentAfter = MyDataHelps.convertDateToIsoString(queryParameters.sentAfter);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'notifications?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Fitbit\n queryFitbitDailySummaries(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'fitbit/dailySummaries?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n queryFitbitSleepLogs(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'fitbit/sleepLogs?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // AppleHealth\n queryAppleHealthActivitySummaries(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'appleHealth/activitySummaries?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n queryAppleHealthWorkouts(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'appleHealth/workouts?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Authorization\n connect() {\n const mdh = this;\n let refreshDelegatedAccessToken = function () {\n mdh.token = null;\n mdh.refreshTokenPromise = new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (tokenResponse) {\n if (tokenResponse.success) {\n mdh.tokenExpires = Date.now() + (tokenResponse.data.expires_in * 1000);\n mdh.token = tokenResponse.data;\n mdh.baseUrl = tokenResponse.baseUrl;\n setTimeout(refreshDelegatedAccessToken, ((tokenResponse.data.expires_in - mdh.accessTokenRenewalBufferSeconds) * 1000));\n resolve(null);\n }\n else {\n mdh.token = null;\n reject(tokenResponse.message);\n }\n mdh.messageHandlers[messageID] = null;\n mdh.refreshTokenPromise = null;\n };\n window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({ messageID: messageID });\n });\n };\n if (this.token && Date.now() < this.tokenExpires) {\n return Promise.resolve();\n }\n if (this.isStandaloneMode()) {\n let error = this.token ? \"access token is expired or invalid\" : \"access token must be explicitly provided using the setParticipantAccess method\";\n console.log(error);\n return Promise.reject(error);\n }\n if (!this.refreshTokenPromise) {\n refreshDelegatedAccessToken();\n }\n // Re-use promise if refresh already in progress\n return this.refreshTokenPromise;\n }\n setParticipantAccessToken(token, baseUrl) {\n this.enableStandaloneMode();\n this.token = token;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n this.tokenExpires = Date.now() + (this.token.expires_in * 1000);\n const mdh = this;\n setTimeout(function () {\n mdh.triggerEvent({ type: \"tokenWillExpire\" });\n }, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));\n }\n // Miscellaneous\n isStandaloneMode() {\n return this.standaloneMode;\n }\n enableStandaloneMode() {\n this.standaloneMode = true;\n if (window.webkit) {\n window.webkit.messageHandlers = {};\n }\n }\n setStatusBarStyle(style) {\n if (window.webkit.messageHandlers.SetStatusBarStyle) {\n window.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });\n }\n }\n getDeviceInfo() {\n let mdh = this;\n return new Promise(function (resolve, reject) {\n if (mdh.isStandaloneMode()) {\n resolve(null);\n }\n else if (window.webkit.messageHandlers.GetDeviceInfo) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (deviceInfoResponse) {\n resolve(deviceInfoResponse.data);\n };\n window.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });\n }\n else {\n reject();\n }\n });\n }\n setCurrentLanguage(language) {\n this.language = language;\n }\n getCurrentLanguage() {\n let searchParams = new URLSearchParams(window.location.search);\n if (searchParams.has(\"lang\")) {\n return searchParams.get(\"lang\");\n }\n return this.language || navigator.language;\n }\n showGoogleFitSettings() {\n if (window.webkit.messageHandlers.ShowGoogleFitSettings) {\n window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({});\n }\n }\n requestReview(cooldownDays) {\n if (window.webkit.messageHandlers.RequestReview) {\n window.webkit.messageHandlers.RequestReview.postMessage({ cooldownDays: cooldownDays });\n }\n }\n trackCustomEvent(event) {\n const endpoint = 'customevents';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', event);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n getDataCollectionSettings() {\n const mdh = this;\n const endpoint = 'datacollectionsettings';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n invokeCustomApi(customApi, method, queryParameters, jsonResponse) {\n if (customApi.includes('?')) {\n throw new Error(\"Cannot include query parameters directly in the \\\"customApi\\\" string. Provide as an argument for \\\"queryParameters\\\" instead.\");\n }\n let endpoint = 'custom/' + customApi;\n method = method.toUpperCase();\n if (queryParameters !== null && queryParameters !== undefined && (method === 'GET' || method === 'DELETE')) {\n let parameterString = new URLSearchParams(queryParameters).toString();\n endpoint += \"?\" + parameterString;\n queryParameters = null;\n }\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, method, queryParameters);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return jsonResponse ? response.json() : undefined;\n });\n }\n nextMessageID() {\n return this.currentMessageID++;\n }\n getBaseUrl() {\n return this.baseUrl || 'https://mydatahelps.org/';\n }\n makeUrl(endpoint) {\n if (!this.baseUrl) {\n console.error(\"Cannot use makeUrl without MyDataHelps.baseUrl.\");\n throw \"Cannot use makeUrl without MyDataHelps.baseUrl.\";\n }\n return this.baseUrl + this.apiBasePath + endpoint;\n }\n makeRequest(endpoint, method, body) {\n if (!this.token || !this.token.access_token) {\n throw \"No access_token available for request authorization.\";\n }\n let url = this.makeUrl(endpoint);\n let headers = new Headers();\n headers.append('Authorization', 'Bearer ' + this.token.access_token);\n headers.append('Accept', 'application/json, text/javascript, */*; q=0.01');\n headers.append('Accept-Language', this.getCurrentLanguage());\n if (!!body) {\n headers.append('Content-Type', 'application/json');\n }\n let init = {\n method: method,\n headers: headers\n };\n if (!!body) {\n init.body = JSON.stringify(body);\n }\n return fetch(url, init);\n }\n static validateResponse(response) {\n if (!response.ok) {\n throw response.statusText;\n }\n return response;\n }\n static escapeParam(param) {\n return String(param)\n .replace(\"\\\\\", \"\\\\\\\\\")\n .replace(\",\", \"\\\\,\");\n }\n static reduceArrayAndEscape(param) {\n if (Array.isArray(param)) {\n let escapedParams = param.map(function (elem) {\n return MyDataHelps.escapeParam(elem);\n });\n return escapedParams.join(\",\");\n }\n return this.escapeParam(param);\n }\n static convertDateToIsoString(date) {\n let paramAsDate = new Date(date);\n if (isNaN(paramAsDate.getTime())) {\n throw \"Cannot interpret parameter as Date\";\n }\n return paramAsDate.toISOString();\n }\n startEmbeddedSurveyInternal(surveyUrl) {\n let mdhSurveyModalId = 'mydatahelps-survey-modal';\n let mdh = this;\n return new Promise(function (resolve, reject) {\n if (document.getElementById(mdhSurveyModalId)) {\n reject(\"Survey already in progress\");\n return;\n }\n window.addEventListener(\"message\", function listener(message) {\n if (message.origin !== new URL(mdh.getBaseUrl()).origin) {\n return;\n }\n let frame = document.getElementById('mydatahelps-survey-frame').contentWindow;\n if (message.source !== frame) {\n return;\n }\n if (message.data.name === 'SurveyWindowInitialized') {\n document.getElementById(mdhSurveyModalId).className += \" loaded\";\n }\n else if (message.data.name === 'SurveyFinished') {\n document.getElementById(mdhSurveyModalId).remove();\n document.body.className = document.body.className.replace(\"no-scroll\", \"\");\n window.removeEventListener(\"message\", listener, true);\n resolve(message.data);\n }\n }, true);\n let surveyModal = document.createElement('div');\n surveyModal.className = 'mydatahelps-survey-modal';\n surveyModal.id = mdhSurveyModalId;\n surveyModal.innerHTML = \"<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='\" + surveyUrl + \"'></iframe></div>\";\n document.body.append(surveyModal);\n document.body.className += ' no-scroll';\n });\n }\n}\n//iOS/Android directly invoke window.MyDataHelps and window.RKStudioClient\n//so it's necessary to explicitly ensure they are present on the window\nconst mdh = new MyDataHelps();\nwindow.MyDataHelps = mdh;\n// For backwards compatibility\nwindow.RKStudioClient = {};\nwindow.RKStudioClient.setActionResult = function (data) {\n window.MyDataHelps.setActionResult(data);\n};\nexport default mdh;\nexport * from './types';\n"],"names":["MyDataHelps","constructor","this","acceptableParentDomains","accessTokenRenewalBufferSeconds","apiBasePath","unsupportedActions","supportedEvents","currentMessageID","messageHandlers","registeredEventHandlers","refreshTokenPromise","standaloneMode","supportedActions","mdh","applicationHost","ancestorOrigins","document","location","getParentOrigin","acceptableOrigin","origin","sourceURL","URL","k","length","hostname","endsWith","console","log","window","webkit","ResearchKit","GetDelegatedAccessToken","data","parent","postMessage","name","messageID","GetDeviceInfo","StartParticipantSurvey","surveyName","OpenExternalLink","url","OpenEmbeddedLink","OpenExternalApplication","modal","Dismiss","PopNavigation","ShowTab","tabKey","ShowParticipantDashboard","dashboardKey","ShowParticipantWebVisualization","visualizationKey","parameters","ShowParticipantWebVisualizationPDF","landscape","htmlViewerZoom","DeleteProviderAccount","accountID","ConnectExternalAccount","externalAccountProviderID","ShowProject","code","JoinProject","action","windowHasAnyActions","actions","addActions","addEventListener","message","validateWindowMessageOrigin","error","setActionResult","triggerEvent","startSurvey","nextMessageID","completeStep","answer","querySurveyAnswers","queryParameters","Object","assign","hasOwnProperty","reduceArrayAndEscape","stepIdentifier","resultIdentifier","before","convertDateToIsoString","after","endpoint","URLSearchParams","toString","connect","then","makeRequest","response","validateResponse","json","deleteSurveyResult","resultID","encodeURIComponent","querySurveyTasks","status","startEmbeddedSurvey","linkIdentifier","language","getCurrentLanguage","surveyUrl","getBaseUrl","startEmbeddedSurveyInternal","startEmbeddedTask","taskLinkIdentifier","openExternalUrl","openEmbeddedUrl","showTab","openApplication","options","dismiss","back","showDashboard","title","undefined","showWebVisualization","showWebVisualizationPdf","showProject","projectCode","joinProject","on","eventName","callback","includes","Error","push","off","eventHandlerIndex","indexOf","splice","event","type","forEach","handler","getParticipantInfo","getProjectInfo","queryDeviceData","observedBefore","observedAfter","persistDeviceData","deviceDataPoints","getExternalAccountProviders","search","category","pageSize","pageNumber","searchParameters","connectExternalAccount","standaloneModeFinalRedirectPath","href","finalRedirectPath","text","redirectUrl","top","replace","getExternalAccounts","refreshExternalAccount","deleteExternalAccount","isStandaloneMode","Promise","resolve","reject","deleteProviderAccountResponse","success","queryNotifications","sentBefore","sentAfter","queryFitbitDailySummaries","startDate","endDate","queryFitbitSleepLogs","queryAppleHealthActivitySummaries","queryAppleHealthWorkouts","refreshDelegatedAccessToken","token","tokenResponse","tokenExpires","Date","now","expires_in","baseUrl","setTimeout","setParticipantAccessToken","enableStandaloneMode","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","deviceInfoResponse","setCurrentLanguage","searchParams","has","get","navigator","showGoogleFitSettings","ShowGoogleFitSettings","requestReview","cooldownDays","RequestReview","trackCustomEvent","getDataCollectionSettings","invokeCustomApi","customApi","method","jsonResponse","toUpperCase","parameterString","makeUrl","body","access_token","headers","Headers","append","init","JSON","stringify","fetch","static","ok","statusText","param","String","Array","isArray","map","elem","escapeParam","join","date","paramAsDate","isNaN","getTime","toISOString","mdhSurveyModalId","getElementById","listener","frame","contentWindow","source","className","remove","removeEventListener","surveyModal","createElement","id","innerHTML","RKStudioClient"],"mappings":"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"}
package/README.md CHANGED
@@ -8,4 +8,37 @@ The SDK can be used to create interactive dashboards, personalized by participan
8
8
 
9
9
  ## Get Started
10
10
 
11
- Documentation and examples can be found at [CareEvolution's RKStudio SDK Documentation](https://developer.rkstudio.careevolution.com/sdk/) page.
11
+ Documentation and examples can be found at [CareEvolution's RKStudio SDK Documentation](https://developer.rkstudio.careevolution.com/sdk/) page.
12
+
13
+ ## To test changes locally (one way)
14
+
15
+ Run
16
+
17
+ npm run build
18
+
19
+ In the `cdn` folder drop an `index.html` file with following contents and open it in a browser:
20
+
21
+ <!DOCTYPE html>
22
+ <html>
23
+
24
+ <head>
25
+ <script type='text/javascript' src='MyDataHelps.min.js'></script>
26
+ <script>
27
+ MyDataHelps.setParticipantAccessToken({
28
+ access_token: '0c2560fe3045546be8d1da8b5a0efb28',
29
+ expires_in: 21600,
30
+ token_type: 'Bearer',
31
+ }, "https://rkstudio.careevolution.dev/inv/");
32
+
33
+ MyDataHelps.queryAppleHealthWorkouts({
34
+ startDate: new Date(2021, 5, 0).toISOString()
35
+ }).then(x => console.log(x));
36
+ </script>
37
+ </head>
38
+
39
+ <body>
40
+ </body>
41
+
42
+ </html>
43
+
44
+ The delegated access token can be picked up from QA via a Coordinator entered simple webviewstep form that just prints out the token.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@careevolution/mydatahelps-js",
3
- "version": "3.2.2",
3
+ "version": "3.3.0",
4
4
  "description": "MyDataHelps client to be used by external applications for integrations inside the MyDataHelps platform",
5
5
  "type": "module",
6
6
  "types": "MyDataHelps.d.ts",
package/types.d.ts CHANGED
@@ -290,6 +290,80 @@ export interface FitbitSleepLogs {
290
290
  sleepLevelRem: number;
291
291
  sleepLevelWake: number;
292
292
  }
293
+ export interface AppleHealthQuery {
294
+ pageID?: Guid;
295
+ pageSize?: number;
296
+ startDate?: string;
297
+ endDate?: string;
298
+ }
299
+ export interface AppleHealthPage {
300
+ nextPageID?: Guid;
301
+ totalResults: number;
302
+ }
303
+ export interface AppleHealthActivitySummaryPage extends AppleHealthPage {
304
+ results: AppleHealthActivitySummary[];
305
+ }
306
+ export interface AppleHealthWorkoutPage extends AppleHealthPage {
307
+ results: AppleHealthWorkout[];
308
+ }
309
+ export interface AppleHealthActivitySummary {
310
+ id: Guid;
311
+ activeEnergyBurned: number;
312
+ activeEnergyBurnedGoal: number;
313
+ appleExerciseTime: number;
314
+ appleExerciseTimeGoal: number;
315
+ appleStandHours: number;
316
+ appleStandHoursGoal: number;
317
+ startDate: string;
318
+ endDate: string;
319
+ insertedDate: string;
320
+ }
321
+ export interface AppleHealthWorkout {
322
+ id: Guid;
323
+ startDate?: string;
324
+ endDate: string;
325
+ source: AppleHealthSourceInfo;
326
+ metadata: {
327
+ [key: string]: string;
328
+ };
329
+ insertedDate: string;
330
+ summary: AppleHealthWorkoutSummary;
331
+ device: AppleHealthDeviceInfo;
332
+ events: AppleHealthWorkoutEvent[];
333
+ }
334
+ export interface AppleHealthSourceInfo {
335
+ name: string;
336
+ identifier: string;
337
+ version: string;
338
+ operatingSystemVersion: string;
339
+ productType: string;
340
+ }
341
+ export interface AppleHealthDeviceInfo {
342
+ fdaIdentifier: string;
343
+ firmwareVersion: string;
344
+ hardwareVersion: string;
345
+ localIdentifier: string;
346
+ manufacturer: string;
347
+ model: string;
348
+ name: string;
349
+ softwareVersion: string;
350
+ }
351
+ export interface AppleHealthWorkoutSummary {
352
+ activityType: string;
353
+ duration?: number;
354
+ totalEnergyBurned?: number;
355
+ totalDistance?: number;
356
+ totalSwimmingStrokeCount?: number;
357
+ totalFlightsClimbed?: number;
358
+ }
359
+ export interface AppleHealthWorkoutEvent {
360
+ date?: string;
361
+ type: string;
362
+ metadata: {
363
+ [key: string]: string;
364
+ };
365
+ endDate?: string;
366
+ }
293
367
  export interface EventData {
294
368
  type: string;
295
369
  messageID?: number;