@medplum/react-hooks 5.1.27 → 5.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +9 -9
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/index.d.ts +19 -1
- package/dist/esm/index.d.ts +19 -1
- package/dist/esm/index.mjs +9 -9
- package/dist/esm/index.mjs.map +3 -3
- package/package.json +11 -11
package/dist/cjs/index.d.ts
CHANGED
|
@@ -45,6 +45,23 @@ import type { Subscription } from '@medplum/fhirtypes';
|
|
|
45
45
|
import type { TypedValue } from '@medplum/core';
|
|
46
46
|
import type { WithId } from '@medplum/core';
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Applies the `questionnaire-optionExclusive` rule to an answer change.
|
|
50
|
+
*
|
|
51
|
+
* Given the previous and newly requested answers for an item, enforces that selecting an answer
|
|
52
|
+
* option marked exclusive clears every other answer, and selecting any other option clears a
|
|
53
|
+
* previously selected exclusive answer. Returns the new answers unchanged if the item has no
|
|
54
|
+
* exclusive options or the change only removed answers.
|
|
55
|
+
*
|
|
56
|
+
* See: https://hl7.org/fhir/extensions/StructureDefinition-questionnaire-optionExclusive.html
|
|
57
|
+
*
|
|
58
|
+
* @param item - The questionnaire item being answered.
|
|
59
|
+
* @param previousAnswers - The item's answers before the change.
|
|
60
|
+
* @param newAnswers - The answers requested by the change.
|
|
61
|
+
* @returns The reconciled answers.
|
|
62
|
+
*/
|
|
63
|
+
export declare function applyOptionExclusive(item: QuestionnaireItem, previousAnswers: QuestionnaireResponseItemAnswer[] | undefined, newAnswers: QuestionnaireResponseItemAnswer[]): QuestionnaireResponseItemAnswer[];
|
|
64
|
+
|
|
48
65
|
export declare function buildInitialResponse(questionnaire: Questionnaire, questionnaireResponse?: QuestionnaireResponse): QuestionnaireResponse;
|
|
49
66
|
|
|
50
67
|
export declare function buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem;
|
|
@@ -176,6 +193,8 @@ export declare const QUESTIONNAIRE_HIDDEN_URL = "http://hl7.org/fhir/StructureDe
|
|
|
176
193
|
|
|
177
194
|
export declare const QUESTIONNAIRE_ITEM_CONTROL_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl";
|
|
178
195
|
|
|
196
|
+
export declare const QUESTIONNAIRE_OPTION_EXCLUSIVE_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-optionExclusive";
|
|
197
|
+
|
|
179
198
|
export declare const QUESTIONNAIRE_REFERENCE_FILTER_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter";
|
|
180
199
|
|
|
181
200
|
export declare const QUESTIONNAIRE_REFERENCE_RESOURCE_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource";
|
|
@@ -594,7 +613,6 @@ export declare interface UseResourceBoardProps<T extends Resource = Resource> {
|
|
|
594
613
|
* without changing the search. Reloads in place — no skeleton — like `refresh()`.
|
|
595
614
|
*/
|
|
596
615
|
readonly reloadKey?: unknown;
|
|
597
|
-
readonly onSelectFirst?: (item: WithId<T>) => void;
|
|
598
616
|
readonly onLoad?: (items: WithId<T>[], total: number | undefined) => void;
|
|
599
617
|
readonly onError?: (error: unknown) => void;
|
|
600
618
|
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -45,6 +45,23 @@ import type { Subscription } from '@medplum/fhirtypes';
|
|
|
45
45
|
import type { TypedValue } from '@medplum/core';
|
|
46
46
|
import type { WithId } from '@medplum/core';
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Applies the `questionnaire-optionExclusive` rule to an answer change.
|
|
50
|
+
*
|
|
51
|
+
* Given the previous and newly requested answers for an item, enforces that selecting an answer
|
|
52
|
+
* option marked exclusive clears every other answer, and selecting any other option clears a
|
|
53
|
+
* previously selected exclusive answer. Returns the new answers unchanged if the item has no
|
|
54
|
+
* exclusive options or the change only removed answers.
|
|
55
|
+
*
|
|
56
|
+
* See: https://hl7.org/fhir/extensions/StructureDefinition-questionnaire-optionExclusive.html
|
|
57
|
+
*
|
|
58
|
+
* @param item - The questionnaire item being answered.
|
|
59
|
+
* @param previousAnswers - The item's answers before the change.
|
|
60
|
+
* @param newAnswers - The answers requested by the change.
|
|
61
|
+
* @returns The reconciled answers.
|
|
62
|
+
*/
|
|
63
|
+
export declare function applyOptionExclusive(item: QuestionnaireItem, previousAnswers: QuestionnaireResponseItemAnswer[] | undefined, newAnswers: QuestionnaireResponseItemAnswer[]): QuestionnaireResponseItemAnswer[];
|
|
64
|
+
|
|
48
65
|
export declare function buildInitialResponse(questionnaire: Questionnaire, questionnaireResponse?: QuestionnaireResponse): QuestionnaireResponse;
|
|
49
66
|
|
|
50
67
|
export declare function buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem;
|
|
@@ -176,6 +193,8 @@ export declare const QUESTIONNAIRE_HIDDEN_URL = "http://hl7.org/fhir/StructureDe
|
|
|
176
193
|
|
|
177
194
|
export declare const QUESTIONNAIRE_ITEM_CONTROL_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl";
|
|
178
195
|
|
|
196
|
+
export declare const QUESTIONNAIRE_OPTION_EXCLUSIVE_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-optionExclusive";
|
|
197
|
+
|
|
179
198
|
export declare const QUESTIONNAIRE_REFERENCE_FILTER_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter";
|
|
180
199
|
|
|
181
200
|
export declare const QUESTIONNAIRE_REFERENCE_RESOURCE_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource";
|
|
@@ -594,7 +613,6 @@ export declare interface UseResourceBoardProps<T extends Resource = Resource> {
|
|
|
594
613
|
* without changing the search. Reloads in place — no skeleton — like `refresh()`.
|
|
595
614
|
*/
|
|
596
615
|
readonly reloadKey?: unknown;
|
|
597
|
-
readonly onSelectFirst?: (item: WithId<T>) => void;
|
|
598
616
|
readonly onLoad?: (items: WithId<T>[], total: number | undefined) => void;
|
|
599
617
|
readonly onError?: (error: unknown) => void;
|
|
600
618
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{useEffect as cn,useMemo as dn,useState as ln}from"react";import{createContext as an,useContext as un}from"react";var j=an(void 0);function J(){return un(j)}function v(){return J().medplum}function sr(){return J().navigate}function Se(){return J().profile}import{jsx as pn}from"react/jsx-runtime";var xe=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function dr(e){let t=e.medplum,n=e.navigate??fn,[r,o]=ln({profile:t.getProfile(),loading:t.isLoading()});cn(()=>{function i(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of xe)t.addEventListener(a,i);return()=>{for(let a of xe)t.removeEventListener(a,i)}},[t]);let s=dn(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return pn(j.Provider,{value:s,children:e.children})}function fn(e){window.location.assign(e)}import{useMemo as mn}from"react";var be=new Map,mr=e=>mn(()=>{if(!e)return;let t=e.split("?")[0];if(!t)return e;let n;try{n=new URLSearchParams(new URL(e).search)}catch{return e}if(!n.has("Key-Pair-Id")||!n.has("Signature"))return e;let r=n.get("Expires");if(!r||r.length>13)return e;let o=be.get(t);if(o){let i=new URLSearchParams(new URL(o).search).get("Expires");if(i&&Number.parseInt(i,10)*1e3-5e3>Date.now())return o}return be.set(t,e),e},[e]);import{INVALID_MEDICATION_CART_RESPONSE as Ee,INVALID_MEDICATION_CHECKOUT_RESPONSE as Rn,isResource as G,medicationCartClearRequestToParameters as hn,medicationCartRemoveRequestToParameters as yn,medicationCheckoutRequestToParameters as gn,parametersToMedicationCartManageResponse as ve,parametersToMedicationCheckoutResponse as In}from"@medplum/core";import{useCallback as K,useRef as Sn,useState as xn}from"react";var bn="Cannot checkout while a medication is still being added to the cart";function Ir(){let e=v(),[t,n]=xn(!1),r=Sn(0),o=K(async u=>{r.current+=1,n(!0);try{return await e.createResource(u)}finally{r.current-=1,r.current<=0&&(r.current=0,n(!1))}},[e]),s=K(async u=>{if(r.current>0)throw new Error(bn);let R=e.fhirUrl("MedicationRequest","$checkout-medications"),h=gn(u),T=await e.post(R,h);if(!G(T,"Parameters"))throw new Error(Rn);return In(T)},[e]),i=K(async u=>{let R=e.fhirUrl("MedicationRequest","$remove-cart-medication"),h=await e.post(R,yn(u));if(!G(h,"Parameters"))throw new Error(Ee);return ve(h)},[e]),a=K(async u=>{let R=e.fhirUrl("MedicationRequest","$clear-cart"),h=await e.post(R,hn(u));if(!G(h,"Parameters"))throw new Error(Ee);return ve(h)},[e]);return{addToCart:o,adding:t,checkout:s,removeFromCart:i,clearCart:a}}import{resolveId as En}from"@medplum/core";import{useEffect as Pe,useRef as H,useState as vn}from"react";function vr(e,t,n){let r=v(),{patientId:o,organization:s,onPatientSyncSuccess:i,onIframeSuccess:a,onError:u}=n,R=En(s),[h,T]=vn(void 0),I=H(i),g=H(a),y=H(u);return Pe(()=>{I.current=i,g.current=a,y.current=u},[i,a,u]),Pe(()=>{let l=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:R}),l)return;I.current?.()}let m=await r.executeBot(t,{patientId:o,organizationId:R});if(l)return;m.url&&(T(m.url),g.current?.(m.url))}catch(m){l||y.current?.(m)}})().catch(()=>{}),()=>{l=!0}},[r,e,t,o,R]),h}import{INVALID_MEDICATION_ORDER_RESPONSE as Pn,INVALID_MEDICATION_SEARCH_RESPONSE as Tn,isResource as X,medicationOrderRequestToParameters as Cn,medicationSearchParamsToParameters as Mn,parametersToMedicationOrderResponse as Qn}from"@medplum/core";import{useCallback as Te}from"react";function Qr(){let e=v(),t=Te(async r=>{let o=e.fhirUrl("Medication","$drug-search"),s=Mn(r),i=await e.post(o,s);if(!X(i,"Bundle"))throw new Error(Tn);return(i.entry??[]).map(a=>a.resource).filter(a=>X(a,"Medication"))},[e]),n=Te(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),s=Cn(r),i=await e.post(o,s);if(!X(i,"Parameters"))throw new Error(Pn);return Qn(i)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as On,isResource as wn,medicationOrderSetRequestToParameters as An,parametersToMedicationOrderSetResponse as kn}from"@medplum/core";import{useCallback as Ce,useEffect as _n,useRef as Me,useState as Y}from"react";function _r(e){let t=v(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i}=e,[a,u]=Y(void 0),[R,h]=Y(!1),[T,I]=Y(void 0),g=Me({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i});g.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i};let y=()=>{let d=g.current;if(!d.patientId)return;let p=!!d.planDefinitionId,S=d.vendorOrderSetId!==void 0&&d.vendorOrderSetId!==null&&d.vendorOrderSetId!=="";return!p&&!S?void 0:{patientId:d.patientId,planDefinitionId:p?d.planDefinitionId:void 0,vendorOrderSetId:S?d.vendorOrderSetId:void 0,appId:d.appId,organization:d.organization}},l=Ce(async d=>{let p=t.fhirUrl("PlanDefinition","$order-set-url"),S=An(d),x=await t.post(p,S);if(!wn(x,"Parameters"))throw new Error(On);return kn(x).launchUrl},[t]),c=Me(0),m=Ce(async()=>{let d=y();if(!d)return;c.current+=1;let p=c.current;h(!0),I(void 0);try{let S=await l(d);return c.current!==p?void 0:(u(S),S)}catch(S){c.current===p&&(I(S),u(void 0));return}finally{c.current===p&&h(!1)}},[l]);return _n(()=>{let d=!1,p=y();if(!p){c.current+=1,u(void 0),h(!1),I(void 0);return}c.current+=1;let S=c.current;return h(!0),I(void 0),l(p).then(x=>{d||c.current!==S||u(x)}).catch(x=>{d||c.current!==S||(I(x),u(void 0))}).finally(()=>{!d&&c.current===S&&h(!1)}),()=>{d=!0}},[l,n,r,o,s,i]),{url:a,loading:R,error:T,refresh:m}}import{useCallback as Un,useEffect as Nn,useState as Ln}from"react";import{deepEquals as Qe}from"@medplum/core";import{useCallback as L,useEffect as Z,useRef as k,useState as Oe}from"react";var qn=3e3;function we(e,t,n){let r=v(),s=Se()?e:void 0,[i,a]=Oe(),[u,R]=Oe(n?.subscriptionProps),h=k(!1),T=k(void 0),I=k(void 0),g=k(void 0),y=k(t);y.current=t;let l=k(n?.onWebSocketOpen);l.current=n?.onWebSocketOpen;let c=k(n?.onWebSocketClose);c.current=n?.onWebSocketClose;let m=k(n?.onSubscriptionConnect);m.current=n?.onSubscriptionConnect;let d=k(n?.onSubscriptionDisconnect);d.current=n?.onSubscriptionDisconnect;let p=k(n?.onError);p.current=n?.onError,Z(()=>{Qe(n?.subscriptionProps,u)||R(n?.subscriptionProps)},[u,n]),Z(()=>{T.current&&(clearTimeout(T.current),T.current=void 0);let P=!1;return(I.current!==s||!Qe(g.current,u))&&(P=!0),P&&I.current&&r.unsubscribeFromCriteria(I.current,g.current),I.current=s,g.current=u,P&&s?a(r.subscribeToCriteria(s,u)):s||a(void 0),()=>{T.current=setTimeout(()=>{a(void 0),s&&r.unsubscribeFromCriteria(s,u)},qn)}},[r,s,u]);let S=L(P=>{y.current?.(P.payload)},[]),x=L(()=>{l.current?.()},[]),E=L(()=>{c.current?.()},[]),f=L(P=>{m.current?.(P.payload.subscriptionId)},[]),O=L(P=>{d.current?.(P.payload.subscriptionId)},[]),C=L(P=>{p.current?.(P.payload)},[]);Z(()=>i?(h.current||(i.addEventListener("message",S),i.addEventListener("open",x),i.addEventListener("close",E),i.addEventListener("connect",f),i.addEventListener("disconnect",O),i.addEventListener("error",C),h.current=!0),()=>{h.current=!1,i.removeEventListener("message",S),i.removeEventListener("open",x),i.removeEventListener("close",E),i.removeEventListener("connect",f),i.removeEventListener("disconnect",O),i.removeEventListener("error",C)}):()=>{},[i,S,x,E,f,O,C])}function Kr(e){let t=v(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[s,i]=Ln(0),a=Un(u=>{t.search(n,r,{cache:u}).then(R=>i(R.total)).catch(console.error)},[t,n,r]);return Nn(()=>{a("default")},[a]),we(o,()=>{a("reload")}),s}import{resolveId as Wn}from"@medplum/core";import{useEffect as Dn,useMemo as Ae,useState as ee}from"react";function ke(e){let t=e.patientParam??"subject",n=e.query,r="";if(n!=null)if(typeof n=="string")r=n;else if(n instanceof URLSearchParams){let o=Array.from(n.entries()).sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else if(Array.isArray(n)){let o=[...n].sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else{let o=Object.entries(n).filter(([,s])=>s!==void 0).sort(([s],[i])=>s.localeCompare(i));r=JSON.stringify(o)}return`${e.resourceType}:${t}:${r}`}function Fn(e){return e.map(t=>{let n=t.searches?t.searches.map(ke).join(","):"";return`${t.key}:[${n}]`}).join("|")}function Jr(e,t){let n=v(),[r,o]=ee([]),[s,i]=ee(!0),[a,u]=ee(),R=Fn(t),h=Ae(()=>t,[R]),T=Ae(()=>Wn(e),[e]);return Dn(()=>{if(!T)return;let I=!1,g=`Patient/${T}`,y={_count:100,_sort:"-_lastUpdated"},l=[],c=new Map,m=[];for(let p of h){let S=[];if(p.searches)for(let x of p.searches){let E=ke(x),f=c.get(E);f===void 0&&(f=l.length,c.set(E,f),l.push(x)),S.push({searchIdx:f,resultKey:x.key})}m.push(S)}if(l.length===0){o(h.map(()=>({}))),i(!1);return}let d=l.map(p=>{let S=p.patientParam??"subject",x={[S]:g};if(p.query){if(typeof p.query=="string")return n.searchResources(p.resourceType,`${S}=${g}&${p.query}&_count=100&_sort=-_lastUpdated`);if(p.query instanceof URLSearchParams)p.query.forEach((E,f)=>{x[f]=E});else if(Array.isArray(p.query))for(let[E,f]of p.query)x[E]=f;else for(let[E,f]of Object.entries(p.query))f!==void 0&&(x[E]=f)}return n.searchResources(p.resourceType,{...y,...x})});return i(!0),u(void 0),Promise.allSettled(d).then(p=>{if(I)return;let S=m.map(E=>{let f={};for(let{searchIdx:O,resultKey:C}of E){let P=p[O];f[C]=P.status==="fulfilled"?P.value:[]}return f});o(S),i(!1);let x=p.filter(E=>E.status==="rejected");if(x.length>0){console.error("Some patient summary searches failed:",x.map(f=>f.reason));let E=x[0].reason;u(E instanceof Error?E:new Error(String(E)))}}).catch(p=>{I||(u(p instanceof Error?p:new Error(String(p))),i(!1))}),()=>{I=!0}},[n,T,h]),{sectionData:r,loading:s,error:a}}import{isAddPharmacyResponse as Vn,isOrganizationArray as Kn,resolveId as _e}from"@medplum/core";import{useCallback as qe}from"react";function Zr(e,t){let n=v(),r=qe(async s=>{let{organization:i,...a}=s,u=_e(i),R=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!Kn(R))throw new Error("Invalid response from pharmacy search");return R},[n,e]),o=qe(async s=>{let i=await n.executeBot(t,{patientId:s.patientId,pharmacy:s.pharmacy,setAsPrimary:s.setAsPrimary,organizationId:_e(s.organization)});if(!Vn(i))throw new Error("Invalid response from add pharmacy bot");return i},[n,t]);return{searchPharmacies:r,addToFavorites:o}}import{useEffect as $n,useRef as Bn}from"react";function to(e){let t=Bn(void 0);return $n(()=>{t.current=e}),t.current}import{getExtension as xt}from"@medplum/core";import{useReducer as bt,useRef as Et}from"react";import{deepEquals as zn,isReference as Ne,isResource as jn,normalizeOperationOutcome as Jn}from"@medplum/core";import{useCallback as Gn,useEffect as Hn,useState as Xn}from"react";function ne(e,t){let n=v(),[r,o]=Xn(()=>Ue(n,e)),s=Gn(i=>{zn(i,r)||o(i)},[r]);return Hn(()=>{let i=!0,a=Ue(n,e);return!a&&Ne(e)?n.readReference(e).then(u=>{i&&s(u)}).catch(u=>{i&&(s(void 0),t&&t(Jn(u)))}):s(a),(()=>i=!1)},[n,e,s,t]),r}function Ue(e,t){if(t){if(jn(t))return t;if(Ne(t))return e.getCachedReference(t)}}import{EMPTY as Fe,HTTP_HL7_ORG as q,PropertyType as w,append as Le,capitalize as We,deepClone as Yn,evalFhirPathTyped as re,getExtension as W,getReferenceString as Zn,getTypedPropertyValueWithoutSchema as $,normalizeErrorString as et,splitN as nt,toJsBoolean as tt,toTypedValue as Ve,typedValueToString as rt}from"@medplum/core";var M={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"},Ke=`${q}/fhir/StructureDefinition/questionnaire-itemControl`,ot=`${q}/fhir/StructureDefinition/questionnaire-referenceFilter`,te=`${q}/fhir/StructureDefinition/questionnaire-referenceResource`,it=`${q}/fhir/StructureDefinition/questionnaire-validationError`,st=`${q}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,at=`${q}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,co=`${q}/fhir/StructureDefinition/questionnaire-signatureRequired`,B=`${q}/fhir/StructureDefinition/questionnaireresponse-signature`,ut=`${q}/fhir/StructureDefinition/questionnaire-hidden`;function lo(e){return e.type==="choice"||e.type==="open-choice"}function oe(e,t){return{...t,item:$e(e.item,t.item,t)}}function $e(e,t,n){if(!t)return t;let r=[];for(let o of t){let s=e?.find(i=>i.linkId===o.linkId);s&&!ct(s,n)||(s?.item&&o.item?r.push({...o,item:$e(s.item,o.item,n)}):r.push(o))}return r}function ct(e,t){if(W(e,ut)?.valueBoolean===!0)return!1;let r=dt(e,t);return r!==void 0?r:lt(e,t)}function dt(e,t){let n=W(e,st);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=Ve(t),s=re(r,[o],{"%resource":o});return tt(s)}}}function lt(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let r of e.enableWhen){let o=Be(t?.item,r.question);if(r.operator==="exists"&&!r.answerBoolean&&!o?.length){if(n==="any")return!0;continue}let{anyMatch:s,allMatch:i}=yt(r,o,n);if(n==="any"&&s)return!0;if(n==="all"&&!i)return!1}return n!=="any"}function ie(e,t,n=t.item){for(let r of e){let o=n?.find(s=>s.linkId===r.linkId);o&&(ft(t,r,o),r.item&&o.item&&ie(r.item,t,o.item))}}function ft(e,t,n){try{let r=Rt(t,e);if(!r)return;let o=mt(t,r);if(!o)return;n.answer=[o]}catch(r){n.extension=[{url:it,valueString:`Expression evaluation failed: ${et(r)}`}]}}var pt={[M.boolean]:[w.boolean],[M.date]:[w.date],[M.dateTime]:[w.dateTime],[M.time]:[w.time],[M.url]:[w.string,w.uri,w.url],[M.attachment]:[w.Attachment],[M.reference]:[w.Reference],[M.quantity]:[w.Quantity],[M.decimal]:[w.decimal,w.integer],[M.integer]:[w.decimal,w.integer]};function mt(e,t){if(!e.type)return;if(e.type===M.choice||e.type===M.openChoice)return{[`value${We(t.type)}`]:t.value};if(e.type===M.string||e.type===M.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(pt[e.type]?.includes(t.type))return{[`value${We(e.type)}`]:t.value}}function Rt(e,t){if(!t)return;let n=W(e,at);if(n){let r=n.valueExpression?.expression;if(r){let o=Ve(t),s=re(r,[o],{"%resource":o});return s.length!==0?s[0]:void 0}}}function fo(e,t,n){let r=[];for(let o of e){let s=n.answerOption?.find(i=>rt(De(i))===o);if(s){let i=De(s);i&&r.push({[t]:i.value})}}return r}function Be(e,t){for(let n of e??Fe){if(n.linkId===t)return n.answer;if(n.item){let r=Be(n.item,t);if(r)return r}}}function ht(e,t,n){if(n==="exists")return!!e===t.value;if(e){let r=n==="="||n==="!="?n?.replace("=","~"):n,[{value:o}]=re(`%actualAnswer ${r} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return o}else return!1}function yt(e,t,n){let r=t||[],o=It(e),s=!1,i=!0;for(let a of r){let u=St(a),{operator:R}=e;if(ht(u,o,R)?s=!0:i=!1,n==="any"&&s)break}return{anyMatch:s,allMatch:i}}function po(e){let t=W(e,te);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function mo(e,t){let n=Yn(e),r=W(n,te);return!t||t.length===0?(r&&(n.extension=n.extension?.filter(o=>o!==r)),n):(r||(n.extension??=[],r={url:te},n.extension.push(r)),t.length===1?(r.valueCode=t[0],delete r.valueCodeableConcept):(r.valueCodeableConcept={coding:t.map(o=>({code:o}))},delete r.valueCode),n)}function Ro(e,t,n){let r=W(e,ot);if(!r?.valueString)return;let o=r.valueString;t?.reference&&(o=o.replaceAll("$subj",t.reference)),n?.reference&&(o=o.replaceAll("$encounter",n.reference));let s={},i=o.split("&");for(let a of i){let[u,R]=nt(a,"=",2);s[u]=R}return s}function se(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??Zn(e),item:ae(e.item,t?.item),status:"in-progress"}}function ae(e,t){let n;for(let r of e??Fe){if(r.type===M.display)continue;let o=t?.filter(s=>s.linkId===r.linkId);if(o?.length)for(let s of o)s.id=s.id??ze(),s.text=s.text??r.text,s.item=ae(r.item,s.item),s.answer=je(r,s),n=Le(n,s);else n=Le(n,ue(r))}return n}function ue(e){return{id:ze(),linkId:e.linkId,text:e.text,item:ae(e.item,void 0),answer:je(e)}}var gt=1;function ze(){return"id-"+gt++}function je(e,t){if(!(e.type===M.display||e.type===M.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 ho(e){return $({type:"QuestionnaireItemInitial",value:e},"value")}function De(e){return $({type:"QuestionnaireItemAnswerOption",value:e},"value")}function It(e){return $({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function St(e){return $({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function bo(e){let t=ne(e.questionnaire),n=ne(e.defaultValue),[,r]=bt(y=>y+1,0),o=Et({activePage:0});if(!o.current.questionnaire&&t&&(o.current.questionnaire=t,o.current.pages=e.disablePagination?void 0:vt(t)),t&&e.defaultValue&&n&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=se(t,n),g()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=se(t),g()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function s(y,l){let c=o.current.questionnaireResponse;for(let m of y)c=c?.item?.find(d=>m.id?d.id===m.id:d.linkId===m.linkId);return l&&(c=c?.item?.find(m=>m.linkId===l.linkId)),c}function i(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(y,l){let c=s(y);c&&(c.item??=[],c.item.push(ue(l)),g())}function R(y,l){let c=s(y,l);c&&(c.answer??=[],c.answer.push({}),g())}function h(y,l,c){let m=s(y,l);m&&(m.answer=c,g())}function T(y){let l=o.current.questionnaireResponse;l&&(y?(l.extension=l.extension??[],l.extension=l.extension.filter(c=>c.url!==B),l.extension.push({url:B,valueSignature:y})):l.extension=l.extension?.filter(c=>c.url!==B),g())}function I(){let y=o.current.questionnaire;if(y?.item){let l=o.current.questionnaireResponse;ie(y.item,l)}}function g(){let y=o.current.questionnaireResponse,l=o.current.questionnaire;!y||!l||(I(),r(),e.onChange?.(oe(l,y)))}return{loading:!1,pagination:!!o.current.pages,questionnaire:o.current.questionnaire,questionnaireResponse:oe(o.current.questionnaire,o.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:o.current.activePage,pages:o.current.pages,items:Pt(o.current.questionnaire,o.current.pages,o.current.activePage),responseItems:Tt(o.current.questionnaireResponse,o.current.pages,o.current.activePage),onNextPage:i,onPrevPage:a,onAddGroup:u,onAddAnswer:R,onChangeAnswer:h,onChangeSignature:T}}function vt(e){if(!(!e?.item||xt(e?.item?.[0],Ke)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,r)=>({linkId:n.linkId,title:n.text??`Page ${r+1}`,group:n}))}function Pt(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{deepEquals as Ct,formatSearchQuery as Mt}from"@medplum/core";import{useCallback as Qt,useEffect as ce,useRef as de,useState as D}from"react";async function Ot(e,t){let n=await t.search(e.resourceType,Mt({...e,total:e.total??"accurate"}),{cache:"no-cache"});return{items:n.entry?.map(o=>o.resource).filter(o=>o!==void 0)??[],total:n.total}}function Co(e){let{search:t,selectedId:n,loadItems:r,reloadKey:o}=e,s=v(),[i,a]=D(t),[u,R]=D([]),[h,T]=D(),[I,g]=D(!0),[y,l]=D(),c=de(e),m=de(0),d=de(0),p=i.resourceType,S=n!==void 0&&y?.id===n?y.value:void 0;Ct(t,i)||(a(t),g(!0));let x=Qt(async()=>{let E=++m.current;try{let f=r?await r(i,s):await Ot(i,s);if(E!==m.current)return;R(f.items),T(f.total),c.current.onLoad?.(f.items,f.total),c.current.selectedId===void 0&&f.items.length>0&&c.current.onSelectFirst?.(f.items[0])}catch(f){E===m.current&&(c.current.onError??console.error)(f)}finally{E===m.current&&g(!1)}},[i,r,s]);return ce(()=>{c.current=e}),ce(()=>{x().catch(console.error)},[x,o]),ce(()=>{let E=++d.current;if(!n)return;let f=async()=>{let C=c.current.resolveSelected;if(C)return C(n,u,s);let P=u.find(N=>N.id===n);return P!==void 0?P:await s.readResource(p,n)};(async()=>{try{let C=await f();E===d.current&&l({id:n,value:C})}catch(C){E===d.current&&(l({id:n,value:void 0}),(c.current.onError??console.error)(C))}})().catch(console.error)},[n,u,s,p]),{items:u,total:h,loading:I,selected:S,search:i,refresh:x}}import{useEffect as Je,useRef as wt}from"react";function wo(e,t){let n=v(),r=wt(t);Je(()=>{r.current=t});let o=Array.isArray(e)?e.join(","):e;Je(()=>{let s=new Set(o.split(",")),i=a=>{s.has(a.payload.resourceType)&&r.current(a.payload)};return n.addEventListener("resourceModified",i),()=>n.removeEventListener("resourceModified",i)},[n,o])}import{allOk as _t,normalizeOperationOutcome as qt}from"@medplum/core";import{useEffect as Ut,useMemo as Nt,useState as fe}from"react";import{useCallback as At,useEffect as Ge,useRef as le,useState as kt}from"react";function He(e,t,n={leading:!1}){let[r,o]=kt(e),s=le(!1),i=le(void 0),a=le(!1),u=At(()=>window.clearTimeout(i.current),[]);return Ge(()=>{s.current&&(!a.current&&n.leading?(a.current=!0,o(e),i.current=setTimeout(()=>{a.current=!1},t)):(u(),i.current=setTimeout(()=>{a.current=!1,o(e)},t)))},[e,n.leading,t,u]),Ge(()=>(s.current=!0,u),[u]),[r,u]}var Lt=250;function Wo(e,t,n){return pe("search",e,t,n)}function Do(e,t,n){return pe("searchOne",e,t,n)}function Fo(e,t,n){return pe("searchResources",e,t,n)}function pe(e,t,n,r){let o=v(),[s,i]=fe(!1),[a,u]=fe(),[R,h]=fe(),T=o.fhirSearchUrl(t,n).toString(),I=Nt(()=>({resourceType:t,query:n}),[T]),g=r?.enabled??!0,y=r?.debounceMs??Lt,[l]=He(I,y,{leading:!0});return Ut(()=>{if(!g)return()=>{};i(!0);let c=!0;return o[e](l.resourceType,l.query).then(m=>{c&&(i(!1),u(m),h(_t))}).catch(m=>{c&&(i(!1),u(void 0),h(qt(m)))}),()=>{c=!1}},[o,e,l,g]),[a,s,R]}import{OperationOutcomeError as Wt,isResource as Dt,parametersToOrderSetSyncResponse as Ft,resolveId as Vt}from"@medplum/core";import{useCallback as Kt}from"react";function zo(){let e=v();return Kt(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:Vt(n)});return Dt(r,"Parameters")?Ft(r):void 0}catch(r){if(r instanceof Wt&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}import{getReferenceString as $t}from"@medplum/core";import{useCallback as Bt,useEffect as Xe,useState as F}from"react";function Xo({query:e,threadId:t}){let n=v(),[r,o]=F(!0),[s,i]=F([]),[a,u]=F(void 0),[R,h]=F(null),[T,I]=F(void 0),g=Bt(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"}),d=m.entry?.map(f=>f.resource).filter(f=>f!==void 0)||[];if(m.total!==void 0&&I(m.total),d.length===0){i([]);return}let S=`
|
|
1
|
+
import{useEffect as fn,useMemo as pn,useState as mn}from"react";import{createContext as dn,useContext as ln}from"react";var X=dn(void 0);function Y(){return ln(X)}function v(){return Y().medplum}function dr(){return Y().navigate}function Ee(){return Y().profile}import{jsx as hn}from"react/jsx-runtime";var be=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function mr(e){let t=e.medplum,n=e.navigate??Rn,[r,o]=mn({profile:t.getProfile(),loading:t.isLoading()});fn(()=>{function i(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of be)t.addEventListener(a,i);return()=>{for(let a of be)t.removeEventListener(a,i)}},[t]);let s=pn(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return hn(X.Provider,{value:s,children:e.children})}function Rn(e){window.location.assign(e)}import{useMemo as yn}from"react";var ve=new Map,gr=e=>yn(()=>{if(!e)return;let t=e.split("?")[0];if(!t)return e;let n;try{n=new URLSearchParams(new URL(e).search)}catch{return e}if(!n.has("Key-Pair-Id")||!n.has("Signature"))return e;let r=n.get("Expires");if(!r||r.length>13)return e;let o=ve.get(t);if(o){let i=new URLSearchParams(new URL(o).search).get("Expires");if(i&&Number.parseInt(i,10)*1e3-5e3>Date.now())return o}return ve.set(t,e),e},[e]);import{INVALID_MEDICATION_CART_RESPONSE as Te,INVALID_MEDICATION_CHECKOUT_RESPONSE as gn,isResource as Z,medicationCartClearRequestToParameters as In,medicationCartRemoveRequestToParameters as Sn,medicationCheckoutRequestToParameters as xn,parametersToMedicationCartManageResponse as Pe,parametersToMedicationCheckoutResponse as En}from"@medplum/core";import{useCallback as j,useRef as bn,useState as vn}from"react";var Tn="Cannot checkout while a medication is still being added to the cart";function br(){let e=v(),[t,n]=vn(!1),r=bn(0),o=j(async u=>{r.current+=1,n(!0);try{return await e.createResource(u)}finally{r.current-=1,r.current<=0&&(r.current=0,n(!1))}},[e]),s=j(async u=>{if(r.current>0)throw new Error(Tn);let f=e.fhirUrl("MedicationRequest","$checkout-medications"),m=xn(u),T=await e.post(f,m);if(!Z(T,"Parameters"))throw new Error(gn);return En(T)},[e]),i=j(async u=>{let f=e.fhirUrl("MedicationRequest","$remove-cart-medication"),m=await e.post(f,Sn(u));if(!Z(m,"Parameters"))throw new Error(Te);return Pe(m)},[e]),a=j(async u=>{let f=e.fhirUrl("MedicationRequest","$clear-cart"),m=await e.post(f,In(u));if(!Z(m,"Parameters"))throw new Error(Te);return Pe(m)},[e]);return{addToCart:o,adding:t,checkout:s,removeFromCart:i,clearCart:a}}import{resolveId as Pn}from"@medplum/core";import{useEffect as Ce,useRef as ee,useState as Cn}from"react";function Mr(e,t,n){let r=v(),{patientId:o,organization:s,onPatientSyncSuccess:i,onIframeSuccess:a,onError:u}=n,f=Pn(s),[m,T]=Cn(void 0),I=ee(i),b=ee(a),S=ee(u);return Ce(()=>{I.current=i,b.current=a,S.current=u},[i,a,u]),Ce(()=>{let c=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:f}),c)return;I.current?.()}let x=await r.executeBot(t,{patientId:o,organizationId:f});if(c)return;x.url&&(T(x.url),b.current?.(x.url))}catch(x){c||S.current?.(x)}})().catch(()=>{}),()=>{c=!0}},[r,e,t,o,f]),m}import{INVALID_MEDICATION_ORDER_RESPONSE as Mn,INVALID_MEDICATION_SEARCH_RESPONSE as Qn,isResource as ne,medicationOrderRequestToParameters as On,medicationSearchParamsToParameters as wn,parametersToMedicationOrderResponse as An}from"@medplum/core";import{useCallback as Me}from"react";function kr(){let e=v(),t=Me(async r=>{let o=e.fhirUrl("Medication","$drug-search"),s=wn(r),i=await e.post(o,s);if(!ne(i,"Bundle"))throw new Error(Qn);return(i.entry??[]).map(a=>a.resource).filter(a=>ne(a,"Medication"))},[e]),n=Me(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),s=On(r),i=await e.post(o,s);if(!ne(i,"Parameters"))throw new Error(Mn);return An(i)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as kn,isResource as _n,medicationOrderSetRequestToParameters as qn,parametersToMedicationOrderSetResponse as Un}from"@medplum/core";import{useCallback as Qe,useEffect as Nn,useRef as Oe,useState as te}from"react";function Lr(e){let t=v(),{patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i}=e,[a,u]=te(void 0),[f,m]=te(!1),[T,I]=te(void 0),b=Oe({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i});b.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:s,organization:i};let S=()=>{let y=b.current;if(!y.patientId)return;let l=!!y.planDefinitionId,h=y.vendorOrderSetId!==void 0&&y.vendorOrderSetId!==null&&y.vendorOrderSetId!=="";return!l&&!h?void 0:{patientId:y.patientId,planDefinitionId:l?y.planDefinitionId:void 0,vendorOrderSetId:h?y.vendorOrderSetId:void 0,appId:y.appId,organization:y.organization}},c=Qe(async y=>{let l=t.fhirUrl("PlanDefinition","$order-set-url"),h=qn(y),p=await t.post(l,h);if(!_n(p,"Parameters"))throw new Error(kn);return Un(p).launchUrl},[t]),d=Oe(0),x=Qe(async()=>{let y=S();if(!y)return;d.current+=1;let l=d.current;m(!0),I(void 0);try{let h=await c(y);return d.current!==l?void 0:(u(h),h)}catch(h){d.current===l&&(I(h),u(void 0));return}finally{d.current===l&&m(!1)}},[c]);return Nn(()=>{let y=!1,l=S();if(!l){d.current+=1,u(void 0),m(!1),I(void 0);return}d.current+=1;let h=d.current;return m(!0),I(void 0),c(l).then(p=>{y||d.current!==h||u(p)}).catch(p=>{y||d.current!==h||(I(p),u(void 0))}).finally(()=>{!y&&d.current===h&&m(!1)}),()=>{y=!0}},[c,n,r,o,s,i]),{url:a,loading:f,error:T,refresh:x}}import{useCallback as Wn,useEffect as Dn,useState as Fn}from"react";import{deepEquals as we}from"@medplum/core";import{useCallback as F,useEffect as re,useRef as _,useState as Ae}from"react";var Ln=3e3;function ke(e,t,n){let r=v(),s=Ee()?e:void 0,[i,a]=Ae(),[u,f]=Ae(n?.subscriptionProps),m=_(!1),T=_(void 0),I=_(void 0),b=_(void 0),S=_(t);S.current=t;let c=_(n?.onWebSocketOpen);c.current=n?.onWebSocketOpen;let d=_(n?.onWebSocketClose);d.current=n?.onWebSocketClose;let x=_(n?.onSubscriptionConnect);x.current=n?.onSubscriptionConnect;let y=_(n?.onSubscriptionDisconnect);y.current=n?.onSubscriptionDisconnect;let l=_(n?.onError);l.current=n?.onError,re(()=>{we(n?.subscriptionProps,u)||f(n?.subscriptionProps)},[u,n]),re(()=>{T.current&&(clearTimeout(T.current),T.current=void 0);let P=!1;return(I.current!==s||!we(b.current,u))&&(P=!0),P&&I.current&&r.unsubscribeFromCriteria(I.current,b.current),I.current=s,b.current=u,P&&s?a(r.subscribeToCriteria(s,u)):s||a(void 0),()=>{T.current=setTimeout(()=>{a(void 0),s&&r.unsubscribeFromCriteria(s,u)},Ln)}},[r,s,u]);let h=F(P=>{S.current?.(P.payload)},[]),p=F(()=>{c.current?.()},[]),g=F(()=>{d.current?.()},[]),R=F(P=>{x.current?.(P.payload.subscriptionId)},[]),C=F(P=>{y.current?.(P.payload.subscriptionId)},[]),Q=F(P=>{l.current?.(P.payload)},[]);re(()=>i?(m.current||(i.addEventListener("message",h),i.addEventListener("open",p),i.addEventListener("close",g),i.addEventListener("connect",R),i.addEventListener("disconnect",C),i.addEventListener("error",Q),m.current=!0),()=>{m.current=!1,i.removeEventListener("message",h),i.removeEventListener("open",p),i.removeEventListener("close",g),i.removeEventListener("connect",R),i.removeEventListener("disconnect",C),i.removeEventListener("error",Q)}):()=>{},[i,h,p,g,R,C,Q])}function jr(e){let t=v(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[s,i]=Fn(0),a=Wn(u=>{t.search(n,r,{cache:u}).then(f=>i(f.total)).catch(console.error)},[t,n,r]);return Dn(()=>{a("default")},[a]),ke(o,()=>{a("reload")}),s}import{resolveId as Vn}from"@medplum/core";import{useEffect as Kn,useMemo as _e,useState as oe}from"react";function qe(e){let t=e.patientParam??"subject",n=e.query,r="";if(n!=null)if(typeof n=="string")r=n;else if(n instanceof URLSearchParams){let o=Array.from(n.entries()).sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else if(Array.isArray(n)){let o=[...n].sort((s,i)=>s[0].localeCompare(i[0])||s[1].localeCompare(i[1]));r=JSON.stringify(o)}else{let o=Object.entries(n).filter(([,s])=>s!==void 0).sort(([s],[i])=>s.localeCompare(i));r=JSON.stringify(o)}return`${e.resourceType}:${t}:${r}`}function $n(e){return e.map(t=>{let n=t.searches?t.searches.map(qe).join(","):"";return`${t.key}:[${n}]`}).join("|")}function Yr(e,t){let n=v(),[r,o]=oe([]),[s,i]=oe(!0),[a,u]=oe(),f=$n(t),m=_e(()=>t,[f]),T=_e(()=>Vn(e),[e]);return Kn(()=>{if(!T)return;let I=!1,b=`Patient/${T}`,S={_count:100,_sort:"-_lastUpdated"},c=[],d=new Map,x=[];for(let l of m){let h=[];if(l.searches)for(let p of l.searches){let g=qe(p),R=d.get(g);R===void 0&&(R=c.length,d.set(g,R),c.push(p)),h.push({searchIdx:R,resultKey:p.key})}x.push(h)}if(c.length===0){o(m.map(()=>({}))),i(!1);return}let y=c.map(l=>{let h=l.patientParam??"subject",p={[h]:b};if(l.query){if(typeof l.query=="string")return n.searchResources(l.resourceType,`${h}=${b}&${l.query}&_count=100&_sort=-_lastUpdated`);if(l.query instanceof URLSearchParams)l.query.forEach((g,R)=>{p[R]=g});else if(Array.isArray(l.query))for(let[g,R]of l.query)p[g]=R;else for(let[g,R]of Object.entries(l.query))R!==void 0&&(p[g]=R)}return n.searchResources(l.resourceType,{...S,...p})});return i(!0),u(void 0),Promise.allSettled(y).then(l=>{if(I)return;let h=x.map(g=>{let R={};for(let{searchIdx:C,resultKey:Q}of g){let P=l[C];R[Q]=P.status==="fulfilled"?P.value:[]}return R});o(h),i(!1);let p=l.filter(g=>g.status==="rejected");if(p.length>0){console.error("Some patient summary searches failed:",p.map(R=>R.reason));let g=p[0].reason;u(g instanceof Error?g:new Error(String(g)))}}).catch(l=>{I||(u(l instanceof Error?l:new Error(String(l))),i(!1))}),()=>{I=!0}},[n,T,m]),{sectionData:r,loading:s,error:a}}import{isAddPharmacyResponse as zn,isOrganizationArray as Bn,resolveId as Ue}from"@medplum/core";import{useCallback as Ne}from"react";function ro(e,t){let n=v(),r=Ne(async s=>{let{organization:i,...a}=s,u=Ue(i),f=await n.executeBot(e,u?{...a,organizationId:u}:a);if(!Bn(f))throw new Error("Invalid response from pharmacy search");return f},[n,e]),o=Ne(async s=>{let i=await n.executeBot(t,{patientId:s.patientId,pharmacy:s.pharmacy,setAsPrimary:s.setAsPrimary,organizationId:Ue(s.organization)});if(!zn(i))throw new Error("Invalid response from add pharmacy bot");return i},[n,t]);return{searchPharmacies:r,addToFavorites:o}}import{useEffect as jn,useRef as Jn}from"react";function so(e){let t=Jn(void 0);return jn(()=>{t.current=e}),t.current}import{getExtension as vt}from"@medplum/core";import{useReducer as Tt,useRef as Pt}from"react";import{deepEquals as Gn,isReference as We,isResource as Hn,normalizeOperationOutcome as Xn}from"@medplum/core";import{useCallback as Yn,useEffect as Zn,useState as et}from"react";function ie(e,t){let n=v(),[r,o]=et(()=>Le(n,e)),s=Yn(i=>{Gn(i,r)||o(i)},[r]);return Zn(()=>{let i=!0,a=Le(n,e);return!a&&We(e)?n.readReference(e).then(u=>{i&&s(u)}).catch(u=>{i&&(s(void 0),t&&t(Xn(u)))}):s(a),(()=>i=!1)},[n,e,s,t]),r}function Le(e,t){if(t){if(Hn(t))return t;if(We(t))return e.getCachedReference(t)}}import{EMPTY as ue,HTTP_HL7_ORG as q,PropertyType as A,append as De,capitalize as Fe,deepClone as nt,deepEquals as Ve,evalFhirPathTyped as ce,getExtension as W,getReferenceString as tt,getTypedPropertyValueWithoutSchema as J,normalizeErrorString as rt,splitN as ot,toJsBoolean as it,toTypedValue as Ke,typedValueToString as st}from"@medplum/core";var O={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"},$e=`${q}/fhir/StructureDefinition/questionnaire-itemControl`,at=`${q}/fhir/StructureDefinition/questionnaire-referenceFilter`,se=`${q}/fhir/StructureDefinition/questionnaire-referenceResource`,ut=`${q}/fhir/StructureDefinition/questionnaire-validationError`,ct=`${q}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,dt=`${q}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,mo=`${q}/fhir/StructureDefinition/questionnaire-signatureRequired`,G=`${q}/fhir/StructureDefinition/questionnaireresponse-signature`,lt=`${q}/fhir/StructureDefinition/questionnaire-hidden`,ft=`${q}/fhir/StructureDefinition/questionnaire-optionExclusive`;function Ro(e){return e.type==="choice"||e.type==="open-choice"}function de(e,t){return{...t,item:ze(e.item,t.item,t)}}function ze(e,t,n){if(!t)return t;let r=[];for(let o of t){let s=e?.find(i=>i.linkId===o.linkId);s&&!pt(s,n)||(s?.item&&o.item?r.push({...o,item:ze(s.item,o.item,n)}):r.push(o))}return r}function pt(e,t){if(W(e,lt)?.valueBoolean===!0)return!1;let r=mt(e,t);return r!==void 0?r:Rt(e,t)}function mt(e,t){let n=W(e,ct);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=Ke(t),s=ce(r,[o],{"%resource":o});return it(s)}}}function Rt(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let r of e.enableWhen){let o=je(t?.item,r.question);if(r.operator==="exists"&&!r.answerBoolean&&!o?.length){if(n==="any")return!0;continue}let{anyMatch:s,allMatch:i}=xt(r,o,n);if(n==="any"&&s)return!0;if(n==="all"&&!i)return!1}return n!=="any"}function le(e,t,n=t.item){for(let r of e){let o=n?.find(s=>s.linkId===r.linkId);o&&(ht(t,r,o),r.item&&o.item&&le(r.item,t,o.item))}}function ht(e,t,n){try{let r=It(t,e);if(!r)return;let o=gt(t,r);if(!o)return;n.answer=[o]}catch(r){n.extension=[{url:ut,valueString:`Expression evaluation failed: ${rt(r)}`}]}}var yt={[O.boolean]:[A.boolean],[O.date]:[A.date],[O.dateTime]:[A.dateTime],[O.time]:[A.time],[O.url]:[A.string,A.uri,A.url],[O.attachment]:[A.Attachment],[O.reference]:[A.Reference],[O.quantity]:[A.Quantity],[O.decimal]:[A.decimal,A.integer],[O.integer]:[A.decimal,A.integer]};function gt(e,t){if(!e.type)return;if(e.type===O.choice||e.type===O.openChoice)return{[`value${Fe(t.type)}`]:t.value};if(e.type===O.string||e.type===O.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(yt[e.type]?.includes(t.type))return{[`value${Fe(e.type)}`]:t.value}}function It(e,t){if(!t)return;let n=W(e,dt);if(n){let r=n.valueExpression?.expression;if(r){let o=Ke(t),s=ce(r,[o],{"%resource":o});return s.length!==0?s[0]:void 0}}}function ho(e,t,n){let r=[];for(let o of e){let s=n.answerOption?.find(i=>st(ae(i))===o);if(s){let i=ae(s);i&&r.push({[t]:i.value})}}return r}function Be(e,t,n){let r=[];for(let a of e.answerOption??ue)if(W(a,ft)?.valueBoolean===!0){let u=ae(a);u?.value!==void 0&&r.push(u)}if(r.length===0)return n;let o=a=>{let u=He(a);return!!u&&r.some(f=>Ve(f,u))},s=n.filter(a=>!t?.some(u=>Ve(u,a))),i=s.find(o);return i?[i]:s.some(a=>!o(a))?n.filter(a=>!o(a)):n}function je(e,t){for(let n of e??ue){if(n.linkId===t)return n.answer;if(n.item){let r=je(n.item,t);if(r)return r}}}function St(e,t,n){if(n==="exists")return!!e===t.value;if(e){let r=n==="="||n==="!="?n?.replace("=","~"):n,[{value:o}]=ce(`%actualAnswer ${r} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return o}else return!1}function xt(e,t,n){let r=t||[],o=bt(e),s=!1,i=!0;for(let a of r){let u=He(a),{operator:f}=e;if(St(u,o,f)?s=!0:i=!1,n==="any"&&s)break}return{anyMatch:s,allMatch:i}}function yo(e){let t=W(e,se);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function go(e,t){let n=nt(e),r=W(n,se);return!t||t.length===0?(r&&(n.extension=n.extension?.filter(o=>o!==r)),n):(r||(n.extension??=[],r={url:se},n.extension.push(r)),t.length===1?(r.valueCode=t[0],delete r.valueCodeableConcept):(r.valueCodeableConcept={coding:t.map(o=>({code:o}))},delete r.valueCode),n)}function Io(e,t,n){let r=W(e,at);if(!r?.valueString)return;let o=r.valueString;t?.reference&&(o=o.replaceAll("$subj",t.reference)),n?.reference&&(o=o.replaceAll("$encounter",n.reference));let s={},i=o.split("&");for(let a of i){let[u,f]=ot(a,"=",2);s[u]=f}return s}function fe(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??tt(e),item:pe(e.item,t?.item),status:"in-progress"}}function pe(e,t){let n;for(let r of e??ue){if(r.type===O.display)continue;let o=t?.filter(s=>s.linkId===r.linkId);if(o?.length)for(let s of o)s.id=s.id??Je(),s.text=s.text??r.text,s.item=pe(r.item,s.item),s.answer=Ge(r,s),n=De(n,s);else n=De(n,me(r))}return n}function me(e){return{id:Je(),linkId:e.linkId,text:e.text,item:pe(e.item,void 0),answer:Ge(e)}}var Et=1;function Je(){return"id-"+Et++}function Ge(e,t){if(!(e.type===O.display||e.type===O.group)){if(t?.answer&&t.answer.length>0)return t.answer;if(e.initial&&e.initial.length>0)return e.initial.map(n=>({...n}));if(e.answerOption)return e.answerOption.filter(n=>n.initialSelected).map(n=>({...n,initialSelected:void 0}))}}function So(e){return J({type:"QuestionnaireItemInitial",value:e},"value")}function ae(e){return J({type:"QuestionnaireItemAnswerOption",value:e},"value")}function bt(e){return J({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function He(e){return J({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Po(e){let t=ie(e.questionnaire),n=ie(e.defaultValue),[,r]=Tt(S=>S+1,0),o=Pt({activePage:0});if(!o.current.questionnaire&&t&&(o.current.questionnaire=t,o.current.pages=e.disablePagination?void 0:Ct(t)),t&&e.defaultValue&&n&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=fe(t,n),b()),t&&!e.defaultValue&&!o.current.questionnaireResponse&&(o.current.questionnaireResponse=fe(t),b()),!o.current.questionnaire||!o.current.questionnaireResponse)return{loading:!0};function s(S,c){let d=o.current.questionnaireResponse;for(let x of S)d=d?.item?.find(y=>x.id?y.id===x.id:y.linkId===x.linkId);return c&&(d=d?.item?.find(x=>x.linkId===c.linkId)),d}function i(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(S,c){let d=s(S);d&&(d.item??=[],d.item.push(me(c)),b())}function f(S,c){let d=s(S,c);d&&(d.answer??=[],d.answer.push({}),b())}function m(S,c,d){let x=s(S,c);x&&(x.answer=Be(c,x.answer,d),b())}function T(S){let c=o.current.questionnaireResponse;c&&(S?(c.extension=c.extension??[],c.extension=c.extension.filter(d=>d.url!==G),c.extension.push({url:G,valueSignature:S})):c.extension=c.extension?.filter(d=>d.url!==G),b())}function I(){let S=o.current.questionnaire;if(S?.item){let c=o.current.questionnaireResponse;le(S.item,c)}}function b(){let S=o.current.questionnaireResponse,c=o.current.questionnaire;!S||!c||(I(),r(),e.onChange?.(de(c,S)))}return{loading:!1,pagination:!!o.current.pages,questionnaire:o.current.questionnaire,questionnaireResponse:de(o.current.questionnaire,o.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:o.current.activePage,pages:o.current.pages,items:Mt(o.current.questionnaire,o.current.pages,o.current.activePage),responseItems:Qt(o.current.questionnaireResponse,o.current.pages,o.current.activePage),onNextPage:i,onPrevPage:a,onAddGroup:u,onAddAnswer:f,onChangeAnswer:m,onChangeSignature:T}}function Ct(e){if(!(!e?.item||vt(e?.item?.[0],$e)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,r)=>({linkId:n.linkId,title:n.text??`Page ${r+1}`,group:n}))}function Mt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function Qt(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{deepEquals as Ot,formatSearchQuery as wt}from"@medplum/core";import{useCallback as At,useEffect as Re,useRef as he,useState as K}from"react";async function kt(e,t){let n=await t.search(e.resourceType,wt({...e,total:e.total??"accurate"}),{cache:"no-cache"});return{items:n.entry?.map(o=>o.resource).filter(o=>o!==void 0)??[],total:n.total}}function wo(e){let{search:t,selectedId:n,loadItems:r,reloadKey:o}=e,s=v(),[i,a]=K(t),[u,f]=K([]),[m,T]=K(),[I,b]=K(!0),[S,c]=K(),d=he(e),x=he(0),y=he(0),l=i.resourceType,h=n!==void 0&&S?.id===n?S.value:void 0;Ot(t,i)||(a(t),b(!0));let p=At(async()=>{let g=++x.current;try{let R=r?await r(i,s):await kt(i,s);if(g!==x.current)return;f(R.items),T(R.total),d.current.onLoad?.(R.items,R.total)}catch(R){g===x.current&&(d.current.onError??console.error)(R)}finally{g===x.current&&b(!1)}},[i,r,s]);return Re(()=>{d.current=e}),Re(()=>{p().catch(console.error)},[p,o]),Re(()=>{let g=++y.current;if(!n)return;let R=async()=>{let Q=d.current.resolveSelected;if(Q)return Q(n,u,s);let P=u.find(M=>M.id===n);return P!==void 0?P:await s.readResource(l,n)};(async()=>{try{let Q=await R();g===y.current&&c({id:n,value:Q})}catch(Q){g===y.current&&(c({id:n,value:void 0}),(d.current.onError??console.error)(Q))}})().catch(console.error)},[n,u,s,l]),{items:u,total:m,loading:I,selected:h,search:i,refresh:p}}import{useEffect as Xe,useRef as _t}from"react";function qo(e,t){let n=v(),r=_t(t);Xe(()=>{r.current=t});let o=Array.isArray(e)?e.join(","):e;Xe(()=>{let s=new Set(o.split(",")),i=a=>{s.has(a.payload.resourceType)&&r.current(a.payload)};return n.addEventListener("resourceModified",i),()=>n.removeEventListener("resourceModified",i)},[n,o])}import{allOk as Nt,normalizeOperationOutcome as Lt}from"@medplum/core";import{useEffect as Wt,useMemo as Dt,useState as ge}from"react";import{useCallback as qt,useEffect as Ye,useRef as ye,useState as Ut}from"react";function Ze(e,t,n={leading:!1}){let[r,o]=Ut(e),s=ye(!1),i=ye(void 0),a=ye(!1),u=qt(()=>window.clearTimeout(i.current),[]);return Ye(()=>{s.current&&(!a.current&&n.leading?(a.current=!0,o(e),i.current=setTimeout(()=>{a.current=!1},t)):(u(),i.current=setTimeout(()=>{a.current=!1,o(e)},t)))},[e,n.leading,t,u]),Ye(()=>(s.current=!0,u),[u]),[r,u]}var Ft=250;function Ko(e,t,n){return Ie("search",e,t,n)}function $o(e,t,n){return Ie("searchOne",e,t,n)}function zo(e,t,n){return Ie("searchResources",e,t,n)}function Ie(e,t,n,r){let o=v(),[s,i]=ge(!1),[a,u]=ge(),[f,m]=ge(),T=o.fhirSearchUrl(t,n).toString(),I=Dt(()=>({resourceType:t,query:n}),[T]),b=r?.enabled??!0,S=r?.debounceMs??Ft,[c]=Ze(I,S,{leading:!0});return Wt(()=>{if(!b)return()=>{};i(!0);let d=!0;return o[e](c.resourceType,c.query).then(x=>{d&&(i(!1),u(x),m(Nt))}).catch(x=>{d&&(i(!1),u(void 0),m(Lt(x)))}),()=>{d=!1}},[o,e,c,b]),[a,s,f]}import{OperationOutcomeError as Vt,isResource as Kt,parametersToOrderSetSyncResponse as $t,resolveId as zt}from"@medplum/core";import{useCallback as Bt}from"react";function Ho(){let e=v();return Bt(async(t,n)=>{try{let r=await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t,organizationId:zt(n)});return Kt(r,"Parameters")?$t(r):void 0}catch(r){if(r instanceof Vt&&r.outcome.issue?.some(o=>o.code==="not-found"))return;throw r}},[e])}import{getReferenceString as jt}from"@medplum/core";import{useCallback as Jt,useEffect as en,useRef as Gt,useState as V}from"react";function ni({query:e,threadId:t}){let n=v(),[r,o]=V(!0),[s,i]=V(e),[a,u]=V([]),[f,m]=V(void 0),[T,I]=V(null),[b,S]=V(void 0),c=Gt(0);e!==s&&(i(e),o(!0));let d=Jt(async()=>{let l=++c.current;try{let h=new URLSearchParams(s);h.append("identifier:not","http://medplum.com/ai-message|"),h.append("part-of:missing","true"),h.append("_has:Communication:part-of:_id:not","null");let p=await n.search("Communication",h.toString(),{cache:"no-cache"});if(l!==c.current)return;let g=p.entry?.map(M=>M.resource).filter(M=>M!==void 0)||[];if(p.total!==void 0&&S(p.total),g.length===0){u([]);return}let C=`
|
|
2
2
|
query {
|
|
3
|
-
${
|
|
4
|
-
${
|
|
5
|
-
part_of: "${
|
|
3
|
+
${g.map(M=>{let D=`thread_${M.id?.replaceAll("-","")||""}`,L=jt(M);return`
|
|
4
|
+
${D}: CommunicationList(
|
|
5
|
+
part_of: "${L}"
|
|
6
6
|
_sort: "-sent"
|
|
7
7
|
_count: 1
|
|
8
8
|
) {
|
|
@@ -26,9 +26,9 @@ import{useEffect as cn,useMemo as dn,useState as ln}from"react";import{createCon
|
|
|
26
26
|
`}).join(`
|
|
27
27
|
`)}
|
|
28
28
|
}
|
|
29
|
-
`,
|
|
30
|
-
`),r=
|
|
31
|
-
`),[n]),[o,s]=
|
|
29
|
+
`,Q=await n.graphql(C);if(l!==c.current)return;let P=g.map(M=>{let D=`thread_${M.id?.replaceAll("-","")||""}`,L=Q.data[D],z=L&&L.length>0?L[0]:void 0;return[M,z]}).filter(M=>M[1]!==void 0);u(P)}finally{l===c.current&&o(!1)}},[n,s]);return en(()=>{d().catch(l=>{I(l)})},[d]),en(()=>{(async()=>{if(!t){m(void 0);return}let h=a.find(g=>g[0].id===t);if(h){m(h[0]);return}let p=await n.readResource("Communication",t);if(p.partOf===void 0)m(p);else{let g=p.partOf[0].reference;if(g){let R=await n.readReference({reference:g});m(R)}}})().catch(h=>{I(h)})},[t,a,n]),{loading:r,error:T,threadMessages:a,selectedThread:f,total:b,addThreadMessage:l=>{(async()=>{await d(),u(p=>[[l,void 0],...p])})().catch(p=>I(p))},handleThreadStatusChange:l=>{if(!f)return;(async()=>{let p=await n.updateResource({...f,status:l});m(p),u(g=>g.map(([R,C])=>R.id===p.id?[p,C]:[R,C]))})().catch(p=>I(p))},refreshThreadMessages:d}}import{getStatus as Ht,OperationOutcomeError as Xt}from"@medplum/core";import{useEffect as Yt,useMemo as nn,useState as Zt}from"react";function er(e){if(e instanceof Xt){let t=Ht(e.outcome);return t===400||t===404}return!1}var tn=[];function nr(e){let t=v(),n=Array.from(new Set(e.filter(i=>!!i))).sort((i,a)=>i.localeCompare(a)).join(`
|
|
30
|
+
`),r=nn(()=>n===""?tn:n.split(`
|
|
31
|
+
`),[n]),[o,s]=Zt({});return Yt(()=>{if(r.length===0)return;let i=!1,a=new AbortController;for(let u of r)t.valueSetExpand({url:u,count:1},{signal:a.signal}).then(()=>{i||s(f=>({...f,[u]:!0}))}).catch(f=>{i||s(m=>({...m,[u]:!er(f)}))});return()=>{i=!0,a.abort()}},[t,r]),nn(()=>{let i=[],a=[],u=!1;for(let f of r){let m=o[f];m===void 0?u=!0:m?i.push(f):a.push(f)}return{loading:u,available:i,unavailable:a}},[r,o])}function si(e){let{loading:t,unavailable:n}=nr(e?[e]:tn);if(!e)return!0;if(!t)return!n.includes(e)}import{ReconnectingWebSocket as tr,sleep as rr}from"@medplum/core";import{useCallback as k,useEffect as Se,useRef as N,useState as H}from"react";var or=12e4;function li({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:r=or}){let o=v(),s=N(n);Se(()=>{s.current=n},[n]);let[i,a]=H("idle"),[u,f]=H(void 0),[m,T]=H([]),I=N(void 0),b=N(void 0),S=N(void 0),c=N(void 0),d=N(!1),x=N(!1),y=N(!1),[l,h]=H(!1),p=N(!1),g=k(E=>{p.current=E,h(E),b.current?.getAudioTracks().forEach(w=>{w.enabled=!E})},[]),R=k(()=>{y.current=!1,c.current?.disconnect(),c.current=void 0,S.current?.close().catch(()=>{}),S.current=void 0,b.current?.getTracks().forEach(E=>E.stop()),b.current=void 0,p.current=!1,h(!1),a(I.current?"idle":"disconnected")},[]),C=k(()=>{R(),I.current?.close(),I.current=void 0,x.current=!1,a("disconnected")},[R]),Q=k(()=>{I.current?.send(JSON.stringify({type:"session.update",session:{type:"transcription",audio:{input:{format:{type:"audio/pcm",rate:24e3},transcription:{model:t,language:e},turn_detection:{type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},noise_reduction:{type:"near_field"}}}}}))},[e,t]),P=k(async()=>{if(!(c.current||d.current)&&!(!b.current||!I.current)){d.current=!0;try{let E=new AudioContext({sampleRate:24e3});await E.audioWorklet.addModule(ur());let w=b.current,U=I.current;if(!y.current||!w||!U){await E.close().catch(()=>{});return}let sn=E.createMediaStreamSource(w),B=new AudioWorkletNode(E,rn);B.port.onmessage=an=>{if(U.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let un=ir(an.data),cn=btoa(String.fromCharCode(...un));U.send(JSON.stringify({type:"input_audio_buffer.append",audio:cn}))},sn.connect(B),B.connect(E.destination),S.current=E,c.current=B,a("listening")}catch(E){f(E),a("error"),R()}finally{d.current=!1}}},[R]),M=k(()=>{y.current&&x.current&&b.current&&(c.current||(I.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),P().catch(()=>{})))},[P]),$=k(E=>{switch(E.type){case"session.created":Q();break;case"session.updated":x.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(E.transcript){let w={text:E.transcript,timestamp:new Date().toISOString()};T(U=>[...U,w]),s.current?.(E.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",E),f(E),a("error");break;default:console.debug("[useWhisper] unhandled message",E.type,E);break}},[Q,M]),D=k(async()=>{a("requesting_microphone");let E=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return E.getAudioTracks().forEach(w=>{w.enabled=!p.current}),b.current=E,E},[]),L=k(()=>{a("connecting");let E=sr(o.getBaseUrl());console.debug("[useWhisper] connecting to",E);let w=new tr(E);return I.current=w,w.onopen=()=>{x.current=!1,y.current?a("connected"):a("idle"),w.send(JSON.stringify({type:"ai-realtime:connect",accessToken:o.getAccessToken()}))},w.onmessage=U=>$(JSON.parse(U.data)),w.onerror=U=>{y.current&&(f(U),C(),a("error"))},w.onclose=()=>{x.current=!1,I.current&&a(y.current?"connecting":"idle")},w},[o,$,C]),z=k(()=>I.current??L(),[L]),on=k(async()=>{try{f(void 0),y.current=!0,z(),await D(),M()}catch(E){f(E),a("error"),R()}},[D,z,R,M]);return Se(()=>{if(i!=="idle"||!I.current||!Number.isFinite(r)||r<=0)return;let E=new AbortController;return rr(r,{signal:E.signal}).then(()=>C()).catch(()=>{}),()=>E.abort()},[i,r,C]),Se(()=>()=>C(),[C]),{status:i,error:u,transcripts:m,start:on,stop:R,isListening:i==="listening"||i==="speech_started"||i==="speech_stopped",muted:l,setMuted:g}}function ir(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++){let r=Math.max(-1,Math.min(1,e[n]));t[n]=r*32767}return new Uint8Array(t.buffer)}function sr(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var rn="medplum-pcm-worklet",ar=`
|
|
32
32
|
class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
33
33
|
constructor() {
|
|
34
34
|
super();
|
|
@@ -60,6 +60,6 @@ class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
registerProcessor('${
|
|
64
|
-
`,
|
|
63
|
+
registerProcessor('${rn}', PcmWorkletProcessor);
|
|
64
|
+
`,xe;function ur(){if(!xe){let e=new Blob([ar],{type:"application/javascript"});xe=URL.createObjectURL(e)}return xe}export{Tn as MEDICATION_CART_ADD_IN_PROGRESS,mr as MedplumProvider,dt as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,ct as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,lt as QUESTIONNAIRE_HIDDEN_URL,$e as QUESTIONNAIRE_ITEM_CONTROL_URL,ft as QUESTIONNAIRE_OPTION_EXCLUSIVE_URL,at as QUESTIONNAIRE_REFERENCE_FILTER_URL,se as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,mo as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,G as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,ut as QUESTIONNAIRE_VALIDATION_ERROR_URL,O as QuestionnaireItemType,Be as applyOptionExclusive,fe as buildInitialResponse,me as buildInitialResponseItem,ir as convertToPCM16,le as evaluateCalculatedExpressionsInQuestionnaire,ae as getItemAnswerOptionValue,bt as getItemEnableWhenValueAnswer,So as getItemInitialValue,ho as getNewMultiSelectValues,Io as getQuestionnaireItemReferenceFilter,yo as getQuestionnaireItemReferenceTargetTypes,He as getResponseItemAnswerValue,Ro as isChoiceQuestion,pt as isQuestionEnabled,er as isValueSetUnavailableError,X as reactContext,de as removeDisabledItems,go as setQuestionnaireItemReferenceTargetTypes,gt as typedValueToResponseItem,gr as useCachedBinaryUrl,br as useMedicationCart,Mr as useMedicationIFrame,kr as useMedicationOrder,Lr as useMedicationOrderSet,v as useMedplum,Y as useMedplumContext,dr as useMedplumNavigate,Ee as useMedplumProfile,jr as useNotificationCount,Yr as usePatientSummaryData,ro as usePharmacySearch,so as usePrevious,Po as useQuestionnaireForm,ie as useResource,wo as useResourceBoard,qo as useResourceModified,Ko as useSearch,$o as useSearchOne,zo as useSearchResources,ke as useSubscription,Ho as useSyncOrderSet,ni as useThreadInbox,nr as useValueSetAvailabilities,si as useValueSetAvailability,li as useWhisper};
|
|
65
65
|
//# sourceMappingURL=index.mjs.map
|