@medplum/react-hooks 5.1.27 → 5.1.29

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.
@@ -1,8 +1,8 @@
1
- "use strict";var ge=Object.defineProperty;var hn=Object.getOwnPropertyDescriptor;var yn=Object.getOwnPropertyNames;var gn=Object.prototype.hasOwnProperty;var In=(e,t)=>{for(var n in t)ge(e,n,{get:t[n],enumerable:!0})},Sn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of yn(t))!gn.call(e,o)&&o!==n&&ge(e,o,{get:()=>t[o],enumerable:!(r=hn(t,o))||r.enumerable});return e};var xn=e=>Sn(ge({},"__esModule",{value:!0}),e);var ht={};In(ht,{MEDICATION_CART_ADD_IN_PROGRESS:()=>Ne,MedplumProvider:()=>En,QUESTIONNAIRE_CALCULATED_EXPRESSION_URL:()=>Be,QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL:()=>$e,QUESTIONNAIRE_HIDDEN_URL:()=>ze,QUESTIONNAIRE_ITEM_CONTROL_URL:()=>Pe,QUESTIONNAIRE_REFERENCE_FILTER_URL:()=>Ve,QUESTIONNAIRE_REFERENCE_RESOURCE_URL:()=>ue,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL:()=>Un,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL:()=>ee,QUESTIONNAIRE_VALIDATION_ERROR_URL:()=>Ke,QuestionnaireItemType:()=>A,buildInitialResponse:()=>le,buildInitialResponseItem:()=>fe,convertToPCM16:()=>cn,evaluateCalculatedExpressionsInQuestionnaire:()=>de,getItemAnswerOptionValue:()=>ve,getItemEnableWhenValueAnswer:()=>Ze,getItemInitialValue:()=>Hn,getNewMultiSelectValues:()=>Kn,getQuestionnaireItemReferenceFilter:()=>Jn,getQuestionnaireItemReferenceTargetTypes:()=>zn,getResponseItemAnswerValue:()=>en,isChoiceQuestion:()=>Nn,isQuestionEnabled:()=>Je,isValueSetUnavailableError:()=>sn,reactContext:()=>oe,removeDisabledItems:()=>ce,setQuestionnaireItemReferenceTargetTypes:()=>jn,typedValueToResponseItem:()=>Ge,useCachedBinaryUrl:()=>Pn,useMedicationCart:()=>Tn,useMedicationIFrame:()=>Cn,useMedicationOrder:()=>Mn,useMedicationOrderSet:()=>Qn,useMedplum:()=>v,useMedplumContext:()=>ie,useMedplumNavigate:()=>bn,useMedplumProfile:()=>Ie,useNotificationCount:()=>wn,usePatientSummaryData:()=>kn,usePharmacySearch:()=>_n,usePrevious:()=>qn,useQuestionnaireForm:()=>Xn,useResource:()=>ae,useResourceBoard:()=>tt,useResourceModified:()=>rt,useSearch:()=>it,useSearchOne:()=>st,useSearchResources:()=>at,useSubscription:()=>be,useSyncOrderSet:()=>ut,useThreadInbox:()=>ct,useValueSetAvailabilities:()=>un,useValueSetAvailability:()=>dt,useWhisper:()=>ft});module.exports=xn(ht);var X=require("react");var re=require("react"),oe=(0,re.createContext)(void 0);function ie(){return(0,re.useContext)(oe)}function v(){return ie().medplum}function bn(){return ie().navigate}function Ie(){return ie().profile}var _e=require("react/jsx-runtime"),ke=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function En(e){let t=e.medplum,n=e.navigate??vn,[r,o]=(0,X.useState)({profile:t.getProfile(),loading:t.isLoading()});(0,X.useEffect)(()=>{function i(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of ke)t.addEventListener(a,i);return()=>{for(let a of ke)t.removeEventListener(a,i)}},[t]);let s=(0,X.useMemo)(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return(0,_e.jsx)(oe.Provider,{value:s,children:e.children})}function vn(e){window.location.assign(e)}var Ue=require("react"),qe=new Map,Pn=e=>(0,Ue.useMemo)(()=>{if(!e)return;let t=e.split("?")[0];if(!t)return e;let n;try{n=new URLSearchParams(new URL(e).search)}catch{return e}if(!n.has("Key-Pair-Id")||!n.has("Signature"))return e;let r=n.get("Expires");if(!r||r.length>13)return e;let o=qe.get(t);if(o){let i=new URLSearchParams(new URL(o).search).get("Expires");if(i&&Number.parseInt(i,10)*1e3-5e3>Date.now())return o}return qe.set(t,e),e},[e]);var O=require("@medplum/core"),F=require("react");var Ne="Cannot checkout while a medication is still being added to the cart";function Tn(){let e=v(),[t,n]=(0,F.useState)(!1),r=(0,F.useRef)(0),o=(0,F.useCallback)(async u=>{r.current+=1,n(!0);try{return await e.createResource(u)}finally{r.current-=1,r.current<=0&&(r.current=0,n(!1))}},[e]),s=(0,F.useCallback)(async u=>{if(r.current>0)throw new Error(Ne);let h=e.fhirUrl("MedicationRequest","$checkout-medications"),y=(0,O.medicationCheckoutRequestToParameters)(u),M=await e.post(h,y);if(!(0,O.isResource)(M,"Parameters"))throw new Error(O.INVALID_MEDICATION_CHECKOUT_RESPONSE);return(0,O.parametersToMedicationCheckoutResponse)(M)},[e]),i=(0,F.useCallback)(async u=>{let h=e.fhirUrl("MedicationRequest","$remove-cart-medication"),y=await e.post(h,(0,O.medicationCartRemoveRequestToParameters)(u));if(!(0,O.isResource)(y,"Parameters"))throw new Error(O.INVALID_MEDICATION_CART_RESPONSE);return(0,O.parametersToMedicationCartManageResponse)(y)},[e]),a=(0,F.useCallback)(async u=>{let h=e.fhirUrl("MedicationRequest","$clear-cart"),y=await e.post(h,(0,O.medicationCartClearRequestToParameters)(u));if(!(0,O.isResource)(y,"Parameters"))throw new Error(O.INVALID_MEDICATION_CART_RESPONSE);return(0,O.parametersToMedicationCartManageResponse)(y)},[e]);return{addToCart:o,adding:t,checkout:s,removeFromCart:i,clearCart:a}}var Le=require("@medplum/core"),V=require("react");function Cn(e,t,n){let r=v(),{patientId:o,organization:s,onPatientSyncSuccess:i,onIframeSuccess:a,onError:u}=n,h=(0,Le.resolveId)(s),[y,M]=(0,V.useState)(void 0),S=(0,V.useRef)(i),I=(0,V.useRef)(a),g=(0,V.useRef)(u);return(0,V.useEffect)(()=>{S.current=i,I.current=a,g.current=u},[i,a,u]),(0,V.useEffect)(()=>{let f=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:h}),f)return;S.current?.()}let R=await r.executeBot(t,{patientId:o,organizationId:h});if(f)return;R.url&&(M(R.url),I.current?.(R.url))}catch(R){f||g.current?.(R)}})().catch(()=>{}),()=>{f=!0}},[r,e,t,o,h]),y}var U=require("@medplum/core"),Se=require("react");function Mn(){let e=v(),t=(0,Se.useCallback)(async r=>{let o=e.fhirUrl("Medication","$drug-search"),s=(0,U.medicationSearchParamsToParameters)(r),i=await e.post(o,s);if(!(0,U.isResource)(i,"Bundle"))throw new Error(U.INVALID_MEDICATION_SEARCH_RESPONSE);return(i.entry??[]).map(a=>a.resource).filter(a=>(0,U.isResource)(a,"Medication"))},[e]),n=(0,Se.useCallback)(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),s=(0,U.medicationOrderRequestToParameters)(r),i=await e.post(o,s);if(!(0,U.isResource)(i,"Parameters"))throw new Error(U.INVALID_MEDICATION_ORDER_RESPONSE);return(0,U.parametersToMedicationOrderResponse)(i)},[e]);return{searchMedications:t,orderMedication:n}}var z=require("@medplum/core"),N=require("react");function Qn(e){let t=v(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i}=e,[a,u]=(0,N.useState)(void 0),[h,y]=(0,N.useState)(!1),[M,S]=(0,N.useState)(void 0),I=(0,N.useRef)({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i});I.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i};let g=()=>{let l=I.current;if(!l.patientId)return;let m=!!l.planDefinitionId,x=l.vendorOrderSetId!==void 0&&l.vendorOrderSetId!==null&&l.vendorOrderSetId!=="";return!m&&!x?void 0:{patientId:l.patientId,planDefinitionId:m?l.planDefinitionId:void 0,vendorOrderSetId:x?l.vendorOrderSetId:void 0,appId:l.appId,organization:l.organization}},f=(0,N.useCallback)(async l=>{let m=t.fhirUrl("PlanDefinition","$order-set-url"),x=(0,z.medicationOrderSetRequestToParameters)(l),b=await t.post(m,x);if(!(0,z.isResource)(b,"Parameters"))throw new Error(z.INVALID_MEDICATION_ORDER_SET_RESPONSE);return(0,z.parametersToMedicationOrderSetResponse)(b).launchUrl},[t]),c=(0,N.useRef)(0),R=(0,N.useCallback)(async()=>{let l=g();if(!l)return;c.current+=1;let m=c.current;y(!0),S(void 0);try{let x=await f(l);return c.current!==m?void 0:(u(x),x)}catch(x){c.current===m&&(S(x),u(void 0));return}finally{c.current===m&&y(!1)}},[f]);return(0,N.useEffect)(()=>{let l=!1,m=g();if(!m){c.current+=1,u(void 0),y(!1),S(void 0);return}c.current+=1;let x=c.current;return y(!0),S(void 0),f(m).then(b=>{l||c.current!==x||u(b)}).catch(b=>{l||c.current!==x||(S(b),u(void 0))}).finally(()=>{!l&&c.current===x&&y(!1)}),()=>{l=!0}},[f,n,r,o,s,i]),{url:a,loading:h,error:M,refresh:R}}var Y=require("react");var xe=require("@medplum/core"),Q=require("react");var On=3e3;function be(e,t,n){let r=v(),s=Ie()?e:void 0,[i,a]=(0,Q.useState)(),[u,h]=(0,Q.useState)(n?.subscriptionProps),y=(0,Q.useRef)(!1),M=(0,Q.useRef)(void 0),S=(0,Q.useRef)(void 0),I=(0,Q.useRef)(void 0),g=(0,Q.useRef)(t);g.current=t;let f=(0,Q.useRef)(n?.onWebSocketOpen);f.current=n?.onWebSocketOpen;let c=(0,Q.useRef)(n?.onWebSocketClose);c.current=n?.onWebSocketClose;let R=(0,Q.useRef)(n?.onSubscriptionConnect);R.current=n?.onSubscriptionConnect;let l=(0,Q.useRef)(n?.onSubscriptionDisconnect);l.current=n?.onSubscriptionDisconnect;let m=(0,Q.useRef)(n?.onError);m.current=n?.onError,(0,Q.useEffect)(()=>{(0,xe.deepEquals)(n?.subscriptionProps,u)||h(n?.subscriptionProps)},[u,n]),(0,Q.useEffect)(()=>{M.current&&(clearTimeout(M.current),M.current=void 0);let C=!1;return(S.current!==s||!(0,xe.deepEquals)(I.current,u))&&(C=!0),C&&S.current&&r.unsubscribeFromCriteria(S.current,I.current),S.current=s,I.current=u,C&&s?a(r.subscribeToCriteria(s,u)):s||a(void 0),()=>{M.current=setTimeout(()=>{a(void 0),s&&r.unsubscribeFromCriteria(s,u)},On)}},[r,s,u]);let x=(0,Q.useCallback)(C=>{g.current?.(C.payload)},[]),b=(0,Q.useCallback)(()=>{f.current?.()},[]),P=(0,Q.useCallback)(()=>{c.current?.()},[]),p=(0,Q.useCallback)(C=>{R.current?.(C.payload.subscriptionId)},[]),q=(0,Q.useCallback)(C=>{l.current?.(C.payload.subscriptionId)},[]),w=(0,Q.useCallback)(C=>{m.current?.(C.payload)},[]);(0,Q.useEffect)(()=>i?(y.current||(i.addEventListener("message",x),i.addEventListener("open",b),i.addEventListener("close",P),i.addEventListener("connect",p),i.addEventListener("disconnect",q),i.addEventListener("error",w),y.current=!0),()=>{y.current=!1,i.removeEventListener("message",x),i.removeEventListener("open",b),i.removeEventListener("close",P),i.removeEventListener("connect",p),i.removeEventListener("disconnect",q),i.removeEventListener("error",w)}):()=>{},[i,x,b,P,p,q,w])}function wn(e){let t=v(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[s,i]=(0,Y.useState)(0),a=(0,Y.useCallback)(u=>{t.search(n,r,{cache:u}).then(h=>i(h.total)).catch(console.error)},[t,n,r]);return(0,Y.useEffect)(()=>{a("default")},[a]),be(o,()=>{a("reload")}),s}var We=require("@medplum/core"),K=require("react");function De(e){let t=e.patientParam??"subject",n=e.query,r="";if(n!=null)if(typeof n=="string")r=n;else if(n instanceof URLSearchParams){let o=Array.from(n.entries()).sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else if(Array.isArray(n)){let o=[...n].sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else{let o=Object.entries(n).filter(([,s])=>s!==void 0).sort(([s],[i])=>s.localeCompare(i));r=JSON.stringify(o)}return`${e.resourceType}:${t}:${r}`}function An(e){return e.map(t=>{let n=t.searches?t.searches.map(De).join(","):"";return`${t.key}:[${n}]`}).join("|")}function kn(e,t){let n=v(),[r,o]=(0,K.useState)([]),[s,i]=(0,K.useState)(!0),[a,u]=(0,K.useState)(),h=An(t),y=(0,K.useMemo)(()=>t,[h]),M=(0,K.useMemo)(()=>(0,We.resolveId)(e),[e]);return(0,K.useEffect)(()=>{if(!M)return;let S=!1,I=`Patient/${M}`,g={_count:100,_sort:"-_lastUpdated"},f=[],c=new Map,R=[];for(let m of y){let x=[];if(m.searches)for(let b of m.searches){let P=De(b),p=c.get(P);p===void 0&&(p=f.length,c.set(P,p),f.push(b)),x.push({searchIdx:p,resultKey:b.key})}R.push(x)}if(f.length===0){o(y.map(()=>({}))),i(!1);return}let l=f.map(m=>{let x=m.patientParam??"subject",b={[x]:I};if(m.query){if(typeof m.query=="string")return n.searchResources(m.resourceType,`${x}=${I}&${m.query}&_count=100&_sort=-_lastUpdated`);if(m.query instanceof URLSearchParams)m.query.forEach((P,p)=>{b[p]=P});else if(Array.isArray(m.query))for(let[P,p]of m.query)b[P]=p;else for(let[P,p]of Object.entries(m.query))p!==void 0&&(b[P]=p)}return n.searchResources(m.resourceType,{...g,...b})});return i(!0),u(void 0),Promise.allSettled(l).then(m=>{if(S)return;let x=R.map(P=>{let p={};for(let{searchIdx:q,resultKey:w}of P){let C=m[q];p[w]=C.status==="fulfilled"?C.value:[]}return p});o(x),i(!1);let b=m.filter(P=>P.status==="rejected");if(b.length>0){console.error("Some patient summary searches failed:",b.map(p=>p.reason));let P=b[0].reason;u(P instanceof Error?P:new Error(String(P)))}}).catch(m=>{S||(u(m instanceof Error?m:new Error(String(m))),i(!1))}),()=>{S=!0}},[n,M,y]),{sectionData:r,loading:s,error:a}}var G=require("@medplum/core"),Ee=require("react");function _n(e,t){let n=v(),r=(0,Ee.useCallback)(async s=>{let{organization:i,...a}=s,u=(0,G.resolveId)(i),h=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!(0,G.isOrganizationArray)(h))throw new Error("Invalid response from pharmacy search");return h},[n,e]),o=(0,Ee.useCallback)(async s=>{let i=await n.executeBot(t,{patientId:s.patientId,pharmacy:s.pharmacy,setAsPrimary:s.setAsPrimary,organizationId:(0,G.resolveId)(s.organization)});if(!(0,G.isAddPharmacyResponse)(i))throw new Error("Invalid response from add pharmacy bot");return i},[n,t]);return{searchPharmacies:r,addToFavorites:o}}var se=require("react");function qn(e){let t=(0,se.useRef)(void 0);return(0,se.useEffect)(()=>{t.current=e}),t.current}var nn=require("@medplum/core"),pe=require("react");var $=require("@medplum/core"),Z=require("react");function ae(e,t){let n=v(),[r,o]=(0,Z.useState)(()=>Fe(n,e)),s=(0,Z.useCallback)(i=>{(0,$.deepEquals)(i,r)||o(i)},[r]);return(0,Z.useEffect)(()=>{let i=!0,a=Fe(n,e);return!a&&(0,$.isReference)(e)?n.readReference(e).then(u=>{i&&s(u)}).catch(u=>{i&&(s(void 0),t&&t((0,$.normalizeOperationOutcome)(u)))}):s(a),(()=>i=!1)},[n,e,s,t]),r}function Fe(e,t){if(t){if((0,$.isResource)(t))return t;if((0,$.isReference)(t))return e.getCachedReference(t)}}var d=require("@medplum/core"),A={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"},Pe=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-itemControl`,Ve=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-referenceFilter`,ue=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-referenceResource`,Ke=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-validationError`,$e=`${d.HTTP_HL7_ORG}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,Be=`${d.HTTP_HL7_ORG}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Un=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-signatureRequired`,ee=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaireresponse-signature`,ze=`${d.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-hidden`;function Nn(e){return e.type==="choice"||e.type==="open-choice"}function ce(e,t){return{...t,item:je(e.item,t.item,t)}}function je(e,t,n){if(!t)return t;let r=[];for(let o of t){let s=e?.find(i=>i.linkId===o.linkId);s&&!Je(s,n)||(s?.item&&o.item?r.push({...o,item:je(s.item,o.item,n)}):r.push(o))}return r}function Je(e,t){if((0,d.getExtension)(e,ze)?.valueBoolean===!0)return!1;let r=Ln(e,t);return r!==void 0?r:Wn(e,t)}function Ln(e,t){let n=(0,d.getExtension)(e,$e);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=(0,d.toTypedValue)(t),s=(0,d.evalFhirPathTyped)(r,[o],{"%resource":o});return(0,d.toJsBoolean)(s)}}}function Wn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let r of e.enableWhen){let o=He(t?.item,r.question);if(r.operator==="exists"&&!r.answerBoolean&&!o?.length){if(n==="any")return!0;continue}let{anyMatch:s,allMatch:i}=Bn(r,o,n);if(n==="any"&&s)return!0;if(n==="all"&&!i)return!1}return n!=="any"}function de(e,t,n=t.item){for(let r of e){let o=n?.find(s=>s.linkId===r.linkId);o&&(Dn(t,r,o),r.item&&o.item&&de(r.item,t,o.item))}}function Dn(e,t,n){try{let r=Vn(t,e);if(!r)return;let o=Ge(t,r);if(!o)return;n.answer=[o]}catch(r){n.extension=[{url:Ke,valueString:`Expression evaluation failed: ${(0,d.normalizeErrorString)(r)}`}]}}var Fn={[A.boolean]:[d.PropertyType.boolean],[A.date]:[d.PropertyType.date],[A.dateTime]:[d.PropertyType.dateTime],[A.time]:[d.PropertyType.time],[A.url]:[d.PropertyType.string,d.PropertyType.uri,d.PropertyType.url],[A.attachment]:[d.PropertyType.Attachment],[A.reference]:[d.PropertyType.Reference],[A.quantity]:[d.PropertyType.Quantity],[A.decimal]:[d.PropertyType.decimal,d.PropertyType.integer],[A.integer]:[d.PropertyType.decimal,d.PropertyType.integer]};function Ge(e,t){if(!e.type)return;if(e.type===A.choice||e.type===A.openChoice)return{[`value${(0,d.capitalize)(t.type)}`]:t.value};if(e.type===A.string||e.type===A.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(Fn[e.type]?.includes(t.type))return{[`value${(0,d.capitalize)(e.type)}`]:t.value}}function Vn(e,t){if(!t)return;let n=(0,d.getExtension)(e,Be);if(n){let r=n.valueExpression?.expression;if(r){let o=(0,d.toTypedValue)(t),s=(0,d.evalFhirPathTyped)(r,[o],{"%resource":o});return s.length!==0?s[0]:void 0}}}function Kn(e,t,n){let r=[];for(let o of e){let s=n.answerOption?.find(i=>(0,d.typedValueToString)(ve(i))===o);if(s){let i=ve(s);i&&r.push({[t]:i.value})}}return r}function He(e,t){for(let n of e??d.EMPTY){if(n.linkId===t)return n.answer;if(n.item){let r=He(n.item,t);if(r)return r}}}function $n(e,t,n){if(n==="exists")return!!e===t.value;if(e){let r=n==="="||n==="!="?n?.replace("=","~"):n,[{value:o}]=(0,d.evalFhirPathTyped)(`%actualAnswer ${r} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return o}else return!1}function Bn(e,t,n){let r=t||[],o=Ze(e),s=!1,i=!0;for(let a of r){let u=en(a),{operator:h}=e;if($n(u,o,h)?s=!0:i=!1,n==="any"&&s)break}return{anyMatch:s,allMatch:i}}function zn(e){let t=(0,d.getExtension)(e,ue);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function jn(e,t){let n=(0,d.deepClone)(e),r=(0,d.getExtension)(n,ue);return!t||t.length===0?(r&&(n.extension=n.extension?.filter(o=>o!==r)),n):(r||(n.extension??=[],r={url:ue},n.extension.push(r)),t.length===1?(r.valueCode=t[0],delete r.valueCodeableConcept):(r.valueCodeableConcept={coding:t.map(o=>({code:o}))},delete r.valueCode),n)}function Jn(e,t,n){let r=(0,d.getExtension)(e,Ve);if(!r?.valueString)return;let o=r.valueString;t?.reference&&(o=o.replaceAll("$subj",t.reference)),n?.reference&&(o=o.replaceAll("$encounter",n.reference));let s={},i=o.split("&");for(let a of i){let[u,h]=(0,d.splitN)(a,"=",2);s[u]=h}return s}function le(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??(0,d.getReferenceString)(e),item:Te(e.item,t?.item),status:"in-progress"}}function Te(e,t){let n;for(let r of e??d.EMPTY){if(r.type===A.display)continue;let o=t?.filter(s=>s.linkId===r.linkId);if(o?.length)for(let s of o)s.id=s.id??Xe(),s.text=s.text??r.text,s.item=Te(r.item,s.item),s.answer=Ye(r,s),n=(0,d.append)(n,s);else n=(0,d.append)(n,fe(r))}return n}function fe(e){return{id:Xe(),linkId:e.linkId,text:e.text,item:Te(e.item,void 0),answer:Ye(e)}}var Gn=1;function Xe(){return"id-"+Gn++}function Ye(e,t){if(!(e.type===A.display||e.type===A.group)){if(t?.answer&&t.answer.length>0)return t.answer;if(e.initial&&e.initial.length>0)return e.initial.map(n=>({...n}));if(e.answerOption)return e.answerOption.filter(n=>n.initialSelected).map(n=>({...n,initialSelected:void 0}))}}function Hn(e){return(0,d.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireItemInitial",value:e},"value")}function ve(e){return(0,d.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Ze(e){return(0,d.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function en(e){return(0,d.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Xn(e){let t=ae(e.questionnaire),n=ae(e.defaultValue),[,r]=(0,pe.useReducer)(g=>g+1,0),o=(0,pe.useRef)({activePage:0});if(!o.current.questionnaire&&t&&(o.current.questionnaire=t,o.current.pages=e.disablePagination?void 0:Yn(t)),t&&e.defaultValue&&n&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=le(t,n),I()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=le(t),I()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function s(g,f){let c=o.current.questionnaireResponse;for(let R of g)c=c?.item?.find(l=>R.id?l.id===R.id:l.linkId===R.linkId);return f&&(c=c?.item?.find(R=>R.linkId===f.linkId)),c}function i(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(g,f){let c=s(g);c&&(c.item??=[],c.item.push(fe(f)),I())}function h(g,f){let c=s(g,f);c&&(c.answer??=[],c.answer.push({}),I())}function y(g,f,c){let R=s(g,f);R&&(R.answer=c,I())}function M(g){let f=o.current.questionnaireResponse;f&&(g?(f.extension=f.extension??[],f.extension=f.extension.filter(c=>c.url!==ee),f.extension.push({url:ee,valueSignature:g})):f.extension=f.extension?.filter(c=>c.url!==ee),I())}function S(){let g=o.current.questionnaire;if(g?.item){let f=o.current.questionnaireResponse;de(g.item,f)}}function I(){let g=o.current.questionnaireResponse,f=o.current.questionnaire;!g||!f||(S(),r(),e.onChange?.(ce(f,g)))}return{loading:!1,pagination:!!o.current.pages,questionnaire:o.current.questionnaire,questionnaireResponse:ce(o.current.questionnaire,o.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:o.current.activePage,pages:o.current.pages,items:Zn(o.current.questionnaire,o.current.pages,o.current.activePage),responseItems:et(o.current.questionnaireResponse,o.current.pages,o.current.activePage),onNextPage:i,onPrevPage:a,onAddGroup:u,onAddAnswer:h,onChangeAnswer:y,onChangeSignature:M}}function Yn(e){if(!(!e?.item||(0,nn.getExtension)(e?.item?.[0],Pe)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,r)=>({linkId:n.linkId,title:n.text??`Page ${r+1}`,group:n}))}function Zn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function et(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}var me=require("@medplum/core"),_=require("react");async function nt(e,t){let n=await t.search(e.resourceType,(0,me.formatSearchQuery)({...e,total:e.total??"accurate"}),{cache:"no-cache"});return{items:n.entry?.map(o=>o.resource).filter(o=>o!==void 0)??[],total:n.total}}function tt(e){let{search:t,selectedId:n,loadItems:r,reloadKey:o}=e,s=v(),[i,a]=(0,_.useState)(t),[u,h]=(0,_.useState)([]),[y,M]=(0,_.useState)(),[S,I]=(0,_.useState)(!0),[g,f]=(0,_.useState)(),c=(0,_.useRef)(e),R=(0,_.useRef)(0),l=(0,_.useRef)(0),m=i.resourceType,x=n!==void 0&&g?.id===n?g.value:void 0;(0,me.deepEquals)(t,i)||(a(t),I(!0));let b=(0,_.useCallback)(async()=>{let P=++R.current;try{let p=r?await r(i,s):await nt(i,s);if(P!==R.current)return;h(p.items),M(p.total),c.current.onLoad?.(p.items,p.total),c.current.selectedId===void 0&&p.items.length>0&&c.current.onSelectFirst?.(p.items[0])}catch(p){P===R.current&&(c.current.onError??console.error)(p)}finally{P===R.current&&I(!1)}},[i,r,s]);return(0,_.useEffect)(()=>{c.current=e}),(0,_.useEffect)(()=>{b().catch(console.error)},[b,o]),(0,_.useEffect)(()=>{let P=++l.current;if(!n)return;let p=async()=>{let w=c.current.resolveSelected;if(w)return w(n,u,s);let C=u.find(B=>B.id===n);return C!==void 0?C:await s.readResource(m,n)};(async()=>{try{let w=await p();P===l.current&&f({id:n,value:w})}catch(w){P===l.current&&(f({id:n,value:void 0}),(c.current.onError??console.error)(w))}})().catch(console.error)},[n,u,s,m]),{items:u,total:y,loading:S,selected:x,search:i,refresh:b}}var ne=require("react");function rt(e,t){let n=v(),r=(0,ne.useRef)(t);(0,ne.useEffect)(()=>{r.current=t});let o=Array.isArray(e)?e.join(","):e;(0,ne.useEffect)(()=>{let s=new Set(o.split(",")),i=a=>{s.has(a.payload.resourceType)&&r.current(a.payload)};return n.addEventListener("resourceModified",i),()=>n.removeEventListener("resourceModified",i)},[n,o])}var Re=require("@medplum/core"),j=require("react");var L=require("react");function tn(e,t,n={leading:!1}){let[r,o]=(0,L.useState)(e),s=(0,L.useRef)(!1),i=(0,L.useRef)(void 0),a=(0,L.useRef)(!1),u=(0,L.useCallback)(()=>window.clearTimeout(i.current),[]);return(0,L.useEffect)(()=>{s.current&&(!a.current&&n.leading?(a.current=!0,o(e),i.current=setTimeout(()=>{a.current=!1},t)):(u(),i.current=setTimeout(()=>{a.current=!1,o(e)},t)))},[e,n.leading,t,u]),(0,L.useEffect)(()=>(s.current=!0,u),[u]),[r,u]}var ot=250;function it(e,t,n){return Ce("search",e,t,n)}function st(e,t,n){return Ce("searchOne",e,t,n)}function at(e,t,n){return Ce("searchResources",e,t,n)}function Ce(e,t,n,r){let o=v(),[s,i]=(0,j.useState)(!1),[a,u]=(0,j.useState)(),[h,y]=(0,j.useState)(),M=o.fhirSearchUrl(t,n).toString(),S=(0,j.useMemo)(()=>({resourceType:t,query:n}),[M]),I=r?.enabled??!0,g=r?.debounceMs??ot,[f]=tn(S,g,{leading:!0});return(0,j.useEffect)(()=>{if(!I)return()=>{};i(!0);let c=!0;return o[e](f.resourceType,f.query).then(R=>{c&&(i(!1),u(R),y(Re.allOk))}).catch(R=>{c&&(i(!1),u(void 0),y((0,Re.normalizeOperationOutcome)(R)))}),()=>{c=!1}},[o,e,f,I]),[a,s,h]}var J=require("@medplum/core"),rn=require("react");function ut(){let e=v();return(0,rn.useCallback)(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:(0,J.resolveId)(n)});return(0,J.isResource)(r,"Parameters")?(0,J.parametersToOrderSetSyncResponse)(r):void 0}catch(r){if(r instanceof J.OperationOutcomeError&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}var on=require("@medplum/core"),W=require("react");function ct({query:e,threadId:t}){let n=v(),[r,o]=(0,W.useState)(!0),[s,i]=(0,W.useState)([]),[a,u]=(0,W.useState)(void 0),[h,y]=(0,W.useState)(null),[M,S]=(0,W.useState)(void 0),I=(0,W.useCallback)(async()=>{let c=new URLSearchParams(e);c.append("identifier:not","http://medplum.com/ai-message|"),c.append("part-of:missing","true"),c.append("_has:Communication:part-of:_id:not","null");let R=await n.search("Communication",c.toString(),{cache:"no-cache"}),l=R.entry?.map(p=>p.resource).filter(p=>p!==void 0)||[];if(R.total!==void 0&&S(R.total),l.length===0){i([]);return}let x=`
1
+ "use strict";var be=Object.defineProperty;var gn=Object.getOwnPropertyDescriptor;var In=Object.getOwnPropertyNames;var Sn=Object.prototype.hasOwnProperty;var xn=(e,t)=>{for(var n in t)be(e,n,{get:t[n],enumerable:!0})},En=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of In(t))!Sn.call(e,o)&&o!==n&&be(e,o,{get:()=>t[o],enumerable:!(r=gn(t,o))||r.enumerable});return e};var bn=e=>En(be({},"__esModule",{value:!0}),e);var gt={};xn(gt,{MEDICATION_CART_ADD_IN_PROGRESS:()=>We,MedplumProvider:()=>Tn,QUESTIONNAIRE_CALCULATED_EXPRESSION_URL:()=>je,QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL:()=>Be,QUESTIONNAIRE_HIDDEN_URL:()=>Je,QUESTIONNAIRE_ITEM_CONTROL_URL:()=>Qe,QUESTIONNAIRE_OPTION_EXCLUSIVE_URL:()=>Ge,QUESTIONNAIRE_REFERENCE_FILTER_URL:()=>$e,QUESTIONNAIRE_REFERENCE_RESOURCE_URL:()=>fe,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL:()=>Ln,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL:()=>te,QUESTIONNAIRE_VALIDATION_ERROR_URL:()=>ze,QuestionnaireItemType:()=>k,applyOptionExclusive:()=>Oe,buildInitialResponse:()=>he,buildInitialResponseItem:()=>ye,convertToPCM16:()=>ln,evaluateCalculatedExpressionsInQuestionnaire:()=>Re,getItemAnswerOptionValue:()=>pe,getItemEnableWhenValueAnswer:()=>tn,getItemInitialValue:()=>Yn,getNewMultiSelectValues:()=>zn,getQuestionnaireItemReferenceFilter:()=>Hn,getQuestionnaireItemReferenceTargetTypes:()=>Jn,getResponseItemAnswerValue:()=>Ae,isChoiceQuestion:()=>Wn,isQuestionEnabled:()=>Xe,isValueSetUnavailableError:()=>un,reactContext:()=>ue,removeDisabledItems:()=>me,setQuestionnaireItemReferenceTargetTypes:()=>Gn,typedValueToResponseItem:()=>Ye,useCachedBinaryUrl:()=>Cn,useMedicationCart:()=>Mn,useMedicationIFrame:()=>Qn,useMedicationOrder:()=>On,useMedicationOrderSet:()=>wn,useMedplum:()=>T,useMedplumContext:()=>ce,useMedplumNavigate:()=>vn,useMedplumProfile:()=>ve,useNotificationCount:()=>kn,usePatientSummaryData:()=>qn,usePharmacySearch:()=>Un,usePrevious:()=>Nn,useQuestionnaireForm:()=>Zn,useResource:()=>le,useResourceBoard:()=>ot,useResourceModified:()=>it,useSearch:()=>at,useSearchOne:()=>ut,useSearchResources:()=>ct,useSubscription:()=>Ce,useSyncOrderSet:()=>dt,useThreadInbox:()=>lt,useValueSetAvailabilities:()=>dn,useValueSetAvailability:()=>ft,useWhisper:()=>mt});module.exports=bn(gt);var Z=require("react");var ae=require("react"),ue=(0,ae.createContext)(void 0);function ce(){return(0,ae.useContext)(ue)}function T(){return ce().medplum}function vn(){return ce().navigate}function ve(){return ce().profile}var Ue=require("react/jsx-runtime"),qe=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function Tn(e){let t=e.medplum,n=e.navigate??Pn,[r,o]=(0,Z.useState)({profile:t.getProfile(),loading:t.isLoading()});(0,Z.useEffect)(()=>{function i(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of qe)t.addEventListener(a,i);return()=>{for(let a of qe)t.removeEventListener(a,i)}},[t]);let s=(0,Z.useMemo)(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return(0,Ue.jsx)(ue.Provider,{value:s,children:e.children})}function Pn(e){window.location.assign(e)}var Le=require("react"),Ne=new Map,Cn=e=>(0,Le.useMemo)(()=>{if(!e)return;let t=e.split("?")[0];if(!t)return e;let n;try{n=new URLSearchParams(new URL(e).search)}catch{return e}if(!n.has("Key-Pair-Id")||!n.has("Signature"))return e;let r=n.get("Expires");if(!r||r.length>13)return e;let o=Ne.get(t);if(o){let i=new URLSearchParams(new URL(o).search).get("Expires");if(i&&Number.parseInt(i,10)*1e3-5e3>Date.now())return o}return Ne.set(t,e),e},[e]);var O=require("@medplum/core"),V=require("react");var We="Cannot checkout while a medication is still being added to the cart";function Mn(){let e=T(),[t,n]=(0,V.useState)(!1),r=(0,V.useRef)(0),o=(0,V.useCallback)(async u=>{r.current+=1,n(!0);try{return await e.createResource(u)}finally{r.current-=1,r.current<=0&&(r.current=0,n(!1))}},[e]),s=(0,V.useCallback)(async u=>{if(r.current>0)throw new Error(We);let p=e.fhirUrl("MedicationRequest","$checkout-medications"),R=(0,O.medicationCheckoutRequestToParameters)(u),C=await e.post(p,R);if(!(0,O.isResource)(C,"Parameters"))throw new Error(O.INVALID_MEDICATION_CHECKOUT_RESPONSE);return(0,O.parametersToMedicationCheckoutResponse)(C)},[e]),i=(0,V.useCallback)(async u=>{let p=e.fhirUrl("MedicationRequest","$remove-cart-medication"),R=await e.post(p,(0,O.medicationCartRemoveRequestToParameters)(u));if(!(0,O.isResource)(R,"Parameters"))throw new Error(O.INVALID_MEDICATION_CART_RESPONSE);return(0,O.parametersToMedicationCartManageResponse)(R)},[e]),a=(0,V.useCallback)(async u=>{let p=e.fhirUrl("MedicationRequest","$clear-cart"),R=await e.post(p,(0,O.medicationCartClearRequestToParameters)(u));if(!(0,O.isResource)(R,"Parameters"))throw new Error(O.INVALID_MEDICATION_CART_RESPONSE);return(0,O.parametersToMedicationCartManageResponse)(R)},[e]);return{addToCart:o,adding:t,checkout:s,removeFromCart:i,clearCart:a}}var De=require("@medplum/core"),K=require("react");function Qn(e,t,n){let r=T(),{patientId:o,organization:s,onPatientSyncSuccess:i,onIframeSuccess:a,onError:u}=n,p=(0,De.resolveId)(s),[R,C]=(0,K.useState)(void 0),S=(0,K.useRef)(i),v=(0,K.useRef)(a),x=(0,K.useRef)(u);return(0,K.useEffect)(()=>{S.current=i,v.current=a,x.current=u},[i,a,u]),(0,K.useEffect)(()=>{let d=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:p}),d)return;S.current?.()}let E=await r.executeBot(t,{patientId:o,organizationId:p});if(d)return;E.url&&(C(E.url),v.current?.(E.url))}catch(E){d||x.current?.(E)}})().catch(()=>{}),()=>{d=!0}},[r,e,t,o,p]),R}var N=require("@medplum/core"),Te=require("react");function On(){let e=T(),t=(0,Te.useCallback)(async r=>{let o=e.fhirUrl("Medication","$drug-search"),s=(0,N.medicationSearchParamsToParameters)(r),i=await e.post(o,s);if(!(0,N.isResource)(i,"Bundle"))throw new Error(N.INVALID_MEDICATION_SEARCH_RESPONSE);return(i.entry??[]).map(a=>a.resource).filter(a=>(0,N.isResource)(a,"Medication"))},[e]),n=(0,Te.useCallback)(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),s=(0,N.medicationOrderRequestToParameters)(r),i=await e.post(o,s);if(!(0,N.isResource)(i,"Parameters"))throw new Error(N.INVALID_MEDICATION_ORDER_RESPONSE);return(0,N.parametersToMedicationOrderResponse)(i)},[e]);return{searchMedications:t,orderMedication:n}}var j=require("@medplum/core"),W=require("react");function wn(e){let t=T(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i}=e,[a,u]=(0,W.useState)(void 0),[p,R]=(0,W.useState)(!1),[C,S]=(0,W.useState)(void 0),v=(0,W.useRef)({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i});v.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i};let x=()=>{let g=v.current;if(!g.patientId)return;let f=!!g.planDefinitionId,y=g.vendorOrderSetId!==void 0&&g.vendorOrderSetId!==null&&g.vendorOrderSetId!=="";return!f&&!y?void 0:{patientId:g.patientId,planDefinitionId:f?g.planDefinitionId:void 0,vendorOrderSetId:y?g.vendorOrderSetId:void 0,appId:g.appId,organization:g.organization}},d=(0,W.useCallback)(async g=>{let f=t.fhirUrl("PlanDefinition","$order-set-url"),y=(0,j.medicationOrderSetRequestToParameters)(g),m=await t.post(f,y);if(!(0,j.isResource)(m,"Parameters"))throw new Error(j.INVALID_MEDICATION_ORDER_SET_RESPONSE);return(0,j.parametersToMedicationOrderSetResponse)(m).launchUrl},[t]),l=(0,W.useRef)(0),E=(0,W.useCallback)(async()=>{let g=x();if(!g)return;l.current+=1;let f=l.current;R(!0),S(void 0);try{let y=await d(g);return l.current!==f?void 0:(u(y),y)}catch(y){l.current===f&&(S(y),u(void 0));return}finally{l.current===f&&R(!1)}},[d]);return(0,W.useEffect)(()=>{let g=!1,f=x();if(!f){l.current+=1,u(void 0),R(!1),S(void 0);return}l.current+=1;let y=l.current;return R(!0),S(void 0),d(f).then(m=>{g||l.current!==y||u(m)}).catch(m=>{g||l.current!==y||(S(m),u(void 0))}).finally(()=>{!g&&l.current===y&&R(!1)}),()=>{g=!0}},[d,n,r,o,s,i]),{url:a,loading:p,error:C,refresh:E}}var ee=require("react");var Pe=require("@medplum/core"),M=require("react");var An=3e3;function Ce(e,t,n){let r=T(),s=ve()?e:void 0,[i,a]=(0,M.useState)(),[u,p]=(0,M.useState)(n?.subscriptionProps),R=(0,M.useRef)(!1),C=(0,M.useRef)(void 0),S=(0,M.useRef)(void 0),v=(0,M.useRef)(void 0),x=(0,M.useRef)(t);x.current=t;let d=(0,M.useRef)(n?.onWebSocketOpen);d.current=n?.onWebSocketOpen;let l=(0,M.useRef)(n?.onWebSocketClose);l.current=n?.onWebSocketClose;let E=(0,M.useRef)(n?.onSubscriptionConnect);E.current=n?.onSubscriptionConnect;let g=(0,M.useRef)(n?.onSubscriptionDisconnect);g.current=n?.onSubscriptionDisconnect;let f=(0,M.useRef)(n?.onError);f.current=n?.onError,(0,M.useEffect)(()=>{(0,Pe.deepEquals)(n?.subscriptionProps,u)||p(n?.subscriptionProps)},[u,n]),(0,M.useEffect)(()=>{C.current&&(clearTimeout(C.current),C.current=void 0);let Q=!1;return(S.current!==s||!(0,Pe.deepEquals)(v.current,u))&&(Q=!0),Q&&S.current&&r.unsubscribeFromCriteria(S.current,v.current),S.current=s,v.current=u,Q&&s?a(r.subscribeToCriteria(s,u)):s||a(void 0),()=>{C.current=setTimeout(()=>{a(void 0),s&&r.unsubscribeFromCriteria(s,u)},An)}},[r,s,u]);let y=(0,M.useCallback)(Q=>{x.current?.(Q.payload)},[]),m=(0,M.useCallback)(()=>{d.current?.()},[]),I=(0,M.useCallback)(()=>{l.current?.()},[]),h=(0,M.useCallback)(Q=>{E.current?.(Q.payload.subscriptionId)},[]),w=(0,M.useCallback)(Q=>{g.current?.(Q.payload.subscriptionId)},[]),_=(0,M.useCallback)(Q=>{f.current?.(Q.payload)},[]);(0,M.useEffect)(()=>i?(R.current||(i.addEventListener("message",y),i.addEventListener("open",m),i.addEventListener("close",I),i.addEventListener("connect",h),i.addEventListener("disconnect",w),i.addEventListener("error",_),R.current=!0),()=>{R.current=!1,i.removeEventListener("message",y),i.removeEventListener("open",m),i.removeEventListener("close",I),i.removeEventListener("connect",h),i.removeEventListener("disconnect",w),i.removeEventListener("error",_)}):()=>{},[i,y,m,I,h,w,_])}function kn(e){let t=T(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[s,i]=(0,ee.useState)(0),a=(0,ee.useCallback)(u=>{t.search(n,r,{cache:u}).then(p=>i(p.total)).catch(console.error)},[t,n,r]);return(0,ee.useEffect)(()=>{a("default")},[a]),Ce(o,()=>{a("reload")}),s}var Fe=require("@medplum/core"),$=require("react");function Ve(e){let t=e.patientParam??"subject",n=e.query,r="";if(n!=null)if(typeof n=="string")r=n;else if(n instanceof URLSearchParams){let o=Array.from(n.entries()).sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else if(Array.isArray(n)){let o=[...n].sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else{let o=Object.entries(n).filter(([,s])=>s!==void 0).sort(([s],[i])=>s.localeCompare(i));r=JSON.stringify(o)}return`${e.resourceType}:${t}:${r}`}function _n(e){return e.map(t=>{let n=t.searches?t.searches.map(Ve).join(","):"";return`${t.key}:[${n}]`}).join("|")}function qn(e,t){let n=T(),[r,o]=(0,$.useState)([]),[s,i]=(0,$.useState)(!0),[a,u]=(0,$.useState)(),p=_n(t),R=(0,$.useMemo)(()=>t,[p]),C=(0,$.useMemo)(()=>(0,Fe.resolveId)(e),[e]);return(0,$.useEffect)(()=>{if(!C)return;let S=!1,v=`Patient/${C}`,x={_count:100,_sort:"-_lastUpdated"},d=[],l=new Map,E=[];for(let f of R){let y=[];if(f.searches)for(let m of f.searches){let I=Ve(m),h=l.get(I);h===void 0&&(h=d.length,l.set(I,h),d.push(m)),y.push({searchIdx:h,resultKey:m.key})}E.push(y)}if(d.length===0){o(R.map(()=>({}))),i(!1);return}let g=d.map(f=>{let y=f.patientParam??"subject",m={[y]:v};if(f.query){if(typeof f.query=="string")return n.searchResources(f.resourceType,`${y}=${v}&${f.query}&_count=100&_sort=-_lastUpdated`);if(f.query instanceof URLSearchParams)f.query.forEach((I,h)=>{m[h]=I});else if(Array.isArray(f.query))for(let[I,h]of f.query)m[I]=h;else for(let[I,h]of Object.entries(f.query))h!==void 0&&(m[I]=h)}return n.searchResources(f.resourceType,{...x,...m})});return i(!0),u(void 0),Promise.allSettled(g).then(f=>{if(S)return;let y=E.map(I=>{let h={};for(let{searchIdx:w,resultKey:_}of I){let Q=f[w];h[_]=Q.status==="fulfilled"?Q.value:[]}return h});o(y),i(!1);let m=f.filter(I=>I.status==="rejected");if(m.length>0){console.error("Some patient summary searches failed:",m.map(h=>h.reason));let I=m[0].reason;u(I instanceof Error?I:new Error(String(I)))}}).catch(f=>{S||(u(f instanceof Error?f:new Error(String(f))),i(!1))}),()=>{S=!0}},[n,C,R]),{sectionData:r,loading:s,error:a}}var H=require("@medplum/core"),Me=require("react");function Un(e,t){let n=T(),r=(0,Me.useCallback)(async s=>{let{organization:i,...a}=s,u=(0,H.resolveId)(i),p=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!(0,H.isOrganizationArray)(p))throw new Error("Invalid response from pharmacy search");return p},[n,e]),o=(0,Me.useCallback)(async s=>{let i=await n.executeBot(t,{patientId:s.patientId,pharmacy:s.pharmacy,setAsPrimary:s.setAsPrimary,organizationId:(0,H.resolveId)(s.organization)});if(!(0,H.isAddPharmacyResponse)(i))throw new Error("Invalid response from add pharmacy bot");return i},[n,t]);return{searchPharmacies:r,addToFavorites:o}}var de=require("react");function Nn(e){let t=(0,de.useRef)(void 0);return(0,de.useEffect)(()=>{t.current=e}),t.current}var rn=require("@medplum/core"),ge=require("react");var z=require("@medplum/core"),ne=require("react");function le(e,t){let n=T(),[r,o]=(0,ne.useState)(()=>Ke(n,e)),s=(0,ne.useCallback)(i=>{(0,z.deepEquals)(i,r)||o(i)},[r]);return(0,ne.useEffect)(()=>{let i=!0,a=Ke(n,e);return!a&&(0,z.isReference)(e)?n.readReference(e).then(u=>{i&&s(u)}).catch(u=>{i&&(s(void 0),t&&t((0,z.normalizeOperationOutcome)(u)))}):s(a),(()=>i=!1)},[n,e,s,t]),r}function Ke(e,t){if(t){if((0,z.isResource)(t))return t;if((0,z.isReference)(t))return e.getCachedReference(t)}}var c=require("@medplum/core"),k={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"},Qe=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-itemControl`,$e=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-referenceFilter`,fe=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-referenceResource`,ze=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-validationError`,Be=`${c.HTTP_HL7_ORG}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,je=`${c.HTTP_HL7_ORG}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Ln=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-signatureRequired`,te=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaireresponse-signature`,Je=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-hidden`,Ge=`${c.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-optionExclusive`;function Wn(e){return e.type==="choice"||e.type==="open-choice"}function me(e,t){return{...t,item:He(e.item,t.item,t)}}function He(e,t,n){if(!t)return t;let r=[];for(let o of t){let s=e?.find(i=>i.linkId===o.linkId);s&&!Xe(s,n)||(s?.item&&o.item?r.push({...o,item:He(s.item,o.item,n)}):r.push(o))}return r}function Xe(e,t){if((0,c.getExtension)(e,Je)?.valueBoolean===!0)return!1;let r=Dn(e,t);return r!==void 0?r:Fn(e,t)}function Dn(e,t){let n=(0,c.getExtension)(e,Be);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=(0,c.toTypedValue)(t),s=(0,c.evalFhirPathTyped)(r,[o],{"%resource":o});return(0,c.toJsBoolean)(s)}}}function Fn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let r of e.enableWhen){let o=Ze(t?.item,r.question);if(r.operator==="exists"&&!r.answerBoolean&&!o?.length){if(n==="any")return!0;continue}let{anyMatch:s,allMatch:i}=jn(r,o,n);if(n==="any"&&s)return!0;if(n==="all"&&!i)return!1}return n!=="any"}function Re(e,t,n=t.item){for(let r of e){let o=n?.find(s=>s.linkId===r.linkId);o&&(Vn(t,r,o),r.item&&o.item&&Re(r.item,t,o.item))}}function Vn(e,t,n){try{let r=$n(t,e);if(!r)return;let o=Ye(t,r);if(!o)return;n.answer=[o]}catch(r){n.extension=[{url:ze,valueString:`Expression evaluation failed: ${(0,c.normalizeErrorString)(r)}`}]}}var Kn={[k.boolean]:[c.PropertyType.boolean],[k.date]:[c.PropertyType.date],[k.dateTime]:[c.PropertyType.dateTime],[k.time]:[c.PropertyType.time],[k.url]:[c.PropertyType.string,c.PropertyType.uri,c.PropertyType.url],[k.attachment]:[c.PropertyType.Attachment],[k.reference]:[c.PropertyType.Reference],[k.quantity]:[c.PropertyType.Quantity],[k.decimal]:[c.PropertyType.decimal,c.PropertyType.integer],[k.integer]:[c.PropertyType.decimal,c.PropertyType.integer]};function Ye(e,t){if(!e.type)return;if(e.type===k.choice||e.type===k.openChoice)return{[`value${(0,c.capitalize)(t.type)}`]:t.value};if(e.type===k.string||e.type===k.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(Kn[e.type]?.includes(t.type))return{[`value${(0,c.capitalize)(e.type)}`]:t.value}}function $n(e,t){if(!t)return;let n=(0,c.getExtension)(e,je);if(n){let r=n.valueExpression?.expression;if(r){let o=(0,c.toTypedValue)(t),s=(0,c.evalFhirPathTyped)(r,[o],{"%resource":o});return s.length!==0?s[0]:void 0}}}function zn(e,t,n){let r=[];for(let o of e){let s=n.answerOption?.find(i=>(0,c.typedValueToString)(pe(i))===o);if(s){let i=pe(s);i&&r.push({[t]:i.value})}}return r}function Oe(e,t,n){let r=[];for(let a of e.answerOption??c.EMPTY)if((0,c.getExtension)(a,Ge)?.valueBoolean===!0){let u=pe(a);u?.value!==void 0&&r.push(u)}if(r.length===0)return n;let o=a=>{let u=Ae(a);return!!u&&r.some(p=>(0,c.deepEquals)(p,u))},s=n.filter(a=>!t?.some(u=>(0,c.deepEquals)(u,a))),i=s.find(o);return i?[i]:s.some(a=>!o(a))?n.filter(a=>!o(a)):n}function Ze(e,t){for(let n of e??c.EMPTY){if(n.linkId===t)return n.answer;if(n.item){let r=Ze(n.item,t);if(r)return r}}}function Bn(e,t,n){if(n==="exists")return!!e===t.value;if(e){let r=n==="="||n==="!="?n?.replace("=","~"):n,[{value:o}]=(0,c.evalFhirPathTyped)(`%actualAnswer ${r} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return o}else return!1}function jn(e,t,n){let r=t||[],o=tn(e),s=!1,i=!0;for(let a of r){let u=Ae(a),{operator:p}=e;if(Bn(u,o,p)?s=!0:i=!1,n==="any"&&s)break}return{anyMatch:s,allMatch:i}}function Jn(e){let t=(0,c.getExtension)(e,fe);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function Gn(e,t){let n=(0,c.deepClone)(e),r=(0,c.getExtension)(n,fe);return!t||t.length===0?(r&&(n.extension=n.extension?.filter(o=>o!==r)),n):(r||(n.extension??=[],r={url:fe},n.extension.push(r)),t.length===1?(r.valueCode=t[0],delete r.valueCodeableConcept):(r.valueCodeableConcept={coding:t.map(o=>({code:o}))},delete r.valueCode),n)}function Hn(e,t,n){let r=(0,c.getExtension)(e,$e);if(!r?.valueString)return;let o=r.valueString;t?.reference&&(o=o.replaceAll("$subj",t.reference)),n?.reference&&(o=o.replaceAll("$encounter",n.reference));let s={},i=o.split("&");for(let a of i){let[u,p]=(0,c.splitN)(a,"=",2);s[u]=p}return s}function he(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??(0,c.getReferenceString)(e),item:we(e.item,t?.item),status:"in-progress"}}function we(e,t){let n;for(let r of e??c.EMPTY){if(r.type===k.display)continue;let o=t?.filter(s=>s.linkId===r.linkId);if(o?.length)for(let s of o)s.id=s.id??en(),s.text=s.text??r.text,s.item=we(r.item,s.item),s.answer=nn(r,s),n=(0,c.append)(n,s);else n=(0,c.append)(n,ye(r))}return n}function ye(e){return{id:en(),linkId:e.linkId,text:e.text,item:we(e.item,void 0),answer:nn(e)}}var Xn=1;function en(){return"id-"+Xn++}function nn(e,t){if(!(e.type===k.display||e.type===k.group)){if(t?.answer&&t.answer.length>0)return t.answer;if(e.initial&&e.initial.length>0)return e.initial.map(n=>({...n}));if(e.answerOption)return e.answerOption.filter(n=>n.initialSelected).map(n=>({...n,initialSelected:void 0}))}}function Yn(e){return(0,c.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireItemInitial",value:e},"value")}function pe(e){return(0,c.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireItemAnswerOption",value:e},"value")}function tn(e){return(0,c.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Ae(e){return(0,c.getTypedPropertyValueWithoutSchema)({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Zn(e){let t=le(e.questionnaire),n=le(e.defaultValue),[,r]=(0,ge.useReducer)(x=>x+1,0),o=(0,ge.useRef)({activePage:0});if(!o.current.questionnaire&&t&&(o.current.questionnaire=t,o.current.pages=e.disablePagination?void 0:et(t)),t&&e.defaultValue&&n&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=he(t,n),v()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=he(t),v()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function s(x,d){let l=o.current.questionnaireResponse;for(let E of x)l=l?.item?.find(g=>E.id?g.id===E.id:g.linkId===E.linkId);return d&&(l=l?.item?.find(E=>E.linkId===d.linkId)),l}function i(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(x,d){let l=s(x);l&&(l.item??=[],l.item.push(ye(d)),v())}function p(x,d){let l=s(x,d);l&&(l.answer??=[],l.answer.push({}),v())}function R(x,d,l){let E=s(x,d);E&&(E.answer=Oe(d,E.answer,l),v())}function C(x){let d=o.current.questionnaireResponse;d&&(x?(d.extension=d.extension??[],d.extension=d.extension.filter(l=>l.url!==te),d.extension.push({url:te,valueSignature:x})):d.extension=d.extension?.filter(l=>l.url!==te),v())}function S(){let x=o.current.questionnaire;if(x?.item){let d=o.current.questionnaireResponse;Re(x.item,d)}}function v(){let x=o.current.questionnaireResponse,d=o.current.questionnaire;!x||!d||(S(),r(),e.onChange?.(me(d,x)))}return{loading:!1,pagination:!!o.current.pages,questionnaire:o.current.questionnaire,questionnaireResponse:me(o.current.questionnaire,o.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:o.current.activePage,pages:o.current.pages,items:nt(o.current.questionnaire,o.current.pages,o.current.activePage),responseItems:tt(o.current.questionnaireResponse,o.current.pages,o.current.activePage),onNextPage:i,onPrevPage:a,onAddGroup:u,onAddAnswer:p,onChangeAnswer:R,onChangeSignature:C}}function et(e){if(!(!e?.item||(0,rn.getExtension)(e?.item?.[0],Qe)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,r)=>({linkId:n.linkId,title:n.text??`Page ${r+1}`,group:n}))}function nt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function tt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}var Ie=require("@medplum/core"),U=require("react");async function rt(e,t){let n=await t.search(e.resourceType,(0,Ie.formatSearchQuery)({...e,total:e.total??"accurate"}),{cache:"no-cache"});return{items:n.entry?.map(o=>o.resource).filter(o=>o!==void 0)??[],total:n.total}}function ot(e){let{search:t,selectedId:n,loadItems:r,reloadKey:o}=e,s=T(),[i,a]=(0,U.useState)(t),[u,p]=(0,U.useState)([]),[R,C]=(0,U.useState)(),[S,v]=(0,U.useState)(!0),[x,d]=(0,U.useState)(),l=(0,U.useRef)(e),E=(0,U.useRef)(0),g=(0,U.useRef)(0),f=i.resourceType,y=n!==void 0&&x?.id===n?x.value:void 0;(0,Ie.deepEquals)(t,i)||(a(t),v(!0));let m=(0,U.useCallback)(async()=>{let I=++E.current;try{let h=r?await r(i,s):await rt(i,s);if(I!==E.current)return;p(h.items),C(h.total),l.current.onLoad?.(h.items,h.total)}catch(h){I===E.current&&(l.current.onError??console.error)(h)}finally{I===E.current&&v(!1)}},[i,r,s]);return(0,U.useEffect)(()=>{l.current=e}),(0,U.useEffect)(()=>{m().catch(console.error)},[m,o]),(0,U.useEffect)(()=>{let I=++g.current;if(!n)return;let h=async()=>{let _=l.current.resolveSelected;if(_)return _(n,u,s);let Q=u.find(A=>A.id===n);return Q!==void 0?Q:await s.readResource(f,n)};(async()=>{try{let _=await h();I===g.current&&d({id:n,value:_})}catch(_){I===g.current&&(d({id:n,value:void 0}),(l.current.onError??console.error)(_))}})().catch(console.error)},[n,u,s,f]),{items:u,total:R,loading:S,selected:y,search:i,refresh:m}}var re=require("react");function it(e,t){let n=T(),r=(0,re.useRef)(t);(0,re.useEffect)(()=>{r.current=t});let o=Array.isArray(e)?e.join(","):e;(0,re.useEffect)(()=>{let s=new Set(o.split(",")),i=a=>{s.has(a.payload.resourceType)&&r.current(a.payload)};return n.addEventListener("resourceModified",i),()=>n.removeEventListener("resourceModified",i)},[n,o])}var Se=require("@medplum/core"),J=require("react");var D=require("react");function on(e,t,n={leading:!1}){let[r,o]=(0,D.useState)(e),s=(0,D.useRef)(!1),i=(0,D.useRef)(void 0),a=(0,D.useRef)(!1),u=(0,D.useCallback)(()=>window.clearTimeout(i.current),[]);return(0,D.useEffect)(()=>{s.current&&(!a.current&&n.leading?(a.current=!0,o(e),i.current=setTimeout(()=>{a.current=!1},t)):(u(),i.current=setTimeout(()=>{a.current=!1,o(e)},t)))},[e,n.leading,t,u]),(0,D.useEffect)(()=>(s.current=!0,u),[u]),[r,u]}var st=250;function at(e,t,n){return ke("search",e,t,n)}function ut(e,t,n){return ke("searchOne",e,t,n)}function ct(e,t,n){return ke("searchResources",e,t,n)}function ke(e,t,n,r){let o=T(),[s,i]=(0,J.useState)(!1),[a,u]=(0,J.useState)(),[p,R]=(0,J.useState)(),C=o.fhirSearchUrl(t,n).toString(),S=(0,J.useMemo)(()=>({resourceType:t,query:n}),[C]),v=r?.enabled??!0,x=r?.debounceMs??st,[d]=on(S,x,{leading:!0});return(0,J.useEffect)(()=>{if(!v)return()=>{};i(!0);let l=!0;return o[e](d.resourceType,d.query).then(E=>{l&&(i(!1),u(E),R(Se.allOk))}).catch(E=>{l&&(i(!1),u(void 0),R((0,Se.normalizeOperationOutcome)(E)))}),()=>{l=!1}},[o,e,d,v]),[a,s,p]}var G=require("@medplum/core"),sn=require("react");function dt(){let e=T();return(0,sn.useCallback)(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:(0,G.resolveId)(n)});return(0,G.isResource)(r,"Parameters")?(0,G.parametersToOrderSetSyncResponse)(r):void 0}catch(r){if(r instanceof G.OperationOutcomeError&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}var an=require("@medplum/core"),L=require("react");function lt({query:e,threadId:t}){let n=T(),[r,o]=(0,L.useState)(!0),[s,i]=(0,L.useState)(e),[a,u]=(0,L.useState)([]),[p,R]=(0,L.useState)(void 0),[C,S]=(0,L.useState)(null),[v,x]=(0,L.useState)(void 0),d=(0,L.useRef)(0);e!==s&&(i(e),o(!0));let l=(0,L.useCallback)(async()=>{let f=++d.current;try{let y=new URLSearchParams(s);y.append("identifier:not","http://medplum.com/ai-message|"),y.append("part-of:missing","true"),y.append("_has:Communication:part-of:_id:not","null");let m=await n.search("Communication",y.toString(),{cache:"no-cache"});if(f!==d.current)return;let I=m.entry?.map(A=>A.resource).filter(A=>A!==void 0)||[];if(m.total!==void 0&&x(m.total),I.length===0){u([]);return}let w=`
2
2
  query {
3
- ${l.map(p=>{let w=`thread_${p.id?.replaceAll("-","")||""}`,C=(0,on.getReferenceString)(p);return`
4
- ${w}: CommunicationList(
5
- part_of: "${C}"
3
+ ${I.map(A=>{let Y=`thread_${A.id?.replaceAll("-","")||""}`,B=(0,an.getReferenceString)(A);return`
4
+ ${Y}: CommunicationList(
5
+ part_of: "${B}"
6
6
  _sort: "-sent"
7
7
  _count: 1
8
8
  ) {
@@ -26,9 +26,9 @@
26
26
  `}).join(`
27
27
  `)}
28
28
  }
29
- `,b=await n.graphql(x),P=l.map(p=>{let w=`thread_${p.id?.replaceAll("-","")||""}`,C=b.data[w],B=C&&C.length>0?C[0]:void 0;return[p,B]}).filter(p=>p[1]!==void 0);i(P)},[n,e]);return(0,W.useEffect)(()=>{o(!0),I().catch(c=>{y(c)}).finally(()=>{o(!1)})},[I]),(0,W.useEffect)(()=>{(async()=>{if(!t){u(void 0);return}let R=s.find(m=>m[0].id===t);if(R){u(R[0]);return}let l=await n.readResource("Communication",t);if(l.partOf===void 0)u(l);else{let m=l.partOf[0].reference;if(m){let x=await n.readReference({reference:m});u(x)}}})().catch(R=>{y(R)})},[t,s,n]),{loading:r,error:h,threadMessages:s,selectedThread:a,total:M,addThreadMessage:c=>{(async()=>{await I(),i(l=>[[c,void 0],...l])})().catch(l=>y(l))},handleThreadStatusChange:c=>{if(!a)return;(async()=>{let l=await n.updateResource({...a,status:c});u(l),i(m=>m.map(([x,b])=>x.id===l.id?[l,b]:[x,b]))})().catch(l=>y(l))},refreshThreadMessages:I}}var he=require("@medplum/core"),H=require("react");function sn(e){if(e instanceof he.OperationOutcomeError){let t=(0,he.getStatus)(e.outcome);return t===400||t===404}return!1}var an=[];function un(e){let t=v(),n=Array.from(new Set(e.filter(i=>!!i))).sort((i,a)=>i.localeCompare(a)).join(`
30
- `),r=(0,H.useMemo)(()=>n===""?an:n.split(`
31
- `),[n]),[o,s]=(0,H.useState)({});return(0,H.useEffect)(()=>{if(r.length===0)return;let i=!1,a=new AbortController;for(let u of r)t.valueSetExpand({url:u,count:1},{signal:a.signal}).then(()=>{i||s(h=>({...h,[u]:!0}))}).catch(h=>{i||s(y=>({...y,[u]:!sn(h)}))});return()=>{i=!0,a.abort()}},[t,r]),(0,H.useMemo)(()=>{let i=[],a=[],u=!1;for(let h of r){let y=o[h];y===void 0?u=!0:y?i.push(h):a.push(h)}return{loading:u,available:i,unavailable:a}},[r,o])}function dt(e){let{loading:t,unavailable:n}=un(e?[e]:an);if(!e)return!0;if(!t)return!n.includes(e)}var ye=require("@medplum/core"),T=require("react");var lt=12e4;function ft({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:r=lt}){let o=v(),s=(0,T.useRef)(n);(0,T.useEffect)(()=>{s.current=n},[n]);let[i,a]=(0,T.useState)("idle"),[u,h]=(0,T.useState)(void 0),[y,M]=(0,T.useState)([]),S=(0,T.useRef)(void 0),I=(0,T.useRef)(void 0),g=(0,T.useRef)(void 0),f=(0,T.useRef)(void 0),c=(0,T.useRef)(!1),R=(0,T.useRef)(!1),l=(0,T.useRef)(!1),[m,x]=(0,T.useState)(!1),b=(0,T.useRef)(!1),P=(0,T.useCallback)(E=>{b.current=E,x(E),I.current?.getAudioTracks().forEach(k=>{k.enabled=!E})},[]),p=(0,T.useCallback)(()=>{l.current=!1,f.current?.disconnect(),f.current=void 0,g.current?.close().catch(()=>{}),g.current=void 0,I.current?.getTracks().forEach(E=>E.stop()),I.current=void 0,b.current=!1,x(!1),a(S.current?"idle":"disconnected")},[]),q=(0,T.useCallback)(()=>{p(),S.current?.close(),S.current=void 0,R.current=!1,a("disconnected")},[p]),w=(0,T.useCallback)(()=>{S.current?.send(JSON.stringify({type:"session.update",session:{type:"transcription",audio:{input:{format:{type:"audio/pcm",rate:24e3},transcription:{model:t,language:e},turn_detection:{type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},noise_reduction:{type:"near_field"}}}}}))},[e,t]),C=(0,T.useCallback)(async()=>{if(!(f.current||c.current)&&!(!I.current||!S.current)){c.current=!0;try{let E=new AudioContext({sampleRate:24e3});await E.audioWorklet.addModule(Rt());let k=I.current,D=S.current;if(!l.current||!k||!D){await E.close().catch(()=>{});return}let fn=E.createMediaStreamSource(k),te=new AudioWorkletNode(E,dn);te.port.onmessage=pn=>{if(D.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let mn=cn(pn.data),Rn=btoa(String.fromCharCode(...mn));D.send(JSON.stringify({type:"input_audio_buffer.append",audio:Rn}))},fn.connect(te),te.connect(E.destination),g.current=E,f.current=te,a("listening")}catch(E){h(E),a("error"),p()}finally{c.current=!1}}},[p]),B=(0,T.useCallback)(()=>{l.current&&R.current&&I.current&&(f.current||(S.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),C().catch(()=>{})))},[C]),Qe=(0,T.useCallback)(E=>{switch(E.type){case"session.created":w();break;case"session.updated":R.current=!0,B();break;case"input_audio_buffer.speech_started":a("speech_started");break;case"input_audio_buffer.speech_stopped":a("speech_stopped");break;case"conversation.item.input_audio_transcription.completed":case"input_audio_transcription.completed":if(E.transcript){let k={text:E.transcript,timestamp:new Date().toISOString()};M(D=>[...D,k]),s.current?.(E.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",E),h(E),a("error");break;default:console.debug("[useWhisper] unhandled message",E.type,E);break}},[w,B]),Oe=(0,T.useCallback)(async()=>{a("requesting_microphone");let E=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return E.getAudioTracks().forEach(k=>{k.enabled=!b.current}),I.current=E,E},[]),we=(0,T.useCallback)(()=>{a("connecting");let E=pt(o.getBaseUrl());console.debug("[useWhisper] connecting to",E);let k=new ye.ReconnectingWebSocket(E);return S.current=k,k.onopen=()=>{R.current=!1,l.current?a("connected"):a("idle"),k.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()}))},k.onmessage=D=>Qe(JSON.parse(D.data)),k.onerror=D=>{l.current&&(h(D),q(),a("error"))},k.onclose=()=>{R.current=!1,S.current&&a(l.current?"connecting":"idle")},k},[o,Qe,q]),Ae=(0,T.useCallback)(()=>S.current??we(),[we]),ln=(0,T.useCallback)(async()=>{try{h(void 0),l.current=!0,Ae(),await Oe(),B()}catch(E){h(E),a("error"),p()}},[Oe,Ae,p,B]);return(0,T.useEffect)(()=>{if(i!=="idle"||!S.current||!Number.isFinite(r)||r<=0)return;let E=new AbortController;return(0,ye.sleep)(r,{signal:E.signal}).then(()=>q()).catch(()=>{}),()=>E.abort()},[i,r,q]),(0,T.useEffect)(()=>()=>q(),[q]),{status:i,error:u,transcripts:y,start:ln,stop:p,isListening:i==="listening"||i==="speech_started"||i==="speech_stopped",muted:m,setMuted:P}}function cn(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++){let r=Math.max(-1,Math.min(1,e[n]));t[n]=r*32767}return new Uint8Array(t.buffer)}function pt(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var dn="medplum-pcm-worklet",mt=`
29
+ `,_=await n.graphql(w);if(f!==d.current)return;let Q=I.map(A=>{let Y=`thread_${A.id?.replaceAll("-","")||""}`,B=_.data[Y],ie=B&&B.length>0?B[0]:void 0;return[A,ie]}).filter(A=>A[1]!==void 0);u(Q)}finally{f===d.current&&o(!1)}},[n,s]);return(0,L.useEffect)(()=>{l().catch(f=>{S(f)})},[l]),(0,L.useEffect)(()=>{(async()=>{if(!t){R(void 0);return}let y=a.find(I=>I[0].id===t);if(y){R(y[0]);return}let m=await n.readResource("Communication",t);if(m.partOf===void 0)R(m);else{let I=m.partOf[0].reference;if(I){let h=await n.readReference({reference:I});R(h)}}})().catch(y=>{S(y)})},[t,a,n]),{loading:r,error:C,threadMessages:a,selectedThread:p,total:v,addThreadMessage:f=>{(async()=>{await l(),u(m=>[[f,void 0],...m])})().catch(m=>S(m))},handleThreadStatusChange:f=>{if(!p)return;(async()=>{let m=await n.updateResource({...p,status:f});R(m),u(I=>I.map(([h,w])=>h.id===m.id?[m,w]:[h,w]))})().catch(m=>S(m))},refreshThreadMessages:l}}var xe=require("@medplum/core"),X=require("react");function un(e){if(e instanceof xe.OperationOutcomeError){let t=(0,xe.getStatus)(e.outcome);return t===400||t===404}return!1}var cn=[];function dn(e){let t=T(),n=Array.from(new Set(e.filter(i=>!!i))).sort((i,a)=>i.localeCompare(a)).join(`
30
+ `),r=(0,X.useMemo)(()=>n===""?cn:n.split(`
31
+ `),[n]),[o,s]=(0,X.useState)({});return(0,X.useEffect)(()=>{if(r.length===0)return;let i=!1,a=new AbortController;for(let u of r)t.valueSetExpand({url:u,count:1},{signal:a.signal}).then(()=>{i||s(p=>({...p,[u]:!0}))}).catch(p=>{i||s(R=>({...R,[u]:!un(p)}))});return()=>{i=!0,a.abort()}},[t,r]),(0,X.useMemo)(()=>{let i=[],a=[],u=!1;for(let p of r){let R=o[p];R===void 0?u=!0:R?i.push(p):a.push(p)}return{loading:u,available:i,unavailable:a}},[r,o])}function ft(e){let{loading:t,unavailable:n}=dn(e?[e]:cn);if(!e)return!0;if(!t)return!n.includes(e)}var Ee=require("@medplum/core"),P=require("react");var pt=12e4;function mt({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:r=pt}){let o=T(),s=(0,P.useRef)(n);(0,P.useEffect)(()=>{s.current=n},[n]);let[i,a]=(0,P.useState)("idle"),[u,p]=(0,P.useState)(void 0),[R,C]=(0,P.useState)([]),S=(0,P.useRef)(void 0),v=(0,P.useRef)(void 0),x=(0,P.useRef)(void 0),d=(0,P.useRef)(void 0),l=(0,P.useRef)(!1),E=(0,P.useRef)(!1),g=(0,P.useRef)(!1),[f,y]=(0,P.useState)(!1),m=(0,P.useRef)(!1),I=(0,P.useCallback)(b=>{m.current=b,y(b),v.current?.getAudioTracks().forEach(q=>{q.enabled=!b})},[]),h=(0,P.useCallback)(()=>{g.current=!1,d.current?.disconnect(),d.current=void 0,x.current?.close().catch(()=>{}),x.current=void 0,v.current?.getTracks().forEach(b=>b.stop()),v.current=void 0,m.current=!1,y(!1),a(S.current?"idle":"disconnected")},[]),w=(0,P.useCallback)(()=>{h(),S.current?.close(),S.current=void 0,E.current=!1,a("disconnected")},[h]),_=(0,P.useCallback)(()=>{S.current?.send(JSON.stringify({type:"session.update",session:{type:"transcription",audio:{input:{format:{type:"audio/pcm",rate:24e3},transcription:{model:t,language:e},turn_detection:{type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},noise_reduction:{type:"near_field"}}}}}))},[e,t]),Q=(0,P.useCallback)(async()=>{if(!(d.current||l.current)&&!(!v.current||!S.current)){l.current=!0;try{let b=new AudioContext({sampleRate:24e3});await b.audioWorklet.addModule(yt());let q=v.current,F=S.current;if(!g.current||!q||!F){await b.close().catch(()=>{});return}let mn=b.createMediaStreamSource(q),se=new AudioWorkletNode(b,fn);se.port.onmessage=Rn=>{if(F.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let hn=ln(Rn.data),yn=btoa(String.fromCharCode(...hn));F.send(JSON.stringify({type:"input_audio_buffer.append",audio:yn}))},mn.connect(se),se.connect(b.destination),x.current=b,d.current=se,a("listening")}catch(b){p(b),a("error"),h()}finally{l.current=!1}}},[h]),A=(0,P.useCallback)(()=>{g.current&&E.current&&v.current&&(d.current||(S.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),Q().catch(()=>{})))},[Q]),oe=(0,P.useCallback)(b=>{switch(b.type){case"session.created":_();break;case"session.updated":E.current=!0,A();break;case"input_audio_buffer.speech_started":a("speech_started");break;case"input_audio_buffer.speech_stopped":a("speech_stopped");break;case"conversation.item.input_audio_transcription.completed":case"input_audio_transcription.completed":if(b.transcript){let q={text:b.transcript,timestamp:new Date().toISOString()};C(F=>[...F,q]),s.current?.(b.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",b),p(b),a("error");break;default:console.debug("[useWhisper] unhandled message",b.type,b);break}},[_,A]),Y=(0,P.useCallback)(async()=>{a("requesting_microphone");let b=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return b.getAudioTracks().forEach(q=>{q.enabled=!m.current}),v.current=b,b},[]),B=(0,P.useCallback)(()=>{a("connecting");let b=Rt(o.getBaseUrl());console.debug("[useWhisper] connecting to",b);let q=new Ee.ReconnectingWebSocket(b);return S.current=q,q.onopen=()=>{E.current=!1,g.current?a("connected"):a("idle"),q.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()}))},q.onmessage=F=>oe(JSON.parse(F.data)),q.onerror=F=>{g.current&&(p(F),w(),a("error"))},q.onclose=()=>{E.current=!1,S.current&&a(g.current?"connecting":"idle")},q},[o,oe,w]),ie=(0,P.useCallback)(()=>S.current??B(),[B]),pn=(0,P.useCallback)(async()=>{try{p(void 0),g.current=!0,ie(),await Y(),A()}catch(b){p(b),a("error"),h()}},[Y,ie,h,A]);return(0,P.useEffect)(()=>{if(i!=="idle"||!S.current||!Number.isFinite(r)||r<=0)return;let b=new AbortController;return(0,Ee.sleep)(r,{signal:b.signal}).then(()=>w()).catch(()=>{}),()=>b.abort()},[i,r,w]),(0,P.useEffect)(()=>()=>w(),[w]),{status:i,error:u,transcripts:R,start:pn,stop:h,isListening:i==="listening"||i==="speech_started"||i==="speech_stopped",muted:f,setMuted:I}}function ln(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++){let r=Math.max(-1,Math.min(1,e[n]));t[n]=r*32767}return new Uint8Array(t.buffer)}function Rt(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var fn="medplum-pcm-worklet",ht=`
32
32
  class PcmWorkletProcessor extends AudioWorkletProcessor {
33
33
  constructor() {
34
34
  super();
@@ -60,6 +60,6 @@ class PcmWorkletProcessor extends AudioWorkletProcessor {
60
60
  }
61
61
  }
62
62
 
63
- registerProcessor('${dn}', PcmWorkletProcessor);
64
- `,Me;function Rt(){if(!Me){let e=new Blob([mt],{type:"application/javascript"});Me=URL.createObjectURL(e)}return Me}
63
+ registerProcessor('${fn}', PcmWorkletProcessor);
64
+ `,_e;function yt(){if(!_e){let e=new Blob([ht],{type:"application/javascript"});_e=URL.createObjectURL(e)}return _e}
65
65
  //# sourceMappingURL=index.cjs.map