@medplum/react-hooks 5.1.14 → 5.1.16

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.
@@ -593,12 +593,18 @@ export declare interface UseThreadInboxReturn {
593
593
  refreshThreadMessages: () => Promise<void>;
594
594
  }
595
595
 
596
- export declare function useWhisper({ language, model, onTranscript, }: UseWhisperOptions): UseWhisperResult;
596
+ export declare function useWhisper({ language, model, onTranscript, idleTimeoutMs, }: UseWhisperOptions): UseWhisperResult;
597
597
 
598
598
  export declare type UseWhisperOptions = {
599
599
  language?: string;
600
600
  model?: string;
601
601
  onTranscript?: (text: string) => void;
602
+ /**
603
+ * How long to keep the WebSocket warm after stop() before fully closing it, in milliseconds.
604
+ * Defaults to 120000 (2 minutes). Set to 0 or a non-finite value to keep the socket warm
605
+ * until unmount (the previous behavior).
606
+ */
607
+ idleTimeoutMs?: number;
602
608
  };
603
609
 
604
610
  export declare type UseWhisperResult = {
@@ -593,12 +593,18 @@ export declare interface UseThreadInboxReturn {
593
593
  refreshThreadMessages: () => Promise<void>;
594
594
  }
595
595
 
596
- export declare function useWhisper({ language, model, onTranscript, }: UseWhisperOptions): UseWhisperResult;
596
+ export declare function useWhisper({ language, model, onTranscript, idleTimeoutMs, }: UseWhisperOptions): UseWhisperResult;
597
597
 
598
598
  export declare type UseWhisperOptions = {
599
599
  language?: string;
600
600
  model?: string;
601
601
  onTranscript?: (text: string) => void;
602
+ /**
603
+ * How long to keep the WebSocket warm after stop() before fully closing it, in milliseconds.
604
+ * Defaults to 120000 (2 minutes). Set to 0 or a non-finite value to keep the socket warm
605
+ * until unmount (the previous behavior).
606
+ */
607
+ idleTimeoutMs?: number;
602
608
  };
603
609
 
604
610
  export declare type UseWhisperResult = {
@@ -1,8 +1,8 @@
1
- import{useEffect as De,useMemo as Fe,useState as We}from"react";import{createContext as qe,useContext as Le}from"react";var F=qe(void 0);function W(){return Le(F)}function Q(){return W().medplum}function dt(){return W().navigate}function ie(){return W().profile}import{jsx as $e}from"react/jsx-runtime";var se=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function mt(e){let t=e.medplum,n=e.navigate??Ve,[o,r]=We({profile:t.getProfile(),loading:t.isLoading()});De(()=>{function s(){r(c=>({...c,profile:t.getProfile(),loading:t.isLoading()}))}for(let c of se)t.addEventListener(c,s);return()=>{for(let c of se)t.removeEventListener(c,s)}},[t]);let i=Fe(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return $e(F.Provider,{value:i,children:e.children})}function Ve(e){window.location.assign(e)}import{useMemo as Ke}from"react";var ae=new Map,gt=e=>Ke(()=>{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=ae.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 ae.set(t,e),e},[e]);import{useEffect as ue,useRef as V,useState as Be}from"react";function bt(e,t,n){let o=Q(),{patientId:r,onPatientSyncSuccess:i,onIframeSuccess:s,onError:c}=n,[p,S]=Be(void 0),x=V(i),g=V(s),b=V(c);return ue(()=>{x.current=i,g.current=s,b.current=c},[i,s,c]),ue(()=>{let h=!1;return(async()=>{try{if(r){if(await o.executeBot(e,{patientId:r}),h)return;x.current?.()}let a=await o.executeBot(t,{patientId:r});if(h)return;a.url&&(S(a.url),g.current?.(a.url))}catch(a){h||b.current?.(a)}})().catch(()=>{}),()=>{h=!0}},[o,e,t,r]),p}import{INVALID_MEDICATION_ORDER_RESPONSE as je,INVALID_MEDICATION_SEARCH_RESPONSE as ze,isResource as $,medicationOrderRequestToParameters as Je,medicationSearchParamsToParameters as Ge,parametersToMedicationOrderResponse as He}from"@medplum/core";import{useCallback as ce}from"react";function Tt(){let e=Q(),t=ce(async o=>{let r=e.fhirUrl("Medication","$drug-search"),i=Ge(o),s=await e.post(r,i);if(!$(s,"Bundle"))throw new Error(ze);return(s.entry??[]).map(c=>c.resource).filter(c=>$(c,"Medication"))},[e]),n=ce(async o=>{let r=e.fhirUrl("MedicationRequest","$order-medication"),i=Je(o),s=await e.post(r,i);if(!$(s,"Parameters"))throw new Error(je);return He(s)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as Xe,isResource as Ye,medicationOrderSetRequestToParameters as Ze,parametersToMedicationOrderSetResponse as en}from"@medplum/core";import{useCallback as de,useEffect as nn,useRef as pe,useState as K}from"react";function At(e){let t=Q(),{patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i}=e,[s,c]=K(void 0),[p,S]=K(!1),[x,g]=K(void 0),b=pe({patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i});b.current={patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i};let h=()=>{let u=b.current;if(!u.patientId)return;let y=!!u.planDefinitionId,d=u.vendorOrderSetId!==void 0&&u.vendorOrderSetId!==null&&u.vendorOrderSetId!=="";return!y&&!d?void 0:{patientId:u.patientId,planDefinitionId:y?u.planDefinitionId:void 0,vendorOrderSetId:d?u.vendorOrderSetId:void 0,appId:u.appId}},R=de(async u=>{let y=t.fhirUrl("PlanDefinition","$order-set-url"),d=Ze(u),I=await t.post(y,d);if(!Ye(I,"Parameters"))throw new Error(Xe);return en(I).launchUrl},[t]),a=pe(0),f=de(async()=>{let u=h();if(!u)return;a.current+=1;let y=a.current;S(!0),g(void 0);try{let d=await R(u);return a.current!==y?void 0:(c(d),d)}catch(d){a.current===y&&(g(d),c(void 0));return}finally{a.current===y&&S(!1)}},[R]);return nn(()=>{let u=!1,y=h();if(!y){a.current+=1,c(void 0),S(!1),g(void 0);return}a.current+=1;let d=a.current;return S(!0),g(void 0),R(y).then(I=>{u||a.current!==d||c(I)}).catch(I=>{u||a.current!==d||(g(I),c(void 0))}).finally(()=>{!u&&a.current===d&&S(!1)}),()=>{u=!0}},[R,n,o,r,i]),{url:s,loading:p,error:x,refresh:f}}import{useCallback as rn,useEffect as on,useState as sn}from"react";import{deepEquals as fe}from"@medplum/core";import{useCallback as _,useEffect as B,useRef as M,useState as le}from"react";var tn=3e3;function me(e,t,n){let o=Q(),i=ie()?e:void 0,[s,c]=le(),[p,S]=le(n?.subscriptionProps),x=M(!1),g=M(void 0),b=M(void 0),h=M(void 0),R=M(t);R.current=t;let a=M(n?.onWebSocketOpen);a.current=n?.onWebSocketOpen;let f=M(n?.onWebSocketClose);f.current=n?.onWebSocketClose;let u=M(n?.onSubscriptionConnect);u.current=n?.onSubscriptionConnect;let y=M(n?.onSubscriptionDisconnect);y.current=n?.onSubscriptionDisconnect;let d=M(n?.onError);d.current=n?.onError,B(()=>{fe(n?.subscriptionProps,p)||S(n?.subscriptionProps)},[p,n]),B(()=>{g.current&&(clearTimeout(g.current),g.current=void 0);let E=!1;return(b.current!==i||!fe(h.current,p))&&(E=!0),E&&b.current&&o.unsubscribeFromCriteria(b.current,h.current),b.current=i,h.current=p,E&&i?c(o.subscribeToCriteria(i,p)):i||c(void 0),()=>{g.current=setTimeout(()=>{c(void 0),i&&o.unsubscribeFromCriteria(i,p)},tn)}},[o,i,p]);let I=_(E=>{R.current?.(E.payload)},[]),v=_(()=>{a.current?.()},[]),m=_(()=>{f.current?.()},[]),l=_(E=>{u.current?.(E.payload.subscriptionId)},[]),P=_(E=>{y.current?.(E.payload.subscriptionId)},[]),O=_(E=>{d.current?.(E.payload)},[]);B(()=>s?(x.current||(s.addEventListener("message",I),s.addEventListener("open",v),s.addEventListener("close",m),s.addEventListener("connect",l),s.addEventListener("disconnect",P),s.addEventListener("error",O),x.current=!0),()=>{x.current=!1,s.removeEventListener("message",I),s.removeEventListener("open",v),s.removeEventListener("close",m),s.removeEventListener("connect",l),s.removeEventListener("disconnect",P),s.removeEventListener("error",O)}):()=>{},[s,I,v,m,l,P,O])}function Wt(e){let t=Q(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=sn(0),c=rn(p=>{t.search(n,o,{cache:p}).then(S=>s(S.total)).catch(console.error)},[t,n,o]);return on(()=>{c("default")},[c]),me(r,()=>{c("reload")}),i}import{resolveId as an}from"@medplum/core";import{useEffect as un,useMemo as ye,useState as j}from"react";function Re(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 cn(e){return e.map(t=>{let n=t.searches?t.searches.map(Re).join(","):"";return`${t.key}:[${n}]`}).join("|")}function jt(e,t){let n=Q(),[o,r]=j([]),[i,s]=j(!0),[c,p]=j(),S=cn(t),x=ye(()=>t,[S]),g=ye(()=>an(e),[e]);return un(()=>{if(!g)return;let b=!1,h=`Patient/${g}`,R={_count:100,_sort:"-_lastUpdated"},a=[],f=new Map,u=[];for(let d of x){let I=[];if(d.searches)for(let v of d.searches){let m=Re(v),l=f.get(m);l===void 0&&(l=a.length,f.set(m,l),a.push(v)),I.push({searchIdx:l,resultKey:v.key})}u.push(I)}if(a.length===0){r(x.map(()=>({}))),s(!1);return}let y=a.map(d=>{let I=d.patientParam??"subject",v={[I]:h};if(d.query){if(typeof d.query=="string")return n.searchResources(d.resourceType,`${I}=${h}&${d.query}&_count=100&_sort=-_lastUpdated`);if(d.query instanceof URLSearchParams)d.query.forEach((m,l)=>{v[l]=m});else if(Array.isArray(d.query))for(let[m,l]of d.query)v[m]=l;else for(let[m,l]of Object.entries(d.query))l!==void 0&&(v[m]=l)}return n.searchResources(d.resourceType,{...R,...v})});return s(!0),p(void 0),Promise.allSettled(y).then(d=>{if(b)return;let I=u.map(m=>{let l={};for(let{searchIdx:P,resultKey:O}of m){let E=d[P];l[O]=E.status==="fulfilled"?E.value:[]}return l});r(I),s(!1);let v=d.filter(m=>m.status==="rejected");if(v.length>0){console.error("Some patient summary searches failed:",v.map(l=>l.reason));let m=v[0].reason;p(m instanceof Error?m:new Error(String(m)))}}).catch(d=>{b||(p(d instanceof Error?d:new Error(String(d))),s(!1))}),()=>{b=!0}},[n,g,x]),{sectionData:o,loading:i,error:c}}import{isAddPharmacyResponse as dn,isOrganizationArray as pn}from"@medplum/core";import{useCallback as he}from"react";function Xt(e,t){let n=Q(),o=he(async i=>{let s=await n.executeBot(e,i);if(!pn(s))throw new Error("Invalid response from pharmacy search");return s},[n,e]),r=he(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary});if(!dn(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:o,addToFavorites:r}}import{useEffect as fn,useRef as ln}from"react";function er(e){let t=ln(void 0);return fn(()=>{t.current=e}),t.current}import{getExtension as $n}from"@medplum/core";import{useReducer as Kn,useRef as Bn}from"react";import{deepEquals as mn,isReference as Ie,isResource as yn,normalizeOperationOutcome as Rn}from"@medplum/core";import{useCallback as hn,useEffect as gn,useState as In}from"react";function z(e,t){let n=Q(),[o,r]=In(()=>ge(n,e)),i=hn(s=>{mn(s,o)||r(s)},[o]);return gn(()=>{let s=!0,c=ge(n,e);return!c&&Ie(e)?n.readReference(e).then(p=>{s&&i(p)}).catch(p=>{s&&(i(void 0),t&&t(Rn(p)))}):i(c),(()=>s=!1)},[n,e,i,t]),o}function ge(e,t){if(t){if(yn(t))return t;if(Ie(t))return e.getCachedReference(t)}}import{EMPTY as Ee,HTTP_HL7_ORG as w,PropertyType as C,append as Se,capitalize as xe,deepClone as Sn,evalFhirPathTyped as G,getExtension as U,getReferenceString as xn,getTypedPropertyValueWithoutSchema as q,normalizeErrorString as bn,splitN as En,toJsBoolean as vn,toTypedValue as ve,typedValueToString as Qn}from"@medplum/core";var T={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=`${w}/fhir/StructureDefinition/questionnaire-itemControl`,Pn=`${w}/fhir/StructureDefinition/questionnaire-referenceFilter`,J=`${w}/fhir/StructureDefinition/questionnaire-referenceResource`,Tn=`${w}/fhir/StructureDefinition/questionnaire-validationError`,Cn=`${w}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,On=`${w}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,ar=`${w}/fhir/StructureDefinition/questionnaire-signatureRequired`,L=`${w}/fhir/StructureDefinition/questionnaireresponse-signature`,Mn=`${w}/fhir/StructureDefinition/questionnaire-hidden`;function ur(e){return e.type==="choice"||e.type==="open-choice"}function H(e,t){return{...t,item:Pe(e.item,t.item,t)}}function Pe(e,t,n){if(!t)return t;let o=[];for(let r of t){let i=e?.find(s=>s.linkId===r.linkId);i&&!wn(i,n)||(i?.item&&r.item?o.push({...r,item:Pe(i.item,r.item,n)}):o.push(r))}return o}function wn(e,t){if(U(e,Mn)?.valueBoolean===!0)return!1;let o=An(e,t);return o!==void 0?o:_n(e,t)}function An(e,t){let n=U(e,Cn);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=ve(t),i=G(o,[r],{"%resource":r});return vn(i)}}}function _n(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=Te(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=Dn(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function X(e,t,n=t.item){for(let o of e){let r=n?.find(i=>i.linkId===o.linkId);r&&(Un(t,o,r),o.item&&r.item&&X(o.item,t,r.item))}}function Un(e,t,n){try{let o=qn(t,e);if(!o)return;let r=Nn(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:Tn,valueString:`Expression evaluation failed: ${bn(o)}`}]}}var kn={[T.boolean]:[C.boolean],[T.date]:[C.date],[T.dateTime]:[C.dateTime],[T.time]:[C.time],[T.url]:[C.string,C.uri,C.url],[T.attachment]:[C.Attachment],[T.reference]:[C.Reference],[T.quantity]:[C.Quantity],[T.decimal]:[C.decimal,C.integer],[T.integer]:[C.decimal,C.integer]};function Nn(e,t){if(!e.type)return;if(e.type===T.choice||e.type===T.openChoice)return{[`value${xe(t.type)}`]:t.value};if(e.type===T.string||e.type===T.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(kn[e.type]?.includes(t.type))return{[`value${xe(e.type)}`]:t.value}}function qn(e,t){if(!t)return;let n=U(e,On);if(n){let o=n.valueExpression?.expression;if(o){let r=ve(t),i=G(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function cr(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>Qn(be(s))===r);if(i){let s=be(i);s&&o.push({[t]:s.value})}}return o}function Te(e,t){for(let n of e??Ee){if(n.linkId===t)return n.answer;if(n.item){let o=Te(n.item,t);if(o)return o}}}function Ln(e,t,n){if(n==="exists")return!!e===t.value;if(e){let o=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=G(`%actualAnswer ${o} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function Dn(e,t,n){let o=t||[],r=Wn(e),i=!1,s=!0;for(let c of o){let p=Vn(c),{operator:S}=e;if(Ln(p,r,S)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function dr(e){let t=U(e,J);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function pr(e,t){let n=Sn(e),o=U(n,J);return!t||t.length===0?(o&&(n.extension=n.extension?.filter(r=>r!==o)),n):(o||(n.extension??=[],o={url:J},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 fr(e,t,n){let o=U(e,Pn);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 c of s){let[p,S]=En(c,"=",2);i[p]=S}return i}function Y(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??xn(e),item:Z(e.item,t?.item),status:"in-progress"}}function Z(e,t){let n;for(let o of e??Ee){if(o.type===T.display)continue;let r=t?.filter(i=>i.linkId===o.linkId);if(r?.length)for(let i of r)i.id=i.id??Ce(),i.text=i.text??o.text,i.item=Z(o.item,i.item),i.answer=Oe(o,i),n=Se(n,i);else n=Se(n,ee(o))}return n}function ee(e){return{id:Ce(),linkId:e.linkId,text:e.text,item:Z(e.item,void 0),answer:Oe(e)}}var Fn=1;function Ce(){return"id-"+Fn++}function Oe(e,t){if(!(e.type===T.display||e.type===T.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 lr(e){return q({type:"QuestionnaireItemInitial",value:e},"value")}function be(e){return q({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Wn(e){return q({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Vn(e){return q({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Ir(e){let t=z(e.questionnaire),n=z(e.defaultValue),[,o]=Kn(R=>R+1,0),r=Bn({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:jn(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=Y(t,n),h()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=Y(t),h()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(R,a){let f=r.current.questionnaireResponse;for(let u of R)f=f?.item?.find(y=>u.id?y.id===u.id:y.linkId===u.linkId);return a&&(f=f?.item?.find(u=>u.linkId===a.linkId)),f}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function c(){r.current.activePage=(r.current.activePage??0)-1,o()}function p(R,a){let f=i(R);f&&(f.item??=[],f.item.push(ee(a)),h())}function S(R,a){let f=i(R,a);f&&(f.answer??=[],f.answer.push({}),h())}function x(R,a,f){let u=i(R,a);u&&(u.answer=f,h())}function g(R){let a=r.current.questionnaireResponse;a&&(R?(a.extension=a.extension??[],a.extension=a.extension.filter(f=>f.url!==L),a.extension.push({url:L,valueSignature:R})):a.extension=a.extension?.filter(f=>f.url!==L),h())}function b(){let R=r.current.questionnaire;if(R?.item){let a=r.current.questionnaireResponse;X(R.item,a)}}function h(){let R=r.current.questionnaireResponse,a=r.current.questionnaire;!R||!a||(b(),o(),e.onChange?.(H(a,R)))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:H(r.current.questionnaire,r.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:zn(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:Jn(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:c,onAddGroup:p,onAddAnswer:S,onChangeAnswer:x,onChangeSignature:g}}function jn(e){if(!(!e?.item||$n(e?.item?.[0],Qe)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,o)=>({linkId:n.linkId,title:n.text??`Page ${o+1}`,group:n}))}function zn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function Jn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{allOk as Xn,normalizeOperationOutcome as Yn}from"@medplum/core";import{useEffect as Zn,useMemo as et,useState as te}from"react";import{useCallback as Gn,useEffect as Me,useRef as ne,useState as Hn}from"react";function we(e,t,n={leading:!1}){let[o,r]=Hn(e),i=ne(!1),s=ne(void 0),c=ne(!1),p=Gn(()=>window.clearTimeout(s.current),[]);return Me(()=>{i.current&&(!c.current&&n.leading?(c.current=!0,r(e),s.current=setTimeout(()=>{c.current=!1},t)):(p(),s.current=setTimeout(()=>{c.current=!1,r(e)},t)))},[e,n.leading,t,p]),Me(()=>(i.current=!0,p),[p]),[o,p]}var nt=250;function Tr(e,t,n){return re("search",e,t,n)}function Cr(e,t,n){return re("searchOne",e,t,n)}function Or(e,t,n){return re("searchResources",e,t,n)}function re(e,t,n,o){let r=Q(),[i,s]=te(!1),[c,p]=te(),[S,x]=te(),g=r.fhirSearchUrl(t,n).toString(),b=et(()=>({resourceType:t,query:n}),[g]),h=o?.enabled??!0,R=o?.debounceMs??nt,[a]=we(b,R,{leading:!0});return Zn(()=>{if(!h)return()=>{};s(!0);let f=!0;return r[e](a.resourceType,a.query).then(u=>{f&&(s(!1),p(u),x(Xn))}).catch(u=>{f&&(s(!1),p(void 0),x(Yn(u)))}),()=>{f=!1}},[r,e,a,h]),[c,i,S]}import{isOperationOutcome as tt}from"@medplum/core";import{useCallback as rt}from"react";function Ur(){let e=Q();return rt(async t=>{try{await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t})}catch(n){if(tt(n)&&n.issue?.some(o=>o.code==="not-found"))return;throw n}},[e])}import{getReferenceString as ot}from"@medplum/core";import{useCallback as it,useEffect as Ae,useState as k}from"react";function Dr({query:e,threadId:t}){let n=Q(),[o,r]=k(!0),[i,s]=k([]),[c,p]=k(void 0),[S,x]=k(null),[g,b]=k(void 0),h=it(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 u=await n.search("Communication",f.toString(),{cache:"no-cache"}),y=u.entry?.map(l=>l.resource).filter(l=>l!==void 0)||[];if(u.total!==void 0&&b(u.total),y.length===0){s([]);return}let I=`
1
+ import{useEffect as ze,useMemo as Je,useState as Ge}from"react";import{createContext as Be,useContext as je}from"react";var K=Be(void 0);function B(){return je(K)}function v(){return B().medplum}function bt(){return B().navigate}function pe(){return B().profile}import{jsx as Xe}from"react/jsx-runtime";var fe=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function Qt(e){let t=e.medplum,n=e.navigate??He,[o,r]=Ge({profile:t.getProfile(),loading:t.isLoading()});ze(()=>{function s(){r(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of fe)t.addEventListener(a,s);return()=>{for(let a of fe)t.removeEventListener(a,s)}},[t]);let i=Je(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return Xe(K.Provider,{value:i,children:e.children})}function He(e){window.location.assign(e)}import{useMemo as Ye}from"react";var le=new Map,Mt=e=>Ye(()=>{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=le.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 le.set(t,e),e},[e]);import{useEffect as me,useRef as j,useState as Ze}from"react";function kt(e,t,n){let o=v(),{patientId:r,onPatientSyncSuccess:i,onIframeSuccess:s,onError:a}=n,[l,S]=Ze(void 0),x=j(i),b=j(s),g=j(a);return me(()=>{x.current=i,b.current=s,g.current=a},[i,s,a]),me(()=>{let h=!1;return(async()=>{try{if(r){if(await o.executeBot(e,{patientId:r}),h)return;x.current?.()}let u=await o.executeBot(t,{patientId:r});if(h)return;u.url&&(S(u.url),b.current?.(u.url))}catch(u){h||g.current?.(u)}})().catch(()=>{}),()=>{h=!0}},[o,e,t,r]),l}import{INVALID_MEDICATION_ORDER_RESPONSE as en,INVALID_MEDICATION_SEARCH_RESPONSE as nn,isResource as z,medicationOrderRequestToParameters as tn,medicationSearchParamsToParameters as rn,parametersToMedicationOrderResponse as on}from"@medplum/core";import{useCallback as he}from"react";function Wt(){let e=v(),t=he(async o=>{let r=e.fhirUrl("Medication","$drug-search"),i=rn(o),s=await e.post(r,i);if(!z(s,"Bundle"))throw new Error(nn);return(s.entry??[]).map(a=>a.resource).filter(a=>z(a,"Medication"))},[e]),n=he(async o=>{let r=e.fhirUrl("MedicationRequest","$order-medication"),i=tn(o),s=await e.post(r,i);if(!z(s,"Parameters"))throw new Error(en);return on(s)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as sn,isResource as an,medicationOrderSetRequestToParameters as un,parametersToMedicationOrderSetResponse as cn}from"@medplum/core";import{useCallback as ye,useEffect as dn,useRef as Re,useState as J}from"react";function Kt(e){let t=v(),{patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i}=e,[s,a]=J(void 0),[l,S]=J(!1),[x,b]=J(void 0),g=Re({patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i});g.current={patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i};let h=()=>{let c=g.current;if(!c.patientId)return;let f=!!c.planDefinitionId,d=c.vendorOrderSetId!==void 0&&c.vendorOrderSetId!==null&&c.vendorOrderSetId!=="";return!f&&!d?void 0:{patientId:c.patientId,planDefinitionId:f?c.planDefinitionId:void 0,vendorOrderSetId:d?c.vendorOrderSetId:void 0,appId:c.appId}},y=ye(async c=>{let f=t.fhirUrl("PlanDefinition","$order-set-url"),d=un(c),R=await t.post(f,d);if(!an(R,"Parameters"))throw new Error(sn);return cn(R).launchUrl},[t]),u=Re(0),p=ye(async()=>{let c=h();if(!c)return;u.current+=1;let f=u.current;S(!0),b(void 0);try{let d=await y(c);return u.current!==f?void 0:(a(d),d)}catch(d){u.current===f&&(b(d),a(void 0));return}finally{u.current===f&&S(!1)}},[y]);return dn(()=>{let c=!1,f=h();if(!f){u.current+=1,a(void 0),S(!1),b(void 0);return}u.current+=1;let d=u.current;return S(!0),b(void 0),y(f).then(R=>{c||u.current!==d||a(R)}).catch(R=>{c||u.current!==d||(b(R),a(void 0))}).finally(()=>{!c&&u.current===d&&S(!1)}),()=>{c=!0}},[y,n,o,r,i]),{url:s,loading:l,error:x,refresh:p}}import{useCallback as fn,useEffect as ln,useState as mn}from"react";import{deepEquals as ge}from"@medplum/core";import{useCallback as q,useEffect as G,useRef as A,useState as Ie}from"react";var pn=3e3;function Se(e,t,n){let o=v(),i=pe()?e:void 0,[s,a]=Ie(),[l,S]=Ie(n?.subscriptionProps),x=A(!1),b=A(void 0),g=A(void 0),h=A(void 0),y=A(t);y.current=t;let u=A(n?.onWebSocketOpen);u.current=n?.onWebSocketOpen;let p=A(n?.onWebSocketClose);p.current=n?.onWebSocketClose;let c=A(n?.onSubscriptionConnect);c.current=n?.onSubscriptionConnect;let f=A(n?.onSubscriptionDisconnect);f.current=n?.onSubscriptionDisconnect;let d=A(n?.onError);d.current=n?.onError,G(()=>{ge(n?.subscriptionProps,l)||S(n?.subscriptionProps)},[l,n]),G(()=>{b.current&&(clearTimeout(b.current),b.current=void 0);let Q=!1;return(g.current!==i||!ge(h.current,l))&&(Q=!0),Q&&g.current&&o.unsubscribeFromCriteria(g.current,h.current),g.current=i,h.current=l,Q&&i?a(o.subscribeToCriteria(i,l)):i||a(void 0),()=>{b.current=setTimeout(()=>{a(void 0),i&&o.unsubscribeFromCriteria(i,l)},pn)}},[o,i,l]);let R=q(Q=>{y.current?.(Q.payload)},[]),E=q(()=>{u.current?.()},[]),P=q(()=>{p.current?.()},[]),m=q(Q=>{c.current?.(Q.payload.subscriptionId)},[]),w=q(Q=>{f.current?.(Q.payload.subscriptionId)},[]),O=q(Q=>{d.current?.(Q.payload)},[]);G(()=>s?(x.current||(s.addEventListener("message",R),s.addEventListener("open",E),s.addEventListener("close",P),s.addEventListener("connect",m),s.addEventListener("disconnect",w),s.addEventListener("error",O),x.current=!0),()=>{x.current=!1,s.removeEventListener("message",R),s.removeEventListener("open",E),s.removeEventListener("close",P),s.removeEventListener("connect",m),s.removeEventListener("disconnect",w),s.removeEventListener("error",O)}):()=>{},[s,R,E,P,m,w,O])}function Zt(e){let t=v(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=mn(0),a=fn(l=>{t.search(n,o,{cache:l}).then(S=>s(S.total)).catch(console.error)},[t,n,o]);return ln(()=>{a("default")},[a]),Se(r,()=>{a("reload")}),i}import{resolveId as hn}from"@medplum/core";import{useEffect as yn,useMemo as xe,useState as H}from"react";function be(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 Rn(e){return e.map(t=>{let n=t.searches?t.searches.map(be).join(","):"";return`${t.key}:[${n}]`}).join("|")}function or(e,t){let n=v(),[o,r]=H([]),[i,s]=H(!0),[a,l]=H(),S=Rn(t),x=xe(()=>t,[S]),b=xe(()=>hn(e),[e]);return yn(()=>{if(!b)return;let g=!1,h=`Patient/${b}`,y={_count:100,_sort:"-_lastUpdated"},u=[],p=new Map,c=[];for(let d of x){let R=[];if(d.searches)for(let E of d.searches){let P=be(E),m=p.get(P);m===void 0&&(m=u.length,p.set(P,m),u.push(E)),R.push({searchIdx:m,resultKey:E.key})}c.push(R)}if(u.length===0){r(x.map(()=>({}))),s(!1);return}let f=u.map(d=>{let R=d.patientParam??"subject",E={[R]:h};if(d.query){if(typeof d.query=="string")return n.searchResources(d.resourceType,`${R}=${h}&${d.query}&_count=100&_sort=-_lastUpdated`);if(d.query instanceof URLSearchParams)d.query.forEach((P,m)=>{E[m]=P});else if(Array.isArray(d.query))for(let[P,m]of d.query)E[P]=m;else for(let[P,m]of Object.entries(d.query))m!==void 0&&(E[P]=m)}return n.searchResources(d.resourceType,{...y,...E})});return s(!0),l(void 0),Promise.allSettled(f).then(d=>{if(g)return;let R=c.map(P=>{let m={};for(let{searchIdx:w,resultKey:O}of P){let Q=d[w];m[O]=Q.status==="fulfilled"?Q.value:[]}return m});r(R),s(!1);let E=d.filter(P=>P.status==="rejected");if(E.length>0){console.error("Some patient summary searches failed:",E.map(m=>m.reason));let P=E[0].reason;l(P instanceof Error?P:new Error(String(P)))}}).catch(d=>{g||(l(d instanceof Error?d:new Error(String(d))),s(!1))}),()=>{g=!0}},[n,b,x]),{sectionData:o,loading:i,error:a}}import{isAddPharmacyResponse as gn,isOrganizationArray as In}from"@medplum/core";import{useCallback as Ee}from"react";function cr(e,t){let n=v(),o=Ee(async i=>{let s=await n.executeBot(e,i);if(!In(s))throw new Error("Invalid response from pharmacy search");return s},[n,e]),r=Ee(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary});if(!gn(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:o,addToFavorites:r}}import{useEffect as Sn,useRef as xn}from"react";function fr(e){let t=xn(void 0);return Sn(()=>{t.current=e}),t.current}import{getExtension as Xn}from"@medplum/core";import{useReducer as Yn,useRef as Zn}from"react";import{deepEquals as bn,isReference as ve,isResource as En,normalizeOperationOutcome as Pn}from"@medplum/core";import{useCallback as vn,useEffect as Qn,useState as Tn}from"react";function X(e,t){let n=v(),[o,r]=Tn(()=>Pe(n,e)),i=vn(s=>{bn(s,o)||r(s)},[o]);return Qn(()=>{let s=!0,a=Pe(n,e);return!a&&ve(e)?n.readReference(e).then(l=>{s&&i(l)}).catch(l=>{s&&(i(void 0),t&&t(Pn(l)))}):i(a),(()=>s=!1)},[n,e,i,t]),o}function Pe(e,t){if(t){if(En(t))return t;if(ve(t))return e.getCachedReference(t)}}import{EMPTY as Oe,HTTP_HL7_ORG as U,PropertyType as C,append as Qe,capitalize as Te,deepClone as Cn,evalFhirPathTyped as Z,getExtension as L,getReferenceString as On,getTypedPropertyValueWithoutSchema as V,normalizeErrorString as Mn,splitN as wn,toJsBoolean as An,toTypedValue as Me,typedValueToString as _n}from"@medplum/core";var T={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"},we=`${U}/fhir/StructureDefinition/questionnaire-itemControl`,kn=`${U}/fhir/StructureDefinition/questionnaire-referenceFilter`,Y=`${U}/fhir/StructureDefinition/questionnaire-referenceResource`,Un=`${U}/fhir/StructureDefinition/questionnaire-validationError`,Nn=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,qn=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Ir=`${U}/fhir/StructureDefinition/questionnaire-signatureRequired`,$=`${U}/fhir/StructureDefinition/questionnaireresponse-signature`,Ln=`${U}/fhir/StructureDefinition/questionnaire-hidden`;function Sr(e){return e.type==="choice"||e.type==="open-choice"}function ee(e,t){return{...t,item:Ae(e.item,t.item,t)}}function Ae(e,t,n){if(!t)return t;let o=[];for(let r of t){let i=e?.find(s=>s.linkId===r.linkId);i&&!Wn(i,n)||(i?.item&&r.item?o.push({...r,item:Ae(i.item,r.item,n)}):o.push(r))}return o}function Wn(e,t){if(L(e,Ln)?.valueBoolean===!0)return!1;let o=Dn(e,t);return o!==void 0?o:Fn(e,t)}function Dn(e,t){let n=L(e,Nn);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=Me(t),i=Z(o,[r],{"%resource":r});return An(i)}}}function Fn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=_e(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=zn(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function ne(e,t,n=t.item){for(let o of e){let r=n?.find(i=>i.linkId===o.linkId);r&&(Vn(t,o,r),o.item&&r.item&&ne(o.item,t,r.item))}}function Vn(e,t,n){try{let o=Bn(t,e);if(!o)return;let r=Kn(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:Un,valueString:`Expression evaluation failed: ${Mn(o)}`}]}}var $n={[T.boolean]:[C.boolean],[T.date]:[C.date],[T.dateTime]:[C.dateTime],[T.time]:[C.time],[T.url]:[C.string,C.uri,C.url],[T.attachment]:[C.Attachment],[T.reference]:[C.Reference],[T.quantity]:[C.Quantity],[T.decimal]:[C.decimal,C.integer],[T.integer]:[C.decimal,C.integer]};function Kn(e,t){if(!e.type)return;if(e.type===T.choice||e.type===T.openChoice)return{[`value${Te(t.type)}`]:t.value};if(e.type===T.string||e.type===T.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if($n[e.type]?.includes(t.type))return{[`value${Te(e.type)}`]:t.value}}function Bn(e,t){if(!t)return;let n=L(e,qn);if(n){let o=n.valueExpression?.expression;if(o){let r=Me(t),i=Z(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function xr(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>_n(Ce(s))===r);if(i){let s=Ce(i);s&&o.push({[t]:s.value})}}return o}function _e(e,t){for(let n of e??Oe){if(n.linkId===t)return n.answer;if(n.item){let o=_e(n.item,t);if(o)return o}}}function jn(e,t,n){if(n==="exists")return!!e===t.value;if(e){let o=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=Z(`%actualAnswer ${o} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function zn(e,t,n){let o=t||[],r=Gn(e),i=!1,s=!0;for(let a of o){let l=Hn(a),{operator:S}=e;if(jn(l,r,S)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function br(e){let t=L(e,Y);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function Er(e,t){let n=Cn(e),o=L(n,Y);return!t||t.length===0?(o&&(n.extension=n.extension?.filter(r=>r!==o)),n):(o||(n.extension??=[],o={url:Y},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 Pr(e,t,n){let o=L(e,kn);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[l,S]=wn(a,"=",2);i[l]=S}return i}function te(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??On(e),item:re(e.item,t?.item),status:"in-progress"}}function re(e,t){let n;for(let o of e??Oe){if(o.type===T.display)continue;let r=t?.filter(i=>i.linkId===o.linkId);if(r?.length)for(let i of r)i.id=i.id??ke(),i.text=i.text??o.text,i.item=re(o.item,i.item),i.answer=Ue(o,i),n=Qe(n,i);else n=Qe(n,oe(o))}return n}function oe(e){return{id:ke(),linkId:e.linkId,text:e.text,item:re(e.item,void 0),answer:Ue(e)}}var Jn=1;function ke(){return"id-"+Jn++}function Ue(e,t){if(!(e.type===T.display||e.type===T.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 vr(e){return V({type:"QuestionnaireItemInitial",value:e},"value")}function Ce(e){return V({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Gn(e){return V({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Hn(e){return V({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function wr(e){let t=X(e.questionnaire),n=X(e.defaultValue),[,o]=Yn(y=>y+1,0),r=Zn({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:et(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=te(t,n),h()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=te(t),h()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(y,u){let p=r.current.questionnaireResponse;for(let c of y)p=p?.item?.find(f=>c.id?f.id===c.id:f.linkId===c.linkId);return u&&(p=p?.item?.find(c=>c.linkId===u.linkId)),p}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function a(){r.current.activePage=(r.current.activePage??0)-1,o()}function l(y,u){let p=i(y);p&&(p.item??=[],p.item.push(oe(u)),h())}function S(y,u){let p=i(y,u);p&&(p.answer??=[],p.answer.push({}),h())}function x(y,u,p){let c=i(y,u);c&&(c.answer=p,h())}function b(y){let u=r.current.questionnaireResponse;u&&(y?(u.extension=u.extension??[],u.extension=u.extension.filter(p=>p.url!==$),u.extension.push({url:$,valueSignature:y})):u.extension=u.extension?.filter(p=>p.url!==$),h())}function g(){let y=r.current.questionnaire;if(y?.item){let u=r.current.questionnaireResponse;ne(y.item,u)}}function h(){let y=r.current.questionnaireResponse,u=r.current.questionnaire;!y||!u||(g(),o(),e.onChange?.(ee(u,y)))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:ee(r.current.questionnaire,r.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:nt(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:tt(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:a,onAddGroup:l,onAddAnswer:S,onChangeAnswer:x,onChangeSignature:b}}function et(e){if(!(!e?.item||Xn(e?.item?.[0],we)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,o)=>({linkId:n.linkId,title:n.text??`Page ${o+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??[]}import{allOk as it,normalizeOperationOutcome as st}from"@medplum/core";import{useEffect as at,useMemo as ut,useState as se}from"react";import{useCallback as rt,useEffect as Ne,useRef as ie,useState as ot}from"react";function qe(e,t,n={leading:!1}){let[o,r]=ot(e),i=ie(!1),s=ie(void 0),a=ie(!1),l=rt(()=>window.clearTimeout(s.current),[]);return Ne(()=>{i.current&&(!a.current&&n.leading?(a.current=!0,r(e),s.current=setTimeout(()=>{a.current=!1},t)):(l(),s.current=setTimeout(()=>{a.current=!1,r(e)},t)))},[e,n.leading,t,l]),Ne(()=>(i.current=!0,l),[l]),[o,l]}var ct=250;function Wr(e,t,n){return ae("search",e,t,n)}function Dr(e,t,n){return ae("searchOne",e,t,n)}function Fr(e,t,n){return ae("searchResources",e,t,n)}function ae(e,t,n,o){let r=v(),[i,s]=se(!1),[a,l]=se(),[S,x]=se(),b=r.fhirSearchUrl(t,n).toString(),g=ut(()=>({resourceType:t,query:n}),[b]),h=o?.enabled??!0,y=o?.debounceMs??ct,[u]=qe(g,y,{leading:!0});return at(()=>{if(!h)return()=>{};s(!0);let p=!0;return r[e](u.resourceType,u.query).then(c=>{p&&(s(!1),l(c),x(it))}).catch(c=>{p&&(s(!1),l(void 0),x(st(c)))}),()=>{p=!1}},[r,e,u,h]),[a,i,S]}import{OperationOutcomeError as dt}from"@medplum/core";import{useCallback as pt}from"react";function jr(){let e=v();return pt(async t=>{try{await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t})}catch(n){if(n instanceof dt&&n.outcome.issue?.some(o=>o.code==="not-found"))return;throw n}},[e])}import{getReferenceString as ft}from"@medplum/core";import{useCallback as lt,useEffect as Le,useState as W}from"react";function Xr({query:e,threadId:t}){let n=v(),[o,r]=W(!0),[i,s]=W([]),[a,l]=W(void 0),[S,x]=W(null),[b,g]=W(void 0),h=lt(async()=>{let p=new URLSearchParams(e);p.append("identifier:not","http://medplum.com/ai-message|"),p.append("part-of:missing","true"),p.append("_has:Communication:part-of:_id:not","null");let c=await n.search("Communication",p.toString(),{cache:"no-cache"}),f=c.entry?.map(m=>m.resource).filter(m=>m!==void 0)||[];if(c.total!==void 0&&g(c.total),f.length===0){s([]);return}let R=`
2
2
  query {
3
- ${y.map(l=>{let O=`thread_${l.id?.replaceAll("-","")||""}`,E=ot(l);return`
3
+ ${f.map(m=>{let O=`thread_${m.id?.replaceAll("-","")||""}`,Q=ft(m);return`
4
4
  ${O}: CommunicationList(
5
- part_of: "${E}"
5
+ part_of: "${Q}"
6
6
  _sort: "-sent"
7
7
  _count: 1
8
8
  ) {
@@ -26,5 +26,38 @@ import{useEffect as De,useMemo as Fe,useState as We}from"react";import{createCon
26
26
  `}).join(`
27
27
  `)}
28
28
  }
29
- `,v=await n.graphql(I),m=y.map(l=>{let O=`thread_${l.id?.replaceAll("-","")||""}`,E=v.data[O],D=E&&E.length>0?E[0]:void 0;return[l,D]}).filter(l=>l[1]!==void 0);s(m)},[n,e]);return Ae(()=>{r(!0),h().catch(f=>{x(f)}).finally(()=>{r(!1)})},[h]),Ae(()=>{(async()=>{if(!t){p(void 0);return}let u=i.find(d=>d[0].id===t);if(u){p(u[0]);return}let y=await n.readResource("Communication",t);if(y.partOf===void 0)p(y);else{let d=y.partOf[0].reference;if(d){let I=await n.readReference({reference:d});p(I)}}})().catch(u=>{x(u)})},[t,i,n]),{loading:o,error:S,threadMessages:i,selectedThread:c,total:g,addThreadMessage:f=>{(async()=>{await h(),s(y=>[[f,void 0],...y])})().catch(y=>x(y))},handleThreadStatusChange:f=>{if(!c)return;(async()=>{let y=await n.updateResource({...c,status:f});p(y),s(d=>d.map(([I,v])=>I.id===y.id?[y,v]:[I,v]))})().catch(y=>x(y))},refreshThreadMessages:h}}import{ReconnectingWebSocket as st}from"@medplum/core";import{useCallback as A,useEffect as _e,useRef as N,useState as oe}from"react";function Kr({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n}){let o=Q(),r=N(n);_e(()=>{r.current=n},[n]);let[i,s]=oe("idle"),[c,p]=oe(void 0),[S,x]=oe([]),g=N(void 0),b=N(void 0),h=N(void 0),R=N(void 0),a=A(()=>{R.current?.disconnect(),R.current=void 0,h.current?.close().catch(()=>{}),h.current=void 0,b.current?.getTracks().forEach(m=>m.stop()),b.current=void 0,g.current?.close(),g.current=void 0,s("disconnected")},[]),f=A(()=>{g.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]),u=A(()=>{let m=b.current,l=g.current;if(!m||!l)return;let P=new AudioContext({sampleRate:24e3}),O=P.createMediaStreamSource(m),E=P.createScriptProcessor(4096,1,1);E.onaudioprocess=D=>{if(l.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let Ue=D.inputBuffer.getChannelData(0),ke=at(Ue),Ne=btoa(String.fromCharCode(...ke));l.send(JSON.stringify({type:"input_audio_buffer.append",audio:Ne}))},O.connect(E),E.connect(P.destination),h.current=P,R.current=E,s("listening")},[]),y=A(m=>{switch(m.type){case"session.created":f();break;case"session.updated":u();break;case"input_audio_buffer.speech_started":s("speech_started");break;case"input_audio_buffer.speech_stopped":s("speech_stopped");break;case"conversation.item.input_audio_transcription.completed":case"input_audio_transcription.completed":if(m.transcript){let l={text:m.transcript,timestamp:new Date().toISOString()};x(P=>[...P,l]),r.current?.(m.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",m),p(m),s("error");break;default:console.debug("[useWhisper] unhandled message",m.type,m);break}},[f,u]),d=A(async()=>{s("requesting_microphone");let m=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return b.current=m,m},[]),I=A(()=>{s("connecting");let m=ut(o.getBaseUrl());console.debug("[useWhisper] connecting to",m);let l=new st(m);return g.current=l,l.onopen=()=>s("connected"),l.onmessage=P=>y(JSON.parse(P.data)),l.onerror=P=>{p(P),s("error"),a()},l.onclose=()=>s("disconnected"),l.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()})),l},[o,y,a]),v=A(async()=>{try{p(void 0),await d(),I()}catch(m){p(m),s("error"),a()}},[d,I,a]);return _e(()=>()=>a(),[a]),{status:i,error:c,transcripts:S,start:v,stop:a,isListening:i==="listening"||i==="speech_started"||i==="speech_stopped"}}function at(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 ut(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}export{mt as MedplumProvider,On as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,Cn as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,Mn as QUESTIONNAIRE_HIDDEN_URL,Qe as QUESTIONNAIRE_ITEM_CONTROL_URL,Pn as QUESTIONNAIRE_REFERENCE_FILTER_URL,J as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,ar as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,L as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,Tn as QUESTIONNAIRE_VALIDATION_ERROR_URL,T as QuestionnaireItemType,Y as buildInitialResponse,ee as buildInitialResponseItem,at as convertToPCM16,X as evaluateCalculatedExpressionsInQuestionnaire,be as getItemAnswerOptionValue,Wn as getItemEnableWhenValueAnswer,lr as getItemInitialValue,cr as getNewMultiSelectValues,fr as getQuestionnaireItemReferenceFilter,dr as getQuestionnaireItemReferenceTargetTypes,Vn as getResponseItemAnswerValue,ur as isChoiceQuestion,wn as isQuestionEnabled,F as reactContext,H as removeDisabledItems,pr as setQuestionnaireItemReferenceTargetTypes,Nn as typedValueToResponseItem,gt as useCachedBinaryUrl,bt as useMedicationIFrame,Tt as useMedicationOrder,At as useMedicationOrderSet,Q as useMedplum,W as useMedplumContext,dt as useMedplumNavigate,ie as useMedplumProfile,Wt as useNotificationCount,jt as usePatientSummaryData,Xt as usePharmacySearch,er as usePrevious,Ir as useQuestionnaireForm,z as useResource,Tr as useSearch,Cr as useSearchOne,Or as useSearchResources,me as useSubscription,Ur as useSyncOrderSet,Dr as useThreadInbox,Kr as useWhisper};
29
+ `,E=await n.graphql(R),P=f.map(m=>{let O=`thread_${m.id?.replaceAll("-","")||""}`,Q=E.data[O],D=Q&&Q.length>0?Q[0]:void 0;return[m,D]}).filter(m=>m[1]!==void 0);s(P)},[n,e]);return Le(()=>{r(!0),h().catch(p=>{x(p)}).finally(()=>{r(!1)})},[h]),Le(()=>{(async()=>{if(!t){l(void 0);return}let c=i.find(d=>d[0].id===t);if(c){l(c[0]);return}let f=await n.readResource("Communication",t);if(f.partOf===void 0)l(f);else{let d=f.partOf[0].reference;if(d){let R=await n.readReference({reference:d});l(R)}}})().catch(c=>{x(c)})},[t,i,n]),{loading:o,error:S,threadMessages:i,selectedThread:a,total:b,addThreadMessage:p=>{(async()=>{await h(),s(f=>[[p,void 0],...f])})().catch(f=>x(f))},handleThreadStatusChange:p=>{if(!a)return;(async()=>{let f=await n.updateResource({...a,status:p});l(f),s(d=>d.map(([R,E])=>R.id===f.id?[f,E]:[R,E]))})().catch(f=>x(f))},refreshThreadMessages:h}}import{ReconnectingWebSocket as mt,sleep as ht}from"@medplum/core";import{useCallback as _,useEffect as ue,useRef as N,useState as ce}from"react";var yt=12e4;function to({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:o=yt}){let r=v(),i=N(n);ue(()=>{i.current=n},[n]);let[s,a]=ce("idle"),[l,S]=ce(void 0),[x,b]=ce([]),g=N(void 0),h=N(void 0),y=N(void 0),u=N(void 0),p=N(!1),c=N(!1),f=N(!1),d=_(()=>{f.current=!1,u.current?.disconnect(),u.current=void 0,y.current?.close().catch(()=>{}),y.current=void 0,h.current?.getTracks().forEach(I=>I.stop()),h.current=void 0,a(g.current?"idle":"disconnected")},[]),R=_(()=>{d(),g.current?.close(),g.current=void 0,c.current=!1,a("disconnected")},[d]),E=_(()=>{g.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]),P=_(async()=>{if(!(u.current||p.current)&&!(!h.current||!g.current)){p.current=!0;try{let I=new AudioContext({sampleRate:24e3});await I.audioWorklet.addModule(St());let M=h.current,k=g.current;if(!f.current||!M||!k){await I.close().catch(()=>{});return}let Fe=I.createMediaStreamSource(M),F=new AudioWorkletNode(I,We);F.port.onmessage=Ve=>{if(k.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let $e=Rt(Ve.data),Ke=btoa(String.fromCharCode(...$e));k.send(JSON.stringify({type:"input_audio_buffer.append",audio:Ke}))},Fe.connect(F),F.connect(I.destination),y.current=I,u.current=F,a("listening")}catch(I){S(I),a("error"),d()}finally{p.current=!1}}},[d]),m=_(()=>{f.current&&c.current&&h.current&&(u.current||(g.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),P().catch(()=>{})))},[P]),w=_(I=>{switch(I.type){case"session.created":E();break;case"session.updated":c.current=!0,m();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(I.transcript){let M={text:I.transcript,timestamp:new Date().toISOString()};b(k=>[...k,M]),i.current?.(I.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",I),S(I),a("error");break;default:console.debug("[useWhisper] unhandled message",I.type,I);break}},[E,m]),O=_(async()=>{a("requesting_microphone");let I=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return h.current=I,I},[]),Q=_(()=>{a("connecting");let I=gt(r.getBaseUrl());console.debug("[useWhisper] connecting to",I);let M=new mt(I);return g.current=M,M.onopen=()=>{c.current=!1,f.current?a("connected"):a("idle"),M.send(JSON.stringify({type:"ai-realtime:connect",accessToken:r.getAccessToken()}))},M.onmessage=k=>w(JSON.parse(k.data)),M.onerror=k=>{f.current&&(S(k),R(),a("error"))},M.onclose=()=>{c.current=!1,g.current&&a(f.current?"connecting":"idle")},M},[r,w,R]),D=_(()=>g.current??Q(),[Q]),De=_(async()=>{try{S(void 0),f.current=!0,D(),await O(),m()}catch(I){S(I),a("error"),d()}},[O,D,d,m]);return ue(()=>{if(s!=="idle"||!g.current||!Number.isFinite(o)||o<=0)return;let I=new AbortController;return ht(o,{signal:I.signal}).then(()=>R()).catch(()=>{}),()=>I.abort()},[s,o,R]),ue(()=>()=>R(),[R]),{status:s,error:l,transcripts:x,start:De,stop:d,isListening:s==="listening"||s==="speech_started"||s==="speech_stopped"}}function Rt(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 gt(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var We="medplum-pcm-worklet",It=`
30
+ class PcmWorkletProcessor extends AudioWorkletProcessor {
31
+ constructor() {
32
+ super();
33
+ this.chunks = [];
34
+ this.length = 0;
35
+ this.targetLength = 4096;
36
+ }
37
+
38
+ process(inputs) {
39
+ const channel = inputs[0] && inputs[0][0];
40
+ if (!channel) {
41
+ return true;
42
+ }
43
+ // The render quantum buffer is reused between calls, so copy it.
44
+ this.chunks.push(new Float32Array(channel));
45
+ this.length += channel.length;
46
+ if (this.length >= this.targetLength) {
47
+ const merged = new Float32Array(this.length);
48
+ let offset = 0;
49
+ for (const chunk of this.chunks) {
50
+ merged.set(chunk, offset);
51
+ offset += chunk.length;
52
+ }
53
+ this.port.postMessage(merged, [merged.buffer]);
54
+ this.chunks = [];
55
+ this.length = 0;
56
+ }
57
+ return true;
58
+ }
59
+ }
60
+
61
+ registerProcessor('${We}', PcmWorkletProcessor);
62
+ `,de;function St(){if(!de){let e=new Blob([It],{type:"application/javascript"});de=URL.createObjectURL(e)}return de}export{Qt as MedplumProvider,qn as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,Nn as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,Ln as QUESTIONNAIRE_HIDDEN_URL,we as QUESTIONNAIRE_ITEM_CONTROL_URL,kn as QUESTIONNAIRE_REFERENCE_FILTER_URL,Y as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,Ir as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,$ as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,Un as QUESTIONNAIRE_VALIDATION_ERROR_URL,T as QuestionnaireItemType,te as buildInitialResponse,oe as buildInitialResponseItem,Rt as convertToPCM16,ne as evaluateCalculatedExpressionsInQuestionnaire,Ce as getItemAnswerOptionValue,Gn as getItemEnableWhenValueAnswer,vr as getItemInitialValue,xr as getNewMultiSelectValues,Pr as getQuestionnaireItemReferenceFilter,br as getQuestionnaireItemReferenceTargetTypes,Hn as getResponseItemAnswerValue,Sr as isChoiceQuestion,Wn as isQuestionEnabled,K as reactContext,ee as removeDisabledItems,Er as setQuestionnaireItemReferenceTargetTypes,Kn as typedValueToResponseItem,Mt as useCachedBinaryUrl,kt as useMedicationIFrame,Wt as useMedicationOrder,Kt as useMedicationOrderSet,v as useMedplum,B as useMedplumContext,bt as useMedplumNavigate,pe as useMedplumProfile,Zt as useNotificationCount,or as usePatientSummaryData,cr as usePharmacySearch,fr as usePrevious,wr as useQuestionnaireForm,X as useResource,Wr as useSearch,Dr as useSearchOne,Fr as useSearchResources,Se as useSubscription,jr as useSyncOrderSet,Xr as useThreadInbox,to as useWhisper};
30
63
  //# sourceMappingURL=index.mjs.map