@medplum/react-hooks 5.1.11 → 5.1.13

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.
@@ -36,6 +36,8 @@ export declare function buildInitialResponse(questionnaire: Questionnaire, quest
36
36
 
37
37
  export declare function buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem;
38
38
 
39
+ export declare function convertToPCM16(float32Array: Float32Array): Uint8Array;
40
+
39
41
  export declare interface EPrescribingIFrameOptions {
40
42
  readonly patientId?: string;
41
43
  readonly onPatientSyncSuccess?: () => void;
@@ -275,6 +277,11 @@ export declare type SectionResults = Record<string, Resource[]>;
275
277
 
276
278
  export declare function setQuestionnaireItemReferenceTargetTypes(item: QuestionnaireItem, targetTypes: ResourceType[] | undefined): QuestionnaireItem;
277
279
 
280
+ export declare type TranscriptItem = {
281
+ text: string;
282
+ timestamp: string;
283
+ };
284
+
278
285
  export declare function typedValueToResponseItem(item: QuestionnaireItem, value: TypedValue): QuestionnaireResponseItemAnswer | undefined;
279
286
 
280
287
  export declare const useCachedBinaryUrl: (binaryUrl: string | undefined) => string | undefined;
@@ -486,4 +493,23 @@ export declare interface UseThreadInboxReturn {
486
493
  refreshThreadMessages: () => Promise<void>;
487
494
  }
488
495
 
496
+ export declare function useWhisper({ language, model, onTranscript, }: UseWhisperOptions): UseWhisperResult;
497
+
498
+ export declare type UseWhisperOptions = {
499
+ language?: string;
500
+ model?: string;
501
+ onTranscript?: (text: string) => void;
502
+ };
503
+
504
+ export declare type UseWhisperResult = {
505
+ status: WhisperStatus;
506
+ error: unknown;
507
+ transcripts: TranscriptItem[];
508
+ start: () => Promise<void>;
509
+ stop: () => void;
510
+ isListening: boolean;
511
+ };
512
+
513
+ export declare type WhisperStatus = 'idle' | 'requesting_microphone' | 'connecting' | 'connected' | 'listening' | 'speech_started' | 'speech_stopped' | 'disconnected' | 'error';
514
+
489
515
  export { }
@@ -36,6 +36,8 @@ export declare function buildInitialResponse(questionnaire: Questionnaire, quest
36
36
 
37
37
  export declare function buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem;
38
38
 
39
+ export declare function convertToPCM16(float32Array: Float32Array): Uint8Array;
40
+
39
41
  export declare interface EPrescribingIFrameOptions {
40
42
  readonly patientId?: string;
41
43
  readonly onPatientSyncSuccess?: () => void;
@@ -275,6 +277,11 @@ export declare type SectionResults = Record<string, Resource[]>;
275
277
 
276
278
  export declare function setQuestionnaireItemReferenceTargetTypes(item: QuestionnaireItem, targetTypes: ResourceType[] | undefined): QuestionnaireItem;
277
279
 
280
+ export declare type TranscriptItem = {
281
+ text: string;
282
+ timestamp: string;
283
+ };
284
+
278
285
  export declare function typedValueToResponseItem(item: QuestionnaireItem, value: TypedValue): QuestionnaireResponseItemAnswer | undefined;
279
286
 
280
287
  export declare const useCachedBinaryUrl: (binaryUrl: string | undefined) => string | undefined;
@@ -486,4 +493,23 @@ export declare interface UseThreadInboxReturn {
486
493
  refreshThreadMessages: () => Promise<void>;
487
494
  }
488
495
 
496
+ export declare function useWhisper({ language, model, onTranscript, }: UseWhisperOptions): UseWhisperResult;
497
+
498
+ export declare type UseWhisperOptions = {
499
+ language?: string;
500
+ model?: string;
501
+ onTranscript?: (text: string) => void;
502
+ };
503
+
504
+ export declare type UseWhisperResult = {
505
+ status: WhisperStatus;
506
+ error: unknown;
507
+ transcripts: TranscriptItem[];
508
+ start: () => Promise<void>;
509
+ stop: () => void;
510
+ isListening: boolean;
511
+ };
512
+
513
+ export declare type WhisperStatus = 'idle' | 'requesting_microphone' | 'connecting' | 'connected' | 'listening' | 'speech_started' | 'speech_stopped' | 'disconnected' | 'error';
514
+
489
515
  export { }
@@ -1,8 +1,8 @@
1
- import{useEffect as Te,useMemo as Pe,useState as Ce}from"react";import{createContext as be,useContext as ve}from"react";var F=be(void 0);function q(){return ve(F)}function b(){return q().medplum}function _n(){return q().navigate}function Fn(){return q().profile}import{jsx as we}from"react/jsx-runtime";var Z=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function Vn(e){let t=e.medplum,n=e.navigate??Oe,[o,r]=Ce({profile:t.getProfile(),loading:t.isLoading()});Te(()=>{function s(){r(c=>({...c,profile:t.getProfile(),loading:t.isLoading()}))}for(let c of Z)t.addEventListener(c,s);return()=>{for(let c of Z)t.removeEventListener(c,s)}},[t]);let i=Pe(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return we(F.Provider,{value:i,children:e.children})}function Oe(e){window.location.assign(e)}import{useMemo as Ae}from"react";var ee=new Map,Bn=e=>Ae(()=>{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=ee.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 ee.set(t,e),e},[e]);import{useEffect as ne,useRef as k,useState as Me}from"react";function Jn(e,t,n){let o=b(),{patientId:r,onPatientSyncSuccess:i,onIframeSuccess:s,onError:c}=n,[d,S]=Me(void 0),h=k(i),E=k(s),v=k(c);return ne(()=>{h.current=i,E.current=s,v.current=c},[i,s,c]),ne(()=>{let y=!1;return(async()=>{try{if(r){if(await o.executeBot(e,{patientId:r}),y)return;h.current?.()}let u=await o.executeBot(t,{patientId:r});if(y)return;u.url&&(S(u.url),E.current?.(u.url))}catch(u){y||v.current?.(u)}})().catch(()=>{}),()=>{y=!0}},[o,e,t,r]),d}import{useCallback as Ue,useEffect as Le,useState as _e}from"react";import{deepEquals as te}from"@medplum/core";import{useCallback as A,useEffect as D,useRef as C,useState as re}from"react";var Ne=3e3;function oe(e,t,n){let o=b(),[r,i]=re(),[s,c]=re(n?.subscriptionProps),d=C(!1),S=C(void 0),h=C(void 0),E=C(void 0),v=C(t);v.current=t;let y=C(n?.onWebSocketOpen);y.current=n?.onWebSocketOpen;let m=C(n?.onWebSocketClose);m.current=n?.onWebSocketClose;let u=C(n?.onSubscriptionConnect);u.current=n?.onSubscriptionConnect;let a=C(n?.onSubscriptionDisconnect);a.current=n?.onSubscriptionDisconnect;let l=C(n?.onError);l.current=n?.onError,D(()=>{te(n?.subscriptionProps,s)||c(n?.subscriptionProps)},[s,n]),D(()=>{S.current&&(clearTimeout(S.current),S.current=void 0);let T=!1;return(h.current!==e||!te(E.current,s))&&(T=!0),T&&h.current&&o.unsubscribeFromCriteria(h.current,E.current),h.current=e,E.current=s,T&&e?i(o.subscribeToCriteria(e,s)):e||i(void 0),()=>{S.current=setTimeout(()=>{i(void 0),e&&o.unsubscribeFromCriteria(e,s)},Ne)}},[o,e,s]);let R=A(T=>{v.current?.(T.payload)},[]),p=A(()=>{y.current?.()},[]),x=A(()=>{m.current?.()},[]),I=A(T=>{u.current?.(T.payload.subscriptionId)},[]),g=A(T=>{a.current?.(T.payload.subscriptionId)},[]),f=A(T=>{l.current?.(T.payload)},[]);D(()=>r?(d.current||(r.addEventListener("message",R),r.addEventListener("open",p),r.addEventListener("close",x),r.addEventListener("connect",I),r.addEventListener("disconnect",g),r.addEventListener("error",f),d.current=!0),()=>{d.current=!1,r.removeEventListener("message",R),r.removeEventListener("open",p),r.removeEventListener("close",x),r.removeEventListener("connect",I),r.removeEventListener("disconnect",g),r.removeEventListener("error",f)}):()=>{},[r,R,p,x,I,g,f])}function ot(e){let t=b(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=_e(0),c=Ue(d=>{t.search(n,o,{cache:d}).then(S=>s(S.total)).catch(console.error)},[t,n,o]);return Le(()=>{c("default")},[c]),oe(r,()=>{c("reload")}),i}import{resolveId as Fe}from"@medplum/core";import{useEffect as qe,useMemo as ie,useState as V}from"react";function se(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 ke(e){return e.map(t=>{let n=t.searches?t.searches.map(se).join(","):"";return`${t.key}:[${n}]`}).join("|")}function ct(e,t){let n=b(),[o,r]=V([]),[i,s]=V(!0),[c,d]=V(),S=ke(t),h=ie(()=>t,[S]),E=ie(()=>Fe(e),[e]);return qe(()=>{if(!E)return;let v=!1,y=`Patient/${E}`,m={_count:100,_sort:"-_lastUpdated"},u=[],a=new Map,l=[];for(let p of h){let x=[];if(p.searches)for(let I of p.searches){let g=se(I),f=a.get(g);f===void 0&&(f=u.length,a.set(g,f),u.push(I)),x.push({searchIdx:f,resultKey:I.key})}l.push(x)}if(u.length===0){r(h.map(()=>({}))),s(!1);return}let R=u.map(p=>{let x=p.patientParam??"subject",I={[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((g,f)=>{I[f]=g});else if(Array.isArray(p.query))for(let[g,f]of p.query)I[g]=f;else for(let[g,f]of Object.entries(p.query))f!==void 0&&(I[g]=f)}return n.searchResources(p.resourceType,{...m,...I})});return s(!0),d(void 0),Promise.allSettled(R).then(p=>{if(v)return;let x=l.map(g=>{let f={};for(let{searchIdx:T,resultKey:N}of g){let w=p[T];f[N]=w.status==="fulfilled"?w.value:[]}return f});r(x),s(!1);let I=p.filter(g=>g.status==="rejected");if(I.length>0){console.error("Some patient summary searches failed:",I.map(f=>f.reason));let g=I[0].reason;d(g instanceof Error?g:new Error(String(g)))}}).catch(p=>{v||(d(p instanceof Error?p:new Error(String(p))),s(!1))}),()=>{v=!0}},[n,E,h]),{sectionData:o,loading:i,error:c}}import{isAddPharmacyResponse as De,isOrganizationArray as Ve}from"@medplum/core";import{useCallback as ue}from"react";function mt(e,t){let n=b(),o=ue(async i=>{let s=await n.executeBot(e,i);if(!Ve(s))throw new Error("Invalid response from pharmacy search");return s},[n,e]),r=ue(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary});if(!De(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:o,addToFavorites:r}}import{useEffect as We,useRef as $e}from"react";function ht(e){let t=$e(void 0);return We(()=>{t.current=e}),t.current}import{getExtension as Sn}from"@medplum/core";import{useReducer as xn,useRef as Qn}from"react";import{deepEquals as Ke,isReference as ce,isResource as Be,normalizeOperationOutcome as je}from"@medplum/core";import{useCallback as ze,useEffect as Ge,useState as Je}from"react";function W(e,t){let n=b(),[o,r]=Je(()=>ae(n,e)),i=ze(s=>{Ke(s,o)||r(s)},[o]);return Ge(()=>{let s=!0,c=ae(n,e);return!c&&ce(e)?n.readReference(e).then(d=>{s&&i(d)}).catch(d=>{s&&(i(void 0),t&&t(je(d)))}):i(c),(()=>s=!1)},[n,e,i,t]),o}function ae(e,t){if(t){if(Be(t))return t;if(ce(t))return e.getCachedReference(t)}}import{EMPTY as le,HTTP_HL7_ORG as O,PropertyType as P,append as de,capitalize as pe,deepClone as He,evalFhirPathTyped as K,getExtension as M,getReferenceString as Xe,getTypedPropertyValueWithoutSchema as L,normalizeErrorString as Ye,splitN as Ze,toJsBoolean as en,toTypedValue as me,typedValueToString as nn}from"@medplum/core";var Q={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"},Re=`${O}/fhir/StructureDefinition/questionnaire-itemControl`,tn=`${O}/fhir/StructureDefinition/questionnaire-referenceFilter`,$=`${O}/fhir/StructureDefinition/questionnaire-referenceResource`,rn=`${O}/fhir/StructureDefinition/questionnaire-validationError`,on=`${O}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,sn=`${O}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,bt=`${O}/fhir/StructureDefinition/questionnaire-signatureRequired`,_=`${O}/fhir/StructureDefinition/questionnaireresponse-signature`,un=`${O}/fhir/StructureDefinition/questionnaire-hidden`;function vt(e){return e.type==="choice"||e.type==="open-choice"}function B(e,t){return{...t,item:ye(e.item,t.item,t)}}function ye(e,t,n){if(!t)return t;let o=[];for(let r of t){let i=e?.find(s=>s.linkId===r.linkId);i&&!an(i,n)||(i?.item&&r.item?o.push({...r,item:ye(i.item,r.item,n)}):o.push(r))}return o}function an(e,t){if(M(e,un)?.valueBoolean===!0)return!1;let o=cn(e,t);return o!==void 0?o:dn(e,t)}function cn(e,t){let n=M(e,on);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=me(t),i=K(o,[r],{"%resource":r});return en(i)}}}function dn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=he(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=yn(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function j(e,t,n=t.item){for(let o of e){let r=n?.find(i=>i.linkId===o.linkId);r&&(pn(t,o,r),o.item&&r.item&&j(o.item,t,r.item))}}function pn(e,t,n){try{let o=mn(t,e);if(!o)return;let r=ln(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:rn,valueString:`Expression evaluation failed: ${Ye(o)}`}]}}var fn={[Q.boolean]:[P.boolean],[Q.date]:[P.date],[Q.dateTime]:[P.dateTime],[Q.time]:[P.time],[Q.url]:[P.string,P.uri,P.url],[Q.attachment]:[P.Attachment],[Q.reference]:[P.Reference],[Q.quantity]:[P.Quantity],[Q.decimal]:[P.decimal,P.integer],[Q.integer]:[P.decimal,P.integer]};function ln(e,t){if(!e.type)return;if(e.type===Q.choice||e.type===Q.openChoice)return{[`value${pe(t.type)}`]:t.value};if(e.type===Q.string||e.type===Q.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(fn[e.type]?.includes(t.type))return{[`value${pe(e.type)}`]:t.value}}function mn(e,t){if(!t)return;let n=M(e,sn);if(n){let o=n.valueExpression?.expression;if(o){let r=me(t),i=K(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function Tt(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>nn(fe(s))===r);if(i){let s=fe(i);s&&o.push({[t]:s.value})}}return o}function he(e,t){for(let n of e??le){if(n.linkId===t)return n.answer;if(n.item){let o=he(n.item,t);if(o)return o}}}function Rn(e,t,n){if(n==="exists")return!!e===t.value;if(e){let o=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=K(`%actualAnswer ${o} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function yn(e,t,n){let o=t||[],r=gn(e),i=!1,s=!0;for(let c of o){let d=In(c),{operator:S}=e;if(Rn(d,r,S)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function Pt(e){let t=M(e,$);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function Ct(e,t){let n=He(e),o=M(n,$);return!t||t.length===0?(o&&(n.extension=n.extension?.filter(r=>r!==o)),n):(o||(n.extension??=[],o={url:$},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 Ot(e,t,n){let o=M(e,tn);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[d,S]=Ze(c,"=",2);i[d]=S}return i}function z(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??Xe(e),item:G(e.item,t?.item),status:"in-progress"}}function G(e,t){let n;for(let o of e??le){if(o.type===Q.display)continue;let r=t?.filter(i=>i.linkId===o.linkId);if(r?.length)for(let i of r)i.id=i.id??ge(),i.text=i.text??o.text,i.item=G(o.item,i.item),i.answer=Ie(o,i),n=de(n,i);else n=de(n,J(o))}return n}function J(e){return{id:ge(),linkId:e.linkId,text:e.text,item:G(e.item,void 0),answer:Ie(e)}}var hn=1;function ge(){return"id-"+hn++}function Ie(e,t){if(!(e.type===Q.display||e.type===Q.group)){if(t?.answer&&t.answer.length>0)return t.answer;if(e.initial&&e.initial.length>0)return e.initial.map(n=>({...n}));if(e.answerOption)return e.answerOption.filter(n=>n.initialSelected).map(n=>({...n,initialSelected:void 0}))}}function wt(e){return L({type:"QuestionnaireItemInitial",value:e},"value")}function fe(e){return L({type:"QuestionnaireItemAnswerOption",value:e},"value")}function gn(e){return L({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function In(e){return L({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function _t(e){let t=W(e.questionnaire),n=W(e.defaultValue),[,o]=xn(m=>m+1,0),r=Qn({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:En(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=z(t,n),y()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=z(t),y()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(m,u){let a=r.current.questionnaireResponse;for(let l of m)a=a?.item?.find(R=>l.id?R.id===l.id:R.linkId===l.linkId);return u&&(a=a?.item?.find(l=>l.linkId===u.linkId)),a}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function c(){r.current.activePage=(r.current.activePage??0)-1,o()}function d(m,u){let a=i(m);a&&(a.item??=[],a.item.push(J(u)),y())}function S(m,u){let a=i(m,u);a&&(a.answer??=[],a.answer.push({}),y())}function h(m,u,a){let l=i(m,u);l&&(l.answer=a,y())}function E(m){let u=r.current.questionnaireResponse;u&&(m?(u.extension=u.extension??[],u.extension=u.extension.filter(a=>a.url!==_),u.extension.push({url:_,valueSignature:m})):u.extension=u.extension?.filter(a=>a.url!==_),y())}function v(){let m=r.current.questionnaire;if(m?.item){let u=r.current.questionnaireResponse;j(m.item,u)}}function y(){let m=r.current.questionnaireResponse,u=r.current.questionnaire;!m||!u||(v(),o(),e.onChange?.(B(u,m)))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:B(r.current.questionnaire,r.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:bn(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:vn(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:c,onAddGroup:d,onAddAnswer:S,onChangeAnswer:h,onChangeSignature:E}}function En(e){if(!(!e?.item||Sn(e?.item?.[0],Re)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,o)=>({linkId:n.linkId,title:n.text??`Page ${o+1}`,group:n}))}function bn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function vn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{allOk as Cn,normalizeOperationOutcome as On}from"@medplum/core";import{useEffect as wn,useMemo as An,useState as X}from"react";import{useCallback as Tn,useEffect as Se,useRef as H,useState as Pn}from"react";function xe(e,t,n={leading:!1}){let[o,r]=Pn(e),i=H(!1),s=H(void 0),c=H(!1),d=Tn(()=>window.clearTimeout(s.current),[]);return Se(()=>{i.current&&(!c.current&&n.leading?(c.current=!0,r(e),s.current=setTimeout(()=>{c.current=!1},t)):(d(),s.current=setTimeout(()=>{c.current=!1,r(e)},t)))},[e,n.leading,t,d]),Se(()=>(i.current=!0,d),[d]),[o,d]}var Mn=250;function Kt(e,t,n){return Y("search",e,t,n)}function Bt(e,t,n){return Y("searchOne",e,t,n)}function jt(e,t,n){return Y("searchResources",e,t,n)}function Y(e,t,n,o){let r=b(),[i,s]=X(!1),[c,d]=X(),[S,h]=X(),E=r.fhirSearchUrl(t,n).toString(),v=An(()=>({resourceType:t,query:n}),[E]),y=o?.enabled??!0,m=o?.debounceMs??Mn,[u]=xe(v,m,{leading:!0});return wn(()=>{if(!y)return()=>{};s(!0);let a=!0;return r[e](u.resourceType,u.query).then(l=>{a&&(s(!1),d(l),h(Cn))}).catch(l=>{a&&(s(!1),d(void 0),h(On(l)))}),()=>{a=!1}},[r,e,u,y]),[c,i,S]}import{getReferenceString as Nn}from"@medplum/core";import{useCallback as Un,useEffect as Qe,useState as U}from"react";function Xt({query:e,threadId:t}){let n=b(),[o,r]=U(!0),[i,s]=U([]),[c,d]=U(void 0),[S,h]=U(null),[E,v]=U(void 0),y=Un(async()=>{let a=new URLSearchParams(e);a.append("identifier:not","http://medplum.com/ai-message|"),a.append("part-of:missing","true"),a.append("_has:Communication:part-of:_id:not","null");let l=await n.search("Communication",a.toString(),{cache:"no-cache"}),R=l.entry?.map(f=>f.resource).filter(f=>f!==void 0)||[];if(l.total!==void 0&&v(l.total),R.length===0){s([]);return}let x=`
1
+ import{useEffect as Me,useMemo as ke,useState as Ue}from"react";import{createContext as Ae,useContext as _e}from"react";var W=Ae(void 0);function D(){return _e(W)}function v(){return D().medplum}function jn(){return D().navigate}function zn(){return D().profile}import{jsx as Le}from"react/jsx-runtime";var re=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function Xn(e){let t=e.medplum,n=e.navigate??Ne,[o,r]=Ue({profile:t.getProfile(),loading:t.isLoading()});Me(()=>{function s(){r(f=>({...f,profile:t.getProfile(),loading:t.isLoading()}))}for(let f of re)t.addEventListener(f,s);return()=>{for(let f of re)t.removeEventListener(f,s)}},[t]);let i=ke(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return Le(W.Provider,{value:i,children:e.children})}function Ne(e){window.location.assign(e)}import{useMemo as qe}from"react";var oe=new Map,nt=e=>qe(()=>{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]);import{useEffect as ie,useRef as V,useState as Fe}from"react";function it(e,t,n){let o=v(),{patientId:r,onPatientSyncSuccess:i,onIframeSuccess:s,onError:f}=n,[p,x]=Fe(void 0),I=V(i),b=V(s),Q=V(f);return ie(()=>{I.current=i,b.current=s,Q.current=f},[i,s,f]),ie(()=>{let h=!1;return(async()=>{try{if(r){if(await o.executeBot(e,{patientId:r}),h)return;I.current?.()}let a=await o.executeBot(t,{patientId:r});if(h)return;a.url&&(x(a.url),b.current?.(a.url))}catch(a){h||Q.current?.(a)}})().catch(()=>{}),()=>{h=!0}},[o,e,t,r]),p}import{useCallback as De,useEffect as Ve,useState as $e}from"react";import{deepEquals as se}from"@medplum/core";import{useCallback as M,useEffect as $,useRef as w,useState as ae}from"react";var We=3e3;function ue(e,t,n){let o=v(),[r,i]=ae(),[s,f]=ae(n?.subscriptionProps),p=w(!1),x=w(void 0),I=w(void 0),b=w(void 0),Q=w(t);Q.current=t;let h=w(n?.onWebSocketOpen);h.current=n?.onWebSocketOpen;let y=w(n?.onWebSocketClose);y.current=n?.onWebSocketClose;let a=w(n?.onSubscriptionConnect);a.current=n?.onSubscriptionConnect;let c=w(n?.onSubscriptionDisconnect);c.current=n?.onSubscriptionDisconnect;let m=w(n?.onError);m.current=n?.onError,$(()=>{se(n?.subscriptionProps,s)||f(n?.subscriptionProps)},[s,n]),$(()=>{x.current&&(clearTimeout(x.current),x.current=void 0);let g=!1;return(I.current!==e||!se(b.current,s))&&(g=!0),g&&I.current&&o.unsubscribeFromCriteria(I.current,b.current),I.current=e,b.current=s,g&&e?i(o.subscribeToCriteria(e,s)):e||i(void 0),()=>{x.current=setTimeout(()=>{i(void 0),e&&o.unsubscribeFromCriteria(e,s)},We)}},[o,e,s]);let R=M(g=>{Q.current?.(g.payload)},[]),l=M(()=>{h.current?.()},[]),E=M(()=>{y.current?.()},[]),S=M(g=>{a.current?.(g.payload.subscriptionId)},[]),d=M(g=>{c.current?.(g.payload.subscriptionId)},[]),u=M(g=>{m.current?.(g.payload)},[]);$(()=>r?(p.current||(r.addEventListener("message",R),r.addEventListener("open",l),r.addEventListener("close",E),r.addEventListener("connect",S),r.addEventListener("disconnect",d),r.addEventListener("error",u),p.current=!0),()=>{p.current=!1,r.removeEventListener("message",R),r.removeEventListener("open",l),r.removeEventListener("close",E),r.removeEventListener("connect",S),r.removeEventListener("disconnect",d),r.removeEventListener("error",u)}):()=>{},[r,R,l,E,S,d,u])}function mt(e){let t=v(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=$e(0),f=De(p=>{t.search(n,o,{cache:p}).then(x=>s(x.total)).catch(console.error)},[t,n,o]);return Ve(()=>{f("default")},[f]),ue(r,()=>{f("reload")}),i}import{resolveId as Ke}from"@medplum/core";import{useEffect as Be,useMemo as ce,useState as K}from"react";function de(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 je(e){return e.map(t=>{let n=t.searches?t.searches.map(de).join(","):"";return`${t.key}:[${n}]`}).join("|")}function It(e,t){let n=v(),[o,r]=K([]),[i,s]=K(!0),[f,p]=K(),x=je(t),I=ce(()=>t,[x]),b=ce(()=>Ke(e),[e]);return Be(()=>{if(!b)return;let Q=!1,h=`Patient/${b}`,y={_count:100,_sort:"-_lastUpdated"},a=[],c=new Map,m=[];for(let l of I){let E=[];if(l.searches)for(let S of l.searches){let d=de(S),u=c.get(d);u===void 0&&(u=a.length,c.set(d,u),a.push(S)),E.push({searchIdx:u,resultKey:S.key})}m.push(E)}if(a.length===0){r(I.map(()=>({}))),s(!1);return}let R=a.map(l=>{let E=l.patientParam??"subject",S={[E]:h};if(l.query){if(typeof l.query=="string")return n.searchResources(l.resourceType,`${E}=${h}&${l.query}&_count=100&_sort=-_lastUpdated`);if(l.query instanceof URLSearchParams)l.query.forEach((d,u)=>{S[u]=d});else if(Array.isArray(l.query))for(let[d,u]of l.query)S[d]=u;else for(let[d,u]of Object.entries(l.query))u!==void 0&&(S[d]=u)}return n.searchResources(l.resourceType,{...y,...S})});return s(!0),p(void 0),Promise.allSettled(R).then(l=>{if(Q)return;let E=m.map(d=>{let u={};for(let{searchIdx:g,resultKey:A}of d){let C=l[g];u[A]=C.status==="fulfilled"?C.value:[]}return u});r(E),s(!1);let S=l.filter(d=>d.status==="rejected");if(S.length>0){console.error("Some patient summary searches failed:",S.map(u=>u.reason));let d=S[0].reason;p(d instanceof Error?d:new Error(String(d)))}}).catch(l=>{Q||(p(l instanceof Error?l:new Error(String(l))),s(!1))}),()=>{Q=!0}},[n,b,I]),{sectionData:o,loading:i,error:f}}import{isAddPharmacyResponse as ze,isOrganizationArray as Je}from"@medplum/core";import{useCallback as pe}from"react";function Qt(e,t){let n=v(),o=pe(async i=>{let s=await n.executeBot(e,i);if(!Je(s))throw new Error("Invalid response from pharmacy search");return s},[n,e]),r=pe(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary});if(!ze(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:o,addToFavorites:r}}import{useEffect as Ge,useRef as He}from"react";function Pt(e){let t=He(void 0);return Ge(()=>{t.current=e}),t.current}import{getExtension as Pn}from"@medplum/core";import{useReducer as Cn,useRef as wn}from"react";import{deepEquals as Xe,isReference as le,isResource as Ye,normalizeOperationOutcome as Ze}from"@medplum/core";import{useCallback as en,useEffect as nn,useState as tn}from"react";function B(e,t){let n=v(),[o,r]=tn(()=>fe(n,e)),i=en(s=>{Xe(s,o)||r(s)},[o]);return nn(()=>{let s=!0,f=fe(n,e);return!f&&le(e)?n.readReference(e).then(p=>{s&&i(p)}).catch(p=>{s&&(i(void 0),t&&t(Ze(p)))}):i(f),(()=>s=!1)},[n,e,i,t]),o}function fe(e,t){if(t){if(Ye(t))return t;if(le(t))return e.getCachedReference(t)}}import{EMPTY as Re,HTTP_HL7_ORG as O,PropertyType as P,append as me,capitalize as ye,deepClone as rn,evalFhirPathTyped as z,getExtension as k,getReferenceString as on,getTypedPropertyValueWithoutSchema as L,normalizeErrorString as sn,splitN as an,toJsBoolean as un,toTypedValue as ge,typedValueToString as cn}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"},Ie=`${O}/fhir/StructureDefinition/questionnaire-itemControl`,dn=`${O}/fhir/StructureDefinition/questionnaire-referenceFilter`,j=`${O}/fhir/StructureDefinition/questionnaire-referenceResource`,pn=`${O}/fhir/StructureDefinition/questionnaire-validationError`,fn=`${O}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,ln=`${O}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,kt=`${O}/fhir/StructureDefinition/questionnaire-signatureRequired`,q=`${O}/fhir/StructureDefinition/questionnaireresponse-signature`,mn=`${O}/fhir/StructureDefinition/questionnaire-hidden`;function Ut(e){return e.type==="choice"||e.type==="open-choice"}function J(e,t){return{...t,item:Se(e.item,t.item,t)}}function Se(e,t,n){if(!t)return t;let o=[];for(let r of t){let i=e?.find(s=>s.linkId===r.linkId);i&&!yn(i,n)||(i?.item&&r.item?o.push({...r,item:Se(i.item,r.item,n)}):o.push(r))}return o}function yn(e,t){if(k(e,mn)?.valueBoolean===!0)return!1;let o=hn(e,t);return o!==void 0?o:Rn(e,t)}function hn(e,t){let n=k(e,fn);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=ge(t),i=z(o,[r],{"%resource":r});return un(i)}}}function Rn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=xe(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=En(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function G(e,t,n=t.item){for(let o of e){let r=n?.find(i=>i.linkId===o.linkId);r&&(gn(t,o,r),o.item&&r.item&&G(o.item,t,r.item))}}function gn(e,t,n){try{let o=xn(t,e);if(!o)return;let r=Sn(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:pn,valueString:`Expression evaluation failed: ${sn(o)}`}]}}var In={[T.boolean]:[P.boolean],[T.date]:[P.date],[T.dateTime]:[P.dateTime],[T.time]:[P.time],[T.url]:[P.string,P.uri,P.url],[T.attachment]:[P.Attachment],[T.reference]:[P.Reference],[T.quantity]:[P.Quantity],[T.decimal]:[P.decimal,P.integer],[T.integer]:[P.decimal,P.integer]};function Sn(e,t){if(!e.type)return;if(e.type===T.choice||e.type===T.openChoice)return{[`value${ye(t.type)}`]:t.value};if(e.type===T.string||e.type===T.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(In[e.type]?.includes(t.type))return{[`value${ye(e.type)}`]:t.value}}function xn(e,t){if(!t)return;let n=k(e,ln);if(n){let o=n.valueExpression?.expression;if(o){let r=ge(t),i=z(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function Nt(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>cn(he(s))===r);if(i){let s=he(i);s&&o.push({[t]:s.value})}}return o}function xe(e,t){for(let n of e??Re){if(n.linkId===t)return n.answer;if(n.item){let o=xe(n.item,t);if(o)return o}}}function bn(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 En(e,t,n){let o=t||[],r=vn(e),i=!1,s=!0;for(let f of o){let p=Tn(f),{operator:x}=e;if(bn(p,r,x)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function Lt(e){let t=k(e,j);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function qt(e,t){let n=rn(e),o=k(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 Ft(e,t,n){let o=k(e,dn);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 f of s){let[p,x]=an(f,"=",2);i[p]=x}return i}function H(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??on(e),item:X(e.item,t?.item),status:"in-progress"}}function X(e,t){let n;for(let o of e??Re){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??be(),i.text=i.text??o.text,i.item=X(o.item,i.item),i.answer=Ee(o,i),n=me(n,i);else n=me(n,Y(o))}return n}function Y(e){return{id:be(),linkId:e.linkId,text:e.text,item:X(e.item,void 0),answer:Ee(e)}}var Qn=1;function be(){return"id-"+Qn++}function Ee(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 Wt(e){return L({type:"QuestionnaireItemInitial",value:e},"value")}function he(e){return L({type:"QuestionnaireItemAnswerOption",value:e},"value")}function vn(e){return L({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Tn(e){return L({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function jt(e){let t=B(e.questionnaire),n=B(e.defaultValue),[,o]=Cn(y=>y+1,0),r=wn({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:On(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=H(t,n),h()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=H(t),h()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(y,a){let c=r.current.questionnaireResponse;for(let m of y)c=c?.item?.find(R=>m.id?R.id===m.id:R.linkId===m.linkId);return a&&(c=c?.item?.find(m=>m.linkId===a.linkId)),c}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function f(){r.current.activePage=(r.current.activePage??0)-1,o()}function p(y,a){let c=i(y);c&&(c.item??=[],c.item.push(Y(a)),h())}function x(y,a){let c=i(y,a);c&&(c.answer??=[],c.answer.push({}),h())}function I(y,a,c){let m=i(y,a);m&&(m.answer=c,h())}function b(y){let a=r.current.questionnaireResponse;a&&(y?(a.extension=a.extension??[],a.extension=a.extension.filter(c=>c.url!==q),a.extension.push({url:q,valueSignature:y})):a.extension=a.extension?.filter(c=>c.url!==q),h())}function Q(){let y=r.current.questionnaire;if(y?.item){let a=r.current.questionnaireResponse;G(y.item,a)}}function h(){let y=r.current.questionnaireResponse,a=r.current.questionnaire;!y||!a||(Q(),o(),e.onChange?.(J(a,y)))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:J(r.current.questionnaire,r.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:An(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:_n(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:f,onAddGroup:p,onAddAnswer:x,onChangeAnswer:I,onChangeSignature:b}}function On(e){if(!(!e?.item||Pn(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 An(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??[]}import{allOk as Un,normalizeOperationOutcome as Nn}from"@medplum/core";import{useEffect as Ln,useMemo as qn,useState as ee}from"react";import{useCallback as Mn,useEffect as Qe,useRef as Z,useState as kn}from"react";function ve(e,t,n={leading:!1}){let[o,r]=kn(e),i=Z(!1),s=Z(void 0),f=Z(!1),p=Mn(()=>window.clearTimeout(s.current),[]);return Qe(()=>{i.current&&(!f.current&&n.leading?(f.current=!0,r(e),s.current=setTimeout(()=>{f.current=!1},t)):(p(),s.current=setTimeout(()=>{f.current=!1,r(e)},t)))},[e,n.leading,t,p]),Qe(()=>(i.current=!0,p),[p]),[o,p]}var Fn=250;function er(e,t,n){return ne("search",e,t,n)}function nr(e,t,n){return ne("searchOne",e,t,n)}function tr(e,t,n){return ne("searchResources",e,t,n)}function ne(e,t,n,o){let r=v(),[i,s]=ee(!1),[f,p]=ee(),[x,I]=ee(),b=r.fhirSearchUrl(t,n).toString(),Q=qn(()=>({resourceType:t,query:n}),[b]),h=o?.enabled??!0,y=o?.debounceMs??Fn,[a]=ve(Q,y,{leading:!0});return Ln(()=>{if(!h)return()=>{};s(!0);let c=!0;return r[e](a.resourceType,a.query).then(m=>{c&&(s(!1),p(m),I(Un))}).catch(m=>{c&&(s(!1),p(void 0),I(Nn(m)))}),()=>{c=!1}},[r,e,a,h]),[f,i,x]}import{getReferenceString as Wn}from"@medplum/core";import{useCallback as Dn,useEffect as Te,useState as U}from"react";function ar({query:e,threadId:t}){let n=v(),[o,r]=U(!0),[i,s]=U([]),[f,p]=U(void 0),[x,I]=U(null),[b,Q]=U(void 0),h=Dn(async()=>{let c=new URLSearchParams(e);c.append("identifier:not","http://medplum.com/ai-message|"),c.append("part-of:missing","true"),c.append("_has:Communication:part-of:_id:not","null");let m=await n.search("Communication",c.toString(),{cache:"no-cache"}),R=m.entry?.map(u=>u.resource).filter(u=>u!==void 0)||[];if(m.total!==void 0&&Q(m.total),R.length===0){s([]);return}let E=`
2
2
  query {
3
- ${R.map(f=>{let N=`thread_${f.id?.replaceAll("-","")||""}`,w=Nn(f);return`
4
- ${N}: CommunicationList(
5
- part_of: "${w}"
3
+ ${R.map(u=>{let A=`thread_${u.id?.replaceAll("-","")||""}`,C=Wn(u);return`
4
+ ${A}: CommunicationList(
5
+ part_of: "${C}"
6
6
  _sort: "-sent"
7
7
  _count: 1
8
8
  ) {
@@ -26,5 +26,5 @@ import{useEffect as Te,useMemo as Pe,useState as Ce}from"react";import{createCon
26
26
  `}).join(`
27
27
  `)}
28
28
  }
29
- `,I=await n.graphql(x),g=R.map(f=>{let N=`thread_${f.id?.replaceAll("-","")||""}`,w=I.data[N],Ee=w&&w.length>0?w[0]:void 0;return[f,Ee]}).filter(f=>f[1]!==void 0);s(g)},[n,e]);return Qe(()=>{r(!0),y().catch(a=>{h(a)}).finally(()=>{r(!1)})},[y]),Qe(()=>{(async()=>{if(!t){d(void 0);return}let l=i.find(p=>p[0].id===t);if(l){d(l[0]);return}let R=await n.readResource("Communication",t);if(R.partOf===void 0)d(R);else{let p=R.partOf[0].reference;if(p){let x=await n.readReference({reference:p});d(x)}}})().catch(l=>{h(l)})},[t,i,n]),{loading:o,error:S,threadMessages:i,selectedThread:c,total:E,addThreadMessage:a=>{(async()=>{await y(),s(R=>[[a,void 0],...R])})().catch(R=>h(R))},handleThreadStatusChange:a=>{if(!c)return;(async()=>{let R=await n.updateResource({...c,status:a});d(R),s(p=>p.map(([x,I])=>x.id===R.id?[R,I]:[x,I]))})().catch(R=>h(R))},refreshThreadMessages:y}}export{Vn as MedplumProvider,sn as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,on as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,un as QUESTIONNAIRE_HIDDEN_URL,Re as QUESTIONNAIRE_ITEM_CONTROL_URL,tn as QUESTIONNAIRE_REFERENCE_FILTER_URL,$ as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,bt as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,_ as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,rn as QUESTIONNAIRE_VALIDATION_ERROR_URL,Q as QuestionnaireItemType,z as buildInitialResponse,J as buildInitialResponseItem,j as evaluateCalculatedExpressionsInQuestionnaire,fe as getItemAnswerOptionValue,gn as getItemEnableWhenValueAnswer,wt as getItemInitialValue,Tt as getNewMultiSelectValues,Ot as getQuestionnaireItemReferenceFilter,Pt as getQuestionnaireItemReferenceTargetTypes,In as getResponseItemAnswerValue,vt as isChoiceQuestion,an as isQuestionEnabled,F as reactContext,B as removeDisabledItems,Ct as setQuestionnaireItemReferenceTargetTypes,ln as typedValueToResponseItem,Bn as useCachedBinaryUrl,Jn as useEPrescribingIFrame,b as useMedplum,q as useMedplumContext,_n as useMedplumNavigate,Fn as useMedplumProfile,ot as useNotificationCount,ct as usePatientSummaryData,mt as usePharmacySearch,ht as usePrevious,_t as useQuestionnaireForm,W as useResource,Kt as useSearch,Bt as useSearchOne,jt as useSearchResources,oe as useSubscription,Xt as useThreadInbox};
29
+ `,S=await n.graphql(E),d=R.map(u=>{let A=`thread_${u.id?.replaceAll("-","")||""}`,C=S.data[A],F=C&&C.length>0?C[0]:void 0;return[u,F]}).filter(u=>u[1]!==void 0);s(d)},[n,e]);return Te(()=>{r(!0),h().catch(c=>{I(c)}).finally(()=>{r(!1)})},[h]),Te(()=>{(async()=>{if(!t){p(void 0);return}let m=i.find(l=>l[0].id===t);if(m){p(m[0]);return}let R=await n.readResource("Communication",t);if(R.partOf===void 0)p(R);else{let l=R.partOf[0].reference;if(l){let E=await n.readReference({reference:l});p(E)}}})().catch(m=>{I(m)})},[t,i,n]),{loading:o,error:x,threadMessages:i,selectedThread:f,total:b,addThreadMessage:c=>{(async()=>{await h(),s(R=>[[c,void 0],...R])})().catch(R=>I(R))},handleThreadStatusChange:c=>{if(!f)return;(async()=>{let R=await n.updateResource({...f,status:c});p(R),s(l=>l.map(([E,S])=>E.id===R.id?[R,S]:[E,S]))})().catch(R=>I(R))},refreshThreadMessages:h}}import{ReconnectingWebSocket as Vn}from"@medplum/core";import{useCallback as _,useEffect as Pe,useRef as N,useState as te}from"react";function fr({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n}){let o=v(),r=N(n);Pe(()=>{r.current=n},[n]);let[i,s]=te("idle"),[f,p]=te(void 0),[x,I]=te([]),b=N(void 0),Q=N(void 0),h=N(void 0),y=N(void 0),a=_(()=>{y.current?.disconnect(),y.current=void 0,h.current?.close().catch(()=>{}),h.current=void 0,Q.current?.getTracks().forEach(d=>d.stop()),Q.current=void 0,b.current?.close(),b.current=void 0,s("disconnected")},[]),c=_(()=>{b.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]),m=_(()=>{let d=Q.current,u=b.current;if(!d||!u)return;let g=new AudioContext({sampleRate:24e3}),A=g.createMediaStreamSource(d),C=g.createScriptProcessor(4096,1,1);C.onaudioprocess=F=>{if(u.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let Ce=F.inputBuffer.getChannelData(0),we=$n(Ce),Oe=btoa(String.fromCharCode(...we));u.send(JSON.stringify({type:"input_audio_buffer.append",audio:Oe}))},A.connect(C),C.connect(g.destination),h.current=g,y.current=C,s("listening")},[]),R=_(d=>{switch(d.type){case"session.created":c();break;case"session.updated":m();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(d.transcript){let u={text:d.transcript,timestamp:new Date().toISOString()};I(g=>[...g,u]),r.current?.(d.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",d),p(d),s("error");break;default:console.debug("[useWhisper] unhandled message",d.type,d);break}},[c,m]),l=_(async()=>{s("requesting_microphone");let d=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return Q.current=d,d},[]),E=_(()=>{s("connecting");let d=Kn(o.getBaseUrl());console.debug("[useWhisper] connecting to",d);let u=new Vn(d);return b.current=u,u.onopen=()=>s("connected"),u.onmessage=g=>R(JSON.parse(g.data)),u.onerror=g=>{p(g),s("error"),a()},u.onclose=()=>s("disconnected"),u.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()})),u},[o,R,a]),S=_(async()=>{try{p(void 0),await l(),E()}catch(d){p(d),s("error"),a()}},[l,E,a]);return Pe(()=>()=>a(),[a]),{status:i,error:f,transcripts:x,start:S,stop:a,isListening:i==="listening"||i==="speech_started"||i==="speech_stopped"}}function $n(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 Kn(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}export{Xn as MedplumProvider,ln as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,fn as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,mn as QUESTIONNAIRE_HIDDEN_URL,Ie as QUESTIONNAIRE_ITEM_CONTROL_URL,dn as QUESTIONNAIRE_REFERENCE_FILTER_URL,j as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,kt as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,q as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,pn as QUESTIONNAIRE_VALIDATION_ERROR_URL,T as QuestionnaireItemType,H as buildInitialResponse,Y as buildInitialResponseItem,$n as convertToPCM16,G as evaluateCalculatedExpressionsInQuestionnaire,he as getItemAnswerOptionValue,vn as getItemEnableWhenValueAnswer,Wt as getItemInitialValue,Nt as getNewMultiSelectValues,Ft as getQuestionnaireItemReferenceFilter,Lt as getQuestionnaireItemReferenceTargetTypes,Tn as getResponseItemAnswerValue,Ut as isChoiceQuestion,yn as isQuestionEnabled,W as reactContext,J as removeDisabledItems,qt as setQuestionnaireItemReferenceTargetTypes,Sn as typedValueToResponseItem,nt as useCachedBinaryUrl,it as useEPrescribingIFrame,v as useMedplum,D as useMedplumContext,jn as useMedplumNavigate,zn as useMedplumProfile,mt as useNotificationCount,It as usePatientSummaryData,Qt as usePharmacySearch,Pt as usePrevious,jt as useQuestionnaireForm,B as useResource,er as useSearch,nr as useSearchOne,tr as useSearchResources,ue as useSubscription,ar as useThreadInbox,fr as useWhisper};
30
30
  //# sourceMappingURL=index.mjs.map