@medplum/react-hooks 5.1.29 → 5.1.30
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/dist/cjs/index.cjs +7 -7
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/esm/index.mjs +7 -7
- package/dist/esm/index.mjs.map +3 -3
- package/package.json +6 -6
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
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=`
|
|
1
|
+
"use strict";var Ee=Object.defineProperty;var gn=Object.getOwnPropertyDescriptor;var In=Object.getOwnPropertyNames;var Sn=Object.prototype.hasOwnProperty;var xn=(e,t)=>{for(var n in t)Ee(e,n,{get:t[n],enumerable:!0})},bn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of In(t))!Sn.call(e,o)&&o!==n&&Ee(e,o,{get:()=>t[o],enumerable:!(r=gn(t,o))||r.enumerable});return e};var En=e=>bn(Ee({},"__esModule",{value:!0}),e);var gt={};xn(gt,{MEDICATION_CART_ADD_IN_PROGRESS:()=>We,MedplumProvider:()=>Pn,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:()=>re,QUESTIONNAIRE_VALIDATION_ERROR_URL:()=>ze,QuestionnaireItemType:()=>A,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:()=>P,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=En(gt);var ee=require("react");var ae=require("react"),ue=(0,ae.createContext)(void 0);function ce(){return(0,ae.useContext)(ue)}function P(){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 Pn(e){let t=e.medplum,n=e.navigate??Tn,[r,o]=(0,ee.useState)({profile:t.getProfile(),loading:t.isLoading()});(0,ee.useEffect)(()=>{function s(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of qe)t.addEventListener(a,s);return()=>{for(let a of qe)t.removeEventListener(a,s)}},[t]);let i=(0,ee.useMemo)(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return(0,Ue.jsx)(ue.Provider,{value:i,children:e.children})}function Tn(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 s=new URLSearchParams(new URL(o).search).get("Expires");if(s&&Number.parseInt(s,10)*1e3-5e3>Date.now())return o}return Ne.set(t,e),e},[e]);var O=require("@medplum/core"),K=require("react");var We="Cannot checkout while a medication is still being added to the cart";function Mn(){let e=P(),[t,n]=(0,K.useState)(!1),r=(0,K.useRef)(0),o=(0,K.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]),i=(0,K.useCallback)(async u=>{if(r.current>0)throw new Error(We);let p=e.fhirUrl("MedicationRequest","$checkout-medications"),R=(0,O.medicationCheckoutRequestToParameters)(u),M=await e.post(p,R);if(!(0,O.isResource)(M,"Parameters"))throw new Error(O.INVALID_MEDICATION_CHECKOUT_RESPONSE);return(0,O.parametersToMedicationCheckoutResponse)(M)},[e]),s=(0,K.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,K.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:i,removeFromCart:s,clearCart:a}}var De=require("@medplum/core"),$=require("react");function Qn(e,t,n){let r=P(),{patientId:o,organization:i,onPatientSyncSuccess:s,onIframeSuccess:a,onError:u}=n,p=(0,De.resolveId)(i),[R,M]=(0,$.useState)(void 0),x=(0,$.useRef)(s),E=(0,$.useRef)(a),y=(0,$.useRef)(u);return(0,$.useEffect)(()=>{x.current=s,E.current=a,y.current=u},[s,a,u]),(0,$.useEffect)(()=>{let d=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:p}),d)return;x.current?.()}let b=await r.executeBot(t,{patientId:o,organizationId:p});if(d)return;b.url&&(M(b.url),E.current?.(b.url))}catch(b){d||y.current?.(b)}})().catch(()=>{}),()=>{d=!0}},[r,e,t,o,p]),R}var L=require("@medplum/core"),Pe=require("react");function On(){let e=P(),t=(0,Pe.useCallback)(async r=>{let o=e.fhirUrl("Medication","$drug-search"),i=(0,L.medicationSearchParamsToParameters)(r),s=await e.post(o,i);if(!(0,L.isResource)(s,"Bundle"))throw new Error(L.INVALID_MEDICATION_SEARCH_RESPONSE);return(s.entry??[]).map(a=>a.resource).filter(a=>(0,L.isResource)(a,"Medication"))},[e]),n=(0,Pe.useCallback)(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),i=(0,L.medicationOrderRequestToParameters)(r),s=await e.post(o,i);if(!(0,L.isResource)(s,"Parameters"))throw new Error(L.INVALID_MEDICATION_ORDER_RESPONSE);return(0,L.parametersToMedicationOrderResponse)(s)},[e]);return{searchMedications:t,orderMedication:n}}var J=require("@medplum/core"),D=require("react");function wn(e){let t=P(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s}=e,[a,u]=(0,D.useState)(void 0),[p,R]=(0,D.useState)(!1),[M,x]=(0,D.useState)(void 0),E=(0,D.useRef)({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s});E.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s};let y=()=>{let g=E.current;if(!g.patientId)return;let f=!!g.planDefinitionId,I=g.vendorOrderSetId!==void 0&&g.vendorOrderSetId!==null&&g.vendorOrderSetId!=="";return!f&&!I?void 0:{patientId:g.patientId,planDefinitionId:f?g.planDefinitionId:void 0,vendorOrderSetId:I?g.vendorOrderSetId:void 0,appId:g.appId,organization:g.organization}},d=(0,D.useCallback)(async g=>{let f=t.fhirUrl("PlanDefinition","$order-set-url"),I=(0,J.medicationOrderSetRequestToParameters)(g),m=await t.post(f,I);if(!(0,J.isResource)(m,"Parameters"))throw new Error(J.INVALID_MEDICATION_ORDER_SET_RESPONSE);return(0,J.parametersToMedicationOrderSetResponse)(m).launchUrl},[t]),l=(0,D.useRef)(0),b=(0,D.useCallback)(async()=>{let g=y();if(!g)return;l.current+=1;let f=l.current;R(!0),x(void 0);try{let I=await d(g);return l.current!==f?void 0:(u(I),I)}catch(I){l.current===f&&(x(I),u(void 0));return}finally{l.current===f&&R(!1)}},[d]);return(0,D.useEffect)(()=>{let g=!1,f=y();if(!f){l.current+=1,u(void 0),R(!1),x(void 0);return}l.current+=1;let I=l.current;return R(!0),x(void 0),d(f).then(m=>{g||l.current!==I||u(m)}).catch(m=>{g||l.current!==I||(x(m),u(void 0))}).finally(()=>{!g&&l.current===I&&R(!1)}),()=>{g=!0}},[d,n,r,o,i,s]),{url:a,loading:p,error:M,refresh:b}}var ne=require("react");var Te=require("@medplum/core"),C=require("react");var An=3e3;function Ce(e,t,n){let r=P(),o=r.getProject(),a=ve()&&o?.features?.includes("websocket-subscriptions")?e:void 0,[u,p]=(0,C.useState)(),[R,M]=(0,C.useState)(n?.subscriptionProps),x=(0,C.useRef)(!1),E=(0,C.useRef)(void 0),y=(0,C.useRef)(void 0),d=(0,C.useRef)(void 0),l=(0,C.useRef)(t);l.current=t;let b=(0,C.useRef)(n?.onWebSocketOpen);b.current=n?.onWebSocketOpen;let g=(0,C.useRef)(n?.onWebSocketClose);g.current=n?.onWebSocketClose;let f=(0,C.useRef)(n?.onSubscriptionConnect);f.current=n?.onSubscriptionConnect;let I=(0,C.useRef)(n?.onSubscriptionDisconnect);I.current=n?.onSubscriptionDisconnect;let m=(0,C.useRef)(n?.onError);m.current=n?.onError,(0,C.useEffect)(()=>{(0,Te.deepEquals)(n?.subscriptionProps,R)||M(n?.subscriptionProps)},[R,n]),(0,C.useEffect)(()=>{E.current&&(clearTimeout(E.current),E.current=void 0);let _=!1;return(y.current!==a||!(0,Te.deepEquals)(d.current,R))&&(_=!0),_&&y.current&&r.unsubscribeFromCriteria(y.current,d.current),y.current=a,d.current=R,_&&a?p(r.subscribeToCriteria(a,R)):a||p(void 0),()=>{E.current=setTimeout(()=>{a&&r.unsubscribeFromCriteria(a,R)},An)}},[r,a,R]);let S=(0,C.useCallback)(_=>{l.current?.(_.payload)},[]),h=(0,C.useCallback)(()=>{b.current?.()},[]),w=(0,C.useCallback)(()=>{g.current?.()},[]),k=(0,C.useCallback)(_=>{f.current?.(_.payload.subscriptionId)},[]),N=(0,C.useCallback)(_=>{I.current?.(_.payload.subscriptionId)},[]),Q=(0,C.useCallback)(_=>{m.current?.(_.payload)},[]);(0,C.useEffect)(()=>u?(x.current||(u.addEventListener("message",S),u.addEventListener("open",h),u.addEventListener("close",w),u.addEventListener("connect",k),u.addEventListener("disconnect",N),u.addEventListener("error",Q),x.current=!0),()=>{x.current=!1,u.removeEventListener("message",S),u.removeEventListener("open",h),u.removeEventListener("close",w),u.removeEventListener("connect",k),u.removeEventListener("disconnect",N),u.removeEventListener("error",Q)}):()=>{},[u,S,h,w,k,N,Q])}function kn(e){let t=P(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[i,s]=(0,ne.useState)(0),a=(0,ne.useCallback)(u=>{t.search(n,r,{cache:u}).then(p=>s(p.total)).catch(console.error)},[t,n,r]);return(0,ne.useEffect)(()=>{a("default")},[a]),Ce(o,()=>{a("reload")}),i}var Fe=require("@medplum/core"),z=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((i,s)=>i[0].localeCompare(s[0])||i[1].localeCompare(s[1]));r=JSON.stringify(o)}else if(Array.isArray(n)){let o=[...n].sort((i,s)=>i[0].localeCompare(s[0])||i[1].localeCompare(s[1]));r=JSON.stringify(o)}else{let o=Object.entries(n).filter(([,i])=>i!==void 0).sort(([i],[s])=>i.localeCompare(s));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=P(),[r,o]=(0,z.useState)([]),[i,s]=(0,z.useState)(!0),[a,u]=(0,z.useState)(),p=_n(t),R=(0,z.useMemo)(()=>t,[p]),M=(0,z.useMemo)(()=>(0,Fe.resolveId)(e),[e]);return(0,z.useEffect)(()=>{if(!M)return;let x=!1,E=`Patient/${M}`,y={_count:100,_sort:"-_lastUpdated"},d=[],l=new Map,b=[];for(let f of R){let I=[];if(f.searches)for(let m of f.searches){let S=Ve(m),h=l.get(S);h===void 0&&(h=d.length,l.set(S,h),d.push(m)),I.push({searchIdx:h,resultKey:m.key})}b.push(I)}if(d.length===0){o(R.map(()=>({}))),s(!1);return}let g=d.map(f=>{let I=f.patientParam??"subject",m={[I]:E};if(f.query){if(typeof f.query=="string")return n.searchResources(f.resourceType,`${I}=${E}&${f.query}&_count=100&_sort=-_lastUpdated`);if(f.query instanceof URLSearchParams)f.query.forEach((S,h)=>{m[h]=S});else if(Array.isArray(f.query))for(let[S,h]of f.query)m[S]=h;else for(let[S,h]of Object.entries(f.query))h!==void 0&&(m[S]=h)}return n.searchResources(f.resourceType,{...y,...m})});return s(!0),u(void 0),Promise.allSettled(g).then(f=>{if(x)return;let I=b.map(S=>{let h={};for(let{searchIdx:w,resultKey:k}of S){let N=f[w];h[k]=N.status==="fulfilled"?N.value:[]}return h});o(I),s(!1);let m=f.filter(S=>S.status==="rejected");if(m.length>0){console.error("Some patient summary searches failed:",m.map(h=>h.reason));let S=m[0].reason;u(S instanceof Error?S:new Error(String(S)))}}).catch(f=>{x||(u(f instanceof Error?f:new Error(String(f))),s(!1))}),()=>{x=!0}},[n,M,R]),{sectionData:r,loading:i,error:a}}var X=require("@medplum/core"),Me=require("react");function Un(e,t){let n=P(),r=(0,Me.useCallback)(async i=>{let{organization:s,...a}=i,u=(0,X.resolveId)(s),p=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!(0,X.isOrganizationArray)(p))throw new Error("Invalid response from pharmacy search");return p},[n,e]),o=(0,Me.useCallback)(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary,organizationId:(0,X.resolveId)(i.organization)});if(!(0,X.isAddPharmacyResponse)(s))throw new Error("Invalid response from add pharmacy bot");return s},[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 B=require("@medplum/core"),te=require("react");function le(e,t){let n=P(),[r,o]=(0,te.useState)(()=>Ke(n,e)),i=(0,te.useCallback)(s=>{(0,B.deepEquals)(s,r)||o(s)},[r]);return(0,te.useEffect)(()=>{let s=!0,a=Ke(n,e);return!a&&(0,B.isReference)(e)?n.readReference(e).then(u=>{s&&i(u)}).catch(u=>{s&&(i(void 0),t&&t((0,B.normalizeOperationOutcome)(u)))}):i(a),(()=>s=!1)},[n,e,i,t]),r}function Ke(e,t){if(t){if((0,B.isResource)(t))return t;if((0,B.isReference)(t))return e.getCachedReference(t)}}var c=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"},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`,re=`${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 i=e?.find(s=>s.linkId===o.linkId);i&&!Xe(i,n)||(i?.item&&o.item?r.push({...o,item:He(i.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),i=(0,c.evalFhirPathTyped)(r,[o],{"%resource":o});return(0,c.toJsBoolean)(i)}}}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:i,allMatch:s}=jn(r,o,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function Re(e,t,n=t.item){for(let r of e){let o=n?.find(i=>i.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={[A.boolean]:[c.PropertyType.boolean],[A.date]:[c.PropertyType.date],[A.dateTime]:[c.PropertyType.dateTime],[A.time]:[c.PropertyType.time],[A.url]:[c.PropertyType.string,c.PropertyType.uri,c.PropertyType.url],[A.attachment]:[c.PropertyType.Attachment],[A.reference]:[c.PropertyType.Reference],[A.quantity]:[c.PropertyType.Quantity],[A.decimal]:[c.PropertyType.decimal,c.PropertyType.integer],[A.integer]:[c.PropertyType.decimal,c.PropertyType.integer]};function Ye(e,t){if(!e.type)return;if(e.type===A.choice||e.type===A.openChoice)return{[`value${(0,c.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(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),i=(0,c.evalFhirPathTyped)(r,[o],{"%resource":o});return i.length!==0?i[0]:void 0}}}function zn(e,t,n){let r=[];for(let o of e){let i=n.answerOption?.find(s=>(0,c.typedValueToString)(pe(s))===o);if(i){let s=pe(i);s&&r.push({[t]:s.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))},i=n.filter(a=>!t?.some(u=>(0,c.deepEquals)(u,a))),s=i.find(o);return s?[s]:i.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),i=!1,s=!0;for(let a of r){let u=Ae(a),{operator:p}=e;if(Bn(u,o,p)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}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 i={},s=o.split("&");for(let a of s){let[u,p]=(0,c.splitN)(a,"=",2);i[u]=p}return i}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===A.display)continue;let o=t?.filter(i=>i.linkId===r.linkId);if(o?.length)for(let i of o)i.id=i.id??en(),i.text=i.text??r.text,i.item=we(r.item,i.item),i.answer=nn(r,i),n=(0,c.append)(n,i);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===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 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)(y=>y+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),E()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=he(t),E()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function i(y,d){let l=o.current.questionnaireResponse;for(let b of y)l=l?.item?.find(g=>b.id?g.id===b.id:g.linkId===b.linkId);return d&&(l=l?.item?.find(b=>b.linkId===d.linkId)),l}function s(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(y,d){let l=i(y);l&&(l.item??=[],l.item.push(ye(d)),E())}function p(y,d){let l=i(y,d);l&&(l.answer??=[],l.answer.push({}),E())}function R(y,d,l){let b=i(y,d);b&&(b.answer=Oe(d,b.answer,l),E())}function M(y){let d=o.current.questionnaireResponse;d&&(y?(d.extension=d.extension??[],d.extension=d.extension.filter(l=>l.url!==re),d.extension.push({url:re,valueSignature:y})):d.extension=d.extension?.filter(l=>l.url!==re),E())}function x(){let y=o.current.questionnaire;if(y?.item){let d=o.current.questionnaireResponse;Re(y.item,d)}}function E(){let y=o.current.questionnaireResponse,d=o.current.questionnaire;!y||!d||(x(),r(),e.onChange?.(me(d,y)))}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:s,onPrevPage:a,onAddGroup:u,onAddAnswer:p,onChangeAnswer:R,onChangeSignature:M}}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,i=P(),[s,a]=(0,U.useState)(t),[u,p]=(0,U.useState)([]),[R,M]=(0,U.useState)(),[x,E]=(0,U.useState)(!0),[y,d]=(0,U.useState)(),l=(0,U.useRef)(e),b=(0,U.useRef)(0),g=(0,U.useRef)(0),f=s.resourceType,I=n!==void 0&&y?.id===n?y.value:void 0;(0,Ie.deepEquals)(t,s)||(a(t),E(!0));let m=(0,U.useCallback)(async()=>{let S=++b.current;try{let h=r?await r(s,i):await rt(s,i);if(S!==b.current)return;p(h.items),M(h.total),l.current.onLoad?.(h.items,h.total)}catch(h){S===b.current&&(l.current.onError??console.error)(h)}finally{S===b.current&&E(!1)}},[s,r,i]);return(0,U.useEffect)(()=>{l.current=e}),(0,U.useEffect)(()=>{m().catch(console.error)},[m,o]),(0,U.useEffect)(()=>{let S=++g.current;if(!n)return;let h=async()=>{let k=l.current.resolveSelected;if(k)return k(n,u,i);let N=u.find(Q=>Q.id===n);return N!==void 0?N:await i.readResource(f,n)};(async()=>{try{let k=await h();S===g.current&&d({id:n,value:k})}catch(k){S===g.current&&(d({id:n,value:void 0}),(l.current.onError??console.error)(k))}})().catch(console.error)},[n,u,i,f]),{items:u,total:R,loading:x,selected:I,search:s,refresh:m}}var oe=require("react");function it(e,t){let n=P(),r=(0,oe.useRef)(t);(0,oe.useEffect)(()=>{r.current=t});let o=Array.isArray(e)?e.join(","):e;(0,oe.useEffect)(()=>{let i=new Set(o.split(",")),s=a=>{i.has(a.payload.resourceType)&&r.current(a.payload)};return n.addEventListener("resourceModified",s),()=>n.removeEventListener("resourceModified",s)},[n,o])}var Se=require("@medplum/core"),G=require("react");var F=require("react");function on(e,t,n={leading:!1}){let[r,o]=(0,F.useState)(e),i=(0,F.useRef)(!1),s=(0,F.useRef)(void 0),a=(0,F.useRef)(!1),u=(0,F.useCallback)(()=>window.clearTimeout(s.current),[]);return(0,F.useEffect)(()=>{i.current&&(!a.current&&n.leading?(a.current=!0,o(e),s.current=setTimeout(()=>{a.current=!1},t)):(u(),s.current=setTimeout(()=>{a.current=!1,o(e)},t)))},[e,n.leading,t,u]),(0,F.useEffect)(()=>(i.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=P(),[i,s]=(0,G.useState)(!1),[a,u]=(0,G.useState)(),[p,R]=(0,G.useState)(),M=o.fhirSearchUrl(t,n).toString(),x=(0,G.useMemo)(()=>({resourceType:t,query:n}),[M]),E=r?.enabled??!0,y=r?.debounceMs??st,[d]=on(x,y,{leading:!0});return(0,G.useEffect)(()=>{if(!E)return()=>{};s(!0);let l=!0;return o[e](d.resourceType,d.query).then(b=>{l&&(s(!1),u(b),R(Se.allOk))}).catch(b=>{l&&(s(!1),u(void 0),R((0,Se.normalizeOperationOutcome)(b)))}),()=>{l=!1}},[o,e,d,E]),[a,i,p]}var H=require("@medplum/core"),sn=require("react");function dt(){let e=P();return(0,sn.useCallback)(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:(0,H.resolveId)(n)});return(0,H.isResource)(r,"Parameters")?(0,H.parametersToOrderSetSyncResponse)(r):void 0}catch(r){if(r instanceof H.OperationOutcomeError&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}var an=require("@medplum/core"),W=require("react");function lt({query:e,threadId:t}){let n=P(),[r,o]=(0,W.useState)(!0),[i,s]=(0,W.useState)(e),[a,u]=(0,W.useState)([]),[p,R]=(0,W.useState)(void 0),[M,x]=(0,W.useState)(null),[E,y]=(0,W.useState)(void 0),d=(0,W.useRef)(0);e!==i&&(s(e),o(!0));let l=(0,W.useCallback)(async()=>{let f=++d.current;try{let I=new URLSearchParams(i);I.append("identifier:not","http://medplum.com/ai-message|"),I.append("part-of:missing","true"),I.append("_has:Communication:part-of:_id:not","null");let m=await n.search("Communication",I.toString(),{cache:"no-cache"});if(f!==d.current)return;let S=m.entry?.map(Q=>Q.resource).filter(Q=>Q!==void 0)||[];if(m.total!==void 0&&y(m.total),S.length===0){u([]);return}let w=`
|
|
2
2
|
query {
|
|
3
|
-
${
|
|
4
|
-
${
|
|
5
|
-
part_of: "${
|
|
3
|
+
${S.map(Q=>{let Z=`thread_${Q.id?.replaceAll("-","")||""}`,j=(0,an.getReferenceString)(Q);return`
|
|
4
|
+
${Z}: CommunicationList(
|
|
5
|
+
part_of: "${j}"
|
|
6
6
|
_sort: "-sent"
|
|
7
7
|
_count: 1
|
|
8
8
|
) {
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
`}).join(`
|
|
27
27
|
`)}
|
|
28
28
|
}
|
|
29
|
-
`,
|
|
30
|
-
`),r=(0,
|
|
31
|
-
`),[n]),[o,
|
|
29
|
+
`,k=await n.graphql(w);if(f!==d.current)return;let N=S.map(Q=>{let Z=`thread_${Q.id?.replaceAll("-","")||""}`,j=k.data[Z],ie=j&&j.length>0?j[0]:void 0;return[Q,ie]}).filter(Q=>Q[1]!==void 0);u(N)}finally{f===d.current&&o(!1)}},[n,i]);return(0,W.useEffect)(()=>{l().catch(f=>{x(f)})},[l]),(0,W.useEffect)(()=>{(async()=>{if(!t){R(void 0);return}let I=a.find(S=>S[0].id===t);if(I){R(I[0]);return}let m=await n.readResource("Communication",t);if(m.partOf===void 0)R(m);else{let S=m.partOf[0].reference;if(S){let h=await n.readReference({reference:S});R(h)}}})().catch(I=>{x(I)})},[t,a,n]),{loading:r,error:M,threadMessages:a,selectedThread:p,total:E,addThreadMessage:f=>{(async()=>{await l(),u(m=>[[f,void 0],...m])})().catch(m=>x(m))},handleThreadStatusChange:f=>{if(!p)return;(async()=>{let m=await n.updateResource({...p,status:f});R(m),u(S=>S.map(([h,w])=>h.id===m.id?[m,w]:[h,w]))})().catch(m=>x(m))},refreshThreadMessages:l}}var xe=require("@medplum/core"),Y=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=P(),n=Array.from(new Set(e.filter(s=>!!s))).sort((s,a)=>s.localeCompare(a)).join(`
|
|
30
|
+
`),r=(0,Y.useMemo)(()=>n===""?cn:n.split(`
|
|
31
|
+
`),[n]),[o,i]=(0,Y.useState)({});return(0,Y.useEffect)(()=>{if(r.length===0)return;let s=!1,a=new AbortController;for(let u of r)t.valueSetExpand({url:u,count:1},{signal:a.signal}).then(()=>{s||i(p=>({...p,[u]:!0}))}).catch(p=>{s||i(R=>({...R,[u]:!un(p)}))});return()=>{s=!0,a.abort()}},[t,r]),(0,Y.useMemo)(()=>{let s=[],a=[],u=!1;for(let p of r){let R=o[p];R===void 0?u=!0:R?s.push(p):a.push(p)}return{loading:u,available:s,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 be=require("@medplum/core"),T=require("react");var pt=12e4;function mt({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:r=pt}){let o=P(),i=(0,T.useRef)(n);(0,T.useEffect)(()=>{i.current=n},[n]);let[s,a]=(0,T.useState)("idle"),[u,p]=(0,T.useState)(void 0),[R,M]=(0,T.useState)([]),x=(0,T.useRef)(void 0),E=(0,T.useRef)(void 0),y=(0,T.useRef)(void 0),d=(0,T.useRef)(void 0),l=(0,T.useRef)(!1),b=(0,T.useRef)(!1),g=(0,T.useRef)(!1),[f,I]=(0,T.useState)(!1),m=(0,T.useRef)(!1),S=(0,T.useCallback)(v=>{m.current=v,I(v),E.current?.getAudioTracks().forEach(q=>{q.enabled=!v})},[]),h=(0,T.useCallback)(()=>{g.current=!1,d.current?.disconnect(),d.current=void 0,y.current?.close().catch(()=>{}),y.current=void 0,E.current?.getTracks().forEach(v=>v.stop()),E.current=void 0,m.current=!1,I(!1),a(x.current?"idle":"disconnected")},[]),w=(0,T.useCallback)(()=>{h(),x.current?.close(),x.current=void 0,b.current=!1,a("disconnected")},[h]),k=(0,T.useCallback)(()=>{x.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]),N=(0,T.useCallback)(async()=>{if(!(d.current||l.current)&&!(!E.current||!x.current)){l.current=!0;try{let v=new AudioContext({sampleRate:24e3});await v.audioWorklet.addModule(yt());let q=E.current,V=x.current;if(!g.current||!q||!V){await v.close().catch(()=>{});return}let mn=v.createMediaStreamSource(q),se=new AudioWorkletNode(v,fn);se.port.onmessage=Rn=>{if(V.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));V.send(JSON.stringify({type:"input_audio_buffer.append",audio:yn}))},mn.connect(se),se.connect(v.destination),y.current=v,d.current=se,a("listening")}catch(v){p(v),a("error"),h()}finally{l.current=!1}}},[h]),Q=(0,T.useCallback)(()=>{g.current&&b.current&&E.current&&(d.current||(x.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),N().catch(()=>{})))},[N]),_=(0,T.useCallback)(v=>{switch(v.type){case"session.created":k();break;case"session.updated":b.current=!0,Q();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(v.transcript){let q={text:v.transcript,timestamp:new Date().toISOString()};M(V=>[...V,q]),i.current?.(v.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",v),p(v),a("error");break;default:console.debug("[useWhisper] unhandled message",v.type,v);break}},[k,Q]),Z=(0,T.useCallback)(async()=>{a("requesting_microphone");let v=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return v.getAudioTracks().forEach(q=>{q.enabled=!m.current}),E.current=v,v},[]),j=(0,T.useCallback)(()=>{a("connecting");let v=Rt(o.getBaseUrl());console.debug("[useWhisper] connecting to",v);let q=new be.ReconnectingWebSocket(v);return x.current=q,q.onopen=()=>{b.current=!1,g.current?a("connected"):a("idle"),q.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()}))},q.onmessage=V=>_(JSON.parse(V.data)),q.onerror=V=>{g.current&&(p(V),w(),a("error"))},q.onclose=()=>{b.current=!1,x.current&&a(g.current?"connecting":"idle")},q},[o,_,w]),ie=(0,T.useCallback)(()=>x.current??j(),[j]),pn=(0,T.useCallback)(async()=>{try{p(void 0),g.current=!0,ie(),await Z(),Q()}catch(v){p(v),a("error"),h()}},[Z,ie,h,Q]);return(0,T.useEffect)(()=>{if(s!=="idle"||!x.current||!Number.isFinite(r)||r<=0)return;let v=new AbortController;return(0,be.sleep)(r,{signal:v.signal}).then(()=>w()).catch(()=>{}),()=>v.abort()},[s,r,w]),(0,T.useEffect)(()=>()=>w(),[w]),{status:s,error:u,transcripts:R,start:pn,stop:h,isListening:s==="listening"||s==="speech_started"||s==="speech_stopped",muted:f,setMuted:S}}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();
|