@medplum/react-hooks 5.1.26 → 5.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +9 -7
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.d.ts +160 -6
- package/dist/esm/index.d.ts +160 -6
- package/dist/esm/index.mjs +9 -7
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +11 -11
package/dist/esm/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
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=`
|
|
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,7 +26,9 @@ import{useEffect as en,useMemo as nn,useState as tn}from"react";import{createCon
|
|
|
26
26
|
`}).join(`
|
|
27
27
|
`)}
|
|
28
28
|
}
|
|
29
|
-
`,
|
|
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=`
|
|
30
32
|
class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
31
33
|
constructor() {
|
|
32
34
|
super();
|
|
@@ -58,6 +60,6 @@ class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
62
|
|
|
61
|
-
registerProcessor('${
|
|
62
|
-
`,
|
|
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};
|
|
63
65
|
//# sourceMappingURL=index.mjs.map
|