@careevolution/mydatahelps-js 3.2.3 → 3.4.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,8 @@
1
+ import "../MyDataHelps.css";
1
2
  import * as Model from "./types";
2
3
  export declare class MyDataHelps {
3
4
  baseUrl: string;
5
+ language: string;
4
6
  token: Model.Token;
5
7
  tokenExpires: number;
6
8
  startSurvey(surveyName: string): void;
@@ -30,17 +32,23 @@ export declare class MyDataHelps {
30
32
  queryDeviceData(queryParameters: Model.DeviceDataPointQuery): Promise<Model.DeviceDataPointsPage>;
31
33
  persistDeviceData(deviceDataPoints: Model.PersistableDeviceDataPoint[]): Promise<void>;
32
34
  getExternalAccountProviders(search: string | null, category: string | null, pageSize: number, pageNumber: number): Promise<Model.ExternalAccountProvidersPage>;
33
- connectExternalAccount(externalAccountProviderID: number): void;
35
+ connectExternalAccount(externalAccountProviderID: number, standaloneModeFinalRedirectPath?: string): void;
34
36
  getExternalAccounts(): Promise<Model.ExternalAccount[]>;
35
37
  refreshExternalAccount(accountID: number): Promise<void>;
36
38
  deleteExternalAccount(accountID: number): Promise<any>;
37
39
  queryNotifications(queryParameters: Model.NotificationQueryParameters): Promise<Model.NotificationsPage>;
38
40
  queryFitbitDailySummaries(queryParameters: Model.FitbitQuery): Promise<Model.FitbitDailySummariesPage>;
39
41
  queryFitbitSleepLogs(queryParameters: Model.FitbitQuery): Promise<Model.FitbitSleepLogsPage>;
42
+ queryAppleHealthActivitySummaries(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthActivitySummaryPage>;
43
+ queryAppleHealthWorkouts(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthWorkoutPage>;
40
44
  connect(): Promise<void>;
41
45
  setParticipantAccessToken(token: Model.Token, baseUrl: string): void;
46
+ isStandaloneMode(): boolean;
47
+ enableStandaloneMode(): void;
42
48
  setStatusBarStyle(style: Model.StatusBarStyle): void;
43
49
  getDeviceInfo(): Promise<Model.DeviceInfo>;
50
+ setSupportedLanguages(languages: string[]): void;
51
+ setCurrentLanguage(language: string): void;
44
52
  getCurrentLanguage(): string;
45
53
  showGoogleFitSettings(): void;
46
54
  requestReview(cooldownDays?: number): void;
@@ -48,24 +56,28 @@ export declare class MyDataHelps {
48
56
  getDataCollectionSettings(): Promise<Model.DataCollectionSettings>;
49
57
  invokeCustomApi(customApi: string, method: string, queryParameters: string, jsonResponse: boolean): Promise<any>;
50
58
  constructor();
51
- private readonly allowedApplicationHosts;
59
+ private readonly acceptableParentDomains;
52
60
  private readonly accessTokenRenewalBufferSeconds;
53
61
  private readonly apiBasePath;
54
62
  private readonly unsupportedActions;
55
63
  private readonly supportedEvents;
64
+ private readonly supportedLanguages;
56
65
  private currentMessageID;
57
66
  private messageHandlers;
58
67
  private registeredEventHandlers;
59
68
  private refreshTokenPromise;
69
+ private standaloneMode;
60
70
  private nextMessageID;
61
71
  private getBaseUrl;
62
72
  private makeUrl;
63
73
  private makeRequest;
74
+ private getSupportedLanguage;
64
75
  private static validateResponse;
65
76
  private static escapeParam;
66
77
  private static reduceArrayAndEscape;
67
78
  private static convertDateToIsoString;
68
79
  private startEmbeddedSurveyInternal;
80
+ private startDelegatedSurvey;
69
81
  }
70
82
  declare const mdh: MyDataHelps;
71
83
  export default mdh;
package/MyDataHelps.js CHANGED
@@ -1,6 +1,12 @@
1
+ var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}
2
+
3
+ var css = "body.no-scroll{height:100%;overflow:hidden!important;position:fixed!important;width:100%}#mydatahelps-survey-modal{background:rgba(0,0,0,.5);bottom:0;left:0;position:fixed;right:0;top:0}#mydatahelps-survey-modal .mydatahelps-survey{background:#fff;border-radius:5px;box-sizing:border-box;height:calc(100% - 32px);margin:16px auto;max-width:768px;overflow:hidden;position:relative;z-index:5002}#mydatahelps-survey-modal .mydatahelps-survey iframe{border:none;bottom:0;height:100%;left:0;opacity:0;position:absolute;right:0;top:0;width:100%}#mydatahelps-survey-modal.loaded .mydatahelps-survey iframe{opacity:1}@media (max-width:768px){#mydatahelps-survey-modal .mydatahelps-survey{border-radius:0;height:100%;margin-bottom:0;margin-top:0}}#mydatahelps-survey-modal .mydatahelps-survey .loader{-webkit-animation:load3 1.4s linear infinite;animation:load3 1.4s linear infinite;background:#fff;background:-moz-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:-webkit-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:-o-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:-ms-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:linear-gradient(90deg,#bbb 10%,hsla(0,0%,100%,0) 42%);border-radius:50%;font-size:5px;height:11em;left:calc(50% - 5.5em);position:absolute;text-indent:-9999em;top:calc(50% - 5.5em);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);width:11em;z-index:1}#mydatahelps-survey-modal .mydatahelps-survey .loader:before{background:#bbb;border-radius:100% 0 0 0;content:\"\";height:50%;left:0;position:absolute;top:0;width:50%}#mydatahelps-survey-modal .mydatahelps-survey .loader:after{background:#fff;border-radius:50%;bottom:0;content:\"\";height:75%;left:0;margin:auto;position:absolute;right:0;top:0;width:75%}#mydatahelps-survey-modal.loaded .mydatahelps-survey .loader{display:none}@-webkit-keyframes load3{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes load3{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}";
4
+ n(css,{});
5
+
6
+ // @ts-ignore : let rollup handle CSS injection
1
7
  class MyDataHelps {
2
8
  constructor() {
3
- this.allowedApplicationHosts = [
9
+ this.acceptableParentDomains = [
4
10
  'localhost',
5
11
  'careevolution.com',
6
12
  'internal',
@@ -15,10 +21,12 @@ class MyDataHelps {
15
21
  this.apiBasePath = 'api/v1/delegated/';
16
22
  this.unsupportedActions = ["SetHeight", "ResearchKit"];
17
23
  this.supportedEvents = ["surveyDidFinish", "applicationDidBecomeVisible", "externalAccountSyncComplete", "tokenWillExpire"];
24
+ this.supportedLanguages = [];
18
25
  this.currentMessageID = 1;
19
26
  this.messageHandlers = [];
20
27
  this.registeredEventHandlers = {};
21
28
  this.refreshTokenPromise = null;
29
+ this.standaloneMode = false;
22
30
  let mdh = this;
23
31
  let applicationHost = getParentOrigin();
24
32
  let supportedActions;
@@ -33,8 +41,8 @@ class MyDataHelps {
33
41
  if (origin === '*')
34
42
  return true;
35
43
  let sourceURL = new URL(origin);
36
- for (let k = 0; k < mdh.allowedApplicationHosts.length; k++) {
37
- if (sourceURL.hostname === mdh.allowedApplicationHosts[k] || sourceURL.hostname.endsWith("." + mdh.allowedApplicationHosts[k])) {
44
+ for (let k = 0; k < mdh.acceptableParentDomains.length; k++) {
45
+ if (sourceURL.hostname === mdh.acceptableParentDomains[k] || sourceURL.hostname.endsWith("." + mdh.acceptableParentDomains[k])) {
38
46
  return true;
39
47
  }
40
48
  }
@@ -46,6 +54,11 @@ class MyDataHelps {
46
54
  }
47
55
  return message.origin === applicationHost;
48
56
  }
57
+ function addActions(actions) {
58
+ for (let action in actions) {
59
+ window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: actions[action] };
60
+ }
61
+ }
49
62
  function receiveWindowMessage(message) {
50
63
  if (!validateWindowMessageOrigin(message)) {
51
64
  console.error("message.origin '" + message.origin + "' is not allowed.");
@@ -58,9 +71,21 @@ class MyDataHelps {
58
71
  mdh.triggerEvent(message.data);
59
72
  }
60
73
  }
74
+ function windowHasAnyActions() {
75
+ for (let action in supportedActions) {
76
+ if (window.webkit.messageHandlers[action]) {
77
+ return true;
78
+ }
79
+ }
80
+ for (let action in mdh.unsupportedActions) {
81
+ if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {
82
+ return true;
83
+ }
84
+ }
85
+ return false;
86
+ }
61
87
  if (!acceptableOrigin(applicationHost)) {
62
- console.error("Application is not hosted at an approved origin.");
63
- throw "Application is not hosted at an approved origin.";
88
+ console.log("Detected unsupported parent origin domain.");
64
89
  }
65
90
  if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {
66
91
  supportedActions = {
@@ -69,9 +94,6 @@ class MyDataHelps {
69
94
  name: 'GetDelegatedAccessToken',
70
95
  messageID: data.messageID
71
96
  }, applicationHost);
72
- },
73
- "GetDeviceInfo": function (data) {
74
- window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);
75
97
  }
76
98
  };
77
99
  }
@@ -162,36 +184,26 @@ class MyDataHelps {
162
184
  }
163
185
  };
164
186
  }
165
- function windowHasAnyActions() {
166
- for (let action in supportedActions) {
167
- if (window.webkit.messageHandlers[action]) {
168
- return true;
169
- }
170
- }
171
- for (let action in mdh.unsupportedActions) {
172
- if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {
173
- return true;
174
- }
175
- }
176
- return false;
177
- }
178
187
  if (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {
179
188
  window.webkit = {
180
189
  messageHandlers: {}
181
190
  };
182
191
  }
183
- for (let action in supportedActions) {
184
- window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: supportedActions[action] };
185
- }
192
+ addActions(supportedActions);
186
193
  window.addEventListener("message", receiveWindowMessage, false);
187
194
  }
188
195
  // Surveys
189
196
  startSurvey(surveyName) {
190
- let messageID = this.nextMessageID();
191
- window.webkit.messageHandlers.StartParticipantSurvey.postMessage({
192
- messageID: messageID,
193
- surveyName: surveyName
194
- });
197
+ if (this.isStandaloneMode()) {
198
+ this.startDelegatedSurvey(`${this.baseUrl}/survey?surveyName=${encodeURIComponent(surveyName)}`);
199
+ }
200
+ else if (window.webkit.messageHandlers.StartParticipantSurvey) {
201
+ let messageID = this.nextMessageID();
202
+ window.webkit.messageHandlers.StartParticipantSurvey.postMessage({
203
+ messageID: messageID,
204
+ surveyName: surveyName
205
+ });
206
+ }
195
207
  }
196
208
  completeStep(answer) {
197
209
  if (answer === undefined || answer === null)
@@ -289,50 +301,68 @@ class MyDataHelps {
289
301
  }
290
302
  // Navigation
291
303
  openExternalUrl(url) {
292
- window.webkit.messageHandlers.OpenExternalLink.postMessage(url);
304
+ if (window.webkit.messageHandlers.OpenExternalLink) {
305
+ window.webkit.messageHandlers.OpenExternalLink.postMessage(url);
306
+ }
293
307
  }
294
308
  openEmbeddedUrl(url) {
295
- window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);
309
+ if (window.webkit.messageHandlers.OpenEmbeddedLink) {
310
+ window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);
311
+ }
296
312
  }
297
313
  showTab(tabKey) {
298
- window.webkit.messageHandlers.ShowTab.postMessage(tabKey);
314
+ if (window.webkit.messageHandlers.ShowTab) {
315
+ window.webkit.messageHandlers.ShowTab.postMessage(tabKey);
316
+ }
299
317
  }
300
318
  openApplication(url, options) {
301
- let messageID = this.nextMessageID();
302
- window.webkit.messageHandlers.OpenExternalApplication.postMessage({
303
- messageID: messageID,
304
- url: url,
305
- modal: !!(options && options.modal)
306
- });
319
+ if (window.webkit.messageHandlers.OpenExternalApplication) {
320
+ let messageID = this.nextMessageID();
321
+ window.webkit.messageHandlers.OpenExternalApplication.postMessage({
322
+ messageID: messageID,
323
+ url: url,
324
+ modal: !!(options && options.modal)
325
+ });
326
+ }
307
327
  }
308
328
  dismiss() {
309
- window.webkit.messageHandlers.Dismiss.postMessage({});
329
+ if (window.webkit.messageHandlers.Dismiss) {
330
+ window.webkit.messageHandlers.Dismiss.postMessage({});
331
+ }
310
332
  }
311
333
  back() {
312
- window.webkit.messageHandlers.PopNavigation.postMessage({});
334
+ if (window.webkit.messageHandlers.PopNavigation) {
335
+ window.webkit.messageHandlers.PopNavigation.postMessage({});
336
+ }
313
337
  }
314
338
  showDashboard(dashboardKey, options) {
315
- window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({
316
- dashboardKey: dashboardKey,
317
- modal: !!(options && options.modal),
318
- title: options && options.title ? options.title : undefined
319
- });
339
+ if (window.webkit.messageHandlers.ShowParticipantDashboard) {
340
+ window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({
341
+ dashboardKey: dashboardKey,
342
+ modal: !!(options && options.modal),
343
+ title: options && options.title ? options.title : undefined
344
+ });
345
+ }
320
346
  }
321
347
  showWebVisualization(visualizationKey, parameters, options) {
322
- window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({
323
- visualizationKey: visualizationKey,
324
- parameters: parameters,
325
- modal: !!(options && options.modal),
326
- title: options && options.title ? options.title : undefined
327
- });
348
+ if (window.webkit.messageHandlers.ShowParticipantWebVisualization) {
349
+ window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({
350
+ visualizationKey: visualizationKey,
351
+ parameters: parameters,
352
+ modal: !!(options && options.modal),
353
+ title: options && options.title ? options.title : undefined
354
+ });
355
+ }
328
356
  }
329
357
  showWebVisualizationPdf(visualizationKey, parameters, options) {
330
- window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({
331
- visualizationKey: visualizationKey,
332
- parameters: parameters,
333
- landscape: !!(options && options.landscape),
334
- htmlViewerZoom: options && options.htmlViewerZoom
335
- });
358
+ if (window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF) {
359
+ window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({
360
+ visualizationKey: visualizationKey,
361
+ parameters: parameters,
362
+ landscape: !!(options && options.landscape),
363
+ htmlViewerZoom: options && options.htmlViewerZoom
364
+ });
365
+ }
336
366
  }
337
367
  showProject(projectCode) {
338
368
  if (window.webkit.messageHandlers.ShowProject) {
@@ -475,8 +505,29 @@ class MyDataHelps {
475
505
  return response.json();
476
506
  });
477
507
  }
478
- connectExternalAccount(externalAccountProviderID) {
479
- if (window.webkit.messageHandlers.ConnectExternalAccount) {
508
+ connectExternalAccount(externalAccountProviderID, standaloneModeFinalRedirectPath) {
509
+ if (this.standaloneMode) {
510
+ standaloneModeFinalRedirectPath = standaloneModeFinalRedirectPath || window.location.href;
511
+ const searchParameters = { finalRedirectPath: standaloneModeFinalRedirectPath };
512
+ const queryString = new URLSearchParams(searchParameters).toString();
513
+ const endpoint = "externalaccountproviders/" + externalAccountProviderID + "/connect?" + queryString;
514
+ const mdh = this;
515
+ this
516
+ .connect()
517
+ .then(function () {
518
+ return mdh.makeRequest(endpoint, 'POST', null);
519
+ })
520
+ .then(function (response) {
521
+ return MyDataHelps.validateResponse(response);
522
+ })
523
+ .then(function (response) {
524
+ return response.text();
525
+ })
526
+ .then(function (redirectUrl) {
527
+ window.top.location = redirectUrl.replace(/['"]+/g, '');
528
+ });
529
+ }
530
+ else if (window.webkit.messageHandlers.ConnectExternalAccount) {
480
531
  window.webkit.messageHandlers.ConnectExternalAccount.postMessage({ externalAccountProviderID: externalAccountProviderID });
481
532
  }
482
533
  }
@@ -511,18 +562,29 @@ class MyDataHelps {
511
562
  });
512
563
  }
513
564
  deleteExternalAccount(accountID) {
514
- let mdh = this;
565
+ const endpoint = 'externalaccounts/delete/' + encodeURIComponent(accountID);
566
+ const mdh = this;
567
+ if (this.isStandaloneMode()) {
568
+ return this
569
+ .connect()
570
+ .then(function () {
571
+ return mdh.makeRequest(endpoint, 'DELETE', null);
572
+ })
573
+ .then(function (response) {
574
+ return MyDataHelps.validateResponse(response);
575
+ });
576
+ }
515
577
  return new Promise(function (resolve, reject) {
516
- let messageID = mdh.nextMessageID();
517
- mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {
518
- if (!deleteProviderAccountResponse.success) {
519
- reject(deleteProviderAccountResponse);
520
- }
521
- else {
522
- resolve(deleteProviderAccountResponse);
523
- }
524
- };
525
578
  if (window.webkit.messageHandlers.DeleteProviderAccount) {
579
+ const messageID = mdh.nextMessageID();
580
+ mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {
581
+ if (!deleteProviderAccountResponse.success) {
582
+ reject(deleteProviderAccountResponse);
583
+ }
584
+ else {
585
+ resolve(deleteProviderAccountResponse);
586
+ }
587
+ };
526
588
  window.webkit.messageHandlers.DeleteProviderAccount.postMessage({
527
589
  messageID: messageID,
528
590
  accountID: accountID
@@ -604,6 +666,53 @@ class MyDataHelps {
604
666
  return response.json();
605
667
  });
606
668
  }
669
+ // AppleHealth
670
+ queryAppleHealthActivitySummaries(queryParameters) {
671
+ queryParameters = Object.assign({}, queryParameters);
672
+ if (queryParameters.hasOwnProperty("startDate")) {
673
+ queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);
674
+ }
675
+ if (queryParameters.hasOwnProperty("endDate")) {
676
+ queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);
677
+ }
678
+ const queryString = new URLSearchParams(queryParameters).toString();
679
+ const endpoint = 'appleHealth/activitySummaries?' + queryString;
680
+ const mdh = this;
681
+ return this
682
+ .connect()
683
+ .then(function () {
684
+ return mdh.makeRequest(endpoint, 'GET', null);
685
+ })
686
+ .then(function (response) {
687
+ return MyDataHelps.validateResponse(response);
688
+ })
689
+ .then(function (response) {
690
+ return response.json();
691
+ });
692
+ }
693
+ queryAppleHealthWorkouts(queryParameters) {
694
+ queryParameters = Object.assign({}, queryParameters);
695
+ if (queryParameters.hasOwnProperty("startDate")) {
696
+ queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);
697
+ }
698
+ if (queryParameters.hasOwnProperty("endDate")) {
699
+ queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);
700
+ }
701
+ const queryString = new URLSearchParams(queryParameters).toString();
702
+ const endpoint = 'appleHealth/workouts?' + queryString;
703
+ const mdh = this;
704
+ return this
705
+ .connect()
706
+ .then(function () {
707
+ return mdh.makeRequest(endpoint, 'GET', null);
708
+ })
709
+ .then(function (response) {
710
+ return MyDataHelps.validateResponse(response);
711
+ })
712
+ .then(function (response) {
713
+ return response.json();
714
+ });
715
+ }
607
716
  // Authorization
608
717
  connect() {
609
718
  const mdh = this;
@@ -632,6 +741,11 @@ class MyDataHelps {
632
741
  if (this.token && Date.now() < this.tokenExpires) {
633
742
  return Promise.resolve();
634
743
  }
744
+ if (this.isStandaloneMode()) {
745
+ let error = this.token ? "access token is expired or invalid" : "access token must be explicitly provided using the setParticipantAccess method";
746
+ console.log(error);
747
+ return Promise.reject(error);
748
+ }
635
749
  if (!this.refreshTokenPromise) {
636
750
  refreshDelegatedAccessToken();
637
751
  }
@@ -639,6 +753,7 @@ class MyDataHelps {
639
753
  return this.refreshTokenPromise;
640
754
  }
641
755
  setParticipantAccessToken(token, baseUrl) {
756
+ this.enableStandaloneMode();
642
757
  this.token = token;
643
758
  if (baseUrl) {
644
759
  this.baseUrl = baseUrl;
@@ -650,6 +765,15 @@ class MyDataHelps {
650
765
  }, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));
651
766
  }
652
767
  // Miscellaneous
768
+ isStandaloneMode() {
769
+ return this.standaloneMode;
770
+ }
771
+ enableStandaloneMode() {
772
+ this.standaloneMode = true;
773
+ if (window.webkit) {
774
+ window.webkit.messageHandlers = {};
775
+ }
776
+ }
653
777
  setStatusBarStyle(style) {
654
778
  if (window.webkit.messageHandlers.SetStatusBarStyle) {
655
779
  window.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });
@@ -658,11 +782,14 @@ class MyDataHelps {
658
782
  getDeviceInfo() {
659
783
  let mdh = this;
660
784
  return new Promise(function (resolve, reject) {
661
- let messageID = mdh.nextMessageID();
662
- mdh.messageHandlers[messageID] = function (deviceInfoResponse) {
663
- resolve(deviceInfoResponse.data);
664
- };
665
- if (window.webkit.messageHandlers.GetDeviceInfo) {
785
+ if (mdh.isStandaloneMode()) {
786
+ resolve(null);
787
+ }
788
+ else if (window.webkit.messageHandlers.GetDeviceInfo) {
789
+ let messageID = mdh.nextMessageID();
790
+ mdh.messageHandlers[messageID] = function (deviceInfoResponse) {
791
+ resolve(deviceInfoResponse.data);
792
+ };
666
793
  window.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });
667
794
  }
668
795
  else {
@@ -670,14 +797,34 @@ class MyDataHelps {
670
797
  }
671
798
  });
672
799
  }
800
+ setSupportedLanguages(languages) {
801
+ this.supportedLanguages.length = 0;
802
+ for (let i = 0; i < languages.length; i++) {
803
+ this.supportedLanguages.push(languages[i].replace("_", "-"));
804
+ }
805
+ }
806
+ setCurrentLanguage(language) {
807
+ let supportedLanguage = this.getSupportedLanguage(language);
808
+ if (supportedLanguage) {
809
+ this.language = supportedLanguage;
810
+ }
811
+ else {
812
+ console.warn(`language ${language} not supported`);
813
+ }
814
+ }
673
815
  getCurrentLanguage() {
674
816
  let searchParams = new URLSearchParams(window.location.search);
817
+ let lang;
675
818
  if (searchParams.has("lang")) {
676
- return searchParams.get("lang");
677
- }
678
- else {
679
- return navigator.language;
819
+ lang = this.getSupportedLanguage(searchParams.get("lang"));
820
+ if (lang) {
821
+ return lang;
822
+ }
823
+ else {
824
+ console.warn(`language ${searchParams.get("lang")} not supported`);
825
+ }
680
826
  }
827
+ return this.language || navigator.language;
681
828
  }
682
829
  showGoogleFitSettings() {
683
830
  if (window.webkit.messageHandlers.ShowGoogleFitSettings) {
@@ -777,6 +924,23 @@ class MyDataHelps {
777
924
  }
778
925
  return fetch(url, init);
779
926
  }
927
+ getSupportedLanguage(language) {
928
+ language = language.replace("_", "-");
929
+ if (this.supportedLanguages.length === 0) {
930
+ return language;
931
+ }
932
+ else {
933
+ if (this.supportedLanguages.find((l) => l === language)) {
934
+ return language;
935
+ }
936
+ else if (language.indexOf("-") > 0) {
937
+ language = language.substring(0, language.indexOf("-"));
938
+ if (this.supportedLanguages.find((l) => l === language)) {
939
+ return language;
940
+ }
941
+ }
942
+ }
943
+ }
780
944
  static validateResponse(response) {
781
945
  if (!response.ok) {
782
946
  throw response.statusText;
@@ -838,6 +1002,43 @@ class MyDataHelps {
838
1002
  document.body.className += ' no-scroll';
839
1003
  });
840
1004
  }
1005
+ startDelegatedSurvey(surveyUrl) {
1006
+ let mdhSurveyModalId = 'mydatahelps-survey-modal';
1007
+ let mdh = this;
1008
+ if (document.getElementById(mdhSurveyModalId)) {
1009
+ return;
1010
+ }
1011
+ window.addEventListener("message", function listener(message) {
1012
+ if (message.origin !== new URL(mdh.getBaseUrl()).origin) {
1013
+ return;
1014
+ }
1015
+ let frame = document.getElementById('mydatahelps-survey-frame').contentWindow;
1016
+ if (message.source !== frame) {
1017
+ return;
1018
+ }
1019
+ if (message.data.name === 'GetDelegatedAccessToken') {
1020
+ mdh.getParticipantInfo().then((participant) => {
1021
+ frame.postMessage({ name: "DelegatedAccessTokenResponse", accessToken: mdh.token, baseUrl: mdh.baseUrl, participantID: participant.participantID }, '*');
1022
+ });
1023
+ }
1024
+ else if (message.data.name === 'SurveyWindowInitialized') {
1025
+ document.getElementById(mdhSurveyModalId).className += " loaded";
1026
+ }
1027
+ else if (message.data.name === 'SurveyFinished') {
1028
+ document.getElementById(mdhSurveyModalId).remove();
1029
+ document.body.className = document.body.className.replace("no-scroll", "");
1030
+ window.removeEventListener("message", listener, true);
1031
+ message.data.type = 'surveyDidFinish';
1032
+ mdh.triggerEvent(message.data);
1033
+ }
1034
+ }, true);
1035
+ let surveyModal = document.createElement('div');
1036
+ surveyModal.className = 'mydatahelps-survey-modal';
1037
+ surveyModal.id = mdhSurveyModalId;
1038
+ 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}&lang=${mdh.getCurrentLanguage()}'></iframe></div>`;
1039
+ document.body.append(surveyModal);
1040
+ document.body.className += ' no-scroll';
1041
+ }
841
1042
  }
842
1043
  //iOS/Android directly invoke window.MyDataHelps and window.RKStudioClient
843
1044
  //so it's necessary to explicitly ensure they are present on the window
@@ -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","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;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
+ var e=[],t=[];!function(n,s){if(n&&"undefined"!=typeof document){var a,r=!0===s.prepend?"prepend":"append",o=!0===s.singleTag,i="string"==typeof s.container?document.querySelector(s.container):document.getElementsByTagName("head")[0];if(o){var d=e.indexOf(i);-1===d&&(d=e.push(i)-1,t[d]={}),a=t[d]&&t[d][r]?t[d][r]:t[d][r]=l()}else a=l();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n))}function l(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),s.attributes)for(var t=Object.keys(s.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],s.attributes[t[n]]);var a="prepend"===r?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}('body.no-scroll{height:100%;overflow:hidden!important;position:fixed!important;width:100%}#mydatahelps-survey-modal{background:rgba(0,0,0,.5);bottom:0;left:0;position:fixed;right:0;top:0}#mydatahelps-survey-modal .mydatahelps-survey{background:#fff;border-radius:5px;box-sizing:border-box;height:calc(100% - 32px);margin:16px auto;max-width:768px;overflow:hidden;position:relative;z-index:5002}#mydatahelps-survey-modal .mydatahelps-survey iframe{border:none;bottom:0;height:100%;left:0;opacity:0;position:absolute;right:0;top:0;width:100%}#mydatahelps-survey-modal.loaded .mydatahelps-survey iframe{opacity:1}@media (max-width:768px){#mydatahelps-survey-modal .mydatahelps-survey{border-radius:0;height:100%;margin-bottom:0;margin-top:0}}#mydatahelps-survey-modal .mydatahelps-survey .loader{-webkit-animation:load3 1.4s linear infinite;animation:load3 1.4s linear infinite;background:#fff;background:-moz-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:-webkit-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:-o-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:-ms-linear-gradient(left,#bbb 10%,hsla(0,0%,100%,0) 42%);background:linear-gradient(90deg,#bbb 10%,hsla(0,0%,100%,0) 42%);border-radius:50%;font-size:5px;height:11em;left:calc(50% - 5.5em);position:absolute;text-indent:-9999em;top:calc(50% - 5.5em);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);width:11em;z-index:1}#mydatahelps-survey-modal .mydatahelps-survey .loader:before{background:#bbb;border-radius:100% 0 0 0;content:"";height:50%;left:0;position:absolute;top:0;width:50%}#mydatahelps-survey-modal .mydatahelps-survey .loader:after{background:#fff;border-radius:50%;bottom:0;content:"";height:75%;left:0;margin:auto;position:absolute;right:0;top:0;width:75%}#mydatahelps-survey-modal.loaded .mydatahelps-survey .loader{display:none}@-webkit-keyframes load3{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes load3{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}',{});class n{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.supportedLanguages=[],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(this.isStandaloneMode())this.startDelegatedSurvey(`${this.baseUrl}/survey?surveyName=${encodeURIComponent(e)}`);else 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(e){(e=Object.assign({},e)).hasOwnProperty("surveyName")&&(e.surveyName=n.reduceArrayAndEscape(e.surveyName)),e.hasOwnProperty("stepIdentifier")&&(e.stepIdentifier=n.reduceArrayAndEscape(e.stepIdentifier)),e.hasOwnProperty("resultIdentifier")&&(e.resultIdentifier=n.reduceArrayAndEscape(e.resultIdentifier)),e.hasOwnProperty("answer")&&(e.answer=n.reduceArrayAndEscape(e.answer)),e.hasOwnProperty("before")&&(e.before=n.convertDateToIsoString(e.before)),e.hasOwnProperty("after")&&(e.after=n.convertDateToIsoString(e.after));const t="surveyanswers?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}deleteSurveyResult(e){const t="surveyresults/"+encodeURIComponent(e),s=this;return this.connect().then((function(){return s.makeRequest(t,"DELETE",null)})).then((function(e){return n.validateResponse(e)})).then((function(){}))}querySurveyTasks(e){(e=Object.assign({},e)).hasOwnProperty("status")&&(e.status=n.reduceArrayAndEscape(e.status)),e.hasOwnProperty("surveyName")&&(e.surveyName=n.reduceArrayAndEscape(e.surveyName));const t="surveytasks?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).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 e=this;return this.connect().then((function(){return e.makeRequest("participant","GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}getProjectInfo(){const e=this;return this.connect().then((function(){return e.makeRequest("project","GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}queryDeviceData(e){(e=Object.assign({},e)).hasOwnProperty("type")&&(e.type=n.reduceArrayAndEscape(e.type)),e.hasOwnProperty("observedBefore")&&(e.observedBefore=n.convertDateToIsoString(e.observedBefore)),e.hasOwnProperty("observedAfter")&&(e.observedAfter=n.convertDateToIsoString(e.observedAfter));const t="devicedata?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}persistDeviceData(e){const t=this;return this.connect().then((function(){return t.makeRequest("devicedata","POST",e)})).then((function(e){return n.validateResponse(e)})).then((function(){}))}getExternalAccountProviders(e,t,s,a){let r={};e&&(r.search=e),t&&(r.category=t),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(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}connectExternalAccount(e,t){if(this.standaloneMode){t=t||window.location.href;const s="externalaccountproviders/"+e+"/connect?"+new URLSearchParams({finalRedirectPath:t}).toString(),a=this;this.connect().then((function(){return a.makeRequest(s,"POST",null)})).then((function(e){return n.validateResponse(e)})).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:e})}getExternalAccounts(){const e=this;return this.connect().then((function(){return e.makeRequest("externalaccounts","GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}refreshExternalAccount(e){const t="externalaccounts/refresh/"+e,s=this;return this.connect().then((function(){return s.makeRequest(t,"POST",null)})).then((function(e){return n.validateResponse(e)})).then((function(){}))}deleteExternalAccount(e){const t="externalaccounts/delete/"+encodeURIComponent(e),s=this;return this.isStandaloneMode()?this.connect().then((function(){return s.makeRequest(t,"DELETE",null)})).then((function(e){return n.validateResponse(e)})):new Promise((function(t,n){if(window.webkit.messageHandlers.DeleteProviderAccount){const a=s.nextMessageID();s.messageHandlers[a]=function(e){e.success?t(e):n(e)},window.webkit.messageHandlers.DeleteProviderAccount.postMessage({messageID:a,accountID:e})}else n()}))}queryNotifications(e){(e=Object.assign({},e)).hasOwnProperty("sentBefore")&&(e.sentBefore=n.convertDateToIsoString(e.sentBefore)),e.hasOwnProperty("sentAfter")&&(e.sentAfter=n.convertDateToIsoString(e.sentAfter));const t="notifications?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}queryFitbitDailySummaries(e){(e=Object.assign({},e)).hasOwnProperty("startDate")&&(e.startDate=n.convertDateToIsoString(e.startDate)),e.hasOwnProperty("endDate")&&(e.endDate=n.convertDateToIsoString(e.endDate));const t="fitbit/dailySummaries?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}queryFitbitSleepLogs(e){(e=Object.assign({},e)).hasOwnProperty("startDate")&&(e.startDate=n.convertDateToIsoString(e.startDate)),e.hasOwnProperty("endDate")&&(e.endDate=n.convertDateToIsoString(e.endDate));const t="fitbit/sleepLogs?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}queryAppleHealthActivitySummaries(e){(e=Object.assign({},e)).hasOwnProperty("startDate")&&(e.startDate=n.convertDateToIsoString(e.startDate)),e.hasOwnProperty("endDate")&&(e.endDate=n.convertDateToIsoString(e.endDate));const t="appleHealth/activitySummaries?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}queryAppleHealthWorkouts(e){(e=Object.assign({},e)).hasOwnProperty("startDate")&&(e.startDate=n.convertDateToIsoString(e.startDate)),e.hasOwnProperty("endDate")&&(e.endDate=n.convertDateToIsoString(e.endDate));const t="appleHealth/workouts?"+new URLSearchParams(e).toString(),s=this;return this.connect().then((function(){return s.makeRequest(t,"GET",null)})).then((function(e){return n.validateResponse(e)})).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()}))}setSupportedLanguages(e){this.supportedLanguages.length=0;for(let t=0;t<e.length;t++)this.supportedLanguages.push(e[t].replace("_","-"))}setCurrentLanguage(e){let t=this.getSupportedLanguage(e);t?this.language=t:console.warn(`language ${e} not supported`)}getCurrentLanguage(){let e,t=new URLSearchParams(window.location.search);if(t.has("lang")){if(e=this.getSupportedLanguage(t.get("lang")),e)return e;console.warn(`language ${t.get("lang")} not supported`)}return 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(e){const t=this;return this.connect().then((function(){return t.makeRequest("customevents","POST",e)})).then((function(e){return n.validateResponse(e)})).then((function(){}))}getDataCollectionSettings(){const e=this;return this.connect().then((function(){return e.makeRequest("datacollectionsettings","GET",null)})).then((function(e){return n.validateResponse(e)})).then((function(e){return e.json()}))}invokeCustomApi(e,t,s,a){if(e.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+e;if(t=t.toUpperCase(),null!=s&&("GET"===t||"DELETE"===t)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,t,s)})).then((function(e){return n.validateResponse(e)})).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)}getSupportedLanguage(e){return e=e.replace("_","-"),0===this.supportedLanguages.length||this.supportedLanguages.find((t=>t===e))||e.indexOf("-")>0&&(e=e.substring(0,e.indexOf("-")),this.supportedLanguages.find((t=>t===e)))?e:void 0}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replace("\\","\\\\").replace(",","\\,")}static reduceArrayAndEscape(e){if(Array.isArray(e)){return e.map((function(e){return n.escapeParam(e)})).join(",")}return this.escapeParam(e)}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"}))}startDelegatedSurvey(e){let t="mydatahelps-survey-modal",n=this;if(document.getElementById(t))return;window.addEventListener("message",(function e(s){if(s.origin!==new URL(n.getBaseUrl()).origin)return;let a=document.getElementById("mydatahelps-survey-frame").contentWindow;s.source===a&&("GetDelegatedAccessToken"===s.data.name?n.getParticipantInfo().then((e=>{a.postMessage({name:"DelegatedAccessTokenResponse",accessToken:n.token,baseUrl:n.baseUrl,participantID:e.participantID},"*")})):"SurveyWindowInitialized"===s.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===s.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s.data.type="surveyDidFinish",n.triggerEvent(s.data)))}),!0);let s=document.createElement("div");s.className="mydatahelps-survey-modal",s.id=t,s.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}&lang=${n.getCurrentLanguage()}'></iframe></div>`,document.body.append(s),document.body.className+=" no-scroll"}}const s=new n;window.MyDataHelps=s,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{n as MyDataHelps,s 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 '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 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":["../../node_modules/rollup-plugin-styles/dist/runtime/inject-css.js","../MyDataHelps.js"],"sourcesContent":["var e=[],t=[];function n(n,r){if(n&&\"undefined\"!=typeof document){var a,s=!0===r.prepend?\"prepend\":\"append\",d=!0===r.singleTag,i=\"string\"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName(\"head\")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c()}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n))}function c(){var e=document.createElement(\"style\");if(e.setAttribute(\"type\",\"text/css\"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a=\"prepend\"===s?\"afterbegin\":\"beforeend\";return i.insertAdjacentElement(a,e),e}}export{n as default};\n","// @ts-ignore : let rollup handle CSS injection\nimport \"../MyDataHelps.css\";\nexport 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.supportedLanguages = [];\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 (this.isStandaloneMode()) {\n this.startDelegatedSurvey(`${this.baseUrl}/survey?surveyName=${encodeURIComponent(surveyName)}`);\n }\n else 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 setSupportedLanguages(languages) {\n this.supportedLanguages.length = 0;\n for (let i = 0; i < languages.length; i++) {\n this.supportedLanguages.push(languages[i].replace(\"_\", \"-\"));\n }\n }\n setCurrentLanguage(language) {\n let supportedLanguage = this.getSupportedLanguage(language);\n if (supportedLanguage) {\n this.language = supportedLanguage;\n }\n else {\n console.warn(`language ${language} not supported`);\n }\n }\n getCurrentLanguage() {\n let searchParams = new URLSearchParams(window.location.search);\n let lang;\n if (searchParams.has(\"lang\")) {\n lang = this.getSupportedLanguage(searchParams.get(\"lang\"));\n if (lang) {\n return lang;\n }\n else {\n console.warn(`language ${searchParams.get(\"lang\")} not supported`);\n }\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 getSupportedLanguage(language) {\n language = language.replace(\"_\", \"-\");\n if (this.supportedLanguages.length === 0) {\n return language;\n }\n else {\n if (this.supportedLanguages.find((l) => l === language)) {\n return language;\n }\n else if (language.indexOf(\"-\") > 0) {\n language = language.substring(0, language.indexOf(\"-\"));\n if (this.supportedLanguages.find((l) => l === language)) {\n return language;\n }\n }\n }\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 startDelegatedSurvey(surveyUrl) {\n let mdhSurveyModalId = 'mydatahelps-survey-modal';\n let mdh = this;\n if (document.getElementById(mdhSurveyModalId)) {\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 === 'GetDelegatedAccessToken') {\n mdh.getParticipantInfo().then((participant) => {\n frame.postMessage({ name: \"DelegatedAccessTokenResponse\", accessToken: mdh.token, baseUrl: mdh.baseUrl, participantID: participant.participantID }, '*');\n });\n }\n else 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 message.data.type = 'surveyDidFinish';\n mdh.triggerEvent(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}&lang=${mdh.getCurrentLanguage()}'></iframe></div>`;\n document.body.append(surveyModal);\n document.body.className += ' no-scroll';\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":["e","t","n","r","document","a","s","prepend","d","singleTag","i","container","querySelector","getElementsByTagName","u","indexOf","push","c","charCodeAt","substring","styleSheet","cssText","appendChild","createTextNode","createElement","setAttribute","attributes","Object","keys","length","insertAdjacentElement","MyDataHelps","constructor","this","acceptableParentDomains","accessTokenRenewalBufferSeconds","apiBasePath","unsupportedActions","supportedEvents","supportedLanguages","currentMessageID","messageHandlers","registeredEventHandlers","refreshTokenPromise","standaloneMode","supportedActions","mdh","applicationHost","ancestorOrigins","location","getParentOrigin","acceptableOrigin","origin","sourceURL","URL","k","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","isStandaloneMode","startDelegatedSurvey","baseUrl","encodeURIComponent","nextMessageID","completeStep","answer","querySurveyAnswers","queryParameters","assign","hasOwnProperty","reduceArrayAndEscape","stepIdentifier","resultIdentifier","before","convertDateToIsoString","after","endpoint","URLSearchParams","toString","connect","then","makeRequest","response","validateResponse","json","deleteSurveyResult","resultID","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","off","eventHandlerIndex","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","Promise","resolve","reject","deleteProviderAccountResponse","success","queryNotifications","sentBefore","sentAfter","queryFitbitDailySummaries","startDate","endDate","queryFitbitSleepLogs","queryAppleHealthActivitySummaries","queryAppleHealthWorkouts","refreshDelegatedAccessToken","token","tokenResponse","tokenExpires","Date","now","expires_in","setTimeout","setParticipantAccessToken","enableStandaloneMode","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","deviceInfoResponse","setSupportedLanguages","languages","setCurrentLanguage","supportedLanguage","getSupportedLanguage","warn","lang","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","find","l","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","id","innerHTML","participant","accessToken","participantID","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.3",
3
+ "version": "3.4.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",
@@ -15,6 +15,7 @@
15
15
  "devDependencies": {
16
16
  "rollup": "^2.69.0",
17
17
  "rollup-plugin-copy": "^3.4.0",
18
+ "rollup-plugin-styles": "^4.0.0",
18
19
  "rollup-plugin-terser": "^7.0.2",
19
20
  "typescript": "^4.6.3"
20
21
  },
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;