@careevolution/mydatahelps-js 3.0.0 → 3.1.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 +2 -0
- package/MyDataHelps.js +51 -0
- package/MyDataHelps.min.js +1 -1
- package/MyDataHelps.min.js.map +1 -1
- package/package.json +1 -1
- package/types.d.ts +82 -0
package/MyDataHelps.d.ts
CHANGED
|
@@ -35,6 +35,8 @@ export declare class MyDataHelps {
|
|
|
35
35
|
refreshExternalAccount(accountID: number): Promise<void>;
|
|
36
36
|
deleteExternalAccount(accountID: number): Promise<any>;
|
|
37
37
|
queryNotifications(queryParameters: Model.NotificationQueryParameters): Promise<Model.NotificationsPage>;
|
|
38
|
+
queryFitbitDailySummaries(queryParameters: Model.FitbitQuery): Promise<Model.FitbitDailySummariesPage>;
|
|
39
|
+
queryFitbitSleepLogs(queryParameters: Model.FitbitQuery): Promise<Model.FitbitSleepLogsPage>;
|
|
38
40
|
connect(): Promise<void>;
|
|
39
41
|
setParticipantAccessToken(token: Model.Token, baseUrl: string): void;
|
|
40
42
|
setStatusBarStyle(style: Model.StatusBarStyle): void;
|
package/MyDataHelps.js
CHANGED
|
@@ -200,6 +200,7 @@ class MyDataHelps {
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
querySurveyAnswers(queryParameters) {
|
|
203
|
+
queryParameters = Object.assign({}, queryParameters);
|
|
203
204
|
if (queryParameters.hasOwnProperty("surveyName")) {
|
|
204
205
|
queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);
|
|
205
206
|
}
|
|
@@ -249,6 +250,7 @@ class MyDataHelps {
|
|
|
249
250
|
});
|
|
250
251
|
}
|
|
251
252
|
querySurveyTasks(queryParameters) {
|
|
253
|
+
queryParameters = Object.assign({}, queryParameters);
|
|
252
254
|
if (queryParameters.hasOwnProperty("status")) {
|
|
253
255
|
queryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status);
|
|
254
256
|
}
|
|
@@ -406,6 +408,7 @@ class MyDataHelps {
|
|
|
406
408
|
}
|
|
407
409
|
// Device Data
|
|
408
410
|
queryDeviceData(queryParameters) {
|
|
411
|
+
queryParameters = Object.assign({}, queryParameters);
|
|
409
412
|
if (queryParameters.hasOwnProperty("type")) {
|
|
410
413
|
queryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type);
|
|
411
414
|
}
|
|
@@ -531,6 +534,7 @@ class MyDataHelps {
|
|
|
531
534
|
}
|
|
532
535
|
// Notifications
|
|
533
536
|
queryNotifications(queryParameters) {
|
|
537
|
+
queryParameters = Object.assign({}, queryParameters);
|
|
534
538
|
if (queryParameters.hasOwnProperty("sentBefore")) {
|
|
535
539
|
queryParameters.sentBefore = MyDataHelps.convertDateToIsoString(queryParameters.sentBefore);
|
|
536
540
|
}
|
|
@@ -552,6 +556,53 @@ class MyDataHelps {
|
|
|
552
556
|
return response.json();
|
|
553
557
|
});
|
|
554
558
|
}
|
|
559
|
+
// Fitbit
|
|
560
|
+
queryFitbitDailySummaries(queryParameters) {
|
|
561
|
+
queryParameters = Object.assign({}, queryParameters);
|
|
562
|
+
if (queryParameters.hasOwnProperty("startDate")) {
|
|
563
|
+
queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);
|
|
564
|
+
}
|
|
565
|
+
if (queryParameters.hasOwnProperty("endDate")) {
|
|
566
|
+
queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);
|
|
567
|
+
}
|
|
568
|
+
const queryString = new URLSearchParams(queryParameters).toString();
|
|
569
|
+
const endpoint = 'fitbit/dailySummaries?' + queryString;
|
|
570
|
+
const mdh = this;
|
|
571
|
+
return this
|
|
572
|
+
.connect()
|
|
573
|
+
.then(function () {
|
|
574
|
+
return mdh.makeRequest(endpoint, 'GET', null);
|
|
575
|
+
})
|
|
576
|
+
.then(function (response) {
|
|
577
|
+
return MyDataHelps.validateResponse(response);
|
|
578
|
+
})
|
|
579
|
+
.then(function (response) {
|
|
580
|
+
return response.json();
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
queryFitbitSleepLogs(queryParameters) {
|
|
584
|
+
queryParameters = Object.assign({}, queryParameters);
|
|
585
|
+
if (queryParameters.hasOwnProperty("startDate")) {
|
|
586
|
+
queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);
|
|
587
|
+
}
|
|
588
|
+
if (queryParameters.hasOwnProperty("endDate")) {
|
|
589
|
+
queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);
|
|
590
|
+
}
|
|
591
|
+
const queryString = new URLSearchParams(queryParameters).toString();
|
|
592
|
+
const endpoint = 'fitbit/sleepLogs?' + queryString;
|
|
593
|
+
const mdh = this;
|
|
594
|
+
return this
|
|
595
|
+
.connect()
|
|
596
|
+
.then(function () {
|
|
597
|
+
return mdh.makeRequest(endpoint, 'GET', null);
|
|
598
|
+
})
|
|
599
|
+
.then(function (response) {
|
|
600
|
+
return MyDataHelps.validateResponse(response);
|
|
601
|
+
})
|
|
602
|
+
.then(function (response) {
|
|
603
|
+
return response.json();
|
|
604
|
+
});
|
|
605
|
+
}
|
|
555
606
|
// Authorization
|
|
556
607
|
connect() {
|
|
557
608
|
const mdh = this;
|
package/MyDataHelps.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
class e{constructor(){this.allowedApplicationHosts=["localhost","careevolution.com","internal","b3-deploys.com","mydatahelps.org","platform.joinallofus.org","careevolution.dev","ce.dev"],this.accessTokenRenewalBufferSeconds=120,this.apiBasePath="api/v1/delegated/",this.unsupportedActions=["SetHeight","ResearchKit"],this.supportedEvents=["surveyDidFinish","applicationDidBecomeVisible","externalAccountSyncComplete","tokenWillExpire"],this.currentMessageID=1,this.messageHandlers=[],this.registeredEventHandlers={},this.refreshTokenPromise=null;let e,t=this,n=function(){let e=document.location.ancestorOrigins;if(e&&e[0])return e[0];return"*"}();function s(e){if("*"===e)return!0;let n=new URL(e);for(let e=0;e<t.allowedApplicationHosts.length;e++)if(n.hostname===t.allowedApplicationHosts[e]||n.hostname.endsWith("."+t.allowedApplicationHosts[e]))return!0;return!1}if(!s(n))throw console.error("Application is not hosted at an approved origin."),"Application is not hosted at an approved origin.";e=window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.ResearchKit?{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)}}:{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)},StartParticipantSurvey:function(e){window.parent.postMessage({name:"StartParticipantSurvey",messageID:e.messageID,surveyName:e.surveyName},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},OpenExternalApplication:function(e){window.parent.postMessage({name:"OpenApplication",messageID:e.messageID,url:e.url,modal:e.modal},n)},Dismiss:function(){window.parent.postMessage({name:"Dismiss"},n)},PopNavigation:function(){window.parent.postMessage({name:"Back"},n)},ShowTab:function(e){window.parent.postMessage({name:"ShowTab",tabKey:e},n)},ShowParticipantDashboard:function(e){window.parent.postMessage({name:"ShowParticipantDashboard",dashboardKey:e.dashboardKey,modal:e.modal},n)},ShowParticipantWebVisualization:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualization",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal},n)},ShowParticipantWebVisualizationPDF:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualizationPDF",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal,landscape:e.landscape,htmlViewerZoom:e.htmlViewerZoom},n)},DeleteProviderAccount:function(e){window.parent.postMessage({name:"DeleteProviderAccount",messageID:e.messageID,accountID:e.accountID},n)},ConnectExternalAccount:function(e){window.parent.postMessage({name:"ConnectExternalAccount",externalAccountProviderID:e.externalAccountProviderID},n)},ShowProject:function(e){window.parent.postMessage({name:"ShowProject",code:e.code},n)},JoinProject:function(e){window.parent.postMessage({name:"JoinProject",code:e.code},n)}},window.webkit&&window.webkit.messageHandlers&&function(){for(let t in e)if(window.webkit.messageHandlers[t])return!0;for(let e in t.unsupportedActions)if(window.webkit.messageHandlers[t.unsupportedActions[e]])return!0;return!1}()||(window.webkit={messageHandlers:{}});for(let t in e)window.webkit.messageHandlers[t]=window.webkit.messageHandlers[t]||{postMessage:e[t]};window.addEventListener("message",(function(e){if(!function(e){return"*"===n?s(e.origin):e.origin===n}(e))throw console.error("message.origin '"+e.origin+"' is not allowed."),"message.origin '"+e.origin+"' is not allowed.";e.data.messageID?t.setActionResult(e.data):t.triggerEvent(e.data)}),!1)}startSurvey(e){let t=this.nextMessageID();window.webkit.messageHandlers.StartParticipantSurvey.postMessage({messageID:t,surveyName:e})}completeStep(e){null==e&&(e=""),window.webkit.messageHandlers.ResearchKit&&window.webkit.messageHandlers.ResearchKit.postMessage(e)}querySurveyAnswers(t){t.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.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.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.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()}))}connect(){const e=this;let t=function(){e.token=null,e.refreshTokenPromise=new Promise((function(n,s){let a=e.nextMessageID();e.messageHandlers[a]=function(r){r.success?(e.tokenExpires=Date.now()+1e3*r.data.expires_in,e.token=r.data,e.baseUrl=r.baseUrl,setTimeout(t,1e3*(r.data.expires_in-e.accessTokenRenewalBufferSeconds)),n(null)):(e.token=null,s(r.message)),e.messageHandlers[a]=null,e.refreshTokenPromise=null},window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({messageID:a})}))};return this.token&&Date.now()<this.tokenExpires?Promise.resolve():(this.refreshTokenPromise||t(),this.refreshTokenPromise)}setParticipantAccessToken(e,t){this.token=e,t&&(this.baseUrl=t),this.tokenExpires=Date.now()+1e3*this.token.expires_in;const n=this;setTimeout((function(){n.triggerEvent({type:"tokenWillExpire"})}),1e3*(this.token.expires_in-this.accessTokenRenewalBufferSeconds))}setStatusBarStyle(e){window.webkit.messageHandlers.SetStatusBarStyle&&window.webkit.messageHandlers.SetStatusBarStyle.postMessage({style:e})}getDeviceInfo(){let e=this;return new Promise((function(t,n){let s=e.nextMessageID();e.messageHandlers[s]=function(e){t(e.data)},window.webkit.messageHandlers.GetDeviceInfo?window.webkit.messageHandlers.GetDeviceInfo.postMessage({messageID:s}):n()}))}getCurrentLanguage(){let e=new URLSearchParams(window.location.search);return e.has("lang")?e.get("lang"):navigator.language}showGoogleFitSettings(){window.webkit.messageHandlers.ShowGoogleFitSettings&&window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({})}requestReview(e){window.webkit.messageHandlers.RequestReview&&window.webkit.messageHandlers.RequestReview.postMessage({cooldownDays:e})}trackCustomEvent(t){const n=this;return this.connect().then((function(){return n.makeRequest("customevents","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDataCollectionSettings(){const t=this;return this.connect().then((function(){return t.makeRequest("datacollectionsettings","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}invokeCustomApi(t,n,s,a){if(t.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+t;if(n=n.toUpperCase(),null!=s&&("GET"===n||"DELETE"===n)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,n,s)})).then((function(t){return e.validateResponse(t)})).then((function(e){return a?e.json():void 0}))}nextMessageID(){return this.currentMessageID++}getBaseUrl(){return this.baseUrl||"https://mydatahelps.org/"}makeUrl(e){if(!this.baseUrl)throw console.error("Cannot use makeUrl without MyDataHelps.baseUrl."),"Cannot use makeUrl without MyDataHelps.baseUrl.";return this.baseUrl+this.apiBasePath+e}makeRequest(e,t,n){if(!this.token||!this.token.access_token)throw"No access_token available for request authorization.";let s=this.makeUrl(e),a=new Headers;a.append("Authorization","Bearer "+this.token.access_token),a.append("Accept","application/json, text/javascript, */*; q=0.01"),a.append("Accept-Language",this.getCurrentLanguage()),n&&a.append("Content-Type","application/json");let r={method:t,headers:a};return n&&(r.body=JSON.stringify(n)),fetch(s,r)}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replace("\\","\\\\").replace(",","\\,")}static reduceArrayAndEscape(t){if(Array.isArray(t)){return t.map((function(t){return e.escapeParam(t)})).join(",")}return this.escapeParam(t)}static convertDateToIsoString(e){let t=new Date(e);if(isNaN(t.getTime()))throw"Cannot interpret parameter as Date";return t.toISOString()}startEmbeddedSurveyInternal(e){let t="mydatahelps-survey-modal",n=this;return new Promise((function(s,a){if(document.getElementById(t))return void a("Survey already in progress");window.addEventListener("message",(function e(a){if(a.origin!==new URL(n.getBaseUrl()).origin)return;let r=document.getElementById("mydatahelps-survey-frame").contentWindow;a.source===r&&("SurveyWindowInitialized"===a.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===a.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s(a.data)))}),!0);let r=document.createElement("div");r.className="mydatahelps-survey-modal",r.id=t,r.innerHTML="<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='"+e+"'></iframe></div>",document.body.append(r),document.body.className+=" no-scroll"}))}}const t=new e;window.MyDataHelps=t,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{e as MyDataHelps,t as default};
|
|
1
|
+
class e{constructor(){this.allowedApplicationHosts=["localhost","careevolution.com","internal","b3-deploys.com","mydatahelps.org","platform.joinallofus.org","careevolution.dev","ce.dev"],this.accessTokenRenewalBufferSeconds=120,this.apiBasePath="api/v1/delegated/",this.unsupportedActions=["SetHeight","ResearchKit"],this.supportedEvents=["surveyDidFinish","applicationDidBecomeVisible","externalAccountSyncComplete","tokenWillExpire"],this.currentMessageID=1,this.messageHandlers=[],this.registeredEventHandlers={},this.refreshTokenPromise=null;let e,t=this,n=function(){let e=document.location.ancestorOrigins;if(e&&e[0])return e[0];return"*"}();function s(e){if("*"===e)return!0;let n=new URL(e);for(let e=0;e<t.allowedApplicationHosts.length;e++)if(n.hostname===t.allowedApplicationHosts[e]||n.hostname.endsWith("."+t.allowedApplicationHosts[e]))return!0;return!1}if(!s(n))throw console.error("Application is not hosted at an approved origin."),"Application is not hosted at an approved origin.";e=window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.ResearchKit?{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)}}:{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)},StartParticipantSurvey:function(e){window.parent.postMessage({name:"StartParticipantSurvey",messageID:e.messageID,surveyName:e.surveyName},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},OpenExternalApplication:function(e){window.parent.postMessage({name:"OpenApplication",messageID:e.messageID,url:e.url,modal:e.modal},n)},Dismiss:function(){window.parent.postMessage({name:"Dismiss"},n)},PopNavigation:function(){window.parent.postMessage({name:"Back"},n)},ShowTab:function(e){window.parent.postMessage({name:"ShowTab",tabKey:e},n)},ShowParticipantDashboard:function(e){window.parent.postMessage({name:"ShowParticipantDashboard",dashboardKey:e.dashboardKey,modal:e.modal},n)},ShowParticipantWebVisualization:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualization",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal},n)},ShowParticipantWebVisualizationPDF:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualizationPDF",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal,landscape:e.landscape,htmlViewerZoom:e.htmlViewerZoom},n)},DeleteProviderAccount:function(e){window.parent.postMessage({name:"DeleteProviderAccount",messageID:e.messageID,accountID:e.accountID},n)},ConnectExternalAccount:function(e){window.parent.postMessage({name:"ConnectExternalAccount",externalAccountProviderID:e.externalAccountProviderID},n)},ShowProject:function(e){window.parent.postMessage({name:"ShowProject",code:e.code},n)},JoinProject:function(e){window.parent.postMessage({name:"JoinProject",code:e.code},n)}},window.webkit&&window.webkit.messageHandlers&&function(){for(let t in e)if(window.webkit.messageHandlers[t])return!0;for(let e in t.unsupportedActions)if(window.webkit.messageHandlers[t.unsupportedActions[e]])return!0;return!1}()||(window.webkit={messageHandlers:{}});for(let t in e)window.webkit.messageHandlers[t]=window.webkit.messageHandlers[t]||{postMessage:e[t]};window.addEventListener("message",(function(e){if(!function(e){return"*"===n?s(e.origin):e.origin===n}(e))throw console.error("message.origin '"+e.origin+"' is not allowed."),"message.origin '"+e.origin+"' is not allowed.";e.data.messageID?t.setActionResult(e.data):t.triggerEvent(e.data)}),!1)}startSurvey(e){let t=this.nextMessageID();window.webkit.messageHandlers.StartParticipantSurvey.postMessage({messageID:t,surveyName:e})}completeStep(e){null==e&&(e=""),window.webkit.messageHandlers.ResearchKit&&window.webkit.messageHandlers.ResearchKit.postMessage(e)}querySurveyAnswers(t){(t=Object.assign({},t)).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("stepIdentifier")&&(t.stepIdentifier=e.reduceArrayAndEscape(t.stepIdentifier)),t.hasOwnProperty("resultIdentifier")&&(t.resultIdentifier=e.reduceArrayAndEscape(t.resultIdentifier)),t.hasOwnProperty("answer")&&(t.answer=e.reduceArrayAndEscape(t.answer)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after));const n="surveyanswers?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteSurveyResult(t){const n="surveyresults/"+encodeURIComponent(t),s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}querySurveyTasks(t){(t=Object.assign({},t)).hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status)),t.hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName));const n="surveytasks?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}startEmbeddedSurvey(e,t,n){n||(n=this.getCurrentLanguage());let s=this.getBaseUrl()+"mydatahelps/"+e+"/surveylink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}startEmbeddedTask(e,t,n){n||(n=this.getCurrentLanguage());let s=this.getBaseUrl()+"mydatahelps/"+e+"/tasklink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}openExternalUrl(e){window.webkit.messageHandlers.OpenExternalLink.postMessage(e)}openEmbeddedUrl(e){window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(e)}showTab(e){window.webkit.messageHandlers.ShowTab.postMessage(e)}openApplication(e,t){let n=this.nextMessageID();window.webkit.messageHandlers.OpenExternalApplication.postMessage({messageID:n,url:e,modal:!(!t||!t.modal)})}dismiss(){window.webkit.messageHandlers.Dismiss.postMessage({})}back(){window.webkit.messageHandlers.PopNavigation.postMessage({})}showDashboard(e,t){window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({dashboardKey:e,modal:!(!t||!t.modal),title:t&&t.title?t.title:void 0})}showWebVisualization(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({visualizationKey:e,parameters:t,modal:!(!n||!n.modal),title:n&&n.title?n.title:void 0})}showWebVisualizationPdf(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({visualizationKey:e,parameters:t,landscape:!(!n||!n.landscape),htmlViewerZoom:n&&n.htmlViewerZoom})}showProject(e){window.webkit.messageHandlers.ShowProject&&window.webkit.messageHandlers.ShowProject.postMessage({code:e})}joinProject(e){window.webkit.messageHandlers.JoinProject&&window.webkit.messageHandlers.JoinProject.postMessage({code:e})}on(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");this.registeredEventHandlers[e]||(this.registeredEventHandlers[e]=[]),this.registeredEventHandlers[e].push(t)}off(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");if(!this.registeredEventHandlers[e])return;let n=this.registeredEventHandlers[e].indexOf(t);-1!==n&&this.registeredEventHandlers[e].splice(n,1)}triggerEvent(e){let t=e.type;this.supportedEvents.includes(t)&&this.registeredEventHandlers[t]&&this.registeredEventHandlers[t].forEach((function(t){t(e)}))}setActionResult(e){this.messageHandlers[e.messageID](e)}getParticipantInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("participant","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getProjectInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("project","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceData(t){(t=Object.assign({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter));const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistDeviceData(t){const n=this;return this.connect().then((function(){return n.makeRequest("devicedata","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getExternalAccountProviders(t,n,s,a){let r={};t&&(r.search=t),n&&(r.category=n),s&&(r.pageSize=s),a&&(r.pageNumber=a);const o="externalaccountproviders?"+new URLSearchParams(r).toString(),i=this;return this.connect().then((function(){return i.makeRequest(o,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connectExternalAccount(e){window.webkit.messageHandlers.ConnectExternalAccount&&window.webkit.messageHandlers.ConnectExternalAccount.postMessage({externalAccountProviderID:e})}getExternalAccounts(){const t=this;return this.connect().then((function(){return t.makeRequest("externalaccounts","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}refreshExternalAccount(t){const n="externalaccounts/refresh/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}deleteExternalAccount(e){let t=this;return new Promise((function(n,s){let a=t.nextMessageID();t.messageHandlers[a]=function(e){e.success?n(e):s(e)},window.webkit.messageHandlers.DeleteProviderAccount?window.webkit.messageHandlers.DeleteProviderAccount.postMessage({messageID:a,accountID:e}):s()}))}queryNotifications(t){(t=Object.assign({},t)).hasOwnProperty("sentBefore")&&(t.sentBefore=e.convertDateToIsoString(t.sentBefore)),t.hasOwnProperty("sentAfter")&&(t.sentAfter=e.convertDateToIsoString(t.sentAfter));const n="notifications?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitDailySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/dailySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitSleepLogs(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/sleepLogs?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connect(){const e=this;let t=function(){e.token=null,e.refreshTokenPromise=new Promise((function(n,s){let a=e.nextMessageID();e.messageHandlers[a]=function(r){r.success?(e.tokenExpires=Date.now()+1e3*r.data.expires_in,e.token=r.data,e.baseUrl=r.baseUrl,setTimeout(t,1e3*(r.data.expires_in-e.accessTokenRenewalBufferSeconds)),n(null)):(e.token=null,s(r.message)),e.messageHandlers[a]=null,e.refreshTokenPromise=null},window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({messageID:a})}))};return this.token&&Date.now()<this.tokenExpires?Promise.resolve():(this.refreshTokenPromise||t(),this.refreshTokenPromise)}setParticipantAccessToken(e,t){this.token=e,t&&(this.baseUrl=t),this.tokenExpires=Date.now()+1e3*this.token.expires_in;const n=this;setTimeout((function(){n.triggerEvent({type:"tokenWillExpire"})}),1e3*(this.token.expires_in-this.accessTokenRenewalBufferSeconds))}setStatusBarStyle(e){window.webkit.messageHandlers.SetStatusBarStyle&&window.webkit.messageHandlers.SetStatusBarStyle.postMessage({style:e})}getDeviceInfo(){let e=this;return new Promise((function(t,n){let s=e.nextMessageID();e.messageHandlers[s]=function(e){t(e.data)},window.webkit.messageHandlers.GetDeviceInfo?window.webkit.messageHandlers.GetDeviceInfo.postMessage({messageID:s}):n()}))}getCurrentLanguage(){let e=new URLSearchParams(window.location.search);return e.has("lang")?e.get("lang"):navigator.language}showGoogleFitSettings(){window.webkit.messageHandlers.ShowGoogleFitSettings&&window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({})}requestReview(e){window.webkit.messageHandlers.RequestReview&&window.webkit.messageHandlers.RequestReview.postMessage({cooldownDays:e})}trackCustomEvent(t){const n=this;return this.connect().then((function(){return n.makeRequest("customevents","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDataCollectionSettings(){const t=this;return this.connect().then((function(){return t.makeRequest("datacollectionsettings","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}invokeCustomApi(t,n,s,a){if(t.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+t;if(n=n.toUpperCase(),null!=s&&("GET"===n||"DELETE"===n)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,n,s)})).then((function(t){return e.validateResponse(t)})).then((function(e){return a?e.json():void 0}))}nextMessageID(){return this.currentMessageID++}getBaseUrl(){return this.baseUrl||"https://mydatahelps.org/"}makeUrl(e){if(!this.baseUrl)throw console.error("Cannot use makeUrl without MyDataHelps.baseUrl."),"Cannot use makeUrl without MyDataHelps.baseUrl.";return this.baseUrl+this.apiBasePath+e}makeRequest(e,t,n){if(!this.token||!this.token.access_token)throw"No access_token available for request authorization.";let s=this.makeUrl(e),a=new Headers;a.append("Authorization","Bearer "+this.token.access_token),a.append("Accept","application/json, text/javascript, */*; q=0.01"),a.append("Accept-Language",this.getCurrentLanguage()),n&&a.append("Content-Type","application/json");let r={method:t,headers:a};return n&&(r.body=JSON.stringify(n)),fetch(s,r)}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replace("\\","\\\\").replace(",","\\,")}static reduceArrayAndEscape(t){if(Array.isArray(t)){return t.map((function(t){return e.escapeParam(t)})).join(",")}return this.escapeParam(t)}static convertDateToIsoString(e){let t=new Date(e);if(isNaN(t.getTime()))throw"Cannot interpret parameter as Date";return t.toISOString()}startEmbeddedSurveyInternal(e){let t="mydatahelps-survey-modal",n=this;return new Promise((function(s,a){if(document.getElementById(t))return void a("Survey already in progress");window.addEventListener("message",(function e(a){if(a.origin!==new URL(n.getBaseUrl()).origin)return;let r=document.getElementById("mydatahelps-survey-frame").contentWindow;a.source===r&&("SurveyWindowInitialized"===a.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===a.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s(a.data)))}),!0);let r=document.createElement("div");r.className="mydatahelps-survey-modal",r.id=t,r.innerHTML="<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='"+e+"'></iframe></div>",document.body.append(r),document.body.className+=" no-scroll"}))}}const t=new e;window.MyDataHelps=t,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{e as MyDataHelps,t as default};
|
|
2
2
|
//# sourceMappingURL=MyDataHelps.min.js.map
|
package/MyDataHelps.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MyDataHelps.min.js","sources":["../MyDataHelps.js"],"sourcesContent":["export class MyDataHelps {\n constructor() {\n this.allowedApplicationHosts = [\n 'localhost',\n 'careevolution.com',\n 'internal',\n 'b3-deploys.com',\n 'mydatahelps.org',\n 'platform.joinallofus.org',\n 'careevolution.dev',\n 'ce.dev'\n ];\n this.accessTokenRenewalBufferSeconds = 120;\n this.apiBasePath = 'api/v1/delegated/';\n this.unsupportedActions = [\"SetHeight\", \"ResearchKit\"];\n this.supportedEvents = [\"surveyDidFinish\", \"applicationDidBecomeVisible\", \"externalAccountSyncComplete\", \"tokenWillExpire\"];\n this.currentMessageID = 1;\n this.messageHandlers = [];\n this.registeredEventHandlers = {};\n this.refreshTokenPromise = null;\n let mdh = this;\n let applicationHost = getParentOrigin();\n let supportedActions;\n function getParentOrigin() {\n let ancestorOrigins = document.location.ancestorOrigins;\n if (ancestorOrigins && ancestorOrigins[0]) {\n return ancestorOrigins[0];\n }\n return '*';\n }\n function acceptableOrigin(origin) {\n if (origin === '*')\n return true;\n let sourceURL = new URL(origin);\n for (let k = 0; k < mdh.allowedApplicationHosts.length; k++) {\n if (sourceURL.hostname === mdh.allowedApplicationHosts[k] || sourceURL.hostname.endsWith(\".\" + mdh.allowedApplicationHosts[k])) {\n return true;\n }\n }\n return false;\n }\n function validateWindowMessageOrigin(message) {\n if (applicationHost === \"*\") {\n return acceptableOrigin(message.origin);\n }\n return message.origin === applicationHost;\n }\n function receiveWindowMessage(message) {\n if (!validateWindowMessageOrigin(message)) {\n console.error(\"message.origin '\" + message.origin + \"' is not allowed.\");\n throw \"message.origin '\" + message.origin + \"' is not allowed.\";\n }\n if (message.data.messageID) {\n mdh.setActionResult(message.data);\n }\n else {\n mdh.triggerEvent(message.data);\n }\n }\n if (!acceptableOrigin(applicationHost)) {\n console.error(\"Application is not hosted at an approved origin.\");\n throw \"Application is not hosted at an approved origin.\";\n }\n if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n }\n };\n }\n else {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n },\n \"StartParticipantSurvey\": function (data) {\n window.parent.postMessage({\n name: 'StartParticipantSurvey',\n messageID: data.messageID,\n surveyName: data.surveyName\n }, applicationHost);\n },\n \"OpenExternalLink\": function (data) {\n window.parent.postMessage({ name: 'OpenExternalUrl', url: data }, applicationHost);\n },\n \"OpenEmbeddedLink\": function (data) {\n window.parent.postMessage({ name: 'OpenEmbeddedUrl', url: data }, applicationHost);\n },\n \"OpenExternalApplication\": function (data) {\n window.parent.postMessage({\n name: 'OpenApplication',\n messageID: data.messageID,\n url: data.url,\n modal: data.modal\n }, applicationHost);\n },\n \"Dismiss\": function () {\n window.parent.postMessage({ name: 'Dismiss' }, applicationHost);\n },\n \"PopNavigation\": function () {\n window.parent.postMessage({ name: 'Back' }, applicationHost);\n },\n \"ShowTab\": function (data) {\n window.parent.postMessage({ name: 'ShowTab', tabKey: data }, applicationHost);\n },\n \"ShowParticipantDashboard\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantDashboard',\n dashboardKey: data.dashboardKey,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualization\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualization',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualizationPDF\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualizationPDF',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal,\n landscape: data.landscape,\n htmlViewerZoom: data.htmlViewerZoom\n }, applicationHost);\n },\n \"DeleteProviderAccount\": function (data) {\n window.parent.postMessage({\n name: 'DeleteProviderAccount',\n messageID: data.messageID,\n accountID: data.accountID\n }, applicationHost);\n },\n \"ConnectExternalAccount\": function (data) {\n window.parent.postMessage({\n name: 'ConnectExternalAccount',\n externalAccountProviderID: data.externalAccountProviderID\n }, applicationHost);\n },\n \"ShowProject\": function (data) {\n window.parent.postMessage({ name: 'ShowProject', code: data.code }, applicationHost);\n },\n \"JoinProject\": function (data) {\n window.parent.postMessage({ name: 'JoinProject', code: data.code }, applicationHost);\n }\n };\n }\n function windowHasAnyActions() {\n for (let action in supportedActions) {\n if (window.webkit.messageHandlers[action]) {\n return true;\n }\n }\n for (let action in mdh.unsupportedActions) {\n if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {\n return true;\n }\n }\n return false;\n }\n if (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {\n window.webkit = {\n messageHandlers: {}\n };\n }\n for (let action in supportedActions) {\n window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: supportedActions[action] };\n }\n window.addEventListener(\"message\", receiveWindowMessage, false);\n }\n // Surveys\n startSurvey(surveyName) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.StartParticipantSurvey.postMessage({\n messageID: messageID,\n surveyName: surveyName\n });\n }\n completeStep(answer) {\n if (answer === undefined || answer === null)\n answer = '';\n if (window.webkit.messageHandlers.ResearchKit) {\n window.webkit.messageHandlers.ResearchKit.postMessage(answer);\n }\n }\n querySurveyAnswers(queryParameters) {\n 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 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 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 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 // 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","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","refreshDelegatedAccessToken","token","tokenResponse","tokenExpires","Date","now","expires_in","baseUrl","setTimeout","setParticipantAccessToken","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","deviceInfoResponse","searchParams","has","get","navigator","showGoogleFitSettings","ShowGoogleFitSettings","requestReview","cooldownDays","RequestReview","trackCustomEvent","getDataCollectionSettings","invokeCustomApi","customApi","method","jsonResponse","toUpperCase","parameterString","makeUrl","body","access_token","headers","Headers","append","init","JSON","stringify","fetch","static","ok","statusText","param","String","replace","Array","isArray","map","elem","escapeParam","join","date","paramAsDate","isNaN","getTime","toISOString","mdhSurveyModalId","getElementById","listener","frame","contentWindow","source","className","remove","removeEventListener","surveyModal","createElement","id","innerHTML","RKStudioClient"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MyDataHelps.min.js","sources":["../MyDataHelps.js"],"sourcesContent":["export class MyDataHelps {\n constructor() {\n this.allowedApplicationHosts = [\n 'localhost',\n 'careevolution.com',\n 'internal',\n 'b3-deploys.com',\n 'mydatahelps.org',\n 'platform.joinallofus.org',\n 'careevolution.dev',\n 'ce.dev'\n ];\n this.accessTokenRenewalBufferSeconds = 120;\n this.apiBasePath = 'api/v1/delegated/';\n this.unsupportedActions = [\"SetHeight\", \"ResearchKit\"];\n this.supportedEvents = [\"surveyDidFinish\", \"applicationDidBecomeVisible\", \"externalAccountSyncComplete\", \"tokenWillExpire\"];\n this.currentMessageID = 1;\n this.messageHandlers = [];\n this.registeredEventHandlers = {};\n this.refreshTokenPromise = null;\n let mdh = this;\n let applicationHost = getParentOrigin();\n let supportedActions;\n function getParentOrigin() {\n let ancestorOrigins = document.location.ancestorOrigins;\n if (ancestorOrigins && ancestorOrigins[0]) {\n return ancestorOrigins[0];\n }\n return '*';\n }\n function acceptableOrigin(origin) {\n if (origin === '*')\n return true;\n let sourceURL = new URL(origin);\n for (let k = 0; k < mdh.allowedApplicationHosts.length; k++) {\n if (sourceURL.hostname === mdh.allowedApplicationHosts[k] || sourceURL.hostname.endsWith(\".\" + mdh.allowedApplicationHosts[k])) {\n return true;\n }\n }\n return false;\n }\n function validateWindowMessageOrigin(message) {\n if (applicationHost === \"*\") {\n return acceptableOrigin(message.origin);\n }\n return message.origin === applicationHost;\n }\n function receiveWindowMessage(message) {\n if (!validateWindowMessageOrigin(message)) {\n console.error(\"message.origin '\" + message.origin + \"' is not allowed.\");\n throw \"message.origin '\" + message.origin + \"' is not allowed.\";\n }\n if (message.data.messageID) {\n mdh.setActionResult(message.data);\n }\n else {\n mdh.triggerEvent(message.data);\n }\n }\n if (!acceptableOrigin(applicationHost)) {\n console.error(\"Application is not hosted at an approved origin.\");\n throw \"Application is not hosted at an approved origin.\";\n }\n if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n }\n };\n }\n else {\n supportedActions = {\n \"GetDelegatedAccessToken\": function (data) {\n window.parent.postMessage({\n name: 'GetDelegatedAccessToken',\n messageID: data.messageID\n }, applicationHost);\n },\n \"GetDeviceInfo\": function (data) {\n window.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost);\n },\n \"StartParticipantSurvey\": function (data) {\n window.parent.postMessage({\n name: 'StartParticipantSurvey',\n messageID: data.messageID,\n surveyName: data.surveyName\n }, applicationHost);\n },\n \"OpenExternalLink\": function (data) {\n window.parent.postMessage({ name: 'OpenExternalUrl', url: data }, applicationHost);\n },\n \"OpenEmbeddedLink\": function (data) {\n window.parent.postMessage({ name: 'OpenEmbeddedUrl', url: data }, applicationHost);\n },\n \"OpenExternalApplication\": function (data) {\n window.parent.postMessage({\n name: 'OpenApplication',\n messageID: data.messageID,\n url: data.url,\n modal: data.modal\n }, applicationHost);\n },\n \"Dismiss\": function () {\n window.parent.postMessage({ name: 'Dismiss' }, applicationHost);\n },\n \"PopNavigation\": function () {\n window.parent.postMessage({ name: 'Back' }, applicationHost);\n },\n \"ShowTab\": function (data) {\n window.parent.postMessage({ name: 'ShowTab', tabKey: data }, applicationHost);\n },\n \"ShowParticipantDashboard\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantDashboard',\n dashboardKey: data.dashboardKey,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualization\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualization',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal\n }, applicationHost);\n },\n \"ShowParticipantWebVisualizationPDF\": function (data) {\n window.parent.postMessage({\n name: 'ShowParticipantWebVisualizationPDF',\n visualizationKey: data.visualizationKey,\n parameters: data.parameters,\n modal: data.modal,\n landscape: data.landscape,\n htmlViewerZoom: data.htmlViewerZoom\n }, applicationHost);\n },\n \"DeleteProviderAccount\": function (data) {\n window.parent.postMessage({\n name: 'DeleteProviderAccount',\n messageID: data.messageID,\n accountID: data.accountID\n }, applicationHost);\n },\n \"ConnectExternalAccount\": function (data) {\n window.parent.postMessage({\n name: 'ConnectExternalAccount',\n externalAccountProviderID: data.externalAccountProviderID\n }, applicationHost);\n },\n \"ShowProject\": function (data) {\n window.parent.postMessage({ name: 'ShowProject', code: data.code }, applicationHost);\n },\n \"JoinProject\": function (data) {\n window.parent.postMessage({ name: 'JoinProject', code: data.code }, applicationHost);\n }\n };\n }\n function windowHasAnyActions() {\n for (let action in supportedActions) {\n if (window.webkit.messageHandlers[action]) {\n return true;\n }\n }\n for (let action in mdh.unsupportedActions) {\n if (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {\n return true;\n }\n }\n return false;\n }\n if (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {\n window.webkit = {\n messageHandlers: {}\n };\n }\n for (let action in supportedActions) {\n window.webkit.messageHandlers[action] = window.webkit.messageHandlers[action] || { postMessage: supportedActions[action] };\n }\n window.addEventListener(\"message\", receiveWindowMessage, false);\n }\n // Surveys\n startSurvey(surveyName) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.StartParticipantSurvey.postMessage({\n messageID: messageID,\n surveyName: surveyName\n });\n }\n completeStep(answer) {\n if (answer === undefined || answer === null)\n answer = '';\n if (window.webkit.messageHandlers.ResearchKit) {\n window.webkit.messageHandlers.ResearchKit.postMessage(answer);\n }\n }\n querySurveyAnswers(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"surveyName\")) {\n queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n }\n if (queryParameters.hasOwnProperty(\"stepIdentifier\")) {\n queryParameters.stepIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.stepIdentifier);\n }\n if (queryParameters.hasOwnProperty(\"resultIdentifier\")) {\n queryParameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.resultIdentifier);\n }\n if (queryParameters.hasOwnProperty(\"answer\")) {\n queryParameters.answer = MyDataHelps.reduceArrayAndEscape(queryParameters.answer);\n }\n if (queryParameters.hasOwnProperty(\"before\")) {\n queryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n }\n if (queryParameters.hasOwnProperty(\"after\")) {\n queryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'surveyanswers?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n deleteSurveyResult(resultID) {\n const endpoint = 'surveyresults/' + encodeURIComponent(resultID);\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'DELETE', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n querySurveyTasks(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"status\")) {\n queryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status);\n }\n if (queryParameters.hasOwnProperty(\"surveyName\")) {\n queryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'surveytasks?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n startEmbeddedSurvey(linkIdentifier, surveyName, language) {\n if (!language) {\n language = this.getCurrentLanguage();\n }\n let surveyUrl = this.getBaseUrl() + \"mydatahelps/\" + linkIdentifier + '/surveylink/' + surveyName + \"?lang=\" + language;\n return this.startEmbeddedSurveyInternal(surveyUrl);\n }\n startEmbeddedTask(linkIdentifier, taskLinkIdentifier, language) {\n if (!language) {\n language = this.getCurrentLanguage();\n }\n let surveyUrl = this.getBaseUrl() + \"mydatahelps/\" + linkIdentifier + '/tasklink/' + taskLinkIdentifier + \"?lang=\" + language;\n return this.startEmbeddedSurveyInternal(surveyUrl);\n }\n // Navigation\n openExternalUrl(url) {\n window.webkit.messageHandlers.OpenExternalLink.postMessage(url);\n }\n openEmbeddedUrl(url) {\n window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);\n }\n showTab(tabKey) {\n window.webkit.messageHandlers.ShowTab.postMessage(tabKey);\n }\n openApplication(url, options) {\n let messageID = this.nextMessageID();\n window.webkit.messageHandlers.OpenExternalApplication.postMessage({\n messageID: messageID,\n url: url,\n modal: !!(options && options.modal)\n });\n }\n dismiss() {\n window.webkit.messageHandlers.Dismiss.postMessage({});\n }\n back() {\n window.webkit.messageHandlers.PopNavigation.postMessage({});\n }\n showDashboard(dashboardKey, options) {\n window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({\n dashboardKey: dashboardKey,\n modal: !!(options && options.modal),\n title: options && options.title ? options.title : undefined\n });\n }\n showWebVisualization(visualizationKey, parameters, options) {\n window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({\n visualizationKey: visualizationKey,\n parameters: parameters,\n modal: !!(options && options.modal),\n title: options && options.title ? options.title : undefined\n });\n }\n showWebVisualizationPdf(visualizationKey, parameters, options) {\n window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({\n visualizationKey: visualizationKey,\n parameters: parameters,\n landscape: !!(options && options.landscape),\n htmlViewerZoom: options && options.htmlViewerZoom\n });\n }\n showProject(projectCode) {\n if (window.webkit.messageHandlers.ShowProject) {\n window.webkit.messageHandlers.ShowProject.postMessage({ code: projectCode });\n }\n }\n joinProject(projectCode) {\n if (window.webkit.messageHandlers.JoinProject) {\n window.webkit.messageHandlers.JoinProject.postMessage({ code: projectCode });\n }\n }\n //Events\n on(eventName, callback) {\n if (!this.supportedEvents.includes(eventName)) {\n throw new Error(eventName + \" is not a supported event type.\");\n }\n if (!this.registeredEventHandlers[eventName]) {\n this.registeredEventHandlers[eventName] = [];\n }\n this.registeredEventHandlers[eventName].push(callback);\n }\n off(eventName, callback) {\n if (!this.supportedEvents.includes(eventName)) {\n throw new Error(eventName + \" is not a supported event type.\");\n }\n if (!this.registeredEventHandlers[eventName])\n return;\n let eventHandlerIndex = this.registeredEventHandlers[eventName].indexOf(callback);\n if (eventHandlerIndex !== -1) {\n this.registeredEventHandlers[eventName].splice(eventHandlerIndex, 1);\n }\n }\n triggerEvent(event) {\n let eventName = event.type;\n if (this.supportedEvents.includes(eventName) && this.registeredEventHandlers[eventName]) {\n this.registeredEventHandlers[eventName].forEach(function (handler) {\n handler(event);\n });\n }\n }\n setActionResult(data) {\n this.messageHandlers[data.messageID](data);\n }\n // Participant Info\n getParticipantInfo() {\n const mdh = this;\n const endpoint = 'participant';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n getProjectInfo() {\n const mdh = this;\n const endpoint = 'project';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Device Data\n queryDeviceData(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"type\")) {\n queryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type);\n }\n if (queryParameters.hasOwnProperty(\"observedBefore\")) {\n queryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n }\n if (queryParameters.hasOwnProperty(\"observedAfter\")) {\n queryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'devicedata?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n persistDeviceData(deviceDataPoints) {\n const endpoint = 'devicedata';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', deviceDataPoints);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n // External Accounts\n getExternalAccountProviders(search, category, pageSize, pageNumber) {\n let searchParameters = {};\n if (!!search)\n searchParameters.search = search;\n if (!!category)\n searchParameters.category = category;\n if (!!pageSize)\n searchParameters.pageSize = pageSize;\n if (!!pageNumber)\n searchParameters.pageNumber = pageNumber;\n const queryString = new URLSearchParams(searchParameters).toString();\n const endpoint = 'externalaccountproviders?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n connectExternalAccount(externalAccountProviderID) {\n if (window.webkit.messageHandlers.ConnectExternalAccount) {\n window.webkit.messageHandlers.ConnectExternalAccount.postMessage({ externalAccountProviderID: externalAccountProviderID });\n }\n }\n getExternalAccounts() {\n const endpoint = 'externalaccounts';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n refreshExternalAccount(accountID) {\n const endpoint = 'externalaccounts/refresh/' + accountID;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n deleteExternalAccount(accountID) {\n let mdh = this;\n return new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {\n if (!deleteProviderAccountResponse.success) {\n reject(deleteProviderAccountResponse);\n }\n else {\n resolve(deleteProviderAccountResponse);\n }\n };\n if (window.webkit.messageHandlers.DeleteProviderAccount) {\n window.webkit.messageHandlers.DeleteProviderAccount.postMessage({\n messageID: messageID,\n accountID: accountID\n });\n }\n else {\n reject();\n }\n });\n }\n // Notifications\n queryNotifications(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"sentBefore\")) {\n queryParameters.sentBefore = MyDataHelps.convertDateToIsoString(queryParameters.sentBefore);\n }\n if (queryParameters.hasOwnProperty(\"sentAfter\")) {\n queryParameters.sentAfter = MyDataHelps.convertDateToIsoString(queryParameters.sentAfter);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'notifications?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Fitbit\n queryFitbitDailySummaries(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'fitbit/dailySummaries?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n queryFitbitSleepLogs(queryParameters) {\n queryParameters = Object.assign({}, queryParameters);\n if (queryParameters.hasOwnProperty(\"startDate\")) {\n queryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n }\n if (queryParameters.hasOwnProperty(\"endDate\")) {\n queryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n }\n const queryString = new URLSearchParams(queryParameters).toString();\n const endpoint = 'fitbit/sleepLogs?' + queryString;\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n // Authorization\n connect() {\n const mdh = this;\n let refreshDelegatedAccessToken = function () {\n mdh.token = null;\n mdh.refreshTokenPromise = new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (tokenResponse) {\n if (tokenResponse.success) {\n mdh.tokenExpires = Date.now() + (tokenResponse.data.expires_in * 1000);\n mdh.token = tokenResponse.data;\n mdh.baseUrl = tokenResponse.baseUrl;\n setTimeout(refreshDelegatedAccessToken, ((tokenResponse.data.expires_in - mdh.accessTokenRenewalBufferSeconds) * 1000));\n resolve(null);\n }\n else {\n mdh.token = null;\n reject(tokenResponse.message);\n }\n mdh.messageHandlers[messageID] = null;\n mdh.refreshTokenPromise = null;\n };\n window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({ messageID: messageID });\n });\n };\n if (this.token && Date.now() < this.tokenExpires) {\n return Promise.resolve();\n }\n if (!this.refreshTokenPromise) {\n refreshDelegatedAccessToken();\n }\n // Re-use promise if refresh already in progress\n return this.refreshTokenPromise;\n }\n setParticipantAccessToken(token, baseUrl) {\n this.token = token;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n this.tokenExpires = Date.now() + (this.token.expires_in * 1000);\n const mdh = this;\n setTimeout(function () {\n mdh.triggerEvent({ type: \"tokenWillExpire\" });\n }, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));\n }\n // Miscellaneous\n setStatusBarStyle(style) {\n if (window.webkit.messageHandlers.SetStatusBarStyle) {\n window.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });\n }\n }\n getDeviceInfo() {\n let mdh = this;\n return new Promise(function (resolve, reject) {\n let messageID = mdh.nextMessageID();\n mdh.messageHandlers[messageID] = function (deviceInfoResponse) {\n resolve(deviceInfoResponse.data);\n };\n if (window.webkit.messageHandlers.GetDeviceInfo) {\n window.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });\n }\n else {\n reject();\n }\n });\n }\n getCurrentLanguage() {\n let searchParams = new URLSearchParams(window.location.search);\n if (searchParams.has(\"lang\")) {\n return searchParams.get(\"lang\");\n }\n else {\n return navigator.language;\n }\n }\n showGoogleFitSettings() {\n if (window.webkit.messageHandlers.ShowGoogleFitSettings) {\n window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({});\n }\n }\n requestReview(cooldownDays) {\n if (window.webkit.messageHandlers.RequestReview) {\n window.webkit.messageHandlers.RequestReview.postMessage({ cooldownDays: cooldownDays });\n }\n }\n trackCustomEvent(event) {\n const endpoint = 'customevents';\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'POST', event);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function () {\n return;\n });\n }\n getDataCollectionSettings() {\n const mdh = this;\n const endpoint = 'datacollectionsettings';\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, 'GET', null);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return response.json();\n });\n }\n invokeCustomApi(customApi, method, queryParameters, jsonResponse) {\n if (customApi.includes('?')) {\n throw new Error(\"Cannot include query parameters directly in the \\\"customApi\\\" string. Provide as an argument for \\\"queryParameters\\\" instead.\");\n }\n let endpoint = 'custom/' + customApi;\n method = method.toUpperCase();\n if (queryParameters !== null && queryParameters !== undefined && (method === 'GET' || method === 'DELETE')) {\n let parameterString = new URLSearchParams(queryParameters).toString();\n endpoint += \"?\" + parameterString;\n queryParameters = null;\n }\n const mdh = this;\n return this\n .connect()\n .then(function () {\n return mdh.makeRequest(endpoint, method, queryParameters);\n })\n .then(function (response) {\n return MyDataHelps.validateResponse(response);\n })\n .then(function (response) {\n return jsonResponse ? response.json() : undefined;\n });\n }\n nextMessageID() {\n return this.currentMessageID++;\n }\n getBaseUrl() {\n return this.baseUrl || 'https://mydatahelps.org/';\n }\n makeUrl(endpoint) {\n if (!this.baseUrl) {\n console.error(\"Cannot use makeUrl without MyDataHelps.baseUrl.\");\n throw \"Cannot use makeUrl without MyDataHelps.baseUrl.\";\n }\n return this.baseUrl + this.apiBasePath + endpoint;\n }\n makeRequest(endpoint, method, body) {\n if (!this.token || !this.token.access_token) {\n throw \"No access_token available for request authorization.\";\n }\n let url = this.makeUrl(endpoint);\n let headers = new Headers();\n headers.append('Authorization', 'Bearer ' + this.token.access_token);\n headers.append('Accept', 'application/json, text/javascript, */*; q=0.01');\n headers.append('Accept-Language', this.getCurrentLanguage());\n if (!!body) {\n headers.append('Content-Type', 'application/json');\n }\n let init = {\n method: method,\n headers: headers\n };\n if (!!body) {\n init.body = JSON.stringify(body);\n }\n return fetch(url, init);\n }\n static validateResponse(response) {\n if (!response.ok) {\n throw response.statusText;\n }\n return response;\n }\n static escapeParam(param) {\n return String(param)\n .replace(\"\\\\\", \"\\\\\\\\\")\n .replace(\",\", \"\\\\,\");\n }\n static reduceArrayAndEscape(param) {\n if (Array.isArray(param)) {\n let escapedParams = param.map(function (elem) {\n return MyDataHelps.escapeParam(elem);\n });\n return escapedParams.join(\",\");\n }\n return this.escapeParam(param);\n }\n static convertDateToIsoString(date) {\n let paramAsDate = new Date(date);\n if (isNaN(paramAsDate.getTime())) {\n throw \"Cannot interpret parameter as Date\";\n }\n return paramAsDate.toISOString();\n }\n startEmbeddedSurveyInternal(surveyUrl) {\n let mdhSurveyModalId = 'mydatahelps-survey-modal';\n let mdh = this;\n return new Promise(function (resolve, reject) {\n if (document.getElementById(mdhSurveyModalId)) {\n reject(\"Survey already in progress\");\n return;\n }\n window.addEventListener(\"message\", function listener(message) {\n if (message.origin !== new URL(mdh.getBaseUrl()).origin) {\n return;\n }\n let frame = document.getElementById('mydatahelps-survey-frame').contentWindow;\n if (message.source !== frame) {\n return;\n }\n if (message.data.name === 'SurveyWindowInitialized') {\n document.getElementById(mdhSurveyModalId).className += \" loaded\";\n }\n else if (message.data.name === 'SurveyFinished') {\n document.getElementById(mdhSurveyModalId).remove();\n document.body.className = document.body.className.replace(\"no-scroll\", \"\");\n window.removeEventListener(\"message\", listener, true);\n resolve(message.data);\n }\n }, true);\n let surveyModal = document.createElement('div');\n surveyModal.className = 'mydatahelps-survey-modal';\n surveyModal.id = mdhSurveyModalId;\n surveyModal.innerHTML = \"<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='\" + surveyUrl + \"'></iframe></div>\";\n document.body.append(surveyModal);\n document.body.className += ' no-scroll';\n });\n }\n}\n//iOS/Android directly invoke window.MyDataHelps and window.RKStudioClient\n//so it's necessary to explicitly ensure they are present on the window\nconst mdh = new MyDataHelps();\nwindow.MyDataHelps = mdh;\n// For backwards compatibility\nwindow.RKStudioClient = {};\nwindow.RKStudioClient.setActionResult = function (data) {\n window.MyDataHelps.setActionResult(data);\n};\nexport default mdh;\nexport * from './types';\n"],"names":["MyDataHelps","constructor","this","allowedApplicationHosts","accessTokenRenewalBufferSeconds","apiBasePath","unsupportedActions","supportedEvents","currentMessageID","messageHandlers","registeredEventHandlers","refreshTokenPromise","supportedActions","mdh","applicationHost","ancestorOrigins","document","location","getParentOrigin","acceptableOrigin","origin","sourceURL","URL","k","length","hostname","endsWith","console","error","window","webkit","ResearchKit","GetDelegatedAccessToken","data","parent","postMessage","name","messageID","GetDeviceInfo","StartParticipantSurvey","surveyName","OpenExternalLink","url","OpenEmbeddedLink","OpenExternalApplication","modal","Dismiss","PopNavigation","ShowTab","tabKey","ShowParticipantDashboard","dashboardKey","ShowParticipantWebVisualization","visualizationKey","parameters","ShowParticipantWebVisualizationPDF","landscape","htmlViewerZoom","DeleteProviderAccount","accountID","ConnectExternalAccount","externalAccountProviderID","ShowProject","code","JoinProject","action","windowHasAnyActions","addEventListener","message","validateWindowMessageOrigin","setActionResult","triggerEvent","startSurvey","nextMessageID","completeStep","answer","querySurveyAnswers","queryParameters","Object","assign","hasOwnProperty","reduceArrayAndEscape","stepIdentifier","resultIdentifier","before","convertDateToIsoString","after","endpoint","URLSearchParams","toString","connect","then","makeRequest","response","validateResponse","json","deleteSurveyResult","resultID","encodeURIComponent","querySurveyTasks","status","startEmbeddedSurvey","linkIdentifier","language","getCurrentLanguage","surveyUrl","getBaseUrl","startEmbeddedSurveyInternal","startEmbeddedTask","taskLinkIdentifier","openExternalUrl","openEmbeddedUrl","showTab","openApplication","options","dismiss","back","showDashboard","title","undefined","showWebVisualization","showWebVisualizationPdf","showProject","projectCode","joinProject","on","eventName","callback","includes","Error","push","off","eventHandlerIndex","indexOf","splice","event","type","forEach","handler","getParticipantInfo","getProjectInfo","queryDeviceData","observedBefore","observedAfter","persistDeviceData","deviceDataPoints","getExternalAccountProviders","search","category","pageSize","pageNumber","searchParameters","connectExternalAccount","getExternalAccounts","refreshExternalAccount","deleteExternalAccount","Promise","resolve","reject","deleteProviderAccountResponse","success","queryNotifications","sentBefore","sentAfter","queryFitbitDailySummaries","startDate","endDate","queryFitbitSleepLogs","refreshDelegatedAccessToken","token","tokenResponse","tokenExpires","Date","now","expires_in","baseUrl","setTimeout","setParticipantAccessToken","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","deviceInfoResponse","searchParams","has","get","navigator","showGoogleFitSettings","ShowGoogleFitSettings","requestReview","cooldownDays","RequestReview","trackCustomEvent","getDataCollectionSettings","invokeCustomApi","customApi","method","jsonResponse","toUpperCase","parameterString","makeUrl","body","access_token","headers","Headers","append","init","JSON","stringify","fetch","static","ok","statusText","param","String","replace","Array","isArray","map","elem","escapeParam","join","date","paramAsDate","isNaN","getTime","toISOString","mdhSurveyModalId","getElementById","listener","frame","contentWindow","source","className","remove","removeEventListener","surveyModal","createElement","id","innerHTML","RKStudioClient"],"mappings":"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"}
|
package/package.json
CHANGED
package/types.d.ts
CHANGED
|
@@ -219,6 +219,88 @@ export interface SurveyAnswer {
|
|
|
219
219
|
answers: string[];
|
|
220
220
|
insertedDate: string;
|
|
221
221
|
}
|
|
222
|
+
export interface FitbitQuery {
|
|
223
|
+
providerID?: number;
|
|
224
|
+
pageID?: Guid;
|
|
225
|
+
pageSize?: number;
|
|
226
|
+
startDate?: string;
|
|
227
|
+
endDate?: string;
|
|
228
|
+
}
|
|
229
|
+
export interface FitbitDailySummariesPage {
|
|
230
|
+
results: FitbitDailySummary[];
|
|
231
|
+
nextPageID?: Guid;
|
|
232
|
+
}
|
|
233
|
+
export interface FitbitDailySummary {
|
|
234
|
+
date: string;
|
|
235
|
+
activityCalories: number;
|
|
236
|
+
bodyBMI: number;
|
|
237
|
+
bodyFat: number;
|
|
238
|
+
bodyWeight: number;
|
|
239
|
+
calories: number;
|
|
240
|
+
caloriesBMR: number;
|
|
241
|
+
distance: number;
|
|
242
|
+
elevation: number;
|
|
243
|
+
foodCaloriesIn: number;
|
|
244
|
+
floors: number;
|
|
245
|
+
heartRateZones: FitbitHeartRateZones;
|
|
246
|
+
minutesFairlyActive: number;
|
|
247
|
+
minutesLightlyActive: number;
|
|
248
|
+
minutesSedentary: number;
|
|
249
|
+
minutesVeryActive: number;
|
|
250
|
+
steps: number;
|
|
251
|
+
tracker: FitbitTracker;
|
|
252
|
+
water: number;
|
|
253
|
+
modifiedDate: string;
|
|
254
|
+
restingHeartRate: number;
|
|
255
|
+
}
|
|
256
|
+
export interface FitbitHeartRateZones {
|
|
257
|
+
fatBurn: FitbitHeartRateZone;
|
|
258
|
+
cardio: FitbitHeartRateZone;
|
|
259
|
+
peak: FitbitHeartRateZone;
|
|
260
|
+
outOfRange: FitbitHeartRateZone;
|
|
261
|
+
}
|
|
262
|
+
export interface FitbitHeartRateZone {
|
|
263
|
+
caloriesOut: number;
|
|
264
|
+
min: number;
|
|
265
|
+
max: number;
|
|
266
|
+
minutes: number;
|
|
267
|
+
}
|
|
268
|
+
export interface FitbitTracker {
|
|
269
|
+
activityCalories: number;
|
|
270
|
+
calories: number;
|
|
271
|
+
distance: number;
|
|
272
|
+
elevation: number;
|
|
273
|
+
floors: number;
|
|
274
|
+
minutesFairlyActive: number;
|
|
275
|
+
minutesLightlyActive: number;
|
|
276
|
+
minutesSedentary: number;
|
|
277
|
+
minutesVeryActive: number;
|
|
278
|
+
steps: number;
|
|
279
|
+
}
|
|
280
|
+
export interface FitbitSleepLogsPage {
|
|
281
|
+
results: FitbitSleepLogs[];
|
|
282
|
+
nextPageID?: Guid;
|
|
283
|
+
}
|
|
284
|
+
export interface FitbitSleepLogs {
|
|
285
|
+
startTimestamp: string;
|
|
286
|
+
endTimestamp: string;
|
|
287
|
+
duration: number;
|
|
288
|
+
efficiency: number;
|
|
289
|
+
timeInBed: number;
|
|
290
|
+
infoCode: string;
|
|
291
|
+
type: string;
|
|
292
|
+
minutesAfterWakeup: number;
|
|
293
|
+
minutesAsleep: number;
|
|
294
|
+
minutesAwake: number;
|
|
295
|
+
minutesToFallAsleep: number;
|
|
296
|
+
sleepLevelAwake: number;
|
|
297
|
+
sleepLevelAsleep: number;
|
|
298
|
+
sleepLevelRestless: number;
|
|
299
|
+
sleepLevelDeep: number;
|
|
300
|
+
sleepLevelLight: number;
|
|
301
|
+
sleepLevelRem: number;
|
|
302
|
+
sleepLevelWake: number;
|
|
303
|
+
}
|
|
222
304
|
export interface EventData {
|
|
223
305
|
type: string;
|
|
224
306
|
messageID?: number;
|