@medplum/react-hooks
Version:
Medplum React Hooks Library
3 lines (2 loc) • 13.2 kB
JavaScript
import{useEffect as de,useMemo as pe,useState as fe}from"react";import{createContext as ae,useContext as ce}from"react";var U=ae(void 0);function _(){return ce(U)}function h(){return _().medplum}function sn(){return _().navigate}function un(){return _().profile}import{jsx as me}from"react/jsx-runtime";var G=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function mn(e){let n=e.medplum,t=e.navigate??le,[i,r]=fe({profile:n.getProfile(),loading:n.isLoading()});de(()=>{function s(){r(c=>({...c,profile:n.getProfile(),loading:n.isLoading()}))}for(let c of G)n.addEventListener(c,s);return()=>{for(let c of G)n.removeEventListener(c,s)}},[n]);let o=pe(()=>({...i,medplum:n,navigate:t}),[i,n,t]);return me(U.Provider,{value:o,children:e.children})}function le(e){window.location.assign(e)}import{useMemo as Re}from"react";var X=new Map,Qn=e=>Re(()=>{if(!e)return;let n=e.split("?")[0];if(!n)return e;let t;try{t=new URLSearchParams(new URL(e).search)}catch{return e}if(!t.has("Key-Pair-Id")||!t.has("Signature"))return e;let i=t.get("Expires");if(!i||i.length>13)return e;let r=X.get(n);if(r){let s=new URLSearchParams(new URL(r).search).get("Expires");if(s&&parseInt(s,10)*1e3-5e3>Date.now())return r}return X.set(n,e),e},[e]);import{useEffect as ge,useRef as Ie}from"react";function yn(e){let n=Ie(void 0);return ge(()=>{n.current=e}),n.current}import{getExtension as $e}from"@medplum/core";import{useReducer as ze,useRef as Ge}from"react";import{deepEquals as Qe,isReference as H,isResource as xe,normalizeOperationOutcome as Se}from"@medplum/core";import{useCallback as ye,useEffect as Ee,useState as be}from"react";function F(e,n){let t=h(),[i,r]=be(()=>j(t,e)),o=ye(s=>{Qe(s,i)||r(s)},[i]);return Ee(()=>{let s=!0,c=j(t,e);return!c&&H(e)?t.readReference(e).then(d=>{s&&o(d)}).catch(d=>{s&&(o(void 0),n&&n(Se(d)))}):o(c),(()=>s=!1)},[t,e,o,n]),i}function j(e,n){if(n){if(xe(n))return n;if(H(n))return e.getCachedReference(n)}}import{HTTP_HL7_ORG as S,PropertyType as l,capitalize as J,deepClone as he,evalFhirPathTyped as k,getExtension as T,getReferenceString as ve,getTypedPropertyValueWithoutSchema as C,normalizeErrorString as Te,splitN as Ce,toJsBoolean as Pe,toTypedValue as Z,typedValueToString as Oe}from"@medplum/core";var f={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"},ee=`${S}/fhir/StructureDefinition/questionnaire-itemControl`,we=`${S}/fhir/StructureDefinition/questionnaire-referenceFilter`,V=`${S}/fhir/StructureDefinition/questionnaire-referenceResource`,Ae=`${S}/fhir/StructureDefinition/questionnaire-validationError`,Me=`${S}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,Ne=`${S}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,wn=`${S}/fhir/StructureDefinition/questionnaire-signatureRequired`,P=`${S}/fhir/StructureDefinition/questionnaireresponse-signature`;function An(e){return e.type==="choice"||e.type==="open-choice"}function Mn(e,n){let t=Le(e,n);return t!==void 0?t:Ue(e,n)}function Le(e,n){let t=T(e,Me);if(n&&t){let i=t.valueExpression?.expression;if(i){let r=Z(n),o=k(i,[r],{"%resource":r});return Pe(o)}}}function Ue(e,n){if(!e.enableWhen)return!0;let t=e.enableBehavior??"any";for(let i of e.enableWhen){let r=ne(n?.item,i.question);if(i.operator==="exists"&&!i.answerBoolean&&!r?.length){if(t==="any")return!0;continue}let{anyMatch:o,allMatch:s}=De(i,r,t);if(t==="any"&&o)return!0;if(t==="all"&&!s)return!1}return t!=="any"}function q(e,n,t=n.item){for(let i of e){let r=t?.find(o=>o.linkId===i.linkId);r&&(_e(n,i,r),i.item&&r.item&&q(i.item,n,r.item))}}function _e(e,n,t){try{let i=ke(n,e);if(!i)return;let r=Ve(n,i);if(!r)return;t.answer=[r]}catch(i){t.extension=[{url:Ae,valueString:`Expression evaluation failed: ${Te(i)}`}]}}var Fe={[f.boolean]:[l.boolean],[f.date]:[l.date],[f.dateTime]:[l.dateTime],[f.time]:[l.time],[f.url]:[l.string,l.uri,l.url],[f.attachment]:[l.Attachment],[f.reference]:[l.Reference],[f.quantity]:[l.Quantity],[f.decimal]:[l.decimal,l.integer],[f.integer]:[l.decimal,l.integer]};function Ve(e,n){if(!e.type)return;if(e.type===f.choice||e.type===f.openChoice)return{[`value${J(n.type)}`]:n.value};if(e.type===f.string||e.type===f.text)return typeof n.value=="string"?{valueString:n.value}:void 0;if(Fe[e.type]?.includes(n.type))return{[`value${J(e.type)}`]:n.value}}function ke(e,n){if(!n)return;let t=T(e,Ne);if(t){let i=t.valueExpression?.expression;if(i){let r=Z(n),o=k(i,[r],{"%resource":r});return o.length!==0?o[0]:void 0}}}function Nn(e,n,t){let i=[];for(let r of e){let o=t.answerOption?.find(s=>Oe(Y(s))===r);if(o){let s=Y(o);s&&i.push({[n]:s.value})}}return i}function ne(e,n){if(e)for(let t of e){if(t.linkId===n)return t.answer;if(t.item){let i=ne(t.item,n);if(i)return i}}}function qe(e,n,t){if(t==="exists")return!!e===n.value;if(e){let i=t==="="||t==="!="?t?.replace("=","~"):t,[{value:r}]=k(`%actualAnswer ${i} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":n});return r}else return!1}function De(e,n,t){let i=n||[],r=We(e),o=!1,s=!0;for(let c of i){let d=Be(c),{operator:m}=e;if(qe(d,r,m)?o=!0:s=!1,t==="any"&&o)break}return{anyMatch:o,allMatch:s}}function Ln(e){let n=T(e,V);if(n){if(n.valueCode!==void 0)return[n.valueCode];if(n.valueCodeableConcept)return n.valueCodeableConcept?.coding?.map(t=>t.code)}}function Un(e,n){let t=he(e),i=T(t,V);return!n||n.length===0?(i&&(t.extension=t.extension?.filter(r=>r!==i)),t):(i||(t.extension??=[],i={url:V},t.extension.push(i)),n.length===1?(i.valueCode=n[0],delete i.valueCodeableConcept):(i.valueCodeableConcept={coding:n.map(r=>({code:r}))},delete i.valueCode),t)}function _n(e,n,t){let i=T(e,we);if(!i?.valueString)return;let r=i.valueString;n?.reference&&(r=r.replaceAll("$subj",n.reference)),t?.reference&&(r=r.replaceAll("$encounter",t.reference));let o={},s=r.split("&");for(let c of s){let[d,m]=Ce(c,"=",2);o[d]=m}return o}function D(e,n){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??ve(e),item:K(e.item,n?.item),status:"in-progress"}}function K(e,n){if(!e)return;let t=[];for(let i of e){if(i.type===f.display)continue;let r=n?.filter(o=>o.linkId===i.linkId);if(r&&r?.length>0)for(let o of r)o.id=o.id??te(),o.text=o.text??i.text,o.item=K(i.item,o.item),o.answer=re(i,o),t.push(o);else t.push(W(i))}return t}function W(e){return{id:te(),linkId:e.linkId,text:e.text,item:K(e.item,void 0),answer:re(e)}}var Ke=1;function te(){return"id-"+Ke++}function re(e,n){if(!(e.type===f.display||e.type===f.group)){if(n?.answer&&n.answer.length>0)return n.answer;if(e.initial&&e.initial.length>0)return e.initial.map(t=>({...t}));if(e.answerOption)return e.answerOption.filter(t=>t.initialSelected).map(t=>({...t,initialSelected:void 0}))}}function Fn(e){return C({type:"QuestionnaireItemInitial",value:e},"value")}function Y(e){return C({type:"QuestionnaireItemAnswerOption",value:e},"value")}function We(e){return C({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function Be(e){return C({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Wn(e){let n=F(e.questionnaire),t=F(e.defaultValue),[,i]=ze(a=>a+1,0),r=Ge({activePage:0});if(!r.current.questionnaire&&n&&(r.current.questionnaire=n,r.current.pages=e.disablePagination?void 0:Xe(n)),n&&e.defaultValue&&t&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=D(n,t),R()),n&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=D(n),R()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function o(a,u){let p=r.current.questionnaireResponse;for(let g of a)p=p?.item?.find(b=>g.id?b.id===g.id:b.linkId===g.linkId);return u&&(p=p?.item?.find(g=>g.linkId===u.linkId)),p}function s(){r.current.activePage=(r.current.activePage??0)+1,i()}function c(){r.current.activePage=(r.current.activePage??0)-1,i()}function d(a,u){let p=o(a);p&&(p.item??=[],p.item.push(W(u)),R())}function m(a,u){let p=o(a,u);p&&(p.answer??=[],p.answer.push({}),R())}function Q(a,u,p){let g=o(a,u);g&&(g.answer=p,R())}function y(a){let u=r.current.questionnaireResponse;u&&(a?(u.extension=u.extension??[],u.extension=u.extension.filter(p=>p.url!==P),u.extension.push({url:P,valueSignature:a})):u.extension=u.extension?.filter(p=>p.url!==P),R())}function E(){let a=r.current.questionnaire;if(a?.item){let u=r.current.questionnaireResponse;q(a.item,u)}}function R(){let a=r.current.questionnaireResponse;a&&(E(),i(),e.onChange?.(a))}return{loading:!1,pagination:!!r.current.pages,questionnaire:r.current.questionnaire,questionnaireResponse:r.current.questionnaireResponse,subject:e.subject,encounter:e.encounter,activePage:r.current.activePage,pages:r.current.pages,items:je(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:He(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:c,onAddGroup:d,onAddAnswer:m,onChangeAnswer:Q,onChangeSignature:y}}function Xe(e){if(!(!e?.item||$e(e?.item?.[0],ee)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((t,i)=>({linkId:t.linkId,title:t.text??`Page ${i+1}`,group:t}))}function je(e,n,t=0){return n&&e?.item?.[t]?[e.item[t]]:e.item??[]}function He(e,n,t=0){return n&&e?.item?.[t]?[e.item[t]]:e.item??[]}import{allOk as Ze,normalizeOperationOutcome as en}from"@medplum/core";import{useEffect as nn,useState as O}from"react";import{useCallback as Je,useEffect as ie,useRef as B,useState as Ye}from"react";function oe(e,n,t={leading:!1}){let[i,r]=Ye(e),o=B(!1),s=B(void 0),c=B(!1),d=Je(()=>window.clearTimeout(s.current),[]);return ie(()=>{o.current&&(!c.current&&t.leading?(c.current=!0,r(e)):(d(),s.current=setTimeout(()=>{c.current=!1,r(e)},n)))},[e,t.leading,n,d]),ie(()=>(o.current=!0,d),[d]),[i,d]}var tn=250;function Zn(e,n,t){return $("search",e,n,t)}function et(e,n,t){return $("searchOne",e,n,t)}function nt(e,n,t){return $("searchResources",e,n,t)}function $(e,n,t,i){let r=h(),[o,s]=O(),[c,d]=O(!0),[m,Q]=O(),[y,E]=O(),R=r.fhirSearchUrl(n,t).toString(),[a]=oe(R,i?.debounceMs??tn,{leading:!0});return nn(()=>{a!==o&&(s(a),r[e](n,t).then(u=>{d(!1),Q(u),E(Ze)}).catch(u=>{d(!1),Q(void 0),E(en(u))}))},[r,e,n,t,o,a]),[m,c,y]}import{deepEquals as se}from"@medplum/core";import{useCallback as v,useEffect as z,useRef as x,useState as ue}from"react";var rn=3e3;function at(e,n,t){let i=h(),[r,o]=ue(),[s,c]=ue(t?.subscriptionProps),d=x(!1),m=x(void 0),Q=x(void 0),y=x(void 0),E=x(n);E.current=n;let R=x(t?.onWebSocketOpen);R.current=t?.onWebSocketOpen;let a=x(t?.onWebSocketClose);a.current=t?.onWebSocketClose;let u=x(t?.onSubscriptionConnect);u.current=t?.onSubscriptionConnect;let p=x(t?.onSubscriptionDisconnect);p.current=t?.onSubscriptionDisconnect;let g=x(t?.onError);g.current=t?.onError,z(()=>{se(t?.subscriptionProps,s)||c(t?.subscriptionProps)},[s,t]),z(()=>{m.current&&(clearTimeout(m.current),m.current=void 0);let I=!1;return(Q.current!==e||!se(y.current,s))&&(I=!0),I&&Q.current&&i.unsubscribeFromCriteria(Q.current,y.current),Q.current=e,y.current=s,I&&e?o(i.subscribeToCriteria(e,s)):e||o(void 0),()=>{m.current=setTimeout(()=>{o(void 0),e&&i.unsubscribeFromCriteria(e,s)},rn)}},[i,e,s]);let b=v(I=>{E.current?.(I.payload)},[]),w=v(()=>{R.current?.()},[]),A=v(()=>{a.current?.()},[]),M=v(I=>{u.current?.(I.payload.subscriptionId)},[]),N=v(I=>{p.current?.(I.payload.subscriptionId)},[]),L=v(I=>{g.current?.(I.payload)},[]);z(()=>r?(d.current||(r.addEventListener("message",b),r.addEventListener("open",w),r.addEventListener("close",A),r.addEventListener("connect",M),r.addEventListener("disconnect",N),r.addEventListener("error",L),d.current=!0),()=>{d.current=!1,r.removeEventListener("message",b),r.removeEventListener("open",w),r.removeEventListener("close",A),r.removeEventListener("connect",M),r.removeEventListener("disconnect",N),r.removeEventListener("error",L)}):()=>{},[r,b,w,A,M,N,L])}export{mn as MedplumProvider,Ne as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,Me as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,ee as QUESTIONNAIRE_ITEM_CONTROL_URL,we as QUESTIONNAIRE_REFERENCE_FILTER_URL,V as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,wn as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,P as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,Ae as QUESTIONNAIRE_VALIDATION_ERROR_URL,f as QuestionnaireItemType,D as buildInitialResponse,W as buildInitialResponseItem,q as evaluateCalculatedExpressionsInQuestionnaire,Y as getItemAnswerOptionValue,We as getItemEnableWhenValueAnswer,Fn as getItemInitialValue,Nn as getNewMultiSelectValues,_n as getQuestionnaireItemReferenceFilter,Ln as getQuestionnaireItemReferenceTargetTypes,Be as getResponseItemAnswerValue,An as isChoiceQuestion,Mn as isQuestionEnabled,U as reactContext,Un as setQuestionnaireItemReferenceTargetTypes,Ve as typedValueToResponseItem,Qn as useCachedBinaryUrl,h as useMedplum,_ as useMedplumContext,sn as useMedplumNavigate,un as useMedplumProfile,yn as usePrevious,Wn as useQuestionnaireForm,F as useResource,Zn as useSearch,et as useSearchOne,nt as useSearchResources,at as useSubscription};
//# sourceMappingURL=index.mjs.map