UNPKG

@aiztechlabs/cardio-sdk

Version:

A JavaScript SDK for integrating Cardio test.

3 lines (2 loc) 7.09 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).ISelfieCardioSDK={})}(this,(function(t){"use strict";const e={frontend_url:"https://dev-ui-v2.iselfietest.com",backend_url:"https://dev-api.iselfietest.com"},i={frontend_url:"https://consumer.iselfietest.com",backend_url:"https://consumer-api.iselfietest.com"};class s{constructor(t){this.iframe=null,this.resolveTest=null,this.rejectTest=null,this.domain=window.location.origin,this.organization=null,this.success=!1,this.config="dev"===t?.environment?e:i,this.apiKey=t?.apiKey||"",this.appUserId=t?.appUserId||"",this.containerId=t?.containerId||"iselfietest",this.options={displayResults:t?.options?.displayResults??!1,enablePDFSharing:t?.options?.enablePDFSharing??!1,timezone:t?.options?.timezone??"Etc/UTC",disableAudio:t?.options?.disableAudio??!1,language:t?.options?.language??"en",isDarkMode:t?.options?.isDarkMode??!0,disableMotionDetection:t?.options?.disableMotionDetection??!1,disableLightCheck:t?.options?.disableLightCheck??!1,disableDistanceCheck:t?.options?.disableDistanceCheck??!1,terminateTestIfConditionPersisted:t?.options?.terminateTestIfConditionPersisted??!1,testTerminationTimeOut:t?.options?.testTerminationTimeOut??7,instructionPage:t?.options?.instructionPage??{hidden:!1,instructionContent:null}},this.styles={pageBackgroundColor:t?.styles?.pageBackgroundColor||"",cardBackgroundColor:t?.styles?.cardBackgroundColor||"",cardHeaderBackgroundColor:t?.styles?.cardHeaderBackgroundColor||"",primaryTextColor:t?.styles?.primaryTextColor||"",secondaryTextColor:t?.styles?.secondaryTextColor||"",buttonColor:t?.styles?.buttonColor||"",buttonTextColor:t?.styles?.buttonTextColor||"",iconColor:t?.styles?.iconColor||"",fontFace:t?.styles?.fontFace||""}}async verifyApiKey(){try{const t=await fetch(`${this.config.backend_url}/sdk/verify`,{method:"GET",headers:{"Content-Type":"application/json","X-Api-Key":this.apiKey}}),e=await t.json();return this.success=e.success,this.organization=e.organization||null,e}catch(t){return console.error("API call failed:",t.message??t),this.success=!1,!1}}async fetchOrgStatus(){try{const t=await fetch(`${this.config.backend_url}/sdk/orgStatus`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":this.apiKey},body:JSON.stringify({organizationId:this.organization._id})});return(await t.json()).data}catch(t){throw new Error("Failed to fetch organization status.")}}async fetchSubscriptionList(){if(!this.organization?._id)throw new Error("Organization ID not available.");try{const t=await fetch(`${this.config.backend_url}/subscription/sdk/${this.organization._id}/list`,{method:"GET",headers:{"Content-Type":"application/json","X-Api-Key":this.apiKey}});return(await t.json()).subscriptions}catch(t){throw new Error("Failed to fetch subscription list.")}}async checkOrgStatus(){const t=await this.fetchOrgStatus(),e=await this.fetchSubscriptionList(),i=t?.accountType,s=t?.totalCardioTestCount||0;if("free"===i)return!0;if("trial"===i){if((o.organization?.cardioTrialTestLimit||0)-s>0)return!0}if("active"===i){const{cardio:i}=t?.testLimitByCurrentSubscription,o=(i.testLimit?i.testLimit.interval_count*i.testLimit.unit:0)-s,n=e.filter((t=>"cardio"===t?.productType&&"active"===t?.stripe?.status));if(o>0&&n.length>0)return!0}return!1}async initialize(){const t=await this.verifyApiKey();if(!t.success)throw new Error(`Verification failed: ${t.message}`);return await this.checkOrgStatus()}createIframe(t){this.iframe?this.sendMessageToIframe():(this.iframe=document.createElement("iframe"),this.iframe.id="iselfietest-iframe",this.iframe.style.border="none",this.iframe.style.width="100%",this.iframe.style.height="100%",this.iframe.allow="camera; microphone",this.iframe.src=`${this.config.frontend_url}/sdk/before-cardio-test?isSDK=true`,t.appendChild(this.iframe),this.iframe.onload=()=>{console.log("Iframe loaded, sending initial message to parent"),this.sendMessageToIframe()},window.addEventListener("message",(t=>this.handleIncomingMessages(t)),!1))}sendMessageToIframe(){const t={type:"iselfietest-sdk-init",data:{apiKey:this.apiKey,organization:{id:this.organization?._id,name:this.organization?.name,description:this.organization?.description,logo:this.organization?.imageUrl},privilege:this.organization?.privilege,appUserId:this.appUserId,domain:this.domain,options:this.options,styles:{"--background-pages":this.styles.pageBackgroundColor,"--background-card":this.styles.cardBackgroundColor,"--background-card-title":this.styles.cardHeaderBackgroundColor,"--text-primary":this.styles.primaryTextColor,"--text-secondary":this.styles.secondaryTextColor,"--button-primary-background":this.styles.buttonColor,"--border-focused":this.styles.buttonColor,"--button-primary-text":this.styles.buttonTextColor,"--icon-default-background":this.styles.iconColor,"--icon-primary-background":this.styles.iconColor,"--font-face":this.styles.fontFace}}},e=setInterval((()=>{this.iframe.contentWindow.postMessage(t,this.config.frontend_url);const i=t=>{"iselfietest-sdk-ack"===t.data.type&&(clearInterval(e),window.removeEventListener("message",i))};window.addEventListener("message",i)}),1e3)}handleIncomingMessages(t){const{type:e,data:i}=t.data;"iselfietest-close"===e&&this.closeTest(),"iselfietest-complete"===e&&(this.resolveTest?.(i),this.closeTest()),"iselfietest-error"===e&&(this.rejectTest?.(i),this.closeTest())}startTest(){return new Promise((async(t,e)=>{this.resolveTest=t,this.rejectTest=e;await this.checkOrgStatus()||e(new Error("You have reached the maximum limit of cardio test usage policy. Please reach out to administrator."));const i=(t=0)=>{const s=document.getElementById(this.containerId);s?this.createIframe(s):t<3?(console.warn(`Container element with ID "${this.containerId}" not found. Retrying... (${t+1}/3)`),setTimeout((()=>i(t+1)),1e3)):(console.error(`Container element with ID "${this.containerId}" not found after 3 attempts.`),e(new Error(`Container element with ID "${this.containerId}" not found.`)))};i()}))}closeTest(){if(this.iframe){const t=document.getElementById(this.containerId);t?.removeChild(this.iframe),this.iframe=null,console.log("Iframe closed.")}else console.log("No iframe to close.")}}let o;async function n(t){if(o)console.warn("SDK is already initialized. Returning the existing instance.");else{o=new s(t);try{return await o.initialize()?{success:!0,message:"SDK initialized successfully.",startCardioTest:()=>o.startTest(),closeTest:()=>o.closeTest()}:{success:!1,message:"You have reached the maximum limit of cardio test usage policy. Please reach out to administrator."}}catch(t){return console.error(t.message),{success:!1,message:t.message}}}}const a=()=>o?.startTest(),r=()=>o?.closeTest();"undefined"!=typeof window&&(window.ISelfieCardioSDK=n,window.startCardioTest=a,window.closeTest=r),t.closeTest=r,t.default=n,t.startCardioTest=a,Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=iselfie-cardio-sdk.umd.min.js.map