@medplum/react-hooks 5.1.24 → 5.1.26
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 +5 -5
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/index.d.ts +9 -3
- package/dist/esm/index.d.ts +9 -3
- package/dist/esm/index.mjs +5 -5
- package/dist/esm/index.mjs.map +3 -3
- package/package.json +6 -6
package/dist/cjs/index.d.ts
CHANGED
|
@@ -461,14 +461,18 @@ export declare function usePatientSummaryData(patient: Patient | Reference<Patie
|
|
|
461
461
|
* Encapsulates calls to a search-pharmacy bot and an add-patient-pharmacy bot,
|
|
462
462
|
* and can be composed with the generic `PharmacyDialog` component from `@medplum/react`.
|
|
463
463
|
*
|
|
464
|
+
* The search param type is generic so vendor hooks can widen it with their own
|
|
465
|
+
* filters (e.g. ScriptSure `specialties`); the extra keys are passed through to
|
|
466
|
+
* the bot as-is at runtime.
|
|
467
|
+
*
|
|
464
468
|
* @param searchBotIdentifier - Bot identifier for the pharmacy search bot.
|
|
465
469
|
* @param addPharmacyBotIdentifier - Bot identifier for the add-patient-pharmacy bot.
|
|
466
470
|
* @returns An object with `searchPharmacies` and `addToFavorites` callbacks.
|
|
467
471
|
*/
|
|
468
|
-
export declare function usePharmacySearch(searchBotIdentifier: Identifier, addPharmacyBotIdentifier: Identifier): UsePharmacySearchReturn
|
|
472
|
+
export declare function usePharmacySearch<T extends PharmacySearchParams = PharmacySearchParams>(searchBotIdentifier: Identifier, addPharmacyBotIdentifier: Identifier): UsePharmacySearchReturn<T>;
|
|
469
473
|
|
|
470
|
-
export declare interface UsePharmacySearchReturn {
|
|
471
|
-
searchPharmacies: (params:
|
|
474
|
+
export declare interface UsePharmacySearchReturn<T extends PharmacySearchParams = PharmacySearchParams> {
|
|
475
|
+
searchPharmacies: (params: T) => Promise<Organization[]>;
|
|
472
476
|
addToFavorites: (params: AddFavoriteParams) => Promise<AddPharmacyResponse>;
|
|
473
477
|
}
|
|
474
478
|
|
|
@@ -658,6 +662,8 @@ export declare type UseWhisperResult = {
|
|
|
658
662
|
start: () => Promise<void>;
|
|
659
663
|
stop: () => void;
|
|
660
664
|
isListening: boolean;
|
|
665
|
+
muted: boolean;
|
|
666
|
+
setMuted: (value: boolean) => void;
|
|
661
667
|
};
|
|
662
668
|
|
|
663
669
|
export declare type WhisperStatus = 'idle' | 'requesting_microphone' | 'connecting' | 'connected' | 'listening' | 'speech_started' | 'speech_stopped' | 'disconnected' | 'error';
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -461,14 +461,18 @@ export declare function usePatientSummaryData(patient: Patient | Reference<Patie
|
|
|
461
461
|
* Encapsulates calls to a search-pharmacy bot and an add-patient-pharmacy bot,
|
|
462
462
|
* and can be composed with the generic `PharmacyDialog` component from `@medplum/react`.
|
|
463
463
|
*
|
|
464
|
+
* The search param type is generic so vendor hooks can widen it with their own
|
|
465
|
+
* filters (e.g. ScriptSure `specialties`); the extra keys are passed through to
|
|
466
|
+
* the bot as-is at runtime.
|
|
467
|
+
*
|
|
464
468
|
* @param searchBotIdentifier - Bot identifier for the pharmacy search bot.
|
|
465
469
|
* @param addPharmacyBotIdentifier - Bot identifier for the add-patient-pharmacy bot.
|
|
466
470
|
* @returns An object with `searchPharmacies` and `addToFavorites` callbacks.
|
|
467
471
|
*/
|
|
468
|
-
export declare function usePharmacySearch(searchBotIdentifier: Identifier, addPharmacyBotIdentifier: Identifier): UsePharmacySearchReturn
|
|
472
|
+
export declare function usePharmacySearch<T extends PharmacySearchParams = PharmacySearchParams>(searchBotIdentifier: Identifier, addPharmacyBotIdentifier: Identifier): UsePharmacySearchReturn<T>;
|
|
469
473
|
|
|
470
|
-
export declare interface UsePharmacySearchReturn {
|
|
471
|
-
searchPharmacies: (params:
|
|
474
|
+
export declare interface UsePharmacySearchReturn<T extends PharmacySearchParams = PharmacySearchParams> {
|
|
475
|
+
searchPharmacies: (params: T) => Promise<Organization[]>;
|
|
472
476
|
addToFavorites: (params: AddFavoriteParams) => Promise<AddPharmacyResponse>;
|
|
473
477
|
}
|
|
474
478
|
|
|
@@ -658,6 +662,8 @@ export declare type UseWhisperResult = {
|
|
|
658
662
|
start: () => Promise<void>;
|
|
659
663
|
stop: () => void;
|
|
660
664
|
isListening: boolean;
|
|
665
|
+
muted: boolean;
|
|
666
|
+
setMuted: (value: boolean) => void;
|
|
661
667
|
};
|
|
662
668
|
|
|
663
669
|
export declare type WhisperStatus = 'idle' | 'requesting_microphone' | 'connecting' | 'connected' | 'listening' | 'speech_started' | 'speech_stopped' | 'disconnected' | 'error';
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{useEffect as He,useMemo as Xe,useState as Ye}from"react";import{createContext as Je,useContext as Ge}from"react";var K=Je(void 0);function j(){return Ge(K)}function P(){return j().medplum}function Ot(){return j().navigate}function me(){return j().profile}import{jsx as en}from"react/jsx-runtime";var he=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function _t(e){let t=e.medplum,n=e.navigate??Ze,[o,r]=Ye({profile:t.getProfile(),loading:t.isLoading()});He(()=>{function s(){r(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of he)t.addEventListener(a,s);return()=>{for(let a of he)t.removeEventListener(a,s)}},[t]);let i=Xe(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return en(K.Provider,{value:i,children:e.children})}function Ze(e){window.location.assign(e)}import{useMemo as nn}from"react";var ye=new Map,Nt=e=>nn(()=>{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=ye.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 ye.set(t,e),e},[e]);import{useEffect as Re,useRef as z,useState as tn}from"react";function Dt(e,t,n){let o=P(),{patientId:r,onPatientSyncSuccess:i,onIframeSuccess:s,onError:a}=n,[f,S]=tn(void 0),E=z(i),T=z(s),g=z(a);return Re(()=>{E.current=i,T.current=s,g.current=a},[i,s,a]),Re(()=>{let h=!1;return(async()=>{try{if(r){if(await o.executeBot(e,{patientId:r}),h)return;E.current?.()}let u=await o.executeBot(t,{patientId:r});if(h)return;u.url&&(S(u.url),T.current?.(u.url))}catch(u){h||g.current?.(u)}})().catch(()=>{}),()=>{h=!0}},[o,e,t,r]),f}import{INVALID_MEDICATION_ORDER_RESPONSE as rn,INVALID_MEDICATION_SEARCH_RESPONSE as on,isResource as J,medicationOrderRequestToParameters as sn,medicationSearchParamsToParameters as an,parametersToMedicationOrderResponse as un}from"@medplum/core";import{useCallback as ge}from"react";function jt(){let e=P(),t=ge(async o=>{let r=e.fhirUrl("Medication","$drug-search"),i=an(o),s=await e.post(r,i);if(!J(s,"Bundle"))throw new Error(on);return(s.entry??[]).map(a=>a.resource).filter(a=>J(a,"Medication"))},[e]),n=ge(async o=>{let r=e.fhirUrl("MedicationRequest","$order-medication"),i=sn(o),s=await e.post(r,i);if(!J(s,"Parameters"))throw new Error(rn);return un(s)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as cn,isResource as dn,medicationOrderSetRequestToParameters as pn,parametersToMedicationOrderSetResponse as fn}from"@medplum/core";import{useCallback as Ie,useEffect as ln,useRef as Se,useState as G}from"react";function Xt(e){let t=P(),{patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i}=e,[s,a]=G(void 0),[f,S]=G(!1),[E,T]=G(void 0),g=Se({patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i});g.current={patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i};let h=()=>{let c=g.current;if(!c.patientId)return;let l=!!c.planDefinitionId,d=c.vendorOrderSetId!==void 0&&c.vendorOrderSetId!==null&&c.vendorOrderSetId!=="";return!l&&!d?void 0:{patientId:c.patientId,planDefinitionId:l?c.planDefinitionId:void 0,vendorOrderSetId:d?c.vendorOrderSetId:void 0,appId:c.appId}},y=Ie(async c=>{let l=t.fhirUrl("PlanDefinition","$order-set-url"),d=pn(c),R=await t.post(l,d);if(!dn(R,"Parameters"))throw new Error(cn);return fn(R).launchUrl},[t]),u=Se(0),p=Ie(async()=>{let c=h();if(!c)return;u.current+=1;let l=u.current;S(!0),T(void 0);try{let d=await y(c);return u.current!==l?void 0:(a(d),d)}catch(d){u.current===l&&(T(d),a(void 0));return}finally{u.current===l&&S(!1)}},[y]);return ln(()=>{let c=!1,l=h();if(!l){u.current+=1,a(void 0),S(!1),T(void 0);return}u.current+=1;let d=u.current;return S(!0),T(void 0),y(l).then(R=>{c||u.current!==d||a(R)}).catch(R=>{c||u.current!==d||(T(R),a(void 0))}).finally(()=>{!c&&u.current===d&&S(!1)}),()=>{c=!0}},[y,n,o,r,i]),{url:s,loading:f,error:E,refresh:p}}import{useCallback as hn,useEffect as yn,useState as Rn}from"react";import{deepEquals as xe}from"@medplum/core";import{useCallback as L,useEffect as H,useRef as A,useState as be}from"react";var mn=3e3;function Ee(e,t,n){let o=P(),i=me()?e:void 0,[s,a]=be(),[f,S]=be(n?.subscriptionProps),E=A(!1),T=A(void 0),g=A(void 0),h=A(void 0),y=A(t);y.current=t;let u=A(n?.onWebSocketOpen);u.current=n?.onWebSocketOpen;let p=A(n?.onWebSocketClose);p.current=n?.onWebSocketClose;let c=A(n?.onSubscriptionConnect);c.current=n?.onSubscriptionConnect;let l=A(n?.onSubscriptionDisconnect);l.current=n?.onSubscriptionDisconnect;let d=A(n?.onError);d.current=n?.onError,H(()=>{xe(n?.subscriptionProps,f)||S(n?.subscriptionProps)},[f,n]),H(()=>{T.current&&(clearTimeout(T.current),T.current=void 0);let v=!1;return(g.current!==i||!xe(h.current,f))&&(v=!0),v&&g.current&&o.unsubscribeFromCriteria(g.current,h.current),g.current=i,h.current=f,v&&i?a(o.subscribeToCriteria(i,f)):i||a(void 0),()=>{T.current=setTimeout(()=>{a(void 0),i&&o.unsubscribeFromCriteria(i,f)},mn)}},[o,i,f]);let R=L(v=>{y.current?.(v.payload)},[]),b=L(()=>{u.current?.()},[]),I=L(()=>{p.current?.()},[]),m=L(v=>{c.current?.(v.payload.subscriptionId)},[]),w=L(v=>{l.current?.(v.payload.subscriptionId)},[]),Q=L(v=>{d.current?.(v.payload)},[]);H(()=>s?(E.current||(s.addEventListener("message",R),s.addEventListener("open",b),s.addEventListener("close",I),s.addEventListener("connect",m),s.addEventListener("disconnect",w),s.addEventListener("error",Q),E.current=!0),()=>{E.current=!1,s.removeEventListener("message",R),s.removeEventListener("open",b),s.removeEventListener("close",I),s.removeEventListener("connect",m),s.removeEventListener("disconnect",w),s.removeEventListener("error",Q)}):()=>{},[s,R,b,I,m,w,Q])}function sr(e){let t=P(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=Rn(0),a=hn(f=>{t.search(n,o,{cache:f}).then(S=>s(S.total)).catch(console.error)},[t,n,o]);return yn(()=>{a("default")},[a]),Ee(r,()=>{a("reload")}),i}import{resolveId as gn}from"@medplum/core";import{useEffect as In,useMemo as Te,useState as X}from"react";function ve(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 Sn(e){return e.map(t=>{let n=t.searches?t.searches.map(ve).join(","):"";return`${t.key}:[${n}]`}).join("|")}function pr(e,t){let n=P(),[o,r]=X([]),[i,s]=X(!0),[a,f]=X(),S=Sn(t),E=Te(()=>t,[S]),T=Te(()=>gn(e),[e]);return In(()=>{if(!T)return;let g=!1,h=`Patient/${T}`,y={_count:100,_sort:"-_lastUpdated"},u=[],p=new Map,c=[];for(let d of E){let R=[];if(d.searches)for(let b of d.searches){let I=ve(b),m=p.get(I);m===void 0&&(m=u.length,p.set(I,m),u.push(b)),R.push({searchIdx:m,resultKey:b.key})}c.push(R)}if(u.length===0){r(E.map(()=>({}))),s(!1);return}let l=u.map(d=>{let R=d.patientParam??"subject",b={[R]:h};if(d.query){if(typeof d.query=="string")return n.searchResources(d.resourceType,`${R}=${h}&${d.query}&_count=100&_sort=-_lastUpdated`);if(d.query instanceof URLSearchParams)d.query.forEach((I,m)=>{b[m]=I});else if(Array.isArray(d.query))for(let[I,m]of d.query)b[I]=m;else for(let[I,m]of Object.entries(d.query))m!==void 0&&(b[I]=m)}return n.searchResources(d.resourceType,{...y,...b})});return s(!0),f(void 0),Promise.allSettled(l).then(d=>{if(g)return;let R=c.map(I=>{let m={};for(let{searchIdx:w,resultKey:Q}of I){let v=d[w];m[Q]=v.status==="fulfilled"?v.value:[]}return m});r(R),s(!1);let b=d.filter(I=>I.status==="rejected");if(b.length>0){console.error("Some patient summary searches failed:",b.map(m=>m.reason));let I=b[0].reason;f(I instanceof Error?I:new Error(String(I)))}}).catch(d=>{g||(f(d instanceof Error?d:new Error(String(d))),s(!1))}),()=>{g=!0}},[n,T,E]),{sectionData:o,loading:i,error:a}}import{isAddPharmacyResponse as xn,isOrganizationArray as bn}from"@medplum/core";import{useCallback as Pe}from"react";function yr(e,t){let n=P(),o=Pe(async i=>{let s=await n.executeBot(e,i);if(!bn(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(!xn(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:o,addToFavorites:r}}import{useEffect as En,useRef as Tn}from"react";function Ir(e){let t=Tn(void 0);return En(()=>{t.current=e}),t.current}import{getExtension as et}from"@medplum/core";import{useReducer as nt,useRef as tt}from"react";import{deepEquals as vn,isReference as Ce,isResource as Pn,normalizeOperationOutcome as Qn}from"@medplum/core";import{useCallback as Cn,useEffect as On,useState as Mn}from"react";function Y(e,t){let n=P(),[o,r]=Mn(()=>Qe(n,e)),i=Cn(s=>{vn(s,o)||r(s)},[o]);return On(()=>{let s=!0,a=Qe(n,e);return!a&&Ce(e)?n.readReference(e).then(f=>{s&&i(f)}).catch(f=>{s&&(i(void 0),t&&t(Qn(f)))}):i(a),(()=>s=!1)},[n,e,i,t]),o}function Qe(e,t){if(t){if(Pn(t))return t;if(Ce(t))return e.getCachedReference(t)}}import{EMPTY as Ae,HTTP_HL7_ORG as U,PropertyType as O,append as Oe,capitalize as Me,deepClone as wn,evalFhirPathTyped as ee,getExtension as W,getReferenceString as An,getTypedPropertyValueWithoutSchema as $,normalizeErrorString as _n,splitN as kn,toJsBoolean as Un,toTypedValue as _e,typedValueToString as qn}from"@medplum/core";var C={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=`${U}/fhir/StructureDefinition/questionnaire-itemControl`,Nn=`${U}/fhir/StructureDefinition/questionnaire-referenceFilter`,Z=`${U}/fhir/StructureDefinition/questionnaire-referenceResource`,Ln=`${U}/fhir/StructureDefinition/questionnaire-validationError`,Wn=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,Fn=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Pr=`${U}/fhir/StructureDefinition/questionnaire-signatureRequired`,B=`${U}/fhir/StructureDefinition/questionnaireresponse-signature`,Dn=`${U}/fhir/StructureDefinition/questionnaire-hidden`;function Qr(e){return e.type==="choice"||e.type==="open-choice"}function ne(e,t){return{...t,item:Ue(e.item,t.item,t)}}function Ue(e,t,n){if(!t)return t;let o=[];for(let r of t){let i=e?.find(s=>s.linkId===r.linkId);i&&!Vn(i,n)||(i?.item&&r.item?o.push({...r,item:Ue(i.item,r.item,n)}):o.push(r))}return o}function Vn(e,t){if(W(e,Dn)?.valueBoolean===!0)return!1;let o=$n(e,t);return o!==void 0?o:Bn(e,t)}function $n(e,t){let n=W(e,Wn);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=_e(t),i=ee(o,[r],{"%resource":r});return Un(i)}}}function Bn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=qe(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=Hn(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function te(e,t,n=t.item){for(let o of e){let r=n?.find(i=>i.linkId===o.linkId);r&&(Kn(t,o,r),o.item&&r.item&&te(o.item,t,r.item))}}function Kn(e,t,n){try{let o=Jn(t,e);if(!o)return;let r=zn(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:Ln,valueString:`Expression evaluation failed: ${_n(o)}`}]}}var jn={[C.boolean]:[O.boolean],[C.date]:[O.date],[C.dateTime]:[O.dateTime],[C.time]:[O.time],[C.url]:[O.string,O.uri,O.url],[C.attachment]:[O.Attachment],[C.reference]:[O.Reference],[C.quantity]:[O.Quantity],[C.decimal]:[O.decimal,O.integer],[C.integer]:[O.decimal,O.integer]};function zn(e,t){if(!e.type)return;if(e.type===C.choice||e.type===C.openChoice)return{[`value${Me(t.type)}`]:t.value};if(e.type===C.string||e.type===C.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(jn[e.type]?.includes(t.type))return{[`value${Me(e.type)}`]:t.value}}function Jn(e,t){if(!t)return;let n=W(e,Fn);if(n){let o=n.valueExpression?.expression;if(o){let r=_e(t),i=ee(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function Cr(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>qn(we(s))===r);if(i){let s=we(i);s&&o.push({[t]:s.value})}}return o}function qe(e,t){for(let n of e??Ae){if(n.linkId===t)return n.answer;if(n.item){let o=qe(n.item,t);if(o)return o}}}function Gn(e,t,n){if(n==="exists")return!!e===t.value;if(e){let o=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=ee(`%actualAnswer ${o} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function Hn(e,t,n){let o=t||[],r=Yn(e),i=!1,s=!0;for(let a of o){let f=Zn(a),{operator:S}=e;if(Gn(f,r,S)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function Or(e){let t=W(e,Z);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function Mr(e,t){let n=wn(e),o=W(n,Z);return!t||t.length===0?(o&&(n.extension=n.extension?.filter(r=>r!==o)),n):(o||(n.extension??=[],o={url:Z},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 wr(e,t,n){let o=W(e,Nn);if(!o?.valueString)return;let r=o.valueString;t?.reference&&(r=r.replaceAll("$subj",t.reference)),n?.reference&&(r=r.replaceAll("$encounter",n.reference));let i={},s=r.split("&");for(let a of s){let[f,S]=kn(a,"=",2);i[f]=S}return i}function re(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??An(e),item:oe(e.item,t?.item),status:"in-progress"}}function oe(e,t){let n;for(let o of e??Ae){if(o.type===C.display)continue;let r=t?.filter(i=>i.linkId===o.linkId);if(r?.length)for(let i of r)i.id=i.id??Ne(),i.text=i.text??o.text,i.item=oe(o.item,i.item),i.answer=Le(o,i),n=Oe(n,i);else n=Oe(n,ie(o))}return n}function ie(e){return{id:Ne(),linkId:e.linkId,text:e.text,item:oe(e.item,void 0),answer:Le(e)}}var Xn=1;function Ne(){return"id-"+Xn++}function Le(e,t){if(!(e.type===C.display||e.type===C.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 Ar(e){return $({type:"QuestionnaireItemInitial",value:e},"value")}function we(e){return $({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Yn(e){return $({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Zn(e){return $({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Lr(e){let t=Y(e.questionnaire),n=Y(e.defaultValue),[,o]=nt(y=>y+1,0),r=tt({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:rt(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=re(t,n),h()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=re(t),h()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(y,u){let p=r.current.questionnaireResponse;for(let c of y)p=p?.item?.find(l=>c.id?l.id===c.id:l.linkId===c.linkId);return u&&(p=p?.item?.find(c=>c.linkId===u.linkId)),p}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function a(){r.current.activePage=(r.current.activePage??0)-1,o()}function f(y,u){let p=i(y);p&&(p.item??=[],p.item.push(ie(u)),h())}function S(y,u){let p=i(y,u);p&&(p.answer??=[],p.answer.push({}),h())}function E(y,u,p){let c=i(y,u);c&&(c.answer=p,h())}function T(y){let u=r.current.questionnaireResponse;u&&(y?(u.extension=u.extension??[],u.extension=u.extension.filter(p=>p.url!==B),u.extension.push({url:B,valueSignature:y})):u.extension=u.extension?.filter(p=>p.url!==B),h())}function g(){let y=r.current.questionnaire;if(y?.item){let u=r.current.questionnaireResponse;te(y.item,u)}}function h(){let y=r.current.questionnaireResponse,u=r.current.questionnaire;!y||!u||(g(),o(),e.onChange?.(ne(u,y)))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:ne(r.current.questionnaire,r.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:ot(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:it(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:a,onAddGroup:f,onAddAnswer:S,onChangeAnswer:E,onChangeSignature:T}}function rt(e){if(!(!e?.item||et(e?.item?.[0],ke)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,o)=>({linkId:n.linkId,title:n.text??`Page ${o+1}`,group:n}))}function ot(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function it(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{deepEquals as st,formatSearchQuery as at}from"@medplum/core";import{useCallback as ut,useEffect as se,useRef as ae,useState as F}from"react";async function ct(e,t){let n=await t.search(e.resourceType,at({...e,total:e.total??"accurate"}),{cache:"no-cache"});return{items:n.entry?.map(r=>r.resource).filter(r=>r!==void 0)??[],total:n.total}}function $r(e){let{search:t,selectedId:n,loadItems:o,reloadKey:r}=e,i=P(),[s,a]=F(t),[f,S]=F([]),[E,T]=F(),[g,h]=F(!0),[y,u]=F(),p=ae(e),c=ae(0),l=ae(0),d=s.resourceType,R=n!==void 0&&y?.id===n?y.value:void 0;st(t,s)||(a(t),h(!0));let b=ut(async()=>{let I=++c.current;try{let m=o?await o(s,i):await ct(s,i);if(I!==c.current)return;S(m.items),T(m.total),p.current.onLoad?.(m.items,m.total),p.current.selectedId===void 0&&m.items.length>0&&p.current.onSelectFirst?.(m.items[0])}catch(m){I===c.current&&(p.current.onError??console.error)(m)}finally{I===c.current&&h(!1)}},[s,o,i]);return se(()=>{p.current=e}),se(()=>{b().catch(console.error)},[b,r]),se(()=>{let I=++l.current;if(!n)return;let m=async()=>{let Q=p.current.resolveSelected;if(Q)return Q(n,f,i);let v=f.find(N=>N.id===n);return v!==void 0?v:await i.readResource(d,n)};(async()=>{try{let Q=await m();I===l.current&&u({id:n,value:Q})}catch(Q){I===l.current&&(u({id:n,value:void 0}),(p.current.onError??console.error)(Q))}})().catch(console.error)},[n,f,i,d]),{items:f,total:E,loading:g,selected:R,search:s,refresh:b}}import{allOk as ft,normalizeOperationOutcome as lt}from"@medplum/core";import{useEffect as mt,useMemo as ht,useState as ce}from"react";import{useCallback as dt,useEffect as We,useRef as ue,useState as pt}from"react";function Fe(e,t,n={leading:!1}){let[o,r]=pt(e),i=ue(!1),s=ue(void 0),a=ue(!1),f=dt(()=>window.clearTimeout(s.current),[]);return We(()=>{i.current&&(!a.current&&n.leading?(a.current=!0,r(e),s.current=setTimeout(()=>{a.current=!1},t)):(f(),s.current=setTimeout(()=>{a.current=!1,r(e)},t)))},[e,n.leading,t,f]),We(()=>(i.current=!0,f),[f]),[o,f]}var yt=250;function Xr(e,t,n){return de("search",e,t,n)}function Yr(e,t,n){return de("searchOne",e,t,n)}function Zr(e,t,n){return de("searchResources",e,t,n)}function de(e,t,n,o){let r=P(),[i,s]=ce(!1),[a,f]=ce(),[S,E]=ce(),T=r.fhirSearchUrl(t,n).toString(),g=ht(()=>({resourceType:t,query:n}),[T]),h=o?.enabled??!0,y=o?.debounceMs??yt,[u]=Fe(g,y,{leading:!0});return mt(()=>{if(!h)return()=>{};s(!0);let p=!0;return r[e](u.resourceType,u.query).then(c=>{p&&(s(!1),f(c),E(ft))}).catch(c=>{p&&(s(!1),f(void 0),E(lt(c)))}),()=>{p=!1}},[r,e,u,h]),[a,i,S]}import{OperationOutcomeError as Rt}from"@medplum/core";import{useCallback as gt}from"react";function oo(){let e=P();return gt(async t=>{try{await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t})}catch(n){if(n instanceof Rt&&n.outcome.issue?.some(o=>o.code==="not-found"))return;throw n}},[e])}import{getReferenceString as It}from"@medplum/core";import{useCallback as St,useEffect as De,useState as D}from"react";function co({query:e,threadId:t}){let n=P(),[o,r]=D(!0),[i,s]=D([]),[a,f]=D(void 0),[S,E]=D(null),[T,g]=D(void 0),h=St(async()=>{let p=new URLSearchParams(e);p.append("identifier:not","http://medplum.com/ai-message|"),p.append("part-of:missing","true"),p.append("_has:Communication:part-of:_id:not","null");let c=await n.search("Communication",p.toString(),{cache:"no-cache"}),l=c.entry?.map(m=>m.resource).filter(m=>m!==void 0)||[];if(c.total!==void 0&&g(c.total),l.length===0){s([]);return}let R=`
|
|
1
|
+
import{useEffect as en,useMemo as nn,useState as tn}from"react";import{createContext as Ye,useContext as Ze}from"react";var j=Ye(void 0);function z(){return Ze(j)}function P(){return z().medplum}function _t(){return z().navigate}function ge(){return z().profile}import{jsx as on}from"react/jsx-runtime";var Ie=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function Nt(e){let t=e.medplum,n=e.navigate??rn,[o,r]=tn({profile:t.getProfile(),loading:t.isLoading()});en(()=>{function s(){r(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of Ie)t.addEventListener(a,s);return()=>{for(let a of Ie)t.removeEventListener(a,s)}},[t]);let i=nn(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return on(j.Provider,{value:i,children:e.children})}function rn(e){window.location.assign(e)}import{useMemo as sn}from"react";var Se=new Map,Dt=e=>sn(()=>{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=Se.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 Se.set(t,e),e},[e]);import{useEffect as xe,useRef as J,useState as an}from"react";function Kt(e,t,n){let o=P(),{patientId:r,onPatientSyncSuccess:i,onIframeSuccess:s,onError:a}=n,[l,I]=an(void 0),E=J(i),T=J(s),g=J(a);return xe(()=>{E.current=i,T.current=s,g.current=a},[i,s,a]),xe(()=>{let h=!1;return(async()=>{try{if(r){if(await o.executeBot(e,{patientId:r}),h)return;E.current?.()}let u=await o.executeBot(t,{patientId:r});if(h)return;u.url&&(I(u.url),T.current?.(u.url))}catch(u){h||g.current?.(u)}})().catch(()=>{}),()=>{h=!0}},[o,e,t,r]),l}import{INVALID_MEDICATION_ORDER_RESPONSE as un,INVALID_MEDICATION_SEARCH_RESPONSE as cn,isResource as G,medicationOrderRequestToParameters as dn,medicationSearchParamsToParameters as fn,parametersToMedicationOrderResponse as pn}from"@medplum/core";import{useCallback as be}from"react";function Ht(){let e=P(),t=be(async o=>{let r=e.fhirUrl("Medication","$drug-search"),i=fn(o),s=await e.post(r,i);if(!G(s,"Bundle"))throw new Error(cn);return(s.entry??[]).map(a=>a.resource).filter(a=>G(a,"Medication"))},[e]),n=be(async o=>{let r=e.fhirUrl("MedicationRequest","$order-medication"),i=dn(o),s=await e.post(r,i);if(!G(s,"Parameters"))throw new Error(un);return pn(s)},[e]);return{searchMedications:t,orderMedication:n}}import{INVALID_MEDICATION_ORDER_SET_RESPONSE as ln,isResource as mn,medicationOrderSetRequestToParameters as hn,parametersToMedicationOrderSetResponse as yn}from"@medplum/core";import{useCallback as Ee,useEffect as Rn,useRef as Te,useState as H}from"react";function nr(e){let t=P(),{patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i}=e,[s,a]=H(void 0),[l,I]=H(!1),[E,T]=H(void 0),g=Te({patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i});g.current={patientId:n,planDefinitionId:o,vendorOrderSetId:r,appId:i};let h=()=>{let c=g.current;if(!c.patientId)return;let m=!!c.planDefinitionId,f=c.vendorOrderSetId!==void 0&&c.vendorOrderSetId!==null&&c.vendorOrderSetId!=="";return!m&&!f?void 0:{patientId:c.patientId,planDefinitionId:m?c.planDefinitionId:void 0,vendorOrderSetId:f?c.vendorOrderSetId:void 0,appId:c.appId}},y=Ee(async c=>{let m=t.fhirUrl("PlanDefinition","$order-set-url"),f=hn(c),S=await t.post(m,f);if(!mn(S,"Parameters"))throw new Error(ln);return yn(S).launchUrl},[t]),u=Te(0),d=Ee(async()=>{let c=h();if(!c)return;u.current+=1;let m=u.current;I(!0),T(void 0);try{let f=await y(c);return u.current!==m?void 0:(a(f),f)}catch(f){u.current===m&&(T(f),a(void 0));return}finally{u.current===m&&I(!1)}},[y]);return Rn(()=>{let c=!1,m=h();if(!m){u.current+=1,a(void 0),I(!1),T(void 0);return}u.current+=1;let f=u.current;return I(!0),T(void 0),y(m).then(S=>{c||u.current!==f||a(S)}).catch(S=>{c||u.current!==f||(T(S),a(void 0))}).finally(()=>{!c&&u.current===f&&I(!1)}),()=>{c=!0}},[y,n,o,r,i]),{url:s,loading:l,error:E,refresh:d}}import{useCallback as In,useEffect as Sn,useState as xn}from"react";import{deepEquals as ve}from"@medplum/core";import{useCallback as L,useEffect as X,useRef as _,useState as Pe}from"react";var gn=3e3;function Qe(e,t,n){let o=P(),i=ge()?e:void 0,[s,a]=Pe(),[l,I]=Pe(n?.subscriptionProps),E=_(!1),T=_(void 0),g=_(void 0),h=_(void 0),y=_(t);y.current=t;let u=_(n?.onWebSocketOpen);u.current=n?.onWebSocketOpen;let d=_(n?.onWebSocketClose);d.current=n?.onWebSocketClose;let c=_(n?.onSubscriptionConnect);c.current=n?.onSubscriptionConnect;let m=_(n?.onSubscriptionDisconnect);m.current=n?.onSubscriptionDisconnect;let f=_(n?.onError);f.current=n?.onError,X(()=>{ve(n?.subscriptionProps,l)||I(n?.subscriptionProps)},[l,n]),X(()=>{T.current&&(clearTimeout(T.current),T.current=void 0);let v=!1;return(g.current!==i||!ve(h.current,l))&&(v=!0),v&&g.current&&o.unsubscribeFromCriteria(g.current,h.current),g.current=i,h.current=l,v&&i?a(o.subscribeToCriteria(i,l)):i||a(void 0),()=>{T.current=setTimeout(()=>{a(void 0),i&&o.unsubscribeFromCriteria(i,l)},gn)}},[o,i,l]);let S=L(v=>{y.current?.(v.payload)},[]),b=L(()=>{u.current?.()},[]),x=L(()=>{d.current?.()},[]),p=L(v=>{c.current?.(v.payload.subscriptionId)},[]),M=L(v=>{m.current?.(v.payload.subscriptionId)},[]),Q=L(v=>{f.current?.(v.payload)},[]);X(()=>s?(E.current||(s.addEventListener("message",S),s.addEventListener("open",b),s.addEventListener("close",x),s.addEventListener("connect",p),s.addEventListener("disconnect",M),s.addEventListener("error",Q),E.current=!0),()=>{E.current=!1,s.removeEventListener("message",S),s.removeEventListener("open",b),s.removeEventListener("close",x),s.removeEventListener("connect",p),s.removeEventListener("disconnect",M),s.removeEventListener("error",Q)}):()=>{},[s,S,b,x,p,M,Q])}function dr(e){let t=P(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=xn(0),a=In(l=>{t.search(n,o,{cache:l}).then(I=>s(I.total)).catch(console.error)},[t,n,o]);return Sn(()=>{a("default")},[a]),Qe(r,()=>{a("reload")}),i}import{resolveId as bn}from"@medplum/core";import{useEffect as En,useMemo as Ce,useState as Y}from"react";function Oe(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 Tn(e){return e.map(t=>{let n=t.searches?t.searches.map(Oe).join(","):"";return`${t.key}:[${n}]`}).join("|")}function hr(e,t){let n=P(),[o,r]=Y([]),[i,s]=Y(!0),[a,l]=Y(),I=Tn(t),E=Ce(()=>t,[I]),T=Ce(()=>bn(e),[e]);return En(()=>{if(!T)return;let g=!1,h=`Patient/${T}`,y={_count:100,_sort:"-_lastUpdated"},u=[],d=new Map,c=[];for(let f of E){let S=[];if(f.searches)for(let b of f.searches){let x=Oe(b),p=d.get(x);p===void 0&&(p=u.length,d.set(x,p),u.push(b)),S.push({searchIdx:p,resultKey:b.key})}c.push(S)}if(u.length===0){r(E.map(()=>({}))),s(!1);return}let m=u.map(f=>{let S=f.patientParam??"subject",b={[S]:h};if(f.query){if(typeof f.query=="string")return n.searchResources(f.resourceType,`${S}=${h}&${f.query}&_count=100&_sort=-_lastUpdated`);if(f.query instanceof URLSearchParams)f.query.forEach((x,p)=>{b[p]=x});else if(Array.isArray(f.query))for(let[x,p]of f.query)b[x]=p;else for(let[x,p]of Object.entries(f.query))p!==void 0&&(b[x]=p)}return n.searchResources(f.resourceType,{...y,...b})});return s(!0),l(void 0),Promise.allSettled(m).then(f=>{if(g)return;let S=c.map(x=>{let p={};for(let{searchIdx:M,resultKey:Q}of x){let v=f[M];p[Q]=v.status==="fulfilled"?v.value:[]}return p});r(S),s(!1);let b=f.filter(x=>x.status==="rejected");if(b.length>0){console.error("Some patient summary searches failed:",b.map(p=>p.reason));let x=b[0].reason;l(x instanceof Error?x:new Error(String(x)))}}).catch(f=>{g||(l(f instanceof Error?f:new Error(String(f))),s(!1))}),()=>{g=!0}},[n,T,E]),{sectionData:o,loading:i,error:a}}import{isAddPharmacyResponse as vn,isOrganizationArray as Pn}from"@medplum/core";import{useCallback as Me}from"react";function Sr(e,t){let n=P(),o=Me(async i=>{let s=await n.executeBot(e,i);if(!Pn(s))throw new Error("Invalid response from pharmacy search");return s},[n,e]),r=Me(async i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary});if(!vn(s))throw new Error("Invalid response from add pharmacy bot");return s},[n,t]);return{searchPharmacies:o,addToFavorites:r}}import{useEffect as Qn,useRef as Cn}from"react";function Er(e){let t=Cn(void 0);return Qn(()=>{t.current=e}),t.current}import{getExtension as ot}from"@medplum/core";import{useReducer as it,useRef as st}from"react";import{deepEquals as On,isReference as Ae,isResource as Mn,normalizeOperationOutcome as wn}from"@medplum/core";import{useCallback as An,useEffect as _n,useState as kn}from"react";function Z(e,t){let n=P(),[o,r]=kn(()=>we(n,e)),i=An(s=>{On(s,o)||r(s)},[o]);return _n(()=>{let s=!0,a=we(n,e);return!a&&Ae(e)?n.readReference(e).then(l=>{s&&i(l)}).catch(l=>{s&&(i(void 0),t&&t(wn(l)))}):i(a),(()=>s=!1)},[n,e,i,t]),o}function we(e,t){if(t){if(Mn(t))return t;if(Ae(t))return e.getCachedReference(t)}}import{EMPTY as qe,HTTP_HL7_ORG as U,PropertyType as w,append as _e,capitalize as ke,deepClone as Un,evalFhirPathTyped as ne,getExtension as W,getReferenceString as qn,getTypedPropertyValueWithoutSchema as $,normalizeErrorString as Nn,splitN as Ln,toJsBoolean as Wn,toTypedValue as Ne,typedValueToString as Fn}from"@medplum/core";var C={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"},Le=`${U}/fhir/StructureDefinition/questionnaire-itemControl`,Dn=`${U}/fhir/StructureDefinition/questionnaire-referenceFilter`,ee=`${U}/fhir/StructureDefinition/questionnaire-referenceResource`,Vn=`${U}/fhir/StructureDefinition/questionnaire-validationError`,$n=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,Bn=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Mr=`${U}/fhir/StructureDefinition/questionnaire-signatureRequired`,B=`${U}/fhir/StructureDefinition/questionnaireresponse-signature`,Kn=`${U}/fhir/StructureDefinition/questionnaire-hidden`;function wr(e){return e.type==="choice"||e.type==="open-choice"}function te(e,t){return{...t,item:We(e.item,t.item,t)}}function We(e,t,n){if(!t)return t;let o=[];for(let r of t){let i=e?.find(s=>s.linkId===r.linkId);i&&!jn(i,n)||(i?.item&&r.item?o.push({...r,item:We(i.item,r.item,n)}):o.push(r))}return o}function jn(e,t){if(W(e,Kn)?.valueBoolean===!0)return!1;let o=zn(e,t);return o!==void 0?o:Jn(e,t)}function zn(e,t){let n=W(e,$n);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=Ne(t),i=ne(o,[r],{"%resource":r});return Wn(i)}}}function Jn(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=Fe(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=et(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function re(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&&re(o.item,t,r.item))}}function Gn(e,t,n){try{let o=Yn(t,e);if(!o)return;let r=Xn(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:Vn,valueString:`Expression evaluation failed: ${Nn(o)}`}]}}var Hn={[C.boolean]:[w.boolean],[C.date]:[w.date],[C.dateTime]:[w.dateTime],[C.time]:[w.time],[C.url]:[w.string,w.uri,w.url],[C.attachment]:[w.Attachment],[C.reference]:[w.Reference],[C.quantity]:[w.Quantity],[C.decimal]:[w.decimal,w.integer],[C.integer]:[w.decimal,w.integer]};function Xn(e,t){if(!e.type)return;if(e.type===C.choice||e.type===C.openChoice)return{[`value${ke(t.type)}`]:t.value};if(e.type===C.string||e.type===C.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(Hn[e.type]?.includes(t.type))return{[`value${ke(e.type)}`]:t.value}}function Yn(e,t){if(!t)return;let n=W(e,Bn);if(n){let o=n.valueExpression?.expression;if(o){let r=Ne(t),i=ne(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function Ar(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>Fn(Ue(s))===r);if(i){let s=Ue(i);s&&o.push({[t]:s.value})}}return o}function Fe(e,t){for(let n of e??qe){if(n.linkId===t)return n.answer;if(n.item){let o=Fe(n.item,t);if(o)return o}}}function Zn(e,t,n){if(n==="exists")return!!e===t.value;if(e){let o=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=ne(`%actualAnswer ${o} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function et(e,t,n){let o=t||[],r=tt(e),i=!1,s=!0;for(let a of o){let l=rt(a),{operator:I}=e;if(Zn(l,r,I)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function _r(e){let t=W(e,ee);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function kr(e,t){let n=Un(e),o=W(n,ee);return!t||t.length===0?(o&&(n.extension=n.extension?.filter(r=>r!==o)),n):(o||(n.extension??=[],o={url:ee},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 Ur(e,t,n){let o=W(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 a of s){let[l,I]=Ln(a,"=",2);i[l]=I}return i}function oe(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??qn(e),item:ie(e.item,t?.item),status:"in-progress"}}function ie(e,t){let n;for(let o of e??qe){if(o.type===C.display)continue;let r=t?.filter(i=>i.linkId===o.linkId);if(r?.length)for(let i of r)i.id=i.id??De(),i.text=i.text??o.text,i.item=ie(o.item,i.item),i.answer=Ve(o,i),n=_e(n,i);else n=_e(n,se(o))}return n}function se(e){return{id:De(),linkId:e.linkId,text:e.text,item:ie(e.item,void 0),answer:Ve(e)}}var nt=1;function De(){return"id-"+nt++}function Ve(e,t){if(!(e.type===C.display||e.type===C.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 qr(e){return $({type:"QuestionnaireItemInitial",value:e},"value")}function Ue(e){return $({type:"QuestionnaireItemAnswerOption",value:e},"value")}function tt(e){return $({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function rt(e){return $({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Vr(e){let t=Z(e.questionnaire),n=Z(e.defaultValue),[,o]=it(y=>y+1,0),r=st({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:at(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=oe(t,n),h()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=oe(t),h()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(y,u){let d=r.current.questionnaireResponse;for(let c of y)d=d?.item?.find(m=>c.id?m.id===c.id:m.linkId===c.linkId);return u&&(d=d?.item?.find(c=>c.linkId===u.linkId)),d}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function a(){r.current.activePage=(r.current.activePage??0)-1,o()}function l(y,u){let d=i(y);d&&(d.item??=[],d.item.push(se(u)),h())}function I(y,u){let d=i(y,u);d&&(d.answer??=[],d.answer.push({}),h())}function E(y,u,d){let c=i(y,u);c&&(c.answer=d,h())}function T(y){let u=r.current.questionnaireResponse;u&&(y?(u.extension=u.extension??[],u.extension=u.extension.filter(d=>d.url!==B),u.extension.push({url:B,valueSignature:y})):u.extension=u.extension?.filter(d=>d.url!==B),h())}function g(){let y=r.current.questionnaire;if(y?.item){let u=r.current.questionnaireResponse;re(y.item,u)}}function h(){let y=r.current.questionnaireResponse,u=r.current.questionnaire;!y||!u||(g(),o(),e.onChange?.(te(u,y)))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:te(r.current.questionnaire,r.current.questionnaireResponse),subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:ut(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:ct(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:a,onAddGroup:l,onAddAnswer:I,onChangeAnswer:E,onChangeSignature:T}}function at(e){if(!(!e?.item||ot(e?.item?.[0],Le)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,o)=>({linkId:n.linkId,title:n.text??`Page ${o+1}`,group:n}))}function ut(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function ct(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{deepEquals as dt,formatSearchQuery as ft}from"@medplum/core";import{useCallback as pt,useEffect as ae,useRef as ue,useState as F}from"react";async function lt(e,t){let n=await t.search(e.resourceType,ft({...e,total:e.total??"accurate"}),{cache:"no-cache"});return{items:n.entry?.map(r=>r.resource).filter(r=>r!==void 0)??[],total:n.total}}function zr(e){let{search:t,selectedId:n,loadItems:o,reloadKey:r}=e,i=P(),[s,a]=F(t),[l,I]=F([]),[E,T]=F(),[g,h]=F(!0),[y,u]=F(),d=ue(e),c=ue(0),m=ue(0),f=s.resourceType,S=n!==void 0&&y?.id===n?y.value:void 0;dt(t,s)||(a(t),h(!0));let b=pt(async()=>{let x=++c.current;try{let p=o?await o(s,i):await lt(s,i);if(x!==c.current)return;I(p.items),T(p.total),d.current.onLoad?.(p.items,p.total),d.current.selectedId===void 0&&p.items.length>0&&d.current.onSelectFirst?.(p.items[0])}catch(p){x===c.current&&(d.current.onError??console.error)(p)}finally{x===c.current&&h(!1)}},[s,o,i]);return ae(()=>{d.current=e}),ae(()=>{b().catch(console.error)},[b,r]),ae(()=>{let x=++m.current;if(!n)return;let p=async()=>{let Q=d.current.resolveSelected;if(Q)return Q(n,l,i);let v=l.find(N=>N.id===n);return v!==void 0?v:await i.readResource(f,n)};(async()=>{try{let Q=await p();x===m.current&&u({id:n,value:Q})}catch(Q){x===m.current&&(u({id:n,value:void 0}),(d.current.onError??console.error)(Q))}})().catch(console.error)},[n,l,i,f]),{items:l,total:E,loading:g,selected:S,search:s,refresh:b}}import{allOk as yt,normalizeOperationOutcome as Rt}from"@medplum/core";import{useEffect as gt,useMemo as It,useState as de}from"react";import{useCallback as mt,useEffect as $e,useRef as ce,useState as ht}from"react";function Be(e,t,n={leading:!1}){let[o,r]=ht(e),i=ce(!1),s=ce(void 0),a=ce(!1),l=mt(()=>window.clearTimeout(s.current),[]);return $e(()=>{i.current&&(!a.current&&n.leading?(a.current=!0,r(e),s.current=setTimeout(()=>{a.current=!1},t)):(l(),s.current=setTimeout(()=>{a.current=!1,r(e)},t)))},[e,n.leading,t,l]),$e(()=>(i.current=!0,l),[l]),[o,l]}var St=250;function no(e,t,n){return fe("search",e,t,n)}function to(e,t,n){return fe("searchOne",e,t,n)}function ro(e,t,n){return fe("searchResources",e,t,n)}function fe(e,t,n,o){let r=P(),[i,s]=de(!1),[a,l]=de(),[I,E]=de(),T=r.fhirSearchUrl(t,n).toString(),g=It(()=>({resourceType:t,query:n}),[T]),h=o?.enabled??!0,y=o?.debounceMs??St,[u]=Be(g,y,{leading:!0});return gt(()=>{if(!h)return()=>{};s(!0);let d=!0;return r[e](u.resourceType,u.query).then(c=>{d&&(s(!1),l(c),E(yt))}).catch(c=>{d&&(s(!1),l(void 0),E(Rt(c)))}),()=>{d=!1}},[r,e,u,h]),[a,i,I]}import{OperationOutcomeError as xt}from"@medplum/core";import{useCallback as bt}from"react";function uo(){let e=P();return bt(async t=>{try{await e.post(e.fhirUrl("PlanDefinition","$sync-orderset"),{planDefinitionId:t})}catch(n){if(n instanceof xt&&n.outcome.issue?.some(o=>o.code==="not-found"))return;throw n}},[e])}import{getReferenceString as Et}from"@medplum/core";import{useCallback as Tt,useEffect as Ke,useState as D}from"react";function mo({query:e,threadId:t}){let n=P(),[o,r]=D(!0),[i,s]=D([]),[a,l]=D(void 0),[I,E]=D(null),[T,g]=D(void 0),h=Tt(async()=>{let d=new URLSearchParams(e);d.append("identifier:not","http://medplum.com/ai-message|"),d.append("part-of:missing","true"),d.append("_has:Communication:part-of:_id:not","null");let c=await n.search("Communication",d.toString(),{cache:"no-cache"}),m=c.entry?.map(p=>p.resource).filter(p=>p!==void 0)||[];if(c.total!==void 0&&g(c.total),m.length===0){s([]);return}let S=`
|
|
2
2
|
query {
|
|
3
|
-
${
|
|
3
|
+
${m.map(p=>{let Q=`thread_${p.id?.replaceAll("-","")||""}`,v=Et(p);return`
|
|
4
4
|
${Q}: CommunicationList(
|
|
5
5
|
part_of: "${v}"
|
|
6
6
|
_sort: "-sent"
|
|
@@ -26,7 +26,7 @@ import{useEffect as He,useMemo as Xe,useState as Ye}from"react";import{createCon
|
|
|
26
26
|
`}).join(`
|
|
27
27
|
`)}
|
|
28
28
|
}
|
|
29
|
-
`,b=await n.graphql(
|
|
29
|
+
`,b=await n.graphql(S),x=m.map(p=>{let Q=`thread_${p.id?.replaceAll("-","")||""}`,v=b.data[Q],N=v&&v.length>0?v[0]:void 0;return[p,N]}).filter(p=>p[1]!==void 0);s(x)},[n,e]);return Ke(()=>{r(!0),h().catch(d=>{E(d)}).finally(()=>{r(!1)})},[h]),Ke(()=>{(async()=>{if(!t){l(void 0);return}let c=i.find(f=>f[0].id===t);if(c){l(c[0]);return}let m=await n.readResource("Communication",t);if(m.partOf===void 0)l(m);else{let f=m.partOf[0].reference;if(f){let S=await n.readReference({reference:f});l(S)}}})().catch(c=>{E(c)})},[t,i,n]),{loading:o,error:I,threadMessages:i,selectedThread:a,total:T,addThreadMessage:d=>{(async()=>{await h(),s(m=>[[d,void 0],...m])})().catch(m=>E(m))},handleThreadStatusChange:d=>{if(!a)return;(async()=>{let m=await n.updateResource({...a,status:d});l(m),s(f=>f.map(([S,b])=>S.id===m.id?[m,b]:[S,b]))})().catch(m=>E(m))},refreshThreadMessages:h}}import{ReconnectingWebSocket as vt,sleep as Pt}from"@medplum/core";import{useCallback as A,useEffect as pe,useRef as q,useState as K}from"react";var Qt=12e4;function Io({language:e="en",model:t="gpt-4o-transcribe",onTranscript:n,idleTimeoutMs:o=Qt}){let r=P(),i=q(n);pe(()=>{i.current=n},[n]);let[s,a]=K("idle"),[l,I]=K(void 0),[E,T]=K([]),g=q(void 0),h=q(void 0),y=q(void 0),u=q(void 0),d=q(!1),c=q(!1),m=q(!1),[f,S]=K(!1),b=q(!1),x=A(R=>{b.current=R,S(R),h.current?.getAudioTracks().forEach(O=>{O.enabled=!R})},[]),p=A(()=>{m.current=!1,u.current?.disconnect(),u.current=void 0,y.current?.close().catch(()=>{}),y.current=void 0,h.current?.getTracks().forEach(R=>R.stop()),h.current=void 0,b.current=!1,S(!1),a(g.current?"idle":"disconnected")},[]),M=A(()=>{p(),g.current?.close(),g.current=void 0,c.current=!1,a("disconnected")},[p]),Q=A(()=>{g.current?.send(JSON.stringify({type:"session.update",session:{type:"transcription",audio:{input:{format:{type:"audio/pcm",rate:24e3},transcription:{model:t,language:e},turn_detection:{type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},noise_reduction:{type:"near_field"}}}}}))},[e,t]),v=A(async()=>{if(!(u.current||d.current)&&!(!h.current||!g.current)){d.current=!0;try{let R=new AudioContext({sampleRate:24e3});await R.audioWorklet.addModule(wt());let O=h.current,k=g.current;if(!m.current||!O||!k){await R.close().catch(()=>{});return}let Je=R.createMediaStreamSource(O),V=new AudioWorkletNode(R,je);V.port.onmessage=Ge=>{if(k.readyState!==WebSocket.OPEN){console.warn("WebSocket is not open. Unable to send audio data.");return}let He=Ct(Ge.data),Xe=btoa(String.fromCharCode(...He));k.send(JSON.stringify({type:"input_audio_buffer.append",audio:Xe}))},Je.connect(V),V.connect(R.destination),y.current=R,u.current=V,a("listening")}catch(R){I(R),a("error"),p()}finally{d.current=!1}}},[p]),N=A(()=>{m.current&&c.current&&h.current&&(u.current||(g.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),v().catch(()=>{})))},[v]),me=A(R=>{switch(R.type){case"session.created":Q();break;case"session.updated":c.current=!0,N();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(R.transcript){let O={text:R.transcript,timestamp:new Date().toISOString()};T(k=>[...k,O]),i.current?.(R.transcript)}break;case"ai-realtime:connected":console.debug("[useWhisper] upstream connected");break;case"ai-realtime:error":case"error":console.error("[useWhisper] error event",R),I(R),a("error");break;default:console.debug("[useWhisper] unhandled message",R.type,R);break}},[Q,N]),he=A(async()=>{a("requesting_microphone");let R=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:24e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0}});return R.getAudioTracks().forEach(O=>{O.enabled=!b.current}),h.current=R,R},[]),ye=A(()=>{a("connecting");let R=Ot(r.getBaseUrl());console.debug("[useWhisper] connecting to",R);let O=new vt(R);return g.current=O,O.onopen=()=>{c.current=!1,m.current?a("connected"):a("idle"),O.send(JSON.stringify({type:"ai-realtime:connect",accessToken:r.getAccessToken()}))},O.onmessage=k=>me(JSON.parse(k.data)),O.onerror=k=>{m.current&&(I(k),M(),a("error"))},O.onclose=()=>{c.current=!1,g.current&&a(m.current?"connecting":"idle")},O},[r,me,M]),Re=A(()=>g.current??ye(),[ye]),ze=A(async()=>{try{I(void 0),m.current=!0,Re(),await he(),N()}catch(R){I(R),a("error"),p()}},[he,Re,p,N]);return pe(()=>{if(s!=="idle"||!g.current||!Number.isFinite(o)||o<=0)return;let R=new AbortController;return Pt(o,{signal:R.signal}).then(()=>M()).catch(()=>{}),()=>R.abort()},[s,o,M]),pe(()=>()=>M(),[M]),{status:s,error:l,transcripts:E,start:ze,stop:p,isListening:s==="listening"||s==="speech_started"||s==="speech_stopped",muted:f,setMuted:x}}function Ct(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 Ot(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var je="medplum-pcm-worklet",Mt=`
|
|
30
30
|
class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
31
31
|
constructor() {
|
|
32
32
|
super();
|
|
@@ -58,6 +58,6 @@ class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
registerProcessor('${
|
|
62
|
-
`,le;function
|
|
61
|
+
registerProcessor('${je}', PcmWorkletProcessor);
|
|
62
|
+
`,le;function wt(){if(!le){let e=new Blob([Mt],{type:"application/javascript"});le=URL.createObjectURL(e)}return le}export{Nt as MedplumProvider,Bn as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,$n as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,Kn as QUESTIONNAIRE_HIDDEN_URL,Le as QUESTIONNAIRE_ITEM_CONTROL_URL,Dn as QUESTIONNAIRE_REFERENCE_FILTER_URL,ee as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,Mr as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,B as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,Vn as QUESTIONNAIRE_VALIDATION_ERROR_URL,C as QuestionnaireItemType,oe as buildInitialResponse,se as buildInitialResponseItem,Ct as convertToPCM16,re as evaluateCalculatedExpressionsInQuestionnaire,Ue as getItemAnswerOptionValue,tt as getItemEnableWhenValueAnswer,qr as getItemInitialValue,Ar as getNewMultiSelectValues,Ur as getQuestionnaireItemReferenceFilter,_r as getQuestionnaireItemReferenceTargetTypes,rt as getResponseItemAnswerValue,wr as isChoiceQuestion,jn as isQuestionEnabled,j as reactContext,te as removeDisabledItems,kr as setQuestionnaireItemReferenceTargetTypes,Xn as typedValueToResponseItem,Dt as useCachedBinaryUrl,Kt as useMedicationIFrame,Ht as useMedicationOrder,nr as useMedicationOrderSet,P as useMedplum,z as useMedplumContext,_t as useMedplumNavigate,ge as useMedplumProfile,dr as useNotificationCount,hr as usePatientSummaryData,Sr as usePharmacySearch,Er as usePrevious,Vr as useQuestionnaireForm,Z as useResource,zr as useResourceBoard,no as useSearch,to as useSearchOne,ro as useSearchResources,Qe as useSubscription,uo as useSyncOrderSet,mo as useThreadInbox,Io as useWhisper};
|
|
63
63
|
//# sourceMappingURL=index.mjs.map
|