@medplum/react-hooks 5.0.14 → 5.1.0
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/README.md +1 -1
- package/dist/cjs/index.cjs +29 -1
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.d.ts +39 -0
- package/dist/esm/index.d.ts +39 -0
- package/dist/esm/index.mjs +29 -1
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +9 -9
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Bundle } from '@medplum/fhirtypes';
|
|
2
|
+
import type { Communication } from '@medplum/fhirtypes';
|
|
2
3
|
import { Context } from 'react';
|
|
3
4
|
import type { Encounter } from '@medplum/fhirtypes';
|
|
4
5
|
import type { ExtractResource } from '@medplum/fhirtypes';
|
|
@@ -108,6 +109,8 @@ export declare const QUESTIONNAIRE_CALCULATED_EXPRESSION_URL = "http://hl7.org/f
|
|
|
108
109
|
|
|
109
110
|
export declare const QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL = "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression";
|
|
110
111
|
|
|
112
|
+
export declare const QUESTIONNAIRE_HIDDEN_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden";
|
|
113
|
+
|
|
111
114
|
export declare const QUESTIONNAIRE_ITEM_CONTROL_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl";
|
|
112
115
|
|
|
113
116
|
export declare const QUESTIONNAIRE_REFERENCE_FILTER_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter";
|
|
@@ -248,6 +251,24 @@ export declare function useMedplumNavigate(): MedplumNavigateFunction;
|
|
|
248
251
|
*/
|
|
249
252
|
export declare function useMedplumProfile(): ProfileResource | undefined;
|
|
250
253
|
|
|
254
|
+
/**
|
|
255
|
+
* Returns a live notification count for a given resource type.
|
|
256
|
+
*
|
|
257
|
+
* Uses `medplum.search()` for the initial count (with default cache policy) and
|
|
258
|
+
* subscribes to real-time updates via `useSubscription()`, re-fetching with
|
|
259
|
+
* `cache: 'reload'` whenever a matching event arrives.
|
|
260
|
+
*
|
|
261
|
+
* @param options - The resource type, count search criteria, and subscription criteria.
|
|
262
|
+
* @returns The current notification count.
|
|
263
|
+
*/
|
|
264
|
+
export declare function useNotificationCount(options: UseNotificationCountOptions): number;
|
|
265
|
+
|
|
266
|
+
export declare interface UseNotificationCountOptions {
|
|
267
|
+
readonly resourceType: ResourceType;
|
|
268
|
+
readonly countCriteria: string;
|
|
269
|
+
readonly subscriptionCriteria: string;
|
|
270
|
+
}
|
|
271
|
+
|
|
251
272
|
/**
|
|
252
273
|
* React Hook to keep track of the passed-in value from the previous render of the containing component.
|
|
253
274
|
* @param value - The value to track.
|
|
@@ -344,4 +365,22 @@ export declare type UseSubscriptionOptions = {
|
|
|
344
365
|
onError?: (err: Error) => void;
|
|
345
366
|
};
|
|
346
367
|
|
|
368
|
+
export declare function useThreadInbox({ query, threadId }: UseThreadInboxOptions): UseThreadInboxReturn;
|
|
369
|
+
|
|
370
|
+
export declare interface UseThreadInboxOptions {
|
|
371
|
+
query: string;
|
|
372
|
+
threadId: string | undefined;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export declare interface UseThreadInboxReturn {
|
|
376
|
+
loading: boolean;
|
|
377
|
+
error: Error | null;
|
|
378
|
+
threadMessages: [Communication, Communication | undefined][];
|
|
379
|
+
selectedThread: Communication | undefined;
|
|
380
|
+
total: number | undefined;
|
|
381
|
+
addThreadMessage: (message: Communication) => void;
|
|
382
|
+
handleThreadStatusChange: (newStatus: Communication['status']) => void;
|
|
383
|
+
refreshThreadMessages: () => Promise<void>;
|
|
384
|
+
}
|
|
385
|
+
|
|
347
386
|
export { }
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Bundle } from '@medplum/fhirtypes';
|
|
2
|
+
import type { Communication } from '@medplum/fhirtypes';
|
|
2
3
|
import { Context } from 'react';
|
|
3
4
|
import type { Encounter } from '@medplum/fhirtypes';
|
|
4
5
|
import type { ExtractResource } from '@medplum/fhirtypes';
|
|
@@ -108,6 +109,8 @@ export declare const QUESTIONNAIRE_CALCULATED_EXPRESSION_URL = "http://hl7.org/f
|
|
|
108
109
|
|
|
109
110
|
export declare const QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL = "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression";
|
|
110
111
|
|
|
112
|
+
export declare const QUESTIONNAIRE_HIDDEN_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden";
|
|
113
|
+
|
|
111
114
|
export declare const QUESTIONNAIRE_ITEM_CONTROL_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl";
|
|
112
115
|
|
|
113
116
|
export declare const QUESTIONNAIRE_REFERENCE_FILTER_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter";
|
|
@@ -248,6 +251,24 @@ export declare function useMedplumNavigate(): MedplumNavigateFunction;
|
|
|
248
251
|
*/
|
|
249
252
|
export declare function useMedplumProfile(): ProfileResource | undefined;
|
|
250
253
|
|
|
254
|
+
/**
|
|
255
|
+
* Returns a live notification count for a given resource type.
|
|
256
|
+
*
|
|
257
|
+
* Uses `medplum.search()` for the initial count (with default cache policy) and
|
|
258
|
+
* subscribes to real-time updates via `useSubscription()`, re-fetching with
|
|
259
|
+
* `cache: 'reload'` whenever a matching event arrives.
|
|
260
|
+
*
|
|
261
|
+
* @param options - The resource type, count search criteria, and subscription criteria.
|
|
262
|
+
* @returns The current notification count.
|
|
263
|
+
*/
|
|
264
|
+
export declare function useNotificationCount(options: UseNotificationCountOptions): number;
|
|
265
|
+
|
|
266
|
+
export declare interface UseNotificationCountOptions {
|
|
267
|
+
readonly resourceType: ResourceType;
|
|
268
|
+
readonly countCriteria: string;
|
|
269
|
+
readonly subscriptionCriteria: string;
|
|
270
|
+
}
|
|
271
|
+
|
|
251
272
|
/**
|
|
252
273
|
* React Hook to keep track of the passed-in value from the previous render of the containing component.
|
|
253
274
|
* @param value - The value to track.
|
|
@@ -344,4 +365,22 @@ export declare type UseSubscriptionOptions = {
|
|
|
344
365
|
onError?: (err: Error) => void;
|
|
345
366
|
};
|
|
346
367
|
|
|
368
|
+
export declare function useThreadInbox({ query, threadId }: UseThreadInboxOptions): UseThreadInboxReturn;
|
|
369
|
+
|
|
370
|
+
export declare interface UseThreadInboxOptions {
|
|
371
|
+
query: string;
|
|
372
|
+
threadId: string | undefined;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export declare interface UseThreadInboxReturn {
|
|
376
|
+
loading: boolean;
|
|
377
|
+
error: Error | null;
|
|
378
|
+
threadMessages: [Communication, Communication | undefined][];
|
|
379
|
+
selectedThread: Communication | undefined;
|
|
380
|
+
total: number | undefined;
|
|
381
|
+
addThreadMessage: (message: Communication) => void;
|
|
382
|
+
handleThreadStatusChange: (newStatus: Communication['status']) => void;
|
|
383
|
+
refreshThreadMessages: () => Promise<void>;
|
|
384
|
+
}
|
|
385
|
+
|
|
347
386
|
export { }
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,2 +1,30 @@
|
|
|
1
|
-
import{useEffect as fe,useMemo as le,useState as me}from"react";import{createContext as de,useContext as pe}from"react";var L=de(void 0);function U(){return pe(L)}function b(){return U().medplum}function cn(){return U().navigate}function dn(){return U().profile}import{jsx as ge}from"react/jsx-runtime";var G=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function mn(e){let t=e.medplum,n=e.navigate??Re,[i,r]=me({profile:t.getProfile(),loading:t.isLoading()});fe(()=>{function s(){r(d=>({...d,profile:t.getProfile(),loading:t.isLoading()}))}for(let d of G)t.addEventListener(d,s);return()=>{for(let d of G)t.removeEventListener(d,s)}},[t]);let o=le(()=>({...i,medplum:t,navigate:n}),[i,t,n]);return ge(L.Provider,{value:o,children:e.children})}function Re(e){window.location.assign(e)}import{useMemo as Ie}from"react";var X=new Map,Qn=e=>Ie(()=>{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 i=n.get("Expires");if(!i||i.length>13)return e;let r=X.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 X.set(t,e),e},[e]);import{useEffect as Qe,useRef as ye}from"react";function Sn(e){let t=ye(void 0);return Qe(()=>{t.current=e}),t.current}import{getExtension as Ge}from"@medplum/core";import{useReducer as Xe,useRef as je}from"react";import{deepEquals as xe,isReference as H,isResource as Se,normalizeOperationOutcome as Ee}from"@medplum/core";import{useCallback as he,useEffect as be,useState as ve}from"react";function V(e,t){let n=b(),[i,r]=ve(()=>j(n,e)),o=he(s=>{xe(s,i)||r(s)},[i]);return be(()=>{let s=!0,d=j(n,e);return!d&&H(e)?n.readReference(e).then(p=>{s&&o(p)}).catch(p=>{s&&(o(void 0),t&&t(Ee(p)))}):o(d),(()=>s=!1)},[n,e,o,t]),i}function j(e,t){if(t){if(Se(t))return t;if(H(t))return e.getCachedReference(t)}}import{EMPTY as ee,HTTP_HL7_ORG as x,PropertyType as l,append as J,capitalize as Y,deepClone as Te,evalFhirPathTyped as F,getExtension as T,getReferenceString as Ce,getTypedPropertyValueWithoutSchema as C,normalizeErrorString as Pe,splitN as Oe,toJsBoolean as we,toTypedValue as ne,typedValueToString as Ae}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"},te=`${x}/fhir/StructureDefinition/questionnaire-itemControl`,Me=`${x}/fhir/StructureDefinition/questionnaire-referenceFilter`,_=`${x}/fhir/StructureDefinition/questionnaire-referenceResource`,Ne=`${x}/fhir/StructureDefinition/questionnaire-validationError`,Le=`${x}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,Ue=`${x}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Pn=`${x}/fhir/StructureDefinition/questionnaire-signatureRequired`,P=`${x}/fhir/StructureDefinition/questionnaireresponse-signature`;function On(e){return e.type==="choice"||e.type==="open-choice"}function wn(e,t){let n=Ve(e,t);return n!==void 0?n:_e(e,t)}function Ve(e,t){let n=T(e,Le);if(t&&n){let i=n.valueExpression?.expression;if(i){let r=ne(t),o=F(i,[r],{"%resource":r});return we(o)}}}function _e(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let i of e.enableWhen){let r=re(t?.item,i.question);if(i.operator==="exists"&&!i.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:o,allMatch:s}=Ke(i,r,n);if(n==="any"&&o)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function k(e,t,n=t.item){for(let i of e){let r=n?.find(o=>o.linkId===i.linkId);r&&(Fe(t,i,r),i.item&&r.item&&k(i.item,t,r.item))}}function Fe(e,t,n){try{let i=We(t,e);if(!i)return;let r=qe(t,i);if(!r)return;n.answer=[r]}catch(i){n.extension=[{url:Ne,valueString:`Expression evaluation failed: ${Pe(i)}`}]}}var ke={[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 qe(e,t){if(!e.type)return;if(e.type===f.choice||e.type===f.openChoice)return{[`value${Y(t.type)}`]:t.value};if(e.type===f.string||e.type===f.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(ke[e.type]?.includes(t.type))return{[`value${Y(e.type)}`]:t.value}}function We(e,t){if(!t)return;let n=T(e,Ue);if(n){let i=n.valueExpression?.expression;if(i){let r=ne(t),o=F(i,[r],{"%resource":r});return o.length!==0?o[0]:void 0}}}function An(e,t,n){let i=[];for(let r of e){let o=n.answerOption?.find(s=>Ae(Z(s))===r);if(o){let s=Z(o);s&&i.push({[t]:s.value})}}return i}function re(e,t){for(let n of e??ee){if(n.linkId===t)return n.answer;if(n.item){let i=re(n.item,t);if(i)return i}}}function De(e,t,n){if(n==="exists")return!!e===t.value;if(e){let i=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=F(`%actualAnswer ${i} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function Ke(e,t,n){let i=t||[],r=$e(e),o=!1,s=!0;for(let d of i){let p=ze(d),{operator:m}=e;if(De(p,r,m)?o=!0:s=!1,n==="any"&&o)break}return{anyMatch:o,allMatch:s}}function Mn(e){let t=T(e,_);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function Nn(e,t){let n=Te(e),i=T(n,_);return!t||t.length===0?(i&&(n.extension=n.extension?.filter(r=>r!==i)),n):(i||(n.extension??=[],i={url:_},n.extension.push(i)),t.length===1?(i.valueCode=t[0],delete i.valueCodeableConcept):(i.valueCodeableConcept={coding:t.map(r=>({code:r}))},delete i.valueCode),n)}function Ln(e,t,n){let i=T(e,Me);if(!i?.valueString)return;let r=i.valueString;t?.reference&&(r=r.replaceAll("$subj",t.reference)),n?.reference&&(r=r.replaceAll("$encounter",n.reference));let o={},s=r.split("&");for(let d of s){let[p,m]=Oe(d,"=",2);o[p]=m}return o}function q(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??Ce(e),item:W(e.item,t?.item),status:"in-progress"}}function W(e,t){let n;for(let i of e??ee){if(i.type===f.display)continue;let r=t?.filter(o=>o.linkId===i.linkId);if(r?.length)for(let o of r)o.id=o.id??ie(),o.text=o.text??i.text,o.item=W(i.item,o.item),o.answer=oe(i,o),n=J(n,o);else n=J(n,D(i))}return n}function D(e){return{id:ie(),linkId:e.linkId,text:e.text,item:W(e.item,void 0),answer:oe(e)}}var Be=1;function ie(){return"id-"+Be++}function oe(e,t){if(!(e.type===f.display||e.type===f.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 Un(e){return C({type:"QuestionnaireItemInitial",value:e},"value")}function Z(e){return C({type:"QuestionnaireItemAnswerOption",value:e},"value")}function $e(e){return C({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function ze(e){return C({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function Wn(e){let t=V(e.questionnaire),n=V(e.defaultValue),[,i]=Xe(c=>c+1,0),r=je({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:He(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=q(t,n),R()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=q(t),R()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function o(c,u){let a=r.current.questionnaireResponse;for(let g of c)a=a?.item?.find(h=>g.id?h.id===g.id:h.linkId===g.linkId);return u&&(a=a?.item?.find(g=>g.linkId===u.linkId)),a}function s(){r.current.activePage=(r.current.activePage??0)+1,i()}function d(){r.current.activePage=(r.current.activePage??0)-1,i()}function p(c,u){let a=o(c);a&&(a.item??=[],a.item.push(D(u)),R())}function m(c,u){let a=o(c,u);a&&(a.answer??=[],a.answer.push({}),R())}function Q(c,u,a){let g=o(c,u);g&&(g.answer=a,R())}function S(c){let u=r.current.questionnaireResponse;u&&(c?(u.extension=u.extension??[],u.extension=u.extension.filter(a=>a.url!==P),u.extension.push({url:P,valueSignature:c})):u.extension=u.extension?.filter(a=>a.url!==P),R())}function E(){let c=r.current.questionnaire;if(c?.item){let u=r.current.questionnaireResponse;k(c.item,u)}}function R(){let c=r.current.questionnaireResponse;c&&(E(),i(),e.onChange?.(c))}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:Ye(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:d,onAddGroup:p,onAddAnswer:m,onChangeAnswer:Q,onChangeSignature:S}}function He(e){if(!(!e?.item||Ge(e?.item?.[0],te)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,i)=>({linkId:n.linkId,title:n.text??`Page ${i+1}`,group:n}))}function Je(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function Ye(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{allOk as nn,normalizeOperationOutcome as tn}from"@medplum/core";import{useEffect as rn,useMemo as on,useState as B}from"react";import{useCallback as Ze,useEffect as se,useRef as K,useState as en}from"react";function ue(e,t,n={leading:!1}){let[i,r]=en(e),o=K(!1),s=K(void 0),d=K(!1),p=Ze(()=>window.clearTimeout(s.current),[]);return se(()=>{o.current&&(!d.current&&n.leading?(d.current=!0,r(e)):(p(),s.current=setTimeout(()=>{d.current=!1,r(e)},t)))},[e,n.leading,t,p]),se(()=>(o.current=!0,p),[p]),[i,p]}var sn=250;function jn(e,t,n){return $("search",e,t,n)}function Hn(e,t,n){return $("searchOne",e,t,n)}function Jn(e,t,n){return $("searchResources",e,t,n)}function $(e,t,n,i){let r=b(),[o,s]=B(!0),[d,p]=B(),[m,Q]=B(),S=r.fhirSearchUrl(t,n).toString(),E=on(()=>({resourceType:t,query:n}),[S]),R=i?.debounceMs??sn,[c]=ue(E,R,{leading:!0});return rn(()=>{let u=!0;return r[e](c.resourceType,c.query).then(a=>{u&&(s(!1),p(a),Q(nn))}).catch(a=>{u&&(s(!1),p(void 0),Q(tn(a)))}),()=>{u=!1}},[r,e,c]),[d,o,m]}import{deepEquals as ae}from"@medplum/core";import{useCallback as v,useEffect as z,useRef as y,useState as ce}from"react";var un=3e3;function tt(e,t,n){let i=b(),[r,o]=ce(),[s,d]=ce(n?.subscriptionProps),p=y(!1),m=y(void 0),Q=y(void 0),S=y(void 0),E=y(t);E.current=t;let R=y(n?.onWebSocketOpen);R.current=n?.onWebSocketOpen;let c=y(n?.onWebSocketClose);c.current=n?.onWebSocketClose;let u=y(n?.onSubscriptionConnect);u.current=n?.onSubscriptionConnect;let a=y(n?.onSubscriptionDisconnect);a.current=n?.onSubscriptionDisconnect;let g=y(n?.onError);g.current=n?.onError,z(()=>{ae(n?.subscriptionProps,s)||d(n?.subscriptionProps)},[s,n]),z(()=>{m.current&&(clearTimeout(m.current),m.current=void 0);let I=!1;return(Q.current!==e||!ae(S.current,s))&&(I=!0),I&&Q.current&&i.unsubscribeFromCriteria(Q.current,S.current),Q.current=e,S.current=s,I&&e?o(i.subscribeToCriteria(e,s)):e||o(void 0),()=>{m.current=setTimeout(()=>{o(void 0),e&&i.unsubscribeFromCriteria(e,s)},un)}},[i,e,s]);let h=v(I=>{E.current?.(I.payload)},[]),O=v(()=>{R.current?.()},[]),w=v(()=>{c.current?.()},[]),A=v(I=>{u.current?.(I.payload.subscriptionId)},[]),M=v(I=>{a.current?.(I.payload.subscriptionId)},[]),N=v(I=>{g.current?.(I.payload)},[]);z(()=>r?(p.current||(r.addEventListener("message",h),r.addEventListener("open",O),r.addEventListener("close",w),r.addEventListener("connect",A),r.addEventListener("disconnect",M),r.addEventListener("error",N),p.current=!0),()=>{p.current=!1,r.removeEventListener("message",h),r.removeEventListener("open",O),r.removeEventListener("close",w),r.removeEventListener("connect",A),r.removeEventListener("disconnect",M),r.removeEventListener("error",N)}):()=>{},[r,h,O,w,A,M,N])}export{mn as MedplumProvider,Ue as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,Le as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,te as QUESTIONNAIRE_ITEM_CONTROL_URL,Me as QUESTIONNAIRE_REFERENCE_FILTER_URL,_ as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,Pn as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,P as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,Ne as QUESTIONNAIRE_VALIDATION_ERROR_URL,f as QuestionnaireItemType,q as buildInitialResponse,D as buildInitialResponseItem,k as evaluateCalculatedExpressionsInQuestionnaire,Z as getItemAnswerOptionValue,$e as getItemEnableWhenValueAnswer,Un as getItemInitialValue,An as getNewMultiSelectValues,Ln as getQuestionnaireItemReferenceFilter,Mn as getQuestionnaireItemReferenceTargetTypes,ze as getResponseItemAnswerValue,On as isChoiceQuestion,wn as isQuestionEnabled,L as reactContext,Nn as setQuestionnaireItemReferenceTargetTypes,qe as typedValueToResponseItem,Qn as useCachedBinaryUrl,b as useMedplum,U as useMedplumContext,cn as useMedplumNavigate,dn as useMedplumProfile,Sn as usePrevious,Wn as useQuestionnaireForm,V as useResource,jn as useSearch,Hn as useSearchOne,Jn as useSearchResources,tt as useSubscription};
|
|
1
|
+
import{useEffect as he,useMemo as ye,useState as xe}from"react";import{createContext as ge,useContext as Ie}from"react";var V=ge(void 0);function F(){return Ie(V)}function E(){return F().medplum}function Qn(){return F().navigate}function Sn(){return F().profile}import{jsx as Se}from"react/jsx-runtime";var X=["change","storageInitialized","storageInitFailed","profileRefreshing","profileRefreshed"];function Tn(e){let t=e.medplum,n=e.navigate??Qe,[o,r]=xe({profile:t.getProfile(),loading:t.isLoading()});he(()=>{function s(){r(a=>({...a,profile:t.getProfile(),loading:t.isLoading()}))}for(let a of X)t.addEventListener(a,s);return()=>{for(let a of X)t.removeEventListener(a,s)}},[t]);let i=ye(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return Se(V.Provider,{value:i,children:e.children})}function Qe(e){window.location.assign(e)}import{useMemo as Ee}from"react";var J=new Map,wn=e=>Ee(()=>{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=J.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 J.set(t,e),e},[e]);import{useCallback as ve,useEffect as Te,useState as Ce}from"react";import{deepEquals as Y}from"@medplum/core";import{useCallback as O,useEffect as k,useRef as b,useState as Z}from"react";var be=3e3;function ee(e,t,n){let o=E(),[r,i]=Z(),[s,a]=Z(n?.subscriptionProps),c=b(!1),R=b(void 0),I=b(void 0),v=b(void 0),C=b(t);C.current=t;let g=b(n?.onWebSocketOpen);g.current=n?.onWebSocketOpen;let p=b(n?.onWebSocketClose);p.current=n?.onWebSocketClose;let d=b(n?.onSubscriptionConnect);d.current=n?.onSubscriptionConnect;let u=b(n?.onSubscriptionDisconnect);u.current=n?.onSubscriptionDisconnect;let l=b(n?.onError);l.current=n?.onError,k(()=>{Y(n?.subscriptionProps,s)||a(n?.subscriptionProps)},[s,n]),k(()=>{R.current&&(clearTimeout(R.current),R.current=void 0);let x=!1;return(I.current!==e||!Y(v.current,s))&&(x=!0),x&&I.current&&o.unsubscribeFromCriteria(I.current,v.current),I.current=e,v.current=s,x&&e?i(o.subscribeToCriteria(e,s)):e||i(void 0),()=>{R.current=setTimeout(()=>{i(void 0),e&&o.unsubscribeFromCriteria(e,s)},be)}},[o,e,s]);let f=O(x=>{C.current?.(x.payload)},[]),Q=O(()=>{g.current?.()},[]),S=O(()=>{p.current?.()},[]),P=O(x=>{d.current?.(x.payload.subscriptionId)},[]),A=O(x=>{u.current?.(x.payload.subscriptionId)},[]),h=O(x=>{l.current?.(x.payload)},[]);k(()=>r?(c.current||(r.addEventListener("message",f),r.addEventListener("open",Q),r.addEventListener("close",S),r.addEventListener("connect",P),r.addEventListener("disconnect",A),r.addEventListener("error",h),c.current=!0),()=>{c.current=!1,r.removeEventListener("message",f),r.removeEventListener("open",Q),r.removeEventListener("close",S),r.removeEventListener("connect",P),r.removeEventListener("disconnect",A),r.removeEventListener("error",h)}):()=>{},[r,f,Q,S,P,A,h])}function kn(e){let t=E(),{resourceType:n,countCriteria:o,subscriptionCriteria:r}=e,[i,s]=Ce(0),a=ve(c=>{t.search(n,o,{cache:c}).then(R=>s(R.total)).catch(console.error)},[t,n,o]);return Te(()=>{a("default")},[a]),ee(r,()=>{a("reload")}),i}import{useEffect as Pe,useRef as Oe}from"react";function Wn(e){let t=Oe(void 0);return Pe(()=>{t.current=e}),t.current}import{getExtension as on}from"@medplum/core";import{useReducer as sn,useRef as un}from"react";import{deepEquals as we,isReference as te,isResource as Ae,normalizeOperationOutcome as Me}from"@medplum/core";import{useCallback as Ne,useEffect as Ue,useState as Le}from"react";function q(e,t){let n=E(),[o,r]=Le(()=>ne(n,e)),i=Ne(s=>{we(s,o)||r(s)},[o]);return Ue(()=>{let s=!0,a=ne(n,e);return!a&&te(e)?n.readReference(e).then(c=>{s&&i(c)}).catch(c=>{s&&(i(void 0),t&&t(Me(c)))}):i(a),(()=>s=!1)},[n,e,i,t]),o}function ne(e,t){if(t){if(Ae(t))return t;if(te(t))return e.getCachedReference(t)}}import{EMPTY as se,HTTP_HL7_ORG as T,PropertyType as y,append as re,capitalize as oe,deepClone as _e,evalFhirPathTyped as W,getExtension as w,getReferenceString as Ve,getTypedPropertyValueWithoutSchema as U,normalizeErrorString as Fe,splitN as ke,toJsBoolean as qe,toTypedValue as ue,typedValueToString as De}from"@medplum/core";var m={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"},ae=`${T}/fhir/StructureDefinition/questionnaire-itemControl`,We=`${T}/fhir/StructureDefinition/questionnaire-referenceFilter`,D=`${T}/fhir/StructureDefinition/questionnaire-referenceResource`,$e=`${T}/fhir/StructureDefinition/questionnaire-validationError`,Ke=`${T}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression`,Be=`${T}/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression`,Hn=`${T}/fhir/StructureDefinition/questionnaire-signatureRequired`,L=`${T}/fhir/StructureDefinition/questionnaireresponse-signature`,ze=`${T}/fhir/StructureDefinition/questionnaire-hidden`;function Xn(e){return e.type==="choice"||e.type==="open-choice"}function Jn(e,t){if(w(e,ze)?.valueBoolean===!0)return!1;let o=Ge(e,t);return o!==void 0?o:je(e,t)}function Ge(e,t){let n=w(e,Ke);if(t&&n){let o=n.valueExpression?.expression;if(o){let r=ue(t),i=W(o,[r],{"%resource":r});return qe(i)}}}function je(e,t){if(!e.enableWhen)return!0;let n=e.enableBehavior??"any";for(let o of e.enableWhen){let r=ce(t?.item,o.question);if(o.operator==="exists"&&!o.answerBoolean&&!r?.length){if(n==="any")return!0;continue}let{anyMatch:i,allMatch:s}=en(o,r,n);if(n==="any"&&i)return!0;if(n==="all"&&!s)return!1}return n!=="any"}function $(e,t,n=t.item){for(let o of e){let r=n?.find(i=>i.linkId===o.linkId);r&&(He(t,o,r),o.item&&r.item&&$(o.item,t,r.item))}}function He(e,t,n){try{let o=Ye(t,e);if(!o)return;let r=Je(t,o);if(!r)return;n.answer=[r]}catch(o){n.extension=[{url:$e,valueString:`Expression evaluation failed: ${Fe(o)}`}]}}var Xe={[m.boolean]:[y.boolean],[m.date]:[y.date],[m.dateTime]:[y.dateTime],[m.time]:[y.time],[m.url]:[y.string,y.uri,y.url],[m.attachment]:[y.Attachment],[m.reference]:[y.Reference],[m.quantity]:[y.Quantity],[m.decimal]:[y.decimal,y.integer],[m.integer]:[y.decimal,y.integer]};function Je(e,t){if(!e.type)return;if(e.type===m.choice||e.type===m.openChoice)return{[`value${oe(t.type)}`]:t.value};if(e.type===m.string||e.type===m.text)return typeof t.value=="string"?{valueString:t.value}:void 0;if(Xe[e.type]?.includes(t.type))return{[`value${oe(e.type)}`]:t.value}}function Ye(e,t){if(!t)return;let n=w(e,Be);if(n){let o=n.valueExpression?.expression;if(o){let r=ue(t),i=W(o,[r],{"%resource":r});return i.length!==0?i[0]:void 0}}}function Yn(e,t,n){let o=[];for(let r of e){let i=n.answerOption?.find(s=>De(ie(s))===r);if(i){let s=ie(i);s&&o.push({[t]:s.value})}}return o}function ce(e,t){for(let n of e??se){if(n.linkId===t)return n.answer;if(n.item){let o=ce(n.item,t);if(o)return o}}}function Ze(e,t,n){if(n==="exists")return!!e===t.value;if(e){let o=n==="="||n==="!="?n?.replace("=","~"):n,[{value:r}]=W(`%actualAnswer ${o} %expectedAnswer`,[e],{"%actualAnswer":e,"%expectedAnswer":t});return r}else return!1}function en(e,t,n){let o=t||[],r=tn(e),i=!1,s=!0;for(let a of o){let c=rn(a),{operator:R}=e;if(Ze(c,r,R)?i=!0:s=!1,n==="any"&&i)break}return{anyMatch:i,allMatch:s}}function Zn(e){let t=w(e,D);if(t){if(t.valueCode!==void 0)return[t.valueCode];if(t.valueCodeableConcept)return t.valueCodeableConcept?.coding?.map(n=>n.code)}}function et(e,t){let n=_e(e),o=w(n,D);return!t||t.length===0?(o&&(n.extension=n.extension?.filter(r=>r!==o)),n):(o||(n.extension??=[],o={url:D},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 nt(e,t,n){let o=w(e,We);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[c,R]=ke(a,"=",2);i[c]=R}return i}function K(e,t){return{resourceType:"QuestionnaireResponse",questionnaire:e.url??Ve(e),item:B(e.item,t?.item),status:"in-progress"}}function B(e,t){let n;for(let o of e??se){if(o.type===m.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=B(o.item,i.item),i.answer=pe(o,i),n=re(n,i);else n=re(n,z(o))}return n}function z(e){return{id:de(),linkId:e.linkId,text:e.text,item:B(e.item,void 0),answer:pe(e)}}var nn=1;function de(){return"id-"+nn++}function pe(e,t){if(!(e.type===m.display||e.type===m.group)){if(t?.answer&&t.answer.length>0)return t.answer;if(e.initial&&e.initial.length>0)return e.initial.map(n=>({...n}));if(e.answerOption)return e.answerOption.filter(n=>n.initialSelected).map(n=>({...n,initialSelected:void 0}))}}function tt(e){return U({type:"QuestionnaireItemInitial",value:e},"value")}function ie(e){return U({type:"QuestionnaireItemAnswerOption",value:e},"value")}function tn(e){return U({type:"QuestionnaireItemEnableWhen",value:e},"answer")}function rn(e){return U({type:"QuestionnaireResponseItemAnswer",value:e},"value")}function at(e){let t=q(e.questionnaire),n=q(e.defaultValue),[,o]=sn(p=>p+1,0),r=un({activePage:0});if(!r.current.questionnaire&&t&&(r.current.questionnaire=t,r.current.pages=e.disablePagination?void 0:an(t)),t&&e.defaultValue&&n&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=K(t,n),g()),t&&!e.defaultValue&&!r.current.questionnaireResponse&&(r.current.questionnaireResponse=K(t),g()),!r.current.questionnaire||!r.current.questionnaireResponse)return{loading:!0};function i(p,d){let u=r.current.questionnaireResponse;for(let l of p)u=u?.item?.find(f=>l.id?f.id===l.id:f.linkId===l.linkId);return d&&(u=u?.item?.find(l=>l.linkId===d.linkId)),u}function s(){r.current.activePage=(r.current.activePage??0)+1,o()}function a(){r.current.activePage=(r.current.activePage??0)-1,o()}function c(p,d){let u=i(p);u&&(u.item??=[],u.item.push(z(d)),g())}function R(p,d){let u=i(p,d);u&&(u.answer??=[],u.answer.push({}),g())}function I(p,d,u){let l=i(p,d);l&&(l.answer=u,g())}function v(p){let d=r.current.questionnaireResponse;d&&(p?(d.extension=d.extension??[],d.extension=d.extension.filter(u=>u.url!==L),d.extension.push({url:L,valueSignature:p})):d.extension=d.extension?.filter(u=>u.url!==L),g())}function C(){let p=r.current.questionnaire;if(p?.item){let d=r.current.questionnaireResponse;$(p.item,d)}}function g(){let p=r.current.questionnaireResponse;p&&(C(),o(),e.onChange?.(p))}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:cn(r.current.questionnaire,r.current.pages,r.current.activePage),responseItems:dn(r.current.questionnaireResponse,r.current.pages,r.current.activePage),onNextPage:s,onPrevPage:a,onAddGroup:c,onAddAnswer:R,onChangeAnswer:I,onChangeSignature:v}}function an(e){if(!(!e?.item||on(e?.item?.[0],ae)?.valueCodeableConcept?.coding?.[0]?.code!=="page"))return e.item.map((n,o)=>({linkId:n.linkId,title:n.text??`Page ${o+1}`,group:n}))}function cn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}function dn(e,t,n=0){return t&&e?.item?.[n]?[e.item[n]]:e.item??[]}import{allOk as ln,normalizeOperationOutcome as mn}from"@medplum/core";import{useEffect as Rn,useMemo as gn,useState as j}from"react";import{useCallback as pn,useEffect as fe,useRef as G,useState as fn}from"react";function le(e,t,n={leading:!1}){let[o,r]=fn(e),i=G(!1),s=G(void 0),a=G(!1),c=pn(()=>window.clearTimeout(s.current),[]);return fe(()=>{i.current&&(!a.current&&n.leading?(a.current=!0,r(e)):(c(),s.current=setTimeout(()=>{a.current=!1,r(e)},t)))},[e,n.leading,t,c]),fe(()=>(i.current=!0,c),[c]),[o,c]}var In=250;function gt(e,t,n){return H("search",e,t,n)}function It(e,t,n){return H("searchOne",e,t,n)}function ht(e,t,n){return H("searchResources",e,t,n)}function H(e,t,n,o){let r=E(),[i,s]=j(!0),[a,c]=j(),[R,I]=j(),v=r.fhirSearchUrl(t,n).toString(),C=gn(()=>({resourceType:t,query:n}),[v]),g=o?.debounceMs??In,[p]=le(C,g,{leading:!0});return Rn(()=>{let d=!0;return r[e](p.resourceType,p.query).then(u=>{d&&(s(!1),c(u),I(ln))}).catch(u=>{d&&(s(!1),c(void 0),I(mn(u)))}),()=>{d=!1}},[r,e,p]),[a,i,R]}import{getReferenceString as hn}from"@medplum/core";import{useCallback as yn,useEffect as me,useState as N}from"react";function Et({query:e,threadId:t}){let n=E(),[o,r]=N(!0),[i,s]=N([]),[a,c]=N(void 0),[R,I]=N(null),[v,C]=N(void 0),g=yn(async()=>{let u=new URLSearchParams(e);u.append("identifier:not","ai-message-topic"),u.append("part-of:missing","true"),u.append("_has:Communication:part-of:_id:not","null");let l=await n.search("Communication",u.toString(),{cache:"no-cache"}),f=l.entry?.map(h=>h.resource).filter(h=>h!==void 0)||[];if(l.total!==void 0&&C(l.total),f.length===0){s([]);return}let S=`
|
|
2
|
+
query {
|
|
3
|
+
${f.map(h=>{let _=`thread_${h.id?.replaceAll("-","")||""}`,M=hn(h);return`
|
|
4
|
+
${_}: CommunicationList(
|
|
5
|
+
part_of: "${M}"
|
|
6
|
+
_sort: "-sent"
|
|
7
|
+
_count: 1
|
|
8
|
+
) {
|
|
9
|
+
id
|
|
10
|
+
meta {
|
|
11
|
+
lastUpdated
|
|
12
|
+
}
|
|
13
|
+
partOf {
|
|
14
|
+
reference
|
|
15
|
+
}
|
|
16
|
+
sender {
|
|
17
|
+
display
|
|
18
|
+
reference
|
|
19
|
+
}
|
|
20
|
+
payload {
|
|
21
|
+
contentString
|
|
22
|
+
}
|
|
23
|
+
sent
|
|
24
|
+
status
|
|
25
|
+
}
|
|
26
|
+
`}).join(`
|
|
27
|
+
`)}
|
|
28
|
+
}
|
|
29
|
+
`,P=await n.graphql(S),A=f.map(h=>{let _=`thread_${h.id?.replaceAll("-","")||""}`,M=P.data[_],Re=M&&M.length>0?M[0]:void 0;return[h,Re]}).filter(h=>h[1]!==void 0);s(A)},[n,e]);return me(()=>{r(!0),g().catch(u=>{I(u)}).finally(()=>{r(!1)})},[g]),me(()=>{(async()=>{if(!t){c(void 0);return}let l=i.find(Q=>Q[0].id===t);if(l){c(l[0]);return}let f=await n.readResource("Communication",t);if(f.partOf===void 0)c(f);else{let Q=f.partOf[0].reference;if(Q){let S=await n.readReference({reference:Q});c(S)}}})().catch(l=>{I(l)})},[t,i,n]),{loading:o,error:R,threadMessages:i,selectedThread:a,total:v,addThreadMessage:u=>{(async()=>{await g(),s(f=>[[u,void 0],...f])})().catch(f=>I(f))},handleThreadStatusChange:u=>{if(!a)return;(async()=>{let f=await n.updateResource({...a,status:u});c(f),s(Q=>Q.map(([S,P])=>S.id===f.id?[f,P]:[S,P]))})().catch(f=>I(f))},refreshThreadMessages:g}}export{Tn as MedplumProvider,Be as QUESTIONNAIRE_CALCULATED_EXPRESSION_URL,Ke as QUESTIONNAIRE_ENABLED_WHEN_EXPRESSION_URL,ze as QUESTIONNAIRE_HIDDEN_URL,ae as QUESTIONNAIRE_ITEM_CONTROL_URL,We as QUESTIONNAIRE_REFERENCE_FILTER_URL,D as QUESTIONNAIRE_REFERENCE_RESOURCE_URL,Hn as QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,L as QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,$e as QUESTIONNAIRE_VALIDATION_ERROR_URL,m as QuestionnaireItemType,K as buildInitialResponse,z as buildInitialResponseItem,$ as evaluateCalculatedExpressionsInQuestionnaire,ie as getItemAnswerOptionValue,tn as getItemEnableWhenValueAnswer,tt as getItemInitialValue,Yn as getNewMultiSelectValues,nt as getQuestionnaireItemReferenceFilter,Zn as getQuestionnaireItemReferenceTargetTypes,rn as getResponseItemAnswerValue,Xn as isChoiceQuestion,Jn as isQuestionEnabled,V as reactContext,et as setQuestionnaireItemReferenceTargetTypes,Je as typedValueToResponseItem,wn as useCachedBinaryUrl,E as useMedplum,F as useMedplumContext,Qn as useMedplumNavigate,Sn as useMedplumProfile,kn as useNotificationCount,Wn as usePrevious,at as useQuestionnaireForm,q as useResource,gt as useSearch,It as useSearchOne,ht as useSearchResources,ee as useSubscription,Et as useThreadInbox};
|
|
2
30
|
//# sourceMappingURL=index.mjs.map
|