@medplum/react-hooks 5.1.29 → 5.1.30
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 +7 -7
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/esm/index.mjs +7 -7
- package/dist/esm/index.mjs.map +3 -3
- package/package.json +6 -6
package/dist/esm/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
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=`
|
|
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 be(){return Y().profile}import{jsx as hn}from"react/jsx-runtime";var Ee=["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 s(){o(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of Ee)t.addEventListener(a,s);return()=>{for(let a of Ee)t.removeEventListener(a,s)}},[t]);let i=pn(()=>({...r,medplum:t,navigate:n}),[r,t,n]);return hn(X.Provider,{value:i,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 s=new URLSearchParams(new URL(o).search).get("Expires");if(s&&Number.parseInt(s,10)*1e3-5e3>Date.now())return o}return ve.set(t,e),e},[e]);import{INVALID_MEDICATION_CART_RESPONSE as Pe,INVALID_MEDICATION_CHECKOUT_RESPONSE as gn,isResource as Z,medicationCartClearRequestToParameters as In,medicationCartRemoveRequestToParameters as Sn,medicationCheckoutRequestToParameters as xn,parametersToMedicationCartManageResponse as Te,parametersToMedicationCheckoutResponse as bn}from"@medplum/core";import{useCallback as j,useRef as En,useState as vn}from"react";var Pn="Cannot checkout while a medication is still being added to the cart";function Er(){let e=v(),[t,n]=vn(!1),r=En(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]),i=j(async u=>{if(r.current>0)throw new Error(Pn);let f=e.fhirUrl("MedicationRequest","$checkout-medications"),m=xn(u),P=await e.post(f,m);if(!Z(P,"Parameters"))throw new Error(gn);return bn(P)},[e]),s=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(Pe);return Te(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(Pe);return Te(m)},[e]);return{addToCart:o,adding:t,checkout:i,removeFromCart:s,clearCart:a}}import{resolveId as Tn}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:i,onPatientSyncSuccess:s,onIframeSuccess:a,onError:u}=n,f=Tn(i),[m,P]=Cn(void 0),S=ee(s),b=ee(a),h=ee(u);return Ce(()=>{S.current=s,b.current=a,h.current=u},[s,a,u]),Ce(()=>{let c=!1;return(async()=>{try{if(o){if(await r.executeBot(e,{patientId:o,organizationId:f}),c)return;S.current?.()}let x=await r.executeBot(t,{patientId:o,organizationId:f});if(c)return;x.url&&(P(x.url),b.current?.(x.url))}catch(x){c||h.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"),i=wn(r),s=await e.post(o,i);if(!ne(s,"Bundle"))throw new Error(Qn);return(s.entry??[]).map(a=>a.resource).filter(a=>ne(a,"Medication"))},[e]),n=Me(async r=>{let o=e.fhirUrl("MedicationRequest","$order-medication"),i=On(r),s=await e.post(o,i);if(!ne(s,"Parameters"))throw new Error(Mn);return An(s)},[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:i,organization:s}=e,[a,u]=te(void 0),[f,m]=te(!1),[P,S]=te(void 0),b=Oe({patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s});b.current={patientId:n,planDefinitionId:r,vendorOrderSetId:o,appId:i,organization:s};let h=()=>{let y=b.current;if(!y.patientId)return;let l=!!y.planDefinitionId,g=y.vendorOrderSetId!==void 0&&y.vendorOrderSetId!==null&&y.vendorOrderSetId!=="";return!l&&!g?void 0:{patientId:y.patientId,planDefinitionId:l?y.planDefinitionId:void 0,vendorOrderSetId:g?y.vendorOrderSetId:void 0,appId:y.appId,organization:y.organization}},c=Qe(async y=>{let l=t.fhirUrl("PlanDefinition","$order-set-url"),g=qn(y),p=await t.post(l,g);if(!_n(p,"Parameters"))throw new Error(kn);return Un(p).launchUrl},[t]),d=Oe(0),x=Qe(async()=>{let y=h();if(!y)return;d.current+=1;let l=d.current;m(!0),S(void 0);try{let g=await c(y);return d.current!==l?void 0:(u(g),g)}catch(g){d.current===l&&(S(g),u(void 0));return}finally{d.current===l&&m(!1)}},[c]);return Nn(()=>{let y=!1,l=h();if(!l){d.current+=1,u(void 0),m(!1),S(void 0);return}d.current+=1;let g=d.current;return m(!0),S(void 0),c(l).then(p=>{y||d.current!==g||u(p)}).catch(p=>{y||d.current!==g||(S(p),u(void 0))}).finally(()=>{!y&&d.current===g&&m(!1)}),()=>{y=!0}},[c,n,r,o,i,s]),{url:a,loading:f,error:P,refresh:x}}import{useCallback as Wn,useEffect as Dn,useState as Fn}from"react";import{deepEquals as we}from"@medplum/core";import{useCallback as V,useEffect as re,useRef as q,useState as Ae}from"react";var Ln=3e3;function ke(e,t,n){let r=v(),o=r.getProject(),a=be()&&o?.features?.includes("websocket-subscriptions")?e:void 0,[u,f]=Ae(),[m,P]=Ae(n?.subscriptionProps),S=q(!1),b=q(void 0),h=q(void 0),c=q(void 0),d=q(t);d.current=t;let x=q(n?.onWebSocketOpen);x.current=n?.onWebSocketOpen;let y=q(n?.onWebSocketClose);y.current=n?.onWebSocketClose;let l=q(n?.onSubscriptionConnect);l.current=n?.onSubscriptionConnect;let g=q(n?.onSubscriptionDisconnect);g.current=n?.onSubscriptionDisconnect;let p=q(n?.onError);p.current=n?.onError,re(()=>{we(n?.subscriptionProps,m)||P(n?.subscriptionProps)},[m,n]),re(()=>{b.current&&(clearTimeout(b.current),b.current=void 0);let O=!1;return(h.current!==a||!we(c.current,m))&&(O=!0),O&&h.current&&r.unsubscribeFromCriteria(h.current,c.current),h.current=a,c.current=m,O&&a?f(r.subscribeToCriteria(a,m)):a||f(void 0),()=>{b.current=setTimeout(()=>{a&&r.unsubscribeFromCriteria(a,m)},Ln)}},[r,a,m]);let I=V(O=>{d.current?.(O.payload)},[]),R=V(()=>{x.current?.()},[]),C=V(()=>{y.current?.()},[]),M=V(O=>{l.current?.(O.payload.subscriptionId)},[]),A=V(O=>{g.current?.(O.payload.subscriptionId)},[]),T=V(O=>{p.current?.(O.payload)},[]);re(()=>u?(S.current||(u.addEventListener("message",I),u.addEventListener("open",R),u.addEventListener("close",C),u.addEventListener("connect",M),u.addEventListener("disconnect",A),u.addEventListener("error",T),S.current=!0),()=>{S.current=!1,u.removeEventListener("message",I),u.removeEventListener("open",R),u.removeEventListener("close",C),u.removeEventListener("connect",M),u.removeEventListener("disconnect",A),u.removeEventListener("error",T)}):()=>{},[u,I,R,C,M,A,T])}function jr(e){let t=v(),{resourceType:n,countCriteria:r,subscriptionCriteria:o}=e,[i,s]=Fn(0),a=Wn(u=>{t.search(n,r,{cache:u}).then(f=>s(f.total)).catch(console.error)},[t,n,r]);return Dn(()=>{a("default")},[a]),ke(o,()=>{a("reload")}),i}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((i,s)=>i[0].localeCompare(s[0])||i[1].localeCompare(s[1]));r=JSON.stringify(o)}else if(Array.isArray(n)){let o=[...n].sort((i,s)=>i[0].localeCompare(s[0])||i[1].localeCompare(s[1]));r=JSON.stringify(o)}else{let o=Object.entries(n).filter(([,i])=>i!==void 0).sort(([i],[s])=>i.localeCompare(s));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([]),[i,s]=oe(!0),[a,u]=oe(),f=$n(t),m=_e(()=>t,[f]),P=_e(()=>Vn(e),[e]);return Kn(()=>{if(!P)return;let S=!1,b=`Patient/${P}`,h={_count:100,_sort:"-_lastUpdated"},c=[],d=new Map,x=[];for(let l of m){let g=[];if(l.searches)for(let p of l.searches){let I=qe(p),R=d.get(I);R===void 0&&(R=c.length,d.set(I,R),c.push(p)),g.push({searchIdx:R,resultKey:p.key})}x.push(g)}if(c.length===0){o(m.map(()=>({}))),s(!1);return}let y=c.map(l=>{let g=l.patientParam??"subject",p={[g]:b};if(l.query){if(typeof l.query=="string")return n.searchResources(l.resourceType,`${g}=${b}&${l.query}&_count=100&_sort=-_lastUpdated`);if(l.query instanceof URLSearchParams)l.query.forEach((I,R)=>{p[R]=I});else if(Array.isArray(l.query))for(let[I,R]of l.query)p[I]=R;else for(let[I,R]of Object.entries(l.query))R!==void 0&&(p[I]=R)}return n.searchResources(l.resourceType,{...h,...p})});return s(!0),u(void 0),Promise.allSettled(y).then(l=>{if(S)return;let g=x.map(I=>{let R={};for(let{searchIdx:C,resultKey:M}of I){let A=l[C];R[M]=A.status==="fulfilled"?A.value:[]}return R});o(g),s(!1);let p=l.filter(I=>I.status==="rejected");if(p.length>0){console.error("Some patient summary searches failed:",p.map(R=>R.reason));let I=p[0].reason;u(I instanceof Error?I:new Error(String(I)))}}).catch(l=>{S||(u(l instanceof Error?l:new Error(String(l))),s(!1))}),()=>{S=!0}},[n,P,m]),{sectionData:r,loading:i,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 i=>{let{organization:s,...a}=i,u=Ue(s),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 i=>{let s=await n.executeBot(t,{patientId:i.patientId,pharmacy:i.pharmacy,setAsPrimary:i.setAsPrimary,organizationId:Ue(i.organization)});if(!zn(s))throw new Error("Invalid response from add pharmacy bot");return s},[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 Pt,useRef as Tt}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)),i=Yn(s=>{Gn(s,r)||o(s)},[r]);return Zn(()=>{let s=!0,a=Le(n,e);return!a&&We(e)?n.readReference(e).then(u=>{s&&i(u)}).catch(u=>{s&&(i(void 0),t&&t(Xn(u)))}):i(a),(()=>s=!1)},[n,e,i,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 U,PropertyType as k,append as De,capitalize as Fe,deepClone as nt,deepEquals as Ve,evalFhirPathTyped as ce,getExtension as D,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 Q={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"},$e=`${U}/fhir/StructureDefinition/questionnaire-itemControl`,at=`${U}/fhir/StructureDefinition/questionnaire-referenceFilter`,se=`${U}/fhir/StructureDefinition/questionnaire-referenceResource`,ut=`${U}/fhir/StructureDefinition/questionnaire-validationError`,ct=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,dt=`${U}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,mo=`${U}/fhir/StructureDefinition/questionnaire-signatureRequired`,G=`${U}/fhir/StructureDefinition/questionnaireresponse-signature`,lt=`${U}/fhir/StructureDefinition/questionnaire-hidden`,ft=`${U}/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 i=e?.find(s=>s.linkId===o.linkId);i&&!pt(i,n)||(i?.item&&o.item?r.push({...o,item:ze(i.item,o.item,n)}):r.push(o))}return r}function pt(e,t){if(D(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=D(e,ct);if(t&&n){let r=n.valueExpression?.expression;if(r){let o=Ke(t),i=ce(r,[o],{"%resource":o});return it(i)}}}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:i,allMatch:s}=xt(r,o,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function le(e,t,n=t.item){for(let r of e){let o=n?.find(i=>i.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={[Q.boolean]:[k.boolean],[Q.date]:[k.date],[Q.dateTime]:[k.dateTime],[Q.time]:[k.time],[Q.url]:[k.string,k.uri,k.url],[Q.attachment]:[k.Attachment],[Q.reference]:[k.Reference],[Q.quantity]:[k.Quantity],[Q.decimal]:[k.decimal,k.integer],[Q.integer]:[k.decimal,k.integer]};function gt(e,t){if(!e.type)return;if(e.type===Q.choice||e.type===Q.openChoice)return{[`value${Fe(t.type)}`]:t.value};if(e.type===Q.string||e.type===Q.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=D(e,dt);if(n){let r=n.valueExpression?.expression;if(r){let o=Ke(t),i=ce(r,[o],{"%resource":o});return i.length!==0?i[0]:void 0}}}function ho(e,t,n){let r=[];for(let o of e){let i=n.answerOption?.find(s=>st(ae(s))===o);if(i){let s=ae(i);s&&r.push({[t]:s.value})}}return r}function Be(e,t,n){let r=[];for(let a of e.answerOption??ue)if(D(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))},i=n.filter(a=>!t?.some(u=>Ve(u,a))),s=i.find(o);return s?[s]:i.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=Et(e),i=!1,s=!0;for(let a of r){let u=He(a),{operator:f}=e;if(St(u,o,f)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function yo(e){let t=D(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=D(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=D(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 i={},s=o.split("&");for(let a of s){let[u,f]=ot(a,"=",2);i[u]=f}return i}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===Q.display)continue;let o=t?.filter(i=>i.linkId===r.linkId);if(o?.length)for(let i of o)i.id=i.id??Je(),i.text=i.text??r.text,i.item=pe(r.item,i.item),i.answer=Ge(r,i),n=De(n,i);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 bt=1;function Je(){return"id-"+bt++}function Ge(e,t){if(!(e.type===Q.display||e.type===Q.group)){if(t?.answer&&t.answer.length>0)return t.answer;if(e.initial&&e.initial.length>0)return e.initial.map(n=>({...n}));if(e.answerOption)return e.answerOption.filter(n=>n.initialSelected).map(n=>({...n,initialSelected:void 0}))}}function So(e){return J({type:"QuestionnaireItemInitial",value:e},"value")}function ae(e){return J({type:"QuestionnaireItemAnswerOption",value:e},"value")}function Et(e){return J({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function He(e){return J({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function To(e){let t=ie(e.questionnaire),n=ie(e.defaultValue),[,r]=Pt(h=>h+1,0),o=Tt({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 i(h,c){let d=o.current.questionnaireResponse;for(let x of h)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 s(){o.current.activePage=(o.current.activePage??0)+1,r()}function a(){o.current.activePage=(o.current.activePage??0)-1,r()}function u(h,c){let d=i(h);d&&(d.item??=[],d.item.push(me(c)),b())}function f(h,c){let d=i(h,c);d&&(d.answer??=[],d.answer.push({}),b())}function m(h,c,d){let x=i(h,c);x&&(x.answer=Be(c,x.answer,d),b())}function P(h){let c=o.current.questionnaireResponse;c&&(h?(c.extension=c.extension??[],c.extension=c.extension.filter(d=>d.url!==G),c.extension.push({url:G,valueSignature:h})):c.extension=c.extension?.filter(d=>d.url!==G),b())}function S(){let h=o.current.questionnaire;if(h?.item){let c=o.current.questionnaireResponse;le(h.item,c)}}function b(){let h=o.current.questionnaireResponse,c=o.current.questionnaire;!h||!c||(S(),r(),e.onChange?.(de(c,h)))}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:s,onPrevPage:a,onAddGroup:u,onAddAnswer:f,onChangeAnswer:m,onChangeSignature:P}}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 $}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,i=v(),[s,a]=$(t),[u,f]=$([]),[m,P]=$(),[S,b]=$(!0),[h,c]=$(),d=he(e),x=he(0),y=he(0),l=s.resourceType,g=n!==void 0&&h?.id===n?h.value:void 0;Ot(t,s)||(a(t),b(!0));let p=At(async()=>{let I=++x.current;try{let R=r?await r(s,i):await kt(s,i);if(I!==x.current)return;f(R.items),P(R.total),d.current.onLoad?.(R.items,R.total)}catch(R){I===x.current&&(d.current.onError??console.error)(R)}finally{I===x.current&&b(!1)}},[s,r,i]);return Re(()=>{d.current=e}),Re(()=>{p().catch(console.error)},[p,o]),Re(()=>{let I=++y.current;if(!n)return;let R=async()=>{let M=d.current.resolveSelected;if(M)return M(n,u,i);let A=u.find(T=>T.id===n);return A!==void 0?A:await i.readResource(l,n)};(async()=>{try{let M=await R();I===y.current&&c({id:n,value:M})}catch(M){I===y.current&&(c({id:n,value:void 0}),(d.current.onError??console.error)(M))}})().catch(console.error)},[n,u,i,l]),{items:u,total:m,loading:S,selected:g,search:s,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 i=new Set(o.split(",")),s=a=>{i.has(a.payload.resourceType)&&r.current(a.payload)};return n.addEventListener("resourceModified",s),()=>n.removeEventListener("resourceModified",s)},[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),i=ye(!1),s=ye(void 0),a=ye(!1),u=qt(()=>window.clearTimeout(s.current),[]);return Ye(()=>{i.current&&(!a.current&&n.leading?(a.current=!0,o(e),s.current=setTimeout(()=>{a.current=!1},t)):(u(),s.current=setTimeout(()=>{a.current=!1,o(e)},t)))},[e,n.leading,t,u]),Ye(()=>(i.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(),[i,s]=ge(!1),[a,u]=ge(),[f,m]=ge(),P=o.fhirSearchUrl(t,n).toString(),S=Dt(()=>({resourceType:t,query:n}),[P]),b=r?.enabled??!0,h=r?.debounceMs??Ft,[c]=Ze(S,h,{leading:!0});return Wt(()=>{if(!b)return()=>{};s(!0);let d=!0;return o[e](c.resourceType,c.query).then(x=>{d&&(s(!1),u(x),m(Nt))}).catch(x=>{d&&(s(!1),u(void 0),m(Lt(x)))}),()=>{d=!1}},[o,e,c,b]),[a,i,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 K}from"react";function ni({query:e,threadId:t}){let n=v(),[r,o]=K(!0),[i,s]=K(e),[a,u]=K([]),[f,m]=K(void 0),[P,S]=K(null),[b,h]=K(void 0),c=Gt(0);e!==i&&(s(e),o(!0));let d=Jt(async()=>{let l=++c.current;try{let g=new URLSearchParams(i);g.append("identifier:not","http://medplum.com/ai-message|"),g.append("part-of:missing","true"),g.append("_has:Communication:part-of:_id:not","null");let p=await n.search("Communication",g.toString(),{cache:"no-cache"});if(l!==c.current)return;let I=p.entry?.map(T=>T.resource).filter(T=>T!==void 0)||[];if(p.total!==void 0&&h(p.total),I.length===0){u([]);return}let C=`
|
|
2
2
|
query {
|
|
3
|
-
${
|
|
4
|
-
${
|
|
5
|
-
part_of: "${
|
|
3
|
+
${I.map(T=>{let F=`thread_${T.id?.replaceAll("-","")||""}`,W=jt(T);return`
|
|
4
|
+
${F}: CommunicationList(
|
|
5
|
+
part_of: "${W}"
|
|
6
6
|
_sort: "-sent"
|
|
7
7
|
_count: 1
|
|
8
8
|
) {
|
|
@@ -26,9 +26,9 @@ import{useEffect as fn,useMemo as pn,useState as mn}from"react";import{createCon
|
|
|
26
26
|
`}).join(`
|
|
27
27
|
`)}
|
|
28
28
|
}
|
|
29
|
-
`,
|
|
29
|
+
`,M=await n.graphql(C);if(l!==c.current)return;let A=I.map(T=>{let F=`thread_${T.id?.replaceAll("-","")||""}`,W=M.data[F],z=W&&W.length>0?W[0]:void 0;return[T,z]}).filter(T=>T[1]!==void 0);u(A)}finally{l===c.current&&o(!1)}},[n,i]);return en(()=>{d().catch(l=>{S(l)})},[d]),en(()=>{(async()=>{if(!t){m(void 0);return}let g=a.find(I=>I[0].id===t);if(g){m(g[0]);return}let p=await n.readResource("Communication",t);if(p.partOf===void 0)m(p);else{let I=p.partOf[0].reference;if(I){let R=await n.readReference({reference:I});m(R)}}})().catch(g=>{S(g)})},[t,a,n]),{loading:r,error:P,threadMessages:a,selectedThread:f,total:b,addThreadMessage:l=>{(async()=>{await d(),u(p=>[[l,void 0],...p])})().catch(p=>S(p))},handleThreadStatusChange:l=>{if(!f)return;(async()=>{let p=await n.updateResource({...f,status:l});m(p),u(I=>I.map(([R,C])=>R.id===p.id?[p,C]:[R,C]))})().catch(p=>S(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(s=>!!s))).sort((s,a)=>s.localeCompare(a)).join(`
|
|
30
30
|
`),r=nn(()=>n===""?tn:n.split(`
|
|
31
|
-
`),[n]),[o,
|
|
31
|
+
`),[n]),[o,i]=Zt({});return Yt(()=>{if(r.length===0)return;let s=!1,a=new AbortController;for(let u of r)t.valueSetExpand({url:u,count:1},{signal:a.signal}).then(()=>{s||i(f=>({...f,[u]:!0}))}).catch(f=>{s||i(m=>({...m,[u]:!er(f)}))});return()=>{s=!0,a.abort()}},[t,r]),nn(()=>{let s=[],a=[],u=!1;for(let f of r){let m=o[f];m===void 0?u=!0:m?s.push(f):a.push(f)}return{loading:u,available:s,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 _,useEffect as Se,useRef as L,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(),i=L(n);Se(()=>{i.current=n},[n]);let[s,a]=H("idle"),[u,f]=H(void 0),[m,P]=H([]),S=L(void 0),b=L(void 0),h=L(void 0),c=L(void 0),d=L(!1),x=L(!1),y=L(!1),[l,g]=H(!1),p=L(!1),I=_(E=>{p.current=E,g(E),b.current?.getAudioTracks().forEach(w=>{w.enabled=!E})},[]),R=_(()=>{y.current=!1,c.current?.disconnect(),c.current=void 0,h.current?.close().catch(()=>{}),h.current=void 0,b.current?.getTracks().forEach(E=>E.stop()),b.current=void 0,p.current=!1,g(!1),a(S.current?"idle":"disconnected")},[]),C=_(()=>{R(),S.current?.close(),S.current=void 0,x.current=!1,a("disconnected")},[R]),M=_(()=>{S.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]),A=_(async()=>{if(!(c.current||d.current)&&!(!b.current||!S.current)){d.current=!0;try{let E=new AudioContext({sampleRate:24e3});await E.audioWorklet.addModule(ur());let w=b.current,N=S.current;if(!y.current||!w||!N){await E.close().catch(()=>{});return}let sn=E.createMediaStreamSource(w),B=new AudioWorkletNode(E,rn);B.port.onmessage=an=>{if(N.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));N.send(JSON.stringify({type:"input_audio_buffer.append",audio:cn}))},sn.connect(B),B.connect(E.destination),h.current=E,c.current=B,a("listening")}catch(E){f(E),a("error"),R()}finally{d.current=!1}}},[R]),T=_(()=>{y.current&&x.current&&b.current&&(c.current||(S.current?.send(JSON.stringify({type:"input_audio_buffer.clear"})),A().catch(()=>{})))},[A]),O=_(E=>{switch(E.type){case"session.created":M();break;case"session.updated":x.current=!0,T();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()};P(N=>[...N,w]),i.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}},[M,T]),F=_(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},[]),W=_(()=>{a("connecting");let E=sr(o.getBaseUrl());console.debug("[useWhisper] connecting to",E);let w=new tr(E);return S.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=N=>O(JSON.parse(N.data)),w.onerror=N=>{y.current&&(f(N),C(),a("error"))},w.onclose=()=>{x.current=!1,S.current&&a(y.current?"connecting":"idle")},w},[o,O,C]),z=_(()=>S.current??W(),[W]),on=_(async()=>{try{f(void 0),y.current=!0,z(),await F(),T()}catch(E){f(E),a("error"),R()}},[F,z,R,T]);return Se(()=>{if(s!=="idle"||!S.current||!Number.isFinite(r)||r<=0)return;let E=new AbortController;return rr(r,{signal:E.signal}).then(()=>C()).catch(()=>{}),()=>E.abort()},[s,r,C]),Se(()=>()=>C(),[C]),{status:s,error:u,transcripts:m,start:on,stop:R,isListening:s==="listening"||s==="speech_started"||s==="speech_stopped",muted:l,setMuted:I}}function ir(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++){let r=Math.max(-1,Math.min(1,e[n]));t[n]=r*32767}return new Uint8Array(t.buffer)}function sr(e){let t=new URL("ws/ai-realtime",e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}var rn="medplum-pcm-worklet",ar=`
|
|
32
32
|
class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
33
33
|
constructor() {
|
|
34
34
|
super();
|
|
@@ -61,5 +61,5 @@ class PcmWorkletProcessor extends AudioWorkletProcessor {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
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{
|
|
64
|
+
`,xe;function ur(){if(!xe){let e=new Blob([ar],{type:"application/javascript"});xe=URL.createObjectURL(e)}return xe}export{Pn 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,Q as QuestionnaireItemType,Be as applyOptionExclusive,fe as buildInitialResponse,me as buildInitialResponseItem,ir as convertToPCM16,le as evaluateCalculatedExpressionsInQuestionnaire,ae as getItemAnswerOptionValue,Et 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,Er as useMedicationCart,Mr as useMedicationIFrame,kr as useMedicationOrder,Lr as useMedicationOrderSet,v as useMedplum,Y as useMedplumContext,dr as useMedplumNavigate,be as useMedplumProfile,jr as useNotificationCount,Yr as usePatientSummaryData,ro as usePharmacySearch,so as usePrevious,To as useQuestionnaireForm,ie as useResource,wo as useResourceBoard,qo as useResourceModified,Ko as useSearch,$o as useSearchOne,zo as useSearchResources,ke as useSubscription,Ho as useSyncOrderSet,ni as useThreadInbox,nr as useValueSetAvailabilities,si as useValueSetAvailability,li as useWhisper};
|
|
65
65
|
//# sourceMappingURL=index.mjs.map
|