@medplum/react-hooks 5.1.26 → 5.1.28

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