@openmrs/esm-react-utils 5.0.3-pre.882 → 5.0.3-pre.894

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-react-utils",
3
- "version": "5.0.3-pre.882",
3
+ "version": "5.0.3-pre.894",
4
4
  "license": "MPL-2.0",
5
5
  "description": "React utilities for OpenMRS.",
6
6
  "browser": "dist/openmrs-esm-react-utils.js",
@@ -44,11 +44,11 @@
44
44
  "swr": "^2.0.1"
45
45
  },
46
46
  "peerDependencies": {
47
- "@openmrs/esm-api": "4.x",
48
- "@openmrs/esm-config": "4.x",
49
- "@openmrs/esm-error-handling": "4.x",
50
- "@openmrs/esm-extensions": "4.x",
51
- "@openmrs/esm-globals": "4.x",
47
+ "@openmrs/esm-api": "5.x",
48
+ "@openmrs/esm-config": "5.x",
49
+ "@openmrs/esm-error-handling": "5.x",
50
+ "@openmrs/esm-extensions": "5.x",
51
+ "@openmrs/esm-globals": "5.x",
52
52
  "dayjs": "1.x",
53
53
  "i18next": "19.x",
54
54
  "react": "18.x",
@@ -56,11 +56,12 @@
56
56
  "react-i18next": "11.x"
57
57
  },
58
58
  "devDependencies": {
59
- "@openmrs/esm-api": "^5.0.3-pre.882",
60
- "@openmrs/esm-config": "^5.0.3-pre.882",
61
- "@openmrs/esm-error-handling": "^5.0.3-pre.882",
62
- "@openmrs/esm-extensions": "^5.0.3-pre.882",
63
- "@openmrs/esm-globals": "^5.0.3-pre.882",
59
+ "@openmrs/esm-api": "^5.0.3-pre.894",
60
+ "@openmrs/esm-config": "^5.0.3-pre.894",
61
+ "@openmrs/esm-error-handling": "^5.0.3-pre.894",
62
+ "@openmrs/esm-extensions": "^5.0.3-pre.894",
63
+ "@openmrs/esm-feature-flags": "^5.0.3-pre.894",
64
+ "@openmrs/esm-globals": "^5.0.3-pre.894",
64
65
  "dayjs": "^1.10.8",
65
66
  "i18next": "^19.6.0",
66
67
  "react": "^18.1.0",
@@ -69,5 +70,5 @@
69
70
  "rxjs": "^6.5.3",
70
71
  "webpack": "^5.88.0"
71
72
  },
72
- "gitHead": "ae49ca10f8b7954d5b4c6fec4b4c07880a83d649"
73
+ "gitHead": "f23d967551442c25ae03cd386fbaf217c1c5f0bc"
73
74
  }
package/src/Extension.tsx CHANGED
@@ -41,7 +41,7 @@ export const Extension: React.FC<ExtensionProps> = ({
41
41
  const [domElement, setDomElement] = useState<HTMLDivElement>();
42
42
  const { extension } = useContext(ComponentContext);
43
43
  const parcel = useRef<Parcel | null>(null);
44
- const updatePromise = useRef<Promise<void> | undefined>();
44
+ const updatePromise = useRef<Promise<void>>(Promise.resolve());
45
45
  const rendering = useRef<boolean>(false);
46
46
 
47
47
  useEffect(() => {
@@ -136,7 +136,19 @@ export const Extension: React.FC<ExtensionProps> = ({
136
136
  parcel?.current?.getStatus() === "MOUNTED" &&
137
137
  parcel.current.update
138
138
  ) {
139
- updatePromise.current = parcel.current.update({ ...state });
139
+ updatePromise.current = parcel.current
140
+ .update({ ...state })
141
+ .catch((err) => {
142
+ // if we were trying to update but the component was unmounted
143
+ // while this was happening, ignore the error
144
+ if (
145
+ !(err instanceof Error) ||
146
+ !err.message.includes("minified message #32") ||
147
+ parcel.current?.getStatus() === "MOUNTED"
148
+ ) {
149
+ throw err;
150
+ }
151
+ });
140
152
  }
141
153
  }
142
154
  );
@@ -181,11 +181,14 @@ describe("ExtensionSlot, Extension, and useExtensionSlotMeta", () => {
181
181
  );
182
182
  const metas = useExtensionSlotMeta("Box");
183
183
  const wrapItem = useCallback(
184
- (slot: React.ReactNode, extension: ExtensionData) => {
184
+ (slot: React.ReactNode, extension?: ExtensionData) => {
185
185
  return (
186
186
  <div>
187
187
  <h1>
188
- {metas[getExtensionNameFromId(extension.extensionId)].code}
188
+ {
189
+ metas[getExtensionNameFromId(extension?.extensionId ?? "")]
190
+ .code
191
+ }
189
192
  </h1>
190
193
  {slot}
191
194
  </div>
@@ -196,7 +199,7 @@ describe("ExtensionSlot, Extension, and useExtensionSlotMeta", () => {
196
199
  return (
197
200
  <div>
198
201
  <ExtensionSlot name="Box">
199
- <Extension wrap={wrapItem} state={{ suffix }} />
202
+ <Extension state={{ suffix }}>{wrapItem}</Extension>
200
203
  </ExtensionSlot>
201
204
  <button onClick={toggleSuffix}>Toggle suffix</button>
202
205
  </div>
package/src/index.ts CHANGED
@@ -16,6 +16,7 @@ export * from "./useExtensionInternalStore";
16
16
  export * from "./useExtensionSlot";
17
17
  export * from "./useExtensionSlotMeta";
18
18
  export * from "./useExtensionStore";
19
+ export * from "./useFeatureFlag";
19
20
  export * from "./useForceUpdate";
20
21
  export * from "./useLayoutType";
21
22
  export * from "./useLocations";
@@ -0,0 +1,31 @@
1
+ /** @module @category Feature Flags */
2
+ import { useEffect } from "react";
3
+ import { useStore } from "./useStore";
4
+ import { featureFlagsStore } from "@openmrs/esm-feature-flags";
5
+
6
+ /** Use this function to tell whether a feature flag is toggled on or off.
7
+ *
8
+ * Example:
9
+ *
10
+ * ```tsx
11
+ * import { useFeatureFlag } from "@openmrs/esm-react-utils";
12
+ *
13
+ * export function MyComponent() {
14
+ * const isMyFeatureFlagOn = useFeatureFlag("my-feature-flag");
15
+ * return <>{isMyFeatureFlagOn && <ExperimentalFeature />}</>;
16
+ * }
17
+ * ```
18
+ */
19
+ export function useFeatureFlag(flagName: string) {
20
+ const { flags } = useStore(featureFlagsStore);
21
+
22
+ useEffect(() => {
23
+ if (!flags[flagName]) {
24
+ console.error(
25
+ `useFeatureFlag: Attempted to get value of non-existent flag "${flagName}". Did you forget to call registerFeatureFlag?`
26
+ );
27
+ }
28
+ }, [flags[flagName]]);
29
+
30
+ return flags[flagName]?.enabled;
31
+ }