@medplum/react-hooks 5.1.37 → 5.1.39

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.
@@ -691,6 +691,26 @@ export declare function useSearchOne<K extends ResourceType>(resourceType: K, qu
691
691
  */
692
692
  export declare function useSearchResources<K extends ResourceType>(resourceType: K, query?: QueryTypes, options?: SearchOptions): [ResourceArray<WithId<ExtractResource<K>>> | undefined, boolean, OperationOutcome | undefined];
693
693
 
694
+ /**
695
+ * Returns a referentially stable wrapper around `callback` that always invokes the most recent
696
+ * value passed in. This allows consumers to pass inline callbacks without invalidating effects
697
+ * that depend on them.
698
+ *
699
+ * The returned function is always defined, even when `callback` is undefined; in that case it
700
+ * is a no-op returning undefined. Do not use the result as a "was a handler provided?" signal.
701
+ *
702
+ * The returned function may not be current during rendering. Synchronous usage in renders
703
+ * should invoke the original function instead of the stabilized wrapper.
704
+ *
705
+ * In React v19.2+, when the callback is only used in effects, this can be replaced with
706
+ * `useEffectEvent`. This package supports embedding in applications using React 18.0, so that
707
+ * technique can not be used in this library yet.
708
+ *
709
+ * @param callback - The callback to stabilize. May be undefined.
710
+ * @returns A stable function that forwards to the latest `callback`.
711
+ */
712
+ export declare function useStabilizedCallback<Args extends unknown[], R>(callback: ((...args: Args) => R) | undefined): (...args: Args) => R | undefined;
713
+
694
714
  /**
695
715
  * Creates an in-memory `Subscription` resource with the given criteria on the Medplum server and calls the given callback when an event notification is triggered by a resource interaction over a WebSocket connection.
696
716
  *
@@ -691,6 +691,26 @@ export declare function useSearchOne<K extends ResourceType>(resourceType: K, qu
691
691
  */
692
692
  export declare function useSearchResources<K extends ResourceType>(resourceType: K, query?: QueryTypes, options?: SearchOptions): [ResourceArray<WithId<ExtractResource<K>>> | undefined, boolean, OperationOutcome | undefined];
693
693
 
694
+ /**
695
+ * Returns a referentially stable wrapper around `callback` that always invokes the most recent
696
+ * value passed in. This allows consumers to pass inline callbacks without invalidating effects
697
+ * that depend on them.
698
+ *
699
+ * The returned function is always defined, even when `callback` is undefined; in that case it
700
+ * is a no-op returning undefined. Do not use the result as a "was a handler provided?" signal.
701
+ *
702
+ * The returned function may not be current during rendering. Synchronous usage in renders
703
+ * should invoke the original function instead of the stabilized wrapper.
704
+ *
705
+ * In React v19.2+, when the callback is only used in effects, this can be replaced with
706
+ * `useEffectEvent`. This package supports embedding in applications using React 18.0, so that
707
+ * technique can not be used in this library yet.
708
+ *
709
+ * @param callback - The callback to stabilize. May be undefined.
710
+ * @returns A stable function that forwards to the latest `callback`.
711
+ */
712
+ export declare function useStabilizedCallback<Args extends unknown[], R>(callback: ((...args: Args) => R) | undefined): (...args: Args) => R | undefined;
713
+
694
714
  /**
695
715
  * Creates an in-memory `Subscription` resource with the given criteria on the Medplum server and calls the given callback when an event notification is triggered by a resource interaction over a WebSocket connection.
696
716
  *
@@ -1,8 +1,8 @@
1
- import{useEffect as fn,useMemo as pn,useState as mn}from"react";import{createContext as dn,useContext as ln}from"react";var X=dn(void 0);function Y(){return ln(X)}function v(){return Y().medplum}function dr(){return Y().navigate}function be(){return Y().profile}import{jsx as hn}from"react/jsx-runtime";var Ee=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function mr(e){let t=e.medplum,n=e.navigate??Rn,[r,o]=mn({profile:t.getProfile(),loading:t.isLoading()});fn(()=>{function s(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of Ee)t.addEventListener(a,s);return()=>{for(let a of Ee)t.removeEventListener(a,s)}},[t]);let i=pn(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return hn(X.Provider,{value:i,children:e.children})}function Rn(e){window.location.assign(e)}import{useMemo as yn}from"react";var ve=new Map,gr=e=>yn(()=>{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=ve.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 ve.set(t,e),e},[e]);import{INVALID_MEDICATION_CART_RESPONSE as Pe,INVALID_MEDICATION_CHECKOUT_RESPONSE as gn,isResource as Z,medicationCartClearRequestToParameters as In,medicationCartRemoveRequestToParameters as Sn,medicationCheckoutRequestToParameters as xn,parametersToMedicationCartManageResponse as Te,parametersToMedicationCheckoutResponse as bn}from"@medplum/core";import{useCallback as j,useRef as En,useState as vn}from"react";var Pn="Cannot checkout while a medication is still being added to the cart";function Er(){let e=v(),[t,n]=vn(!1),r=En(0),o=j(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=j(async u=>{if(r.current>0)throw new Error(Pn);let f=e.fhirUrl("MedicationRequest","$checkout-medications"),m=xn(u),P=await e.post(f,m);if(!Z(P,"Parameters"))throw new Error(gn);return bn(P)},[e]),s=j(async u=>{let f=e.fhirUrl("MedicationRequest","$remove-cart-medication"),m=await e.post(f,Sn(u));if(!Z(m,"Parameters"))throw new Error(Pe);return Te(m)},[e]),a=j(async u=>{let f=e.fhirUrl("MedicationRequest","$clear-cart"),m=await e.post(f,In(u));if(!Z(m,"Parameters"))throw new Error(Pe);return Te(m)},[e]);return{addToCart:o,adding:t,checkout:i,removeFromCart:s,clearCart:a}}import{resolveId as Tn}from"@medplum/core";import{useEffect as Ce,useRef as ee,useState as Cn}from"react";function Mr(e,t,n){let r=v(),{patientId:o,organization:i,onPatientSyncSuccess:s,onIframeSuccess:a,onError:u}=n,f=Tn(i),[m,P]=Cn(void 0),S=ee(s),b=ee(a),h=ee(u);return Ce(()=>{S.current=s,b.current=a,h.current=u},[s,a,u]),Ce(()=>{let c=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:f}),c)return;S.current?.()}let x=await r.executeBot(t,{patientId:o,organizationId:f});if(c)return;x.url&&(P(x.url),b.current?.(x.url))}catch(x){c||h.current?.(x)}})().catch(()=>{}),()=>{c=!0}},[r,e,t,o,f]),m}import{INVALID_MEDICATION_ORDER_RESPONSE as Mn,INVALID_MEDICATION_SEARCH_RESPONSE as Qn,isResource as ne,medicationOrderRequestToParameters as On,medicationSearchParamsToParameters as wn,parametersToMedicationOrderResponse as An}from"@medplum/core";import{useCallback as Me}from"react";function kr(){let e=v(),t=Me(async r=>{let o=e.fhirUrl("Medication","$drug-search"),i=wn(r),s=await e.post(o,i);if(!ne(s,"Bundle"))throw new Error(Qn);return(s.entry??[]).map(a=>a.resource).filter(a=>ne(a,"Medication"))},[e]),n=Me(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),i=On(r),s=await e.post(o,i);if(!ne(s,"Parameters"))throw new Error(Mn);return An(s)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as kn,isResource as _n,medicationOrderSetRequestToParameters as qn,parametersToMedicationOrderSetResponse as Un}from"@medplum/core";import{useCallback as Qe,useEffect as Nn,useRef as Oe,useState as te}from"react";function Lr(e){let t=v(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s}=e,[a,u]=te(void 0),[f,m]=te(!1),[P,S]=te(void 0),b=Oe({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s});b.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s};let h=()=>{let y=b.current;if(!y.patientId)return;let l=!!y.planDefinitionId,g=y.vendorOrderSetId!==void 0&&y.vendorOrderSetId!==null&&y.vendorOrderSetId!=="";return!l&&!g?void 0:{patientId:y.patientId,planDefinitionId:l?y.planDefinitionId:void 0,vendorOrderSetId:g?y.vendorOrderSetId:void 0,appId:y.appId,organization:y.organization}},c=Qe(async y=>{let l=t.fhirUrl("PlanDefinition","$order-set-url"),g=qn(y),p=await t.post(l,g);if(!_n(p,"Parameters"))throw new Error(kn);return Un(p).launchUrl},[t]),d=Oe(0),x=Qe(async()=>{let y=h();if(!y)return;d.current+=1;let l=d.current;m(!0),S(void 0);try{let g=await c(y);return d.current!==l?void 0:(u(g),g)}catch(g){d.current===l&&(S(g),u(void 0));return}finally{d.current===l&&m(!1)}},[c]);return Nn(()=>{let y=!1,l=h();if(!l){d.current+=1,u(void 0),m(!1),S(void 0);return}d.current+=1;let g=d.current;return m(!0),S(void 0),c(l).then(p=>{y||d.current!==g||u(p)}).catch(p=>{y||d.current!==g||(S(p),u(void 0))}).finally(()=>{!y&&d.current===g&&m(!1)}),()=>{y=!0}},[c,n,r,o,i,s]),{url:a,loading:f,error:P,refresh:x}}import{useCallback as Wn,useEffect as Dn,useState as Fn}from"react";import{deepEquals as we}from"@medplum/core";import{useCallback as V,useEffect as re,useRef as q,useState as Ae}from"react";var Ln=3e3;function ke(e,t,n){let r=v(),o=r.getProject(),a=be()&&o?.features?.includes("websocket-subscriptions")?e:void 0,[u,f]=Ae(),[m,P]=Ae(n?.subscriptionProps),S=q(!1),b=q(void 0),h=q(void 0),c=q(void 0),d=q(t);d.current=t;let x=q(n?.onWebSocketOpen);x.current=n?.onWebSocketOpen;let y=q(n?.onWebSocketClose);y.current=n?.onWebSocketClose;let l=q(n?.onSubscriptionConnect);l.current=n?.onSubscriptionConnect;let g=q(n?.onSubscriptionDisconnect);g.current=n?.onSubscriptionDisconnect;let p=q(n?.onError);p.current=n?.onError,re(()=>{we(n?.subscriptionProps,m)||P(n?.subscriptionProps)},[m,n]),re(()=>{b.current&&(clearTimeout(b.current),b.current=void 0);let O=!1;return(h.current!==a||!we(c.current,m))&&(O=!0),O&&h.current&&r.unsubscribeFromCriteria(h.current,c.current),h.current=a,c.current=m,O&&a?f(r.subscribeToCriteria(a,m)):a||f(void 0),()=>{b.current=setTimeout(()=>{a&&r.unsubscribeFromCriteria(a,m)},Ln)}},[r,a,m]);let I=V(O=>{d.current?.(O.payload)},[]),R=V(()=>{x.current?.()},[]),C=V(()=>{y.current?.()},[]),M=V(O=>{l.current?.(O.payload.subscriptionId)},[]),A=V(O=>{g.current?.(O.payload.subscriptionId)},[]),T=V(O=>{p.current?.(O.payload)},[]);re(()=>u?(S.current||(u.addEventListener("message",I),u.addEventListener("open",R),u.addEventListener("close",C),u.addEventListener("connect",M),u.addEventListener("disconnect",A),u.addEventListener("error",T),S.current=!0),()=>{S.current=!1,u.removeEventListener("message",I),u.removeEventListener("open",R),u.removeEventListener("close",C),u.removeEventListener("connect",M),u.removeEventListener("disconnect",A),u.removeEventListener("error",T)}):()=>{},[u,I,R,C,M,A,T])}function jr(e){let t=v(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[i,s]=Fn(0),a=Wn(u=>{t.search(n,r,{cache:u}).then(f=>s(f.total)).catch(console.error)},[t,n,r]);return Dn(()=>{a("default")},[a]),ke(o,()=>{a("reload")}),i}import{resolveId as Vn}from"@medplum/core";import{useEffect as Kn,useMemo as _e,useState as oe}from"react";function qe(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(qe).join(","):"";return`${t.key}:[${n}]`}).join("|")}function Yr(e,t){let n=v(),[r,o]=oe([]),[i,s]=oe(!0),[a,u]=oe(),f=$n(t),m=_e(()=>t,[f]),P=_e(()=>Vn(e),[e]);return Kn(()=>{if(!P)return;let S=!1,b=`Patient/${P}`,h={_count:100,_sort:"-_lastUpdated"},c=[],d=new Map,x=[];for(let l of m){let g=[];if(l.searches)for(let p of l.searches){let I=qe(p),R=d.get(I);R===void 0&&(R=c.length,d.set(I,R),c.push(p)),g.push({searchIdx:R,resultKey:p.key})}x.push(g)}if(c.length===0){o(m.map(()=>({}))),s(!1);return}let y=c.map(l=>{let g=l.patientParam??"subject",p={[g]:b};if(l.query){if(typeof l.query=="string")return n.searchResources(l.resourceType,`${g}=${b}&${l.query}&_count=100&_sort=-_lastUpdated`);if(l.query instanceof URLSearchParams)l.query.forEach((I,R)=>{p[R]=I});else if(Array.isArray(l.query))for(let[I,R]of l.query)p[I]=R;else for(let[I,R]of Object.entries(l.query))R!==void 0&&(p[I]=R)}return n.searchResources(l.resourceType,{...h,...p})});return s(!0),u(void 0),Promise.allSettled(y).then(l=>{if(S)return;let g=x.map(I=>{let R={};for(let{searchIdx:C,resultKey:M}of I){let A=l[C];R[M]=A.status==="fulfilled"?A.value:[]}return R});o(g),s(!1);let p=l.filter(I=>I.status==="rejected");if(p.length>0){console.error("Some patient summary searches failed:",p.map(R=>R.reason));let I=p[0].reason;u(I instanceof Error?I:new Error(String(I)))}}).catch(l=>{S||(u(l instanceof Error?l:new Error(String(l))),s(!1))}),()=>{S=!0}},[n,P,m]),{sectionData:r,loading:i,error:a}}import{isAddPharmacyResponse as zn,isOrganizationArray as Bn,resolveId as Ue}from"@medplum/core";import{useCallback as Ne}from"react";function ro(e,t){let n=v(),r=Ne(async i=>{let{organization:s,...a}=i,u=Ue(s),f=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!Bn(f))throw new Error("Invalid response from pharmacy search");return f},[n,e]),o=Ne(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary,organizationId:Ue(i.organization)});if(!zn(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:r,addToFavorites:o}}import{useEffect as jn,useRef as Jn}from"react";function so(e){let t=Jn(void 0);return jn(()=>{t.current=e}),t.current}import{getExtension as vt}from"@medplum/core";import{useReducer as Pt,useRef as Tt}from"react";import{deepEquals as Gn,isReference as We,isResource as Hn,normalizeOperationOutcome as Xn}from"@medplum/core";import{useCallback as Yn,useEffect as Zn,useState as et}from"react";function ie(e,t){let n=v(),[r,o]=et(()=>Le(n,e)),i=Yn(s=>{Gn(s,r)||o(s)},[r]);return Zn(()=>{let s=!0,a=Le(n,e);return!a&&We(e)?n.readReference(e).then(u=>{s&&i(u)}).catch(u=>{s&&(i(void 0),t&&t(Xn(u)))}):i(a),(()=>s=!1)},[n,e,i,t]),r}function Le(e,t){if(t){if(Hn(t))return t;if(We(t))return e.getCachedReference(t)}}import{EMPTY as ue,HTTP_HL7_ORG as U,PropertyType as k,append as De,capitalize as Fe,deepClone as nt,deepEquals as Ve,evalFhirPathTyped as ce,getExtension as D,getReferenceString as tt,getTypedPropertyValueWithoutSchema as J,normalizeErrorString as rt,splitN as ot,toJsBoolean as it,toTypedValue as Ke,typedValueToString as st}from"@medplum/core";var Q={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"},$e=`${U}/fhir/StructureDefinition/questionnaire-itemControl`,at=`${U}/fhir/StructureDefinition/questionnaire-referenceFilter`,se=`${U}/fhir/StructureDefinition/questionnaire-referenceResource`,ut=`${U}/fhir/StructureDefinition/questionnaire-validationError`,ct=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,dt=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,mo=`${U}/fhir/StructureDefinition/questionnaire-signatureRequired`,G=`${U}/fhir/StructureDefinition/questionnaireresponse-signature`,lt=`${U}/fhir/StructureDefinition/questionnaire-hidden`,ft=`${U}/fhir/StructureDefinition/questionnaire-optionExclusive`;function Ro(e){return e.type==="choice"||e.type==="open-choice"}function de(e,t){return{...t,item:ze(e.item,t.item,t)}}function ze(e,t,n){if(!t)return t;let r=[];for(let o of t){let i=e?.find(s=>s.linkId===o.linkId);i&&!pt(i,n)||(i?.item&&o.item?r.push({...o,item:ze(i.item,o.item,n)}):r.push(o))}return r}function pt(e,t){if(D(e,lt)?.valueBoolean===!0)return!1;let r=mt(e,t);return r!==void 0?r:Rt(e,t)}function mt(e,t){let n=D(e,ct);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=Ke(t),i=ce(r,[o],{"%resource":o});return it(i)}}}function Rt(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let r of e.enableWhen){let o=je(t?.item,r.question);if(r.operator==="exists"&&!r.answerBoolean&&!o?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=xt(r,o,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function le(e,t,n=t.item){for(let r of e){let o=n?.find(i=>i.linkId===r.linkId);o&&(ht(t,r,o),r.item&&o.item&&le(r.item,t,o.item))}}function ht(e,t,n){try{let r=It(t,e);if(!r)return;let o=gt(t,r);if(!o)return;n.answer=[o]}catch(r){n.extension=[{url:ut,valueString:`Expression evaluation failed: ${rt(r)}`}]}}var yt={[Q.boolean]:[k.boolean],[Q.date]:[k.date],[Q.dateTime]:[k.dateTime],[Q.time]:[k.time],[Q.url]:[k.string,k.uri,k.url],[Q.attachment]:[k.Attachment],[Q.reference]:[k.Reference],[Q.quantity]:[k.Quantity],[Q.decimal]:[k.decimal,k.integer],[Q.integer]:[k.decimal,k.integer]};function gt(e,t){if(!e.type)return;if(e.type===Q.choice||e.type===Q.openChoice)return{[`value${Fe(t.type)}`]:t.value};if(e.type===Q.string||e.type===Q.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(yt[e.type]?.includes(t.type))return{[`value${Fe(e.type)}`]:t.value}}function It(e,t){if(!t)return;let n=D(e,dt);if(n){let r=n.valueExpression?.expression;if(r){let o=Ke(t),i=ce(r,[o],{"%resource":o});return i.length!==0?i[0]:void 0}}}function ho(e,t,n){let r=[];for(let o of e){let i=n.answerOption?.find(s=>st(ae(s))===o);if(i){let s=ae(i);s&&r.push({[t]:s.value})}}return r}function Be(e,t,n){let r=[];for(let a of e.answerOption??ue)if(D(a,ft)?.valueBoolean===!0){let u=ae(a);u?.value!==void 0&&r.push(u)}if(r.length===0)return n;let o=a=>{let u=He(a);return!!u&&r.some(f=>Ve(f,u))},i=n.filter(a=>!t?.some(u=>Ve(u,a))),s=i.find(o);return s?[s]:i.some(a=>!o(a))?n.filter(a=>!o(a)):n}function je(e,t){for(let n of e??ue){if(n.linkId===t)return n.answer;if(n.item){let r=je(n.item,t);if(r)return r}}}function St(e,t,n){if(n==="exists")return!!e===t.value;if(e){let r=n==="="||n==="!="?n?.replace("=","~"):n,[{value:o}]=ce(`%actualAnswer ${r} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return o}else return!1}function xt(e,t,n){let r=t||[],o=Et(e),i=!1,s=!0;for(let a of r){let u=He(a),{operator:f}=e;if(St(u,o,f)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function yo(e){let t=D(e,se);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function go(e,t){let n=nt(e),r=D(n,se);return!t||t.length===0?(r&&(n.extension=n.extension?.filter(o=>o!==r)),n):(r||(n.extension??=[],r={url:se},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 Io(e,t,n){let r=D(e,at);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,f]=ot(a,"=",2);i[u]=f}return i}function fe(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??tt(e),item:pe(e.item,t?.item),status:"in-progress"}}function pe(e,t){let n;for(let r of e??ue){if(r.type===Q.display)continue;let o=t?.filter(i=>i.linkId===r.linkId);if(o?.length)for(let i of o)i.id=i.id??Je(),i.text=i.text??r.text,i.item=pe(r.item,i.item),i.answer=Ge(r,i),n=De(n,i);else n=De(n,me(r))}return n}function me(e){return{id:Je(),linkId:e.linkId,text:e.text,item:pe(e.item,void 0),answer:Ge(e)}}var bt=1;function Je(){return"id-"+bt++}function Ge(e,t){if(!(e.type===Q.display||e.type===Q.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 So(e){return J({type:"QuestionnaireItemInitial",value:e},"value")}function ae(e){return J({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Et(e){return J({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function He(e){return J({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function To(e){let t=ie(e.questionnaire),n=ie(e.defaultValue),[,r]=Pt(h=>h+1,0),o=Tt({activePage:0});if(!o.current.questionnaire&&t&&(o.current.questionnaire=t,o.current.pages=e.disablePagination?void 0:Ct(t)),t&&e.defaultValue&&n&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=fe(t,n),b()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=fe(t),b()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function i(h,c){let d=o.current.questionnaireResponse;for(let x of h)d=d?.item?.find(y=>x.id?y.id===x.id:y.linkId===x.linkId);return c&&(d=d?.item?.find(x=>x.linkId===c.linkId)),d}function s(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(h,c){let d=i(h);d&&(d.item??=[],d.item.push(me(c)),b())}function f(h,c){let d=i(h,c);d&&(d.answer??=[],d.answer.push({}),b())}function m(h,c,d){let x=i(h,c);x&&(x.answer=Be(c,x.answer,d),b())}function P(h){let c=o.current.questionnaireResponse;c&&(h?(c.extension=c.extension??[],c.extension=c.extension.filter(d=>d.url!==G),c.extension.push({url:G,valueSignature:h})):c.extension=c.extension?.filter(d=>d.url!==G),b())}function S(){let h=o.current.questionnaire;if(h?.item){let c=o.current.questionnaireResponse;le(h.item,c)}}function b(){let h=o.current.questionnaireResponse,c=o.current.questionnaire;!h||!c||(S(),r(),e.onChange?.(de(c,h)))}return{loading:!1,pagination:!!o.current.pages,questionnaire:o.current.questionnaire,questionnaireResponse:de(o.current.questionnaire,o.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:o.current.activePage,pages:o.current.pages,items:Mt(o.current.questionnaire,o.current.pages,o.current.activePage),responseItems:Qt(o.current.questionnaireResponse,o.current.pages,o.current.activePage),onNextPage:s,onPrevPage:a,onAddGroup:u,onAddAnswer:f,onChangeAnswer:m,onChangeSignature:P}}function Ct(e){if(!(!e?.item||vt(e?.item?.[0],$e)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,r)=>({linkId:n.linkId,title:n.text??`Page ${r+1}`,group:n}))}function Mt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function Qt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{deepEquals as Ot,formatSearchQuery as wt}from"@medplum/core";import{useCallback as At,useEffect as Re,useRef as he,useState as $}from"react";async function kt(e,t){let n=await t.search(e.resourceType,wt({...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 wo(e){let{search:t,selectedId:n,loadItems:r,reloadKey:o}=e,i=v(),[s,a]=$(t),[u,f]=$([]),[m,P]=$(),[S,b]=$(!0),[h,c]=$(),d=he(e),x=he(0),y=he(0),l=s.resourceType,g=n!==void 0&&h?.id===n?h.value:void 0;Ot(t,s)||(a(t),b(!0));let p=At(async()=>{let I=++x.current;try{let R=r?await r(s,i):await kt(s,i);if(I!==x.current)return;f(R.items),P(R.total),d.current.onLoad?.(R.items,R.total)}catch(R){I===x.current&&(d.current.onError??console.error)(R)}finally{I===x.current&&b(!1)}},[s,r,i]);return Re(()=>{d.current=e}),Re(()=>{p().catch(console.error)},[p,o]),Re(()=>{let I=++y.current;if(!n)return;let R=async()=>{let M=d.current.resolveSelected;if(M)return M(n,u,i);let A=u.find(T=>T.id===n);return A!==void 0?A:await i.readResource(l,n)};(async()=>{try{let M=await R();I===y.current&&c({id:n,value:M})}catch(M){I===y.current&&(c({id:n,value:void 0}),(d.current.onError??console.error)(M))}})().catch(console.error)},[n,u,i,l]),{items:u,total:m,loading:S,selected:g,search:s,refresh:p}}import{useEffect as Xe,useRef as _t}from"react";function qo(e,t){let n=v(),r=_t(t);Xe(()=>{r.current=t});let o=Array.isArray(e)?e.join(","):e;Xe(()=>{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])}import{allOk as Nt,normalizeOperationOutcome as Lt}from"@medplum/core";import{useEffect as Wt,useMemo as Dt,useState as ge}from"react";import{useCallback as qt,useEffect as Ye,useRef as ye,useState as Ut}from"react";function Ze(e,t,n={leading:!1}){let[r,o]=Ut(e),i=ye(!1),s=ye(void 0),a=ye(!1),u=qt(()=>window.clearTimeout(s.current),[]);return Ye(()=>{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]),Ye(()=>(i.current=!0,u),[u]),[r,u]}var Ft=250;function Ko(e,t,n){return Ie("search",e,t,n)}function $o(e,t,n){return Ie("searchOne",e,t,n)}function zo(e,t,n){return Ie("searchResources",e,t,n)}function Ie(e,t,n,r){let o=v(),[i,s]=ge(!1),[a,u]=ge(),[f,m]=ge(),P=o.fhirSearchUrl(t,n).toString(),S=Dt(()=>({resourceType:t,query:n}),[P]),b=r?.enabled??!0,h=r?.debounceMs??Ft,[c]=Ze(S,h,{leading:!0});return Wt(()=>{if(!b)return()=>{};s(!0);let d=!0;return o[e](c.resourceType,c.query).then(x=>{d&&(s(!1),u(x),m(Nt))}).catch(x=>{d&&(s(!1),u(void 0),m(Lt(x)))}),()=>{d=!1}},[o,e,c,b]),[a,i,f]}import{OperationOutcomeError as Vt,isResource as Kt,parametersToOrderSetSyncResponse as $t,resolveId as zt}from"@medplum/core";import{useCallback as Bt}from"react";function Ho(){let e=v();return Bt(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:zt(n)});return Kt(r,"Parameters")?$t(r):void 0}catch(r){if(r instanceof Vt&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}import{getReferenceString as jt}from"@medplum/core";import{useCallback as Jt,useEffect as en,useRef as Gt,useState as K}from"react";function ni({query:e,threadId:t}){let n=v(),[r,o]=K(!0),[i,s]=K(e),[a,u]=K([]),[f,m]=K(void 0),[P,S]=K(null),[b,h]=K(void 0),c=Gt(0);e!==i&&(s(e),o(!0));let d=Jt(async()=>{let l=++c.current;try{let g=new URLSearchParams(i);g.append("identifier:not","http://medplum.com/ai-message|"),g.append("part-of:missing","true"),g.append("_has:Communication:part-of:_id:not","null");let p=await n.search("Communication",g.toString(),{cache:"no-cache"});if(l!==c.current)return;let I=p.entry?.map(T=>T.resource).filter(T=>T!==void 0)||[];if(p.total!==void 0&&h(p.total),I.length===0){u([]);return}let C=`
1
+ import{useEffect as dn,useMemo as ln,useState as pn}from"react";import{createContext as un,useContext as cn}from"react";var Y=un(void 0);function Z(){return cn(Y)}function v(){return Z().medplum}function pr(){return Z().navigate}function xe(){return Z().profile}import{jsx as mn}from"react/jsx-runtime";var be=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function hr(e){let t=e.medplum,n=e.navigate??fn,[r,o]=pn({profile:t.getProfile(),loading:t.isLoading()});dn(()=>{function s(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of be)t.addEventListener(a,s);return()=>{for(let a of be)t.removeEventListener(a,s)}},[t]);let i=ln(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return mn(Y.Provider,{value:i,children:e.children})}function fn(e){window.location.assign(e)}import{useMemo as Rn}from"react";var Ee=new Map,Sr=e=>Rn(()=>{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=Ee.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 Ee.set(t,e),e},[e]);import{INVALID_MEDICATION_CART_RESPONSE as ve,INVALID_MEDICATION_CHECKOUT_RESPONSE as hn,isResource as ee,medicationCartClearRequestToParameters as yn,medicationCartRemoveRequestToParameters as gn,medicationCheckoutRequestToParameters as In,parametersToMedicationCartManageResponse as Te,parametersToMedicationCheckoutResponse as Sn}from"@medplum/core";import{useCallback as j,useRef as xn,useState as bn}from"react";var En="Cannot checkout while a medication is still being added to the cart";function Tr(){let e=v(),[t,n]=bn(!1),r=xn(0),o=j(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=j(async u=>{if(r.current>0)throw new Error(En);let p=e.fhirUrl("MedicationRequest","$checkout-medications"),f=In(u),T=await e.post(p,f);if(!ee(T,"Parameters"))throw new Error(hn);return Sn(T)},[e]),s=j(async u=>{let p=e.fhirUrl("MedicationRequest","$remove-cart-medication"),f=await e.post(p,gn(u));if(!ee(f,"Parameters"))throw new Error(ve);return Te(f)},[e]),a=j(async u=>{let p=e.fhirUrl("MedicationRequest","$clear-cart"),f=await e.post(p,yn(u));if(!ee(f,"Parameters"))throw new Error(ve);return Te(f)},[e]);return{addToCart:o,adding:t,checkout:i,removeFromCart:s,clearCart:a}}import{resolveId as Cn}from"@medplum/core";import{useEffect as Mn,useState as Qn}from"react";import{useCallback as vn,useInsertionEffect as Tn,useRef as Pn}from"react";function A(e){let t=Pn(e);return Tn(()=>{t.current=e},[e]),vn((...n)=>t.current?.(...n),[])}function kr(e,t,n){let r=v(),{patientId:o,organization:i}=n,s=Cn(i),[a,u]=Qn(void 0),p=A(n.onPatientSyncSuccess),f=A(n.onIframeSuccess),T=A(n.onError);return Mn(()=>{let y=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:s}),y)return;p()}let R=await r.executeBot(t,{patientId:o,organizationId:s});if(y)return;R.url&&(u(R.url),f(R.url))}catch(R){y||T(R)}})().catch(()=>{}),()=>{y=!0}},[r,e,t,o,s,p,f,T]),a}import{INVALID_MEDICATION_ORDER_RESPONSE as On,INVALID_MEDICATION_SEARCH_RESPONSE as wn,isResource as ne,medicationOrderRequestToParameters as An,medicationSearchParamsToParameters as kn,parametersToMedicationOrderResponse as _n}from"@medplum/core";import{useCallback as Pe}from"react";function Lr(){let e=v(),t=Pe(async r=>{let o=e.fhirUrl("Medication","$drug-search"),i=kn(r),s=await e.post(o,i);if(!ne(s,"Bundle"))throw new Error(wn);return(s.entry??[]).map(a=>a.resource).filter(a=>ne(a,"Medication"))},[e]),n=Pe(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),i=An(r),s=await e.post(o,i);if(!ne(s,"Parameters"))throw new Error(On);return _n(s)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as qn,isResource as Un,medicationOrderSetRequestToParameters as Nn,parametersToMedicationOrderSetResponse as Ln}from"@medplum/core";import{useCallback as Ce,useEffect as Wn,useRef as Me,useState as te}from"react";function zr(e){let t=v(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s}=e,[a,u]=te(void 0),[p,f]=te(!1),[T,y]=te(void 0),b=Me({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s});b.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s};let R=()=>{let g=b.current;if(!g.patientId)return;let l=!!g.planDefinitionId,I=g.vendorOrderSetId!==void 0&&g.vendorOrderSetId!==null&&g.vendorOrderSetId!=="";return!l&&!I?void 0:{patientId:g.patientId,planDefinitionId:l?g.planDefinitionId:void 0,vendorOrderSetId:I?g.vendorOrderSetId:void 0,appId:g.appId,organization:g.organization}},d=Ce(async g=>{let l=t.fhirUrl("PlanDefinition","$order-set-url"),I=Nn(g),m=await t.post(l,I);if(!Un(m,"Parameters"))throw new Error(qn);return Ln(m).launchUrl},[t]),c=Me(0),E=Ce(async()=>{let g=R();if(!g)return;c.current+=1;let l=c.current;f(!0),y(void 0);try{let I=await d(g);return c.current!==l?void 0:(u(I),I)}catch(I){c.current===l&&(y(I),u(void 0));return}finally{c.current===l&&f(!1)}},[d]);return Wn(()=>{let g=!1,l=R();if(!l){c.current+=1,u(void 0),f(!1),y(void 0);return}c.current+=1;let I=c.current;return f(!0),y(void 0),d(l).then(m=>{g||c.current!==I||u(m)}).catch(m=>{g||c.current!==I||(y(m),u(void 0))}).finally(()=>{!g&&c.current===I&&f(!1)}),()=>{g=!0}},[d,n,r,o,i,s]),{url:a,loading:p,error:T,refresh:E}}import{useCallback as Fn,useEffect as Vn,useState as zn}from"react";import{deepEquals as Qe}from"@medplum/core";import{useCallback as V,useEffect as re,useRef as J,useState as Oe}from"react";var Dn=3e3;function we(e,t,n){let r=v(),o=r.getProject(),a=xe()&&o?.features?.includes("websocket-subscriptions")?e:void 0,[u,p]=Oe(),[f,T]=Oe(n?.subscriptionProps),y=J(!1),b=J(void 0),R=J(void 0),d=J(void 0);re(()=>{Qe(n?.subscriptionProps,f)||T(n?.subscriptionProps)},[f,n]),re(()=>{b.current&&(clearTimeout(b.current),b.current=void 0);let M=!1;return(R.current!==a||!Qe(d.current,f))&&(M=!0),M&&R.current&&r.unsubscribeFromCriteria(R.current,d.current),R.current=a,d.current=f,M&&a?p(r.subscribeToCriteria(a,f)):a||p(void 0),()=>{b.current=setTimeout(()=>{a&&r.unsubscribeFromCriteria(a,f)},Dn)}},[r,a,f]);let c=A(t),E=A(n?.onWebSocketOpen),g=A(n?.onWebSocketClose),l=A(n?.onSubscriptionConnect),I=A(n?.onSubscriptionDisconnect),m=A(n?.onError),S=V(M=>c(M.payload),[c]),h=V(M=>E(),[E]),C=V(M=>g(),[g]),Q=V(M=>l(M.payload.subscriptionId),[l]),k=V(M=>I(M.payload.subscriptionId),[I]),P=V(M=>m(M.payload),[m]);re(()=>u?(y.current||(u.addEventListener("message",S),u.addEventListener("open",h),u.addEventListener("close",C),u.addEventListener("connect",Q),u.addEventListener("disconnect",k),u.addEventListener("error",P),y.current=!0),()=>{y.current=!1,u.removeEventListener("message",S),u.removeEventListener("open",h),u.removeEventListener("close",C),u.removeEventListener("connect",Q),u.removeEventListener("disconnect",k),u.removeEventListener("error",P)}):()=>{},[u,S,h,C,Q,k,P])}function Zr(e){let t=v(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[i,s]=zn(0),a=Fn(u=>{t.search(n,r,{cache:u}).then(p=>s(p.total)).catch(console.error)},[t,n,r]);return Vn(()=>{a("default")},[a]),we(o,()=>{a("reload")}),i}import{resolveId as Kn}from"@medplum/core";import{useEffect as $n,useMemo as Ae,useState as oe}from"react";function ke(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 Bn(e){return e.map(t=>{let n=t.searches?t.searches.map(ke).join(","):"";return`${t.key}:[${n}]`}).join("|")}function oo(e,t){let n=v(),[r,o]=oe([]),[i,s]=oe(!0),[a,u]=oe(),p=Bn(t),f=Ae(()=>t,[p]),T=Ae(()=>Kn(e),[e]);return $n(()=>{if(!T)return;let y=!1,b=`Patient/${T}`,R={_count:100,_sort:"-_lastUpdated"},d=[],c=new Map,E=[];for(let l of f){let I=[];if(l.searches)for(let m of l.searches){let S=ke(m),h=c.get(S);h===void 0&&(h=d.length,c.set(S,h),d.push(m)),I.push({searchIdx:h,resultKey:m.key})}E.push(I)}if(d.length===0){o(f.map(()=>({}))),s(!1);return}let g=d.map(l=>{let I=l.patientParam??"subject",m={[I]:b};if(l.query){if(typeof l.query=="string")return n.searchResources(l.resourceType,`${I}=${b}&${l.query}&_count=100&_sort=-_lastUpdated`);if(l.query instanceof URLSearchParams)l.query.forEach((S,h)=>{m[h]=S});else if(Array.isArray(l.query))for(let[S,h]of l.query)m[S]=h;else for(let[S,h]of Object.entries(l.query))h!==void 0&&(m[S]=h)}return n.searchResources(l.resourceType,{...R,...m})});return s(!0),u(void 0),Promise.allSettled(g).then(l=>{if(y)return;let I=E.map(S=>{let h={};for(let{searchIdx:C,resultKey:Q}of S){let k=l[C];h[Q]=k.status==="fulfilled"?k.value:[]}return h});o(I),s(!1);let m=l.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(l=>{y||(u(l instanceof Error?l:new Error(String(l))),s(!1))}),()=>{y=!0}},[n,T,f]),{sectionData:r,loading:i,error:a}}import{isAddPharmacyResponse as jn,isOrganizationArray as Jn,resolveId as _e}from"@medplum/core";import{useCallback as qe}from"react";function co(e,t){let n=v(),r=qe(async i=>{let{organization:s,...a}=i,u=_e(s),p=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!Jn(p))throw new Error("Invalid response from pharmacy search");return p},[n,e]),o=qe(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary,organizationId:_e(i.organization)});if(!jn(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:r,addToFavorites:o}}import{useEffect as Gn,useRef as Hn}from"react";function fo(e){let t=Hn(void 0);return Gn(()=>{t.current=e}),t.current}import{getExtension as Pt}from"@medplum/core";import{useReducer as Ct,useRef as Mt}from"react";import{deepEquals as Xn,isReference as Ne,isResource as Yn,normalizeOperationOutcome as Zn}from"@medplum/core";import{useCallback as et,useEffect as nt,useState as tt}from"react";function ie(e,t){let n=v(),[r,o]=tt(()=>Ue(n,e)),i=et(s=>{Xn(s,r)||o(s)},[r]);return nt(()=>{let s=!0,a=Ue(n,e);return!a&&Ne(e)?n.readReference(e).then(u=>{s&&i(u)}).catch(u=>{s&&(i(void 0),t&&t(Zn(u)))}):i(a),(()=>s=!1)},[n,e,i,t]),r}function Ue(e,t){if(t){if(Yn(t))return t;if(Ne(t))return e.getCachedReference(t)}}import{EMPTY as ue,HTTP_HL7_ORG as U,PropertyType as _,append as Le,capitalize as We,deepClone as rt,deepEquals as De,evalFhirPathTyped as ce,getExtension as D,getReferenceString as ot,getTypedPropertyValueWithoutSchema as G,normalizeErrorString as it,splitN as st,toJsBoolean as at,toTypedValue as Fe,typedValueToString as ut}from"@medplum/core";var O={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"},Ve=`${U}/fhir/StructureDefinition/questionnaire-itemControl`,ct=`${U}/fhir/StructureDefinition/questionnaire-referenceFilter`,se=`${U}/fhir/StructureDefinition/questionnaire-referenceResource`,dt=`${U}/fhir/StructureDefinition/questionnaire-validationError`,lt=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,pt=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,So=`${U}/fhir/StructureDefinition/questionnaire-signatureRequired`,H=`${U}/fhir/StructureDefinition/questionnaireresponse-signature`,ft=`${U}/fhir/StructureDefinition/questionnaire-hidden`,mt=`${U}/fhir/StructureDefinition/questionnaire-optionExclusive`;function xo(e){return e.type==="choice"||e.type==="open-choice"}function de(e,t){return{...t,item:ze(e.item,t.item,t)}}function ze(e,t,n){if(!t)return t;let r=[];for(let o of t){let i=e?.find(s=>s.linkId===o.linkId);i&&!Rt(i,n)||(i?.item&&o.item?r.push({...o,item:ze(i.item,o.item,n)}):r.push(o))}return r}function Rt(e,t){if(D(e,ft)?.valueBoolean===!0)return!1;let r=ht(e,t);return r!==void 0?r:yt(e,t)}function ht(e,t){let n=D(e,lt);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=Fe(t),i=ce(r,[o],{"%resource":o});return at(i)}}}function yt(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let r of e.enableWhen){let o=$e(t?.item,r.question);if(r.operator==="exists"&&!r.answerBoolean&&!o?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=Et(r,o,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function le(e,t,n=t.item){for(let r of e){let o=n?.find(i=>i.linkId===r.linkId);o&&(gt(t,r,o),r.item&&o.item&&le(r.item,t,o.item))}}function gt(e,t,n){try{let r=xt(t,e);if(!r)return;let o=St(t,r);if(!o)return;n.answer=[o]}catch(r){n.extension=[{url:dt,valueString:`Expression evaluation failed: ${it(r)}`}]}}var It={[O.boolean]:[_.boolean],[O.date]:[_.date],[O.dateTime]:[_.dateTime],[O.time]:[_.time],[O.url]:[_.string,_.uri,_.url],[O.attachment]:[_.Attachment],[O.reference]:[_.Reference],[O.quantity]:[_.Quantity],[O.decimal]:[_.decimal,_.integer],[O.integer]:[_.decimal,_.integer]};function St(e,t){if(!e.type)return;if(e.type===O.choice||e.type===O.openChoice)return{[`value${We(t.type)}`]:t.value};if(e.type===O.string||e.type===O.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(It[e.type]?.includes(t.type))return{[`value${We(e.type)}`]:t.value}}function xt(e,t){if(!t)return;let n=D(e,pt);if(n){let r=n.valueExpression?.expression;if(r){let o=Fe(t),i=ce(r,[o],{"%resource":o});return i.length!==0?i[0]:void 0}}}function bo(e,t,n){let r=[];for(let o of e){let i=n.answerOption?.find(s=>ut(ae(s))===o);if(i){let s=ae(i);s&&r.push({[t]:s.value})}}return r}function Ke(e,t,n){let r=[];for(let a of e.answerOption??ue)if(D(a,mt)?.valueBoolean===!0){let u=ae(a);u?.value!==void 0&&r.push(u)}if(r.length===0)return n;let o=a=>{let u=Je(a);return!!u&&r.some(p=>De(p,u))},i=n.filter(a=>!t?.some(u=>De(u,a))),s=i.find(o);return s?[s]:i.some(a=>!o(a))?n.filter(a=>!o(a)):n}function $e(e,t){for(let n of e??ue){if(n.linkId===t)return n.answer;if(n.item){let r=$e(n.item,t);if(r)return r}}}function bt(e,t,n){if(n==="exists")return!!e===t.value;if(e){let r=n==="="||n==="!="?n?.replace("=","~"):n,[{value:o}]=ce(`%actualAnswer ${r} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return o}else return!1}function Et(e,t,n){let r=t||[],o=Tt(e),i=!1,s=!0;for(let a of r){let u=Je(a),{operator:p}=e;if(bt(u,o,p)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function Eo(e){let t=D(e,se);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function vo(e,t){let n=rt(e),r=D(n,se);return!t||t.length===0?(r&&(n.extension=n.extension?.filter(o=>o!==r)),n):(r||(n.extension??=[],r={url:se},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 To(e,t,n){let r=D(e,ct);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]=st(a,"=",2);i[u]=p}return i}function pe(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??ot(e),item:fe(e.item,t?.item),status:"in-progress"}}function fe(e,t){let n;for(let r of e??ue){if(r.type===O.display)continue;let o=t?.filter(i=>i.linkId===r.linkId);if(o?.length)for(let i of o)i.id=i.id??Be(),i.text=i.text??r.text,i.item=fe(r.item,i.item),i.answer=je(r,i),n=Le(n,i);else n=Le(n,me(r))}return n}function me(e){return{id:Be(),linkId:e.linkId,text:e.text,item:fe(e.item,void 0),answer:je(e)}}var vt=1;function Be(){return"id-"+vt++}function je(e,t){if(!(e.type===O.display||e.type===O.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 Po(e){return G({type:"QuestionnaireItemInitial",value:e},"value")}function ae(e){return G({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Tt(e){return G({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Je(e){return G({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Ao(e){let t=ie(e.questionnaire),n=ie(e.defaultValue),[,r]=Ct(R=>R+1,0),o=Mt({activePage:0});if(!o.current.questionnaire&&t&&(o.current.questionnaire=t,o.current.pages=e.disablePagination?void 0:Qt(t)),t&&e.defaultValue&&n&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=pe(t,n),b()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=pe(t),b()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function i(R,d){let c=o.current.questionnaireResponse;for(let E of R)c=c?.item?.find(g=>E.id?g.id===E.id:g.linkId===E.linkId);return d&&(c=c?.item?.find(E=>E.linkId===d.linkId)),c}function s(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(R,d){let c=i(R);c&&(c.item??=[],c.item.push(me(d)),b())}function p(R,d){let c=i(R,d);c&&(c.answer??=[],c.answer.push({}),b())}function f(R,d,c){let E=i(R,d);E&&(E.answer=Ke(d,E.answer,c),b())}function T(R){let d=o.current.questionnaireResponse;d&&(R?(d.extension=d.extension??[],d.extension=d.extension.filter(c=>c.url!==H),d.extension.push({url:H,valueSignature:R})):d.extension=d.extension?.filter(c=>c.url!==H),b())}function y(){let R=o.current.questionnaire;if(R?.item){let d=o.current.questionnaireResponse;le(R.item,d)}}function b(){let R=o.current.questionnaireResponse,d=o.current.questionnaire;!R||!d||(y(),r(),e.onChange?.(de(d,R)))}return{loading:!1,pagination:!!o.current.pages,questionnaire:o.current.questionnaire,questionnaireResponse:de(o.current.questionnaire,o.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:o.current.activePage,pages:o.current.pages,items:Ot(o.current.questionnaire,o.current.pages,o.current.activePage),responseItems:wt(o.current.questionnaireResponse,o.current.pages,o.current.activePage),onNextPage:s,onPrevPage:a,onAddGroup:u,onAddAnswer:p,onChangeAnswer:f,onChangeSignature:T}}function Qt(e){if(!(!e?.item||Pt(e?.item?.[0],Ve)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,r)=>({linkId:n.linkId,title:n.text??`Page ${r+1}`,group:n}))}function Ot(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function wt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{deepEquals as At,formatSearchQuery as kt}from"@medplum/core";import{useCallback as _t,useEffect as Re,useRef as he,useState as K}from"react";async function qt(e,t){let n=await t.search(e.resourceType,kt({...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 No(e){let{search:t,selectedId:n,loadItems:r,reloadKey:o}=e,i=v(),[s,a]=K(t),[u,p]=K([]),[f,T]=K(),[y,b]=K(!0),[R,d]=K(),c=he(e),E=he(0),g=he(0),l=s.resourceType,I=n!==void 0&&R?.id===n?R.value:void 0;At(t,s)||(a(t),b(!0));let m=_t(async()=>{let S=++E.current;try{let h=r?await r(s,i):await qt(s,i);if(S!==E.current)return;p(h.items),T(h.total),c.current.onLoad?.(h.items,h.total)}catch(h){S===E.current&&(c.current.onError??console.error)(h)}finally{S===E.current&&b(!1)}},[s,r,i]);return Re(()=>{c.current=e}),Re(()=>{m().catch(console.error)},[m,o]),Re(()=>{let S=++g.current;if(!n)return;let h=async()=>{let Q=c.current.resolveSelected;if(Q)return Q(n,u,i);let k=u.find(P=>P.id===n);return k!==void 0?k:await i.readResource(l,n)};(async()=>{try{let Q=await h();S===g.current&&d({id:n,value:Q})}catch(Q){S===g.current&&(d({id:n,value:void 0}),(c.current.onError??console.error)(Q))}})().catch(console.error)},[n,u,i,l]),{items:u,total:f,loading:y,selected:I,search:s,refresh:m}}import{useEffect as Ut}from"react";function Vo(e,t){let n=v(),r=A(t),o=Array.isArray(e)?e.join(","):e;Ut(()=>{let i=new Set(o.split(",")),s=a=>{i.has(a.payload.resourceType)&&r(a.payload)};return n.addEventListener("resourceModified",s),()=>n.removeEventListener("resourceModified",s)},[n,o,r])}import{allOk as Wt,normalizeOperationOutcome as Dt}from"@medplum/core";import{useEffect as Ft,useMemo as Vt,useState as ge}from"react";import{useCallback as Nt,useEffect as Ge,useRef as ye,useState as Lt}from"react";function He(e,t,n={leading:!1}){let[r,o]=Lt(e),i=ye(!1),s=ye(void 0),a=ye(!1),u=Nt(()=>window.clearTimeout(s.current),[]);return Ge(()=>{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]),Ge(()=>(i.current=!0,u),[u]),[r,u]}var zt=250;function Ho(e,t,n){return Ie("search",e,t,n)}function Xo(e,t,n){return Ie("searchOne",e,t,n)}function Yo(e,t,n){return Ie("searchResources",e,t,n)}function Ie(e,t,n,r){let o=v(),[i,s]=ge(!1),[a,u]=ge(),[p,f]=ge(),T=o.fhirSearchUrl(t,n).toString(),y=Vt(()=>({resourceType:t,query:n}),[T]),b=r?.enabled??!0,R=r?.debounceMs??zt,[d]=He(y,R,{leading:!0});return Ft(()=>{if(!b)return()=>{};s(!0);let c=!0;return o[e](d.resourceType,d.query).then(E=>{c&&(s(!1),u(E),f(Wt))}).catch(E=>{c&&(s(!1),u(void 0),f(Dt(E)))}),()=>{c=!1}},[o,e,d,b]),[a,i,p]}import{OperationOutcomeError as Kt,isResource as $t,parametersToOrderSetSyncResponse as Bt,resolveId as jt}from"@medplum/core";import{useCallback as Jt}from"react";function ri(){let e=v();return Jt(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:jt(n)});return $t(r,"Parameters")?Bt(r):void 0}catch(r){if(r instanceof Kt&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}import{getReferenceString as Gt}from"@medplum/core";import{useCallback as Ht,useEffect as Xe,useRef as Xt,useState as z}from"react";function ui({query:e,threadId:t}){let n=v(),[r,o]=z(!0),[i,s]=z(e),[a,u]=z([]),[p,f]=z(void 0),[T,y]=z(null),[b,R]=z(void 0),d=Xt(0);e!==i&&(s(e),o(!0));let c=Ht(async()=>{let l=++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(l!==d.current)return;let S=m.entry?.map(P=>P.resource).filter(P=>P!==void 0)||[];if(m.total!==void 0&&R(m.total),S.length===0){u([]);return}let C=`
2
2
  query {
3
- ${I.map(T=>{let F=`thread_${T.id?.replaceAll("-","")||""}`,W=jt(T);return`
3
+ ${S.map(P=>{let F=`thread_${P.id?.replaceAll("-","")||""}`,L=Gt(P);return`
4
4
  ${F}: CommunicationList(
5
- part_of: "${W}"
5
+ part_of: "${L}"
6
6
  _sort: "-sent"
7
7
  _count: 1
8
8
  ) {
@@ -26,9 +26,9 @@ import{useEffect as fn,useMemo as pn,useState as mn}from"react";import{createCon
26
26
  `}).join(`
27
27
  `)}
28
28
  }
29
- `,M=await n.graphql(C);if(l!==c.current)return;let A=I.map(T=>{let F=`thread_${T.id?.replaceAll("-","")||""}`,W=M.data[F],z=W&&W.length>0?W[0]:void 0;return[T,z]}).filter(T=>T[1]!==void 0);u(A)}finally{l===c.current&&o(!1)}},[n,i]);return en(()=>{d().catch(l=>{S(l)})},[d]),en(()=>{(async()=>{if(!t){m(void 0);return}let g=a.find(I=>I[0].id===t);if(g){m(g[0]);return}let p=await n.readResource("Communication",t);if(p.partOf===void 0)m(p);else{let I=p.partOf[0].reference;if(I){let R=await n.readReference({reference:I});m(R)}}})().catch(g=>{S(g)})},[t,a,n]),{loading:r,error:P,threadMessages:a,selectedThread:f,total:b,addThreadMessage:l=>{(async()=>{await d(),u(p=>[[l,void 0],...p])})().catch(p=>S(p))},handleThreadStatusChange:l=>{if(!f)return;(async()=>{let p=await n.updateResource({...f,status:l});m(p),u(I=>I.map(([R,C])=>R.id===p.id?[p,C]:[R,C]))})().catch(p=>S(p))},refreshThreadMessages:d}}import{getStatus as Ht,OperationOutcomeError as Xt}from"@medplum/core";import{useEffect as Yt,useMemo as nn,useState as Zt}from"react";function er(e){if(e instanceof Xt){let t=Ht(e.outcome);return t===400||t===404}return!1}var tn=[];function nr(e){let t=v(),n=Array.from(new Set(e.filter(s=>!!s))).sort((s,a)=>s.localeCompare(a)).join(`
30
- `),r=nn(()=>n===""?tn:n.split(`
31
- `),[n]),[o,i]=Zt({});return Yt(()=>{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(f=>({...f,[u]:!0}))}).catch(f=>{s||i(m=>({...m,[u]:!er(f)}))});return()=>{s=!0,a.abort()}},[t,r]),nn(()=>{let s=[],a=[],u=!1;for(let f of r){let m=o[f];m===void 0?u=!0:m?s.push(f):a.push(f)}return{loading:u,available:s,unavailable:a}},[r,o])}function si(e){let{loading:t,unavailable:n}=nr(e?[e]:tn);if(!e)return!0;if(!t)return!n.includes(e)}import{ReconnectingWebSocket as tr,sleep as rr}from"@medplum/core";import{useCallback as _,useEffect as Se,useRef as L,useState as H}from"react";var or=12e4;function li({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:r=or}){let o=v(),i=L(n);Se(()=>{i.current=n},[n]);let[s,a]=H("idle"),[u,f]=H(void 0),[m,P]=H([]),S=L(void 0),b=L(void 0),h=L(void 0),c=L(void 0),d=L(!1),x=L(!1),y=L(!1),[l,g]=H(!1),p=L(!1),I=_(E=>{p.current=E,g(E),b.current?.getAudioTracks().forEach(w=>{w.enabled=!E})},[]),R=_(()=>{y.current=!1,c.current?.disconnect(),c.current=void 0,h.current?.close().catch(()=>{}),h.current=void 0,b.current?.getTracks().forEach(E=>E.stop()),b.current=void 0,p.current=!1,g(!1),a(S.current?"idle":"disconnected")},[]),C=_(()=>{R(),S.current?.close(),S.current=void 0,x.current=!1,a("disconnected")},[R]),M=_(()=>{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]),A=_(async()=>{if(!(c.current||d.current)&&!(!b.current||!S.current)){d.current=!0;try{let E=new AudioContext({sampleRate:24e3});await E.audioWorklet.addModule(ur());let w=b.current,N=S.current;if(!y.current||!w||!N){await E.close().catch(()=>{});return}let sn=E.createMediaStreamSource(w),B=new AudioWorkletNode(E,rn);B.port.onmessage=an=>{if(N.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let un=ir(an.data),cn=btoa(String.fromCharCode(...un));N.send(JSON.stringify({type:"input_audio_buffer.append",audio:cn}))},sn.connect(B),B.connect(E.destination),h.current=E,c.current=B,a("listening")}catch(E){f(E),a("error"),R()}finally{d.current=!1}}},[R]),T=_(()=>{y.current&&x.current&&b.current&&(c.current||(S.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),A().catch(()=>{})))},[A]),O=_(E=>{switch(E.type){case"session.created":M();break;case"session.updated":x.current=!0,T();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 w={text:E.transcript,timestamp:new Date().toISOString()};P(N=>[...N,w]),i.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),f(E),a("error");break;default:console.debug("[useWhisper] unhandled message",E.type,E);break}},[M,T]),F=_(async()=>{a("requesting_microphone");let E=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return E.getAudioTracks().forEach(w=>{w.enabled=!p.current}),b.current=E,E},[]),W=_(()=>{a("connecting");let E=sr(o.getBaseUrl());console.debug("[useWhisper] connecting to",E);let w=new tr(E);return S.current=w,w.onopen=()=>{x.current=!1,y.current?a("connected"):a("idle"),w.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()}))},w.onmessage=N=>O(JSON.parse(N.data)),w.onerror=N=>{y.current&&(f(N),C(),a("error"))},w.onclose=()=>{x.current=!1,S.current&&a(y.current?"connecting":"idle")},w},[o,O,C]),z=_(()=>S.current??W(),[W]),on=_(async()=>{try{f(void 0),y.current=!0,z(),await F(),T()}catch(E){f(E),a("error"),R()}},[F,z,R,T]);return Se(()=>{if(s!=="idle"||!S.current||!Number.isFinite(r)||r<=0)return;let E=new AbortController;return rr(r,{signal:E.signal}).then(()=>C()).catch(()=>{}),()=>E.abort()},[s,r,C]),Se(()=>()=>C(),[C]),{status:s,error:u,transcripts:m,start:on,stop:R,isListening:s==="listening"||s==="speech_started"||s==="speech_stopped",muted:l,setMuted:I}}function ir(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 sr(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var rn="medplum-pcm-worklet",ar=`
29
+ `,Q=await n.graphql(C);if(l!==d.current)return;let k=S.map(P=>{let F=`thread_${P.id?.replaceAll("-","")||""}`,L=Q.data[F],$=L&&L.length>0?L[0]:void 0;return[P,$]}).filter(P=>P[1]!==void 0);u(k)}finally{l===d.current&&o(!1)}},[n,i]);return Xe(()=>{c().catch(l=>{y(l)})},[c]),Xe(()=>{(async()=>{if(!t){f(void 0);return}let I=a.find(S=>S[0].id===t);if(I){f(I[0]);return}let m=await n.readResource("Communication",t);if(m.partOf===void 0)f(m);else{let S=m.partOf[0].reference;if(S){let h=await n.readReference({reference:S});f(h)}}})().catch(I=>{y(I)})},[t,a,n]),{loading:r,error:T,threadMessages:a,selectedThread:p,total:b,addThreadMessage:l=>{(async()=>{await c(),u(m=>[[l,void 0],...m])})().catch(m=>y(m))},handleThreadStatusChange:l=>{if(!p)return;(async()=>{let m=await n.updateResource({...p,status:l});f(m),u(S=>S.map(([h,C])=>h.id===m.id?[m,C]:[h,C]))})().catch(m=>y(m))},refreshThreadMessages:c}}import{getStatus as Yt,OperationOutcomeError as Zt}from"@medplum/core";import{useEffect as er,useMemo as Ye,useState as nr}from"react";function tr(e){if(e instanceof Zt){let t=Yt(e.outcome);return t===400||t===404}return!1}var Ze=[];function rr(e){let t=v(),n=Array.from(new Set(e.filter(s=>!!s))).sort((s,a)=>s.localeCompare(a)).join(`
30
+ `),r=Ye(()=>n===""?Ze:n.split(`
31
+ `),[n]),[o,i]=nr({});return er(()=>{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(f=>({...f,[u]:!tr(p)}))});return()=>{s=!0,a.abort()}},[t,r]),Ye(()=>{let s=[],a=[],u=!1;for(let p of r){let f=o[p];f===void 0?u=!0:f?s.push(p):a.push(p)}return{loading:u,available:s,unavailable:a}},[r,o])}function fi(e){let{loading:t,unavailable:n}=rr(e?[e]:Ze);if(!e)return!0;if(!t)return!n.includes(e)}import{ReconnectingWebSocket as or,sleep as ir}from"@medplum/core";import{useCallback as q,useEffect as en,useRef as W,useState as X}from"react";var sr=12e4;function Ii({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:r=sr}){let o=v(),i=A(n),[s,a]=X("idle"),[u,p]=X(void 0),[f,T]=X([]),y=W(void 0),b=W(void 0),R=W(void 0),d=W(void 0),c=W(!1),E=W(!1),g=W(!1),[l,I]=X(!1),m=W(!1),S=q(x=>{m.current=x,I(x),b.current?.getAudioTracks().forEach(w=>{w.enabled=!x})},[]),h=q(()=>{g.current=!1,d.current?.disconnect(),d.current=void 0,R.current?.close().catch(()=>{}),R.current=void 0,b.current?.getTracks().forEach(x=>x.stop()),b.current=void 0,m.current=!1,I(!1),a(y.current?"idle":"disconnected")},[]),C=q(()=>{h(),y.current?.close(),y.current=void 0,E.current=!1,a("disconnected")},[h]),Q=q(()=>{y.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]),k=q(async()=>{if(!(d.current||c.current)&&!(!b.current||!y.current)){c.current=!0;try{let x=new AudioContext({sampleRate:24e3});await x.audioWorklet.addModule(dr());let w=b.current,N=y.current;if(!g.current||!w||!N){await x.close().catch(()=>{});return}let rn=x.createMediaStreamSource(w),B=new AudioWorkletNode(x,nn);B.port.onmessage=on=>{if(N.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let sn=ar(on.data),an=btoa(String.fromCharCode(...sn));N.send(JSON.stringify({type:"input_audio_buffer.append",audio:an}))},rn.connect(B),B.connect(x.destination),R.current=x,d.current=B,a("listening")}catch(x){p(x),a("error"),h()}finally{c.current=!1}}},[h]),P=q(()=>{g.current&&E.current&&b.current&&(d.current||(y.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),k().catch(()=>{})))},[k]),M=q(x=>{switch(x.type){case"session.created":Q();break;case"session.updated":E.current=!0,P();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(x.transcript){let w={text:x.transcript,timestamp:new Date().toISOString()};T(N=>[...N,w]),i(x.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",x),p(x),a("error");break;default:console.debug("[useWhisper] unhandled message",x.type,x);break}},[Q,P,i]),F=q(async()=>{a("requesting_microphone");let x=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return x.getAudioTracks().forEach(w=>{w.enabled=!m.current}),b.current=x,x},[]),L=q(()=>{a("connecting");let x=ur(o.getBaseUrl());console.debug("[useWhisper] connecting to",x);let w=new or(x);return y.current=w,w.onopen=()=>{E.current=!1,g.current?a("connected"):a("idle"),w.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()}))},w.onmessage=N=>M(JSON.parse(N.data)),w.onerror=N=>{g.current&&(p(N),C(),a("error"))},w.onclose=()=>{E.current=!1,y.current&&a(g.current?"connecting":"idle")},w},[o,M,C]),$=q(()=>y.current??L(),[L]),tn=q(async()=>{try{p(void 0),g.current=!0,$(),await F(),P()}catch(x){p(x),a("error"),h()}},[F,$,h,P]);return en(()=>{if(s!=="idle"||!y.current||!Number.isFinite(r)||r<=0)return;let x=new AbortController;return ir(r,{signal:x.signal}).then(()=>C()).catch(()=>{}),()=>x.abort()},[s,r,C]),en(()=>()=>C(),[C]),{status:s,error:u,transcripts:f,start:tn,stop:h,isListening:s==="listening"||s==="speech_started"||s==="speech_stopped",muted:l,setMuted:S}}function ar(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 ur(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var nn="medplum-pcm-worklet",cr=`
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('${rn}', PcmWorkletProcessor);
64
- `,xe;function ur(){if(!xe){let e=new Blob([ar],{type:"application/javascript"});xe=URL.createObjectURL(e)}return xe}export{Pn as MEDICATION_CART_ADD_IN_PROGRESS,mr as MedplumProvider,dt as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,ct as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,lt as QUESTIONNAIRE_HIDDEN_URL,$e as QUESTIONNAIRE_ITEM_CONTROL_URL,ft as QUESTIONNAIRE_OPTION_EXCLUSIVE_URL,at as QUESTIONNAIRE_REFERENCE_FILTER_URL,se as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,mo as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,G as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,ut as QUESTIONNAIRE_VALIDATION_ERROR_URL,Q as QuestionnaireItemType,Be as applyOptionExclusive,fe as buildInitialResponse,me as buildInitialResponseItem,ir as convertToPCM16,le as evaluateCalculatedExpressionsInQuestionnaire,ae as getItemAnswerOptionValue,Et as getItemEnableWhenValueAnswer,So as getItemInitialValue,ho as getNewMultiSelectValues,Io as getQuestionnaireItemReferenceFilter,yo as getQuestionnaireItemReferenceTargetTypes,He as getResponseItemAnswerValue,Ro as isChoiceQuestion,pt as isQuestionEnabled,er as isValueSetUnavailableError,X as reactContext,de as removeDisabledItems,go as setQuestionnaireItemReferenceTargetTypes,gt as typedValueToResponseItem,gr as useCachedBinaryUrl,Er as useMedicationCart,Mr as useMedicationIFrame,kr as useMedicationOrder,Lr as useMedicationOrderSet,v as useMedplum,Y as useMedplumContext,dr as useMedplumNavigate,be as useMedplumProfile,jr as useNotificationCount,Yr as usePatientSummaryData,ro as usePharmacySearch,so as usePrevious,To as useQuestionnaireForm,ie as useResource,wo as useResourceBoard,qo as useResourceModified,Ko as useSearch,$o as useSearchOne,zo as useSearchResources,ke as useSubscription,Ho as useSyncOrderSet,ni as useThreadInbox,nr as useValueSetAvailabilities,si as useValueSetAvailability,li as useWhisper};
63
+ registerProcessor('${nn}', PcmWorkletProcessor);
64
+ `,Se;function dr(){if(!Se){let e=new Blob([cr],{type:"application/javascript"});Se=URL.createObjectURL(e)}return Se}export{En as MEDICATION_CART_ADD_IN_PROGRESS,hr as MedplumProvider,pt as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,lt as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,ft as QUESTIONNAIRE_HIDDEN_URL,Ve as QUESTIONNAIRE_ITEM_CONTROL_URL,mt as QUESTIONNAIRE_OPTION_EXCLUSIVE_URL,ct as QUESTIONNAIRE_REFERENCE_FILTER_URL,se as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,So as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,H as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,dt as QUESTIONNAIRE_VALIDATION_ERROR_URL,O as QuestionnaireItemType,Ke as applyOptionExclusive,pe as buildInitialResponse,me as buildInitialResponseItem,ar as convertToPCM16,le as evaluateCalculatedExpressionsInQuestionnaire,ae as getItemAnswerOptionValue,Tt as getItemEnableWhenValueAnswer,Po as getItemInitialValue,bo as getNewMultiSelectValues,To as getQuestionnaireItemReferenceFilter,Eo as getQuestionnaireItemReferenceTargetTypes,Je as getResponseItemAnswerValue,xo as isChoiceQuestion,Rt as isQuestionEnabled,tr as isValueSetUnavailableError,Y as reactContext,de as removeDisabledItems,vo as setQuestionnaireItemReferenceTargetTypes,St as typedValueToResponseItem,Sr as useCachedBinaryUrl,Tr as useMedicationCart,kr as useMedicationIFrame,Lr as useMedicationOrder,zr as useMedicationOrderSet,v as useMedplum,Z as useMedplumContext,pr as useMedplumNavigate,xe as useMedplumProfile,Zr as useNotificationCount,oo as usePatientSummaryData,co as usePharmacySearch,fo as usePrevious,Ao as useQuestionnaireForm,ie as useResource,No as useResourceBoard,Vo as useResourceModified,Ho as useSearch,Xo as useSearchOne,Yo as useSearchResources,A as useStabilizedCallback,we as useSubscription,ri as useSyncOrderSet,ui as useThreadInbox,rr as useValueSetAvailabilities,fi as useValueSetAvailability,Ii as useWhisper};
65
65
  //# sourceMappingURL=index.mjs.map