@equinor/fusion-framework-react-app 4.2.0 → 4.3.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.
@@ -0,0 +1,2 @@
1
+ export { IFeatureFlag, IFeatureFlagProvider, FeatureFlagModule, } from '@equinor/fusion-framework-module-feature-flag';
2
+ export { useFeature } from './useFeature';
@@ -0,0 +1,6 @@
1
+ import { type IFeatureFlag } from '@equinor/fusion-framework-module-feature-flag';
2
+ export declare const useFeature: <T = unknown>(key: string) => {
3
+ feature?: IFeatureFlag<T> | undefined;
4
+ toggleFeature: (enabled?: boolean) => void;
5
+ error?: unknown;
6
+ };
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { RenderTeardown } from './render-component';
3
3
  import type { ComponentRenderArgs } from './create-component';
4
- export declare const renderApp: (Component: import("react").ElementType<any>, configure?: import("@equinor/fusion-framework-app").AppModuleInitiator<import("@equinor/fusion-framework-module").AnyModule[], import("@equinor/fusion-framework-react").Fusion<unknown>, import("@equinor/fusion-framework-app").AppEnv> | undefined) => (el: HTMLElement, args: ComponentRenderArgs) => RenderTeardown;
4
+ export declare const renderApp: (Component: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements>, configure?: import("@equinor/fusion-framework-app").AppModuleInitiator<import("@equinor/fusion-framework-module").AnyModule[], import("@equinor/fusion-framework-react").Fusion<unknown>, import("@equinor/fusion-framework-app").AppEnv> | undefined) => (el: HTMLElement, args: ComponentRenderArgs) => RenderTeardown;
5
5
  export default renderApp;
@@ -1 +1 @@
1
- export declare const version = "4.2.0";
1
+ export declare const version = "4.3.0";
package/package.json CHANGED
@@ -1,37 +1,17 @@
1
1
  {
2
2
  "name": "@equinor/fusion-framework-react-app",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "",
5
5
  "main": "dist/esm/index.js",
6
6
  "exports": {
7
- ".": {
8
- "import": "./dist/esm/index.js",
9
- "types": "./dist/types/index.d.ts"
10
- },
11
- "./bookmark": {
12
- "import": "./dist/esm/bookmark/index.js",
13
- "types": "./dist/types/bookmark/index.d.ts"
14
- },
15
- "./context": {
16
- "import": "./dist/esm/context/index.js",
17
- "types": "./dist/types/context/index.d.ts"
18
- },
19
- "./framework": {
20
- "import": "./dist/esm/framework/index.js",
21
- "types": "./dist/types/framework/index.d.ts"
22
- },
23
- "./http": {
24
- "import": "./dist/esm/http/index.js",
25
- "types": "./dist/types/http/index.d.ts"
26
- },
27
- "./msal": {
28
- "import": "./dist/esm/msal/index.js",
29
- "types": "./dist/types/msal/index.d.ts"
30
- },
31
- "./navigation": {
32
- "import": "./dist/esm/navigation/index.js",
33
- "types": "./dist/types/navigation/index.d.ts"
34
- }
7
+ ".": "./dist/esm/index.js",
8
+ "./bookmark": "./dist/esm/bookmark/index.js",
9
+ "./context": "./dist/esm/context/index.js",
10
+ "./feature-flag": "./dist/esm/feature-flag/index.js",
11
+ "./framework": "./dist/esm/framework/index.js",
12
+ "./http": "./dist/esm/http/index.js",
13
+ "./msal": "./dist/esm/msal/index.js",
14
+ "./navigation": "./dist/esm/navigation/index.js"
35
15
  },
36
16
  "types": "./dist/types/index.d.ts",
37
17
  "typesVersions": {
@@ -42,6 +22,9 @@
42
22
  "context": [
43
23
  "dist/types/context/index.d.ts"
44
24
  ],
25
+ "feature-flag": [
26
+ "dist/types/feature-flag/index.d.ts"
27
+ ],
45
28
  "framework": [
46
29
  "dist/types/framework/index.d.ts"
47
30
  ],
@@ -68,12 +51,12 @@
68
51
  "directory": "packages/react"
69
52
  },
70
53
  "dependencies": {
71
- "@equinor/fusion-framework-app": "^7.1.15",
72
- "@equinor/fusion-framework-module": "^4.2.6",
54
+ "@equinor/fusion-framework-app": "^8.0.0",
73
55
  "@equinor/fusion-framework-module-app": "^5.2.12",
74
- "@equinor/fusion-framework-react": "^5.3.8",
75
- "@equinor/fusion-framework-react-module": "^3.0.7",
56
+ "@equinor/fusion-framework-module": "^4.2.6",
76
57
  "@equinor/fusion-framework-module-navigation": "^3.1.3",
58
+ "@equinor/fusion-framework-react": "^6.0.0",
59
+ "@equinor/fusion-framework-react-module": "^3.0.7",
77
60
  "@equinor/fusion-framework-react-module-http": "^4.0.5"
78
61
  },
79
62
  "devDependencies": {
@@ -81,16 +64,20 @@
81
64
  "@types/react-dom": "^18.2.7",
82
65
  "react": "^18.2.0",
83
66
  "react-dom": "^18.2.0",
67
+ "rxjs": "^7.8.1",
84
68
  "typescript": "^5.1.3",
85
- "@equinor/fusion-framework-module-msal": "^3.0.9",
86
- "@equinor/fusion-framework-react-module-bookmark": "^2.0.27",
87
69
  "@equinor/fusion-framework-module-event": "^4.0.7",
70
+ "@equinor/fusion-framework-module-msal": "^3.0.9",
71
+ "@equinor/fusion-framework-react-module-bookmark": "^2.0.30",
72
+ "@equinor/fusion-framework-module-feature-flag": "^1.0.0",
73
+ "@equinor/fusion-observable": "^8.1.4",
88
74
  "@equinor/fusion-framework-react-module-context": "^6.0.18"
89
75
  },
90
76
  "peerDependencies": {
91
77
  "@types/react": "^17.0.0 || ^18.0.0",
92
78
  "react": "^17.0.0 || ^18.0.0",
93
79
  "react-dom": "^17.0.0 || ^18.0.0",
80
+ "rxjs": "^7.8.1",
94
81
  "@equinor/fusion-framework-module-msal": "^3.0.9"
95
82
  },
96
83
  "peerDependenciesMeta": {
@@ -103,11 +90,20 @@
103
90
  "@equinor/fusion-framework-react-module-bookmark": {
104
91
  "optional": true
105
92
  },
93
+ "@equinor/fusion-framework-module-feature-flag": {
94
+ "optional": true
95
+ },
96
+ "@equinor/fusion-observable": {
97
+ "optional": true
98
+ },
106
99
  "@types/react": {
107
100
  "optional": true
108
101
  },
109
102
  "react-dom": {
110
103
  "optional": true
104
+ },
105
+ "rxjs": {
106
+ "optional": true
111
107
  }
112
108
  },
113
109
  "scripts": {
@@ -0,0 +1,20 @@
1
+ __useFeature__
2
+
3
+ Custom hook for accessing and manipulating feature flags.
4
+
5
+ ```ts
6
+ const Component = () => {
7
+ const { feature, toggleFeature } = useFeature('my-feature');
8
+ return (
9
+ <>
10
+ <p>My feature is { feature.enabled ? 'enabled': 'disabled' }</p>
11
+ <button onClick={ () => toggleFeature() }>
12
+ { feature.enabled ? 'disable' : 'enable' } my feature
13
+ </button>
14
+ </>
15
+ )
16
+ }
17
+ ```
18
+
19
+ > [!NOTE]
20
+ > this hook can access parent feature if not found in application
@@ -0,0 +1,6 @@
1
+ export {
2
+ IFeatureFlag,
3
+ IFeatureFlagProvider,
4
+ FeatureFlagModule,
5
+ } from '@equinor/fusion-framework-module-feature-flag';
6
+ export { useFeature } from './useFeature';
@@ -0,0 +1,66 @@
1
+ import { useCallback, useMemo } from 'react';
2
+
3
+ import { EMPTY, combineLatest, map } from 'rxjs';
4
+
5
+ import { useFrameworkModule } from '@equinor/fusion-framework-react';
6
+ import { useObservableState } from '@equinor/fusion-observable/react';
7
+ import {
8
+ type FeatureFlagModule,
9
+ type IFeatureFlag,
10
+ } from '@equinor/fusion-framework-module-feature-flag';
11
+ import { findFeature } from '@equinor/fusion-framework-module-feature-flag/selectors';
12
+
13
+ import { useAppModule } from '../useAppModule';
14
+
15
+ /**
16
+ * Custom hook for accessing and manipulating feature flags.
17
+ * @template T - The type of the feature flag value.
18
+ * @param key - The key of the feature flag.
19
+ * @returns An object containing the feature flag, toggle function, and error (if any).
20
+ */
21
+ export const useFeature = <T = unknown>(
22
+ key: string,
23
+ ): {
24
+ feature?: IFeatureFlag<T>;
25
+ toggleFeature: (enabled?: boolean) => void;
26
+ error?: unknown;
27
+ } => {
28
+ const appProvider = useAppModule<FeatureFlagModule>('featureFlag');
29
+ const frameworkProvider = useFrameworkModule<FeatureFlagModule>('featureFlag');
30
+
31
+ /** get all available feature flags */
32
+ const features$ = useMemo(() => {
33
+ /** the framework does not have the feature flag module */
34
+ if (!frameworkProvider) {
35
+ return appProvider.features$;
36
+ }
37
+ /** merge feature flags from framework and application */
38
+ return combineLatest({
39
+ framework: frameworkProvider.features$,
40
+ app: appProvider.features$,
41
+ }).pipe(
42
+ map(({ framework, app }) => {
43
+ return { ...framework, ...app };
44
+ }),
45
+ );
46
+ }, [appProvider, frameworkProvider]);
47
+
48
+ /** find feature flag by the provided key */
49
+ const feature$ = useMemo(() => features$.pipe(findFeature<T>(key)), [features$, key]);
50
+
51
+ const { value: feature, error } = useObservableState(feature$ ?? EMPTY);
52
+
53
+ const toggleFeature = useCallback(
54
+ (enable?: boolean) => {
55
+ /** if no value provided, invert the current value */
56
+ const enabled = enable === undefined ? !appProvider.getFeature(key)?.enabled : enable;
57
+ appProvider.toggleFeature({
58
+ key,
59
+ enabled,
60
+ });
61
+ },
62
+ [appProvider, key],
63
+ );
64
+
65
+ return { feature, toggleFeature, error };
66
+ };
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '4.2.0';
2
+ export const version = '4.3.0';