@equinor/fusion-framework-react-app 4.2.1 → 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.
@@ -1 +1,2 @@
1
- export { useFeatureFlag, useFrameworkFeatureFlag, useFeatureFlags, useFrameworkFeatureFlags, } from './useFeatureFlags';
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.1";
1
+ export declare const version = "4.3.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@equinor/fusion-framework-react-app",
3
- "version": "4.2.1",
3
+ "version": "4.3.0",
4
4
  "description": "",
5
5
  "main": "dist/esm/index.js",
6
6
  "exports": {
@@ -51,12 +51,12 @@
51
51
  "directory": "packages/react"
52
52
  },
53
53
  "dependencies": {
54
- "@equinor/fusion-framework-app": "^7.1.15",
54
+ "@equinor/fusion-framework-app": "^8.0.0",
55
+ "@equinor/fusion-framework-module-app": "^5.2.12",
55
56
  "@equinor/fusion-framework-module": "^4.2.6",
56
57
  "@equinor/fusion-framework-module-navigation": "^3.1.3",
57
- "@equinor/fusion-framework-react": "^5.3.9",
58
+ "@equinor/fusion-framework-react": "^6.0.0",
58
59
  "@equinor/fusion-framework-react-module": "^3.0.7",
59
- "@equinor/fusion-framework-module-app": "^5.2.12",
60
60
  "@equinor/fusion-framework-react-module-http": "^4.0.5"
61
61
  },
62
62
  "devDependencies": {
@@ -68,10 +68,10 @@
68
68
  "typescript": "^5.1.3",
69
69
  "@equinor/fusion-framework-module-event": "^4.0.7",
70
70
  "@equinor/fusion-framework-module-msal": "^3.0.9",
71
- "@equinor/fusion-framework-module-feature-flag": "^0.0.1",
72
- "@equinor/fusion-framework-react-module-context": "^6.0.18",
73
- "@equinor/fusion-framework-react-module-bookmark": "^2.0.28",
74
- "@equinor/fusion-observable": "^8.1.4"
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",
74
+ "@equinor/fusion-framework-react-module-context": "^6.0.18"
75
75
  },
76
76
  "peerDependencies": {
77
77
  "@types/react": "^17.0.0 || ^18.0.0",
@@ -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
@@ -1,6 +1,6 @@
1
1
  export {
2
- useFeatureFlag,
3
- useFrameworkFeatureFlag,
4
- useFeatureFlags,
5
- useFrameworkFeatureFlags,
6
- } from './useFeatureFlags';
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.1';
2
+ export const version = '4.3.0';
@@ -1,48 +0,0 @@
1
- import { useFramework } from '@equinor/fusion-framework-react';
2
- import { useAppModule } from '../useAppModule';
3
- import { useCallback, useMemo } from 'react';
4
- import { useObservableState } from '@equinor/fusion-observable/react';
5
- import { EMPTY } from 'rxjs';
6
- export const useFeatureFlag = (key) => {
7
- const provider = useAppModule('featureFlag');
8
- const { value: feature, error } = useObservableState(_useFeatureFlag(key, provider));
9
- const setFeatureEnabled = _useSetFeatureflag(provider);
10
- return { feature, error, setFeatureEnabled };
11
- };
12
- export const useFeatureFlags = () => {
13
- const provider = useAppModule('featureFlag');
14
- const { value: features, error } = useObservableState(_useFeatureFlags(provider));
15
- const setFeatureEnabled = _useSetFeatureflag(provider);
16
- return { features, error, setFeatureEnabled };
17
- };
18
- export const useFrameworkFeatureFlag = (key) => {
19
- const provider = useFramework().modules.featureFlag;
20
- const { value: feature, error } = useObservableState(_useFeatureFlag(key, provider));
21
- const setFeatureEnabled = _useSetFeatureflag(provider);
22
- return { feature, error, setFeatureEnabled };
23
- };
24
- export const useFrameworkFeatureFlags = () => {
25
- const provider = useFramework().modules.featureFlag;
26
- const { value: features, error } = useObservableState(_useFeatureFlags(provider));
27
- const setFeatureEnabled = _useSetFeatureflag(provider);
28
- return { features, error, setFeatureEnabled };
29
- };
30
- const _useFeatureFlag = (key, provider) => {
31
- return useMemo(() => {
32
- return provider ? provider.getFeature(key) : EMPTY;
33
- }, [provider, key]);
34
- };
35
- const _useFeatureFlags = (provider) => {
36
- return useMemo(() => {
37
- return provider ? provider.getFeatures((_) => true) : EMPTY;
38
- }, [provider]);
39
- };
40
- const _useSetFeatureflag = (provider) => {
41
- return useCallback((key, enabled) => {
42
- if (!provider) {
43
- throw new Error('Missing IFeatureFlagProvider.');
44
- }
45
- provider.toggleFeature({ key, enabled });
46
- }, [provider]);
47
- };
48
- //# sourceMappingURL=useFeatureFlags.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFeatureFlags.js","sourceRoot":"","sources":["../../../src/feature-flag/useFeatureFlags.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import { IFeatureFlag } from '@equinor/fusion-framework-module-feature-flag';
2
- export declare const useFeatureFlag: (key: string) => {
3
- feature: IFeatureFlag<unknown> | undefined;
4
- error: unknown;
5
- setFeatureEnabled: (key: string, enabled: boolean) => void;
6
- };
7
- export declare const useFeatureFlags: () => {
8
- features: IFeatureFlag<unknown>[] | undefined;
9
- error: unknown;
10
- setFeatureEnabled: (key: string, enabled: boolean) => void;
11
- };
12
- export declare const useFrameworkFeatureFlag: (key: string) => {
13
- feature: IFeatureFlag<unknown> | undefined;
14
- error: unknown;
15
- setFeatureEnabled: (key: string, enabled: boolean) => void;
16
- };
17
- export declare const useFrameworkFeatureFlags: () => {
18
- features: IFeatureFlag<unknown>[] | undefined;
19
- error: unknown;
20
- setFeatureEnabled: (key: string, enabled: boolean) => void;
21
- };
@@ -1,110 +0,0 @@
1
- import { useFramework } from '@equinor/fusion-framework-react';
2
- import { useAppModule } from '../useAppModule';
3
- import { useCallback, useMemo } from 'react';
4
- import { useObservableState } from '@equinor/fusion-observable/react';
5
- import {
6
- FeatureFlagModule,
7
- IFeatureFlagProvider,
8
- IFeatureFlag,
9
- } from '@equinor/fusion-framework-module-feature-flag';
10
- import { EMPTY } from 'rxjs';
11
-
12
- /**
13
- * useFeatureflag
14
- *
15
- * Hook for getting single featureflag from app.
16
- *
17
- * @param key string
18
- */
19
- export const useFeatureFlag = (
20
- key: string,
21
- ): {
22
- feature: IFeatureFlag<unknown> | undefined;
23
- error: unknown;
24
- setFeatureEnabled: (key: string, enabled: boolean) => void;
25
- } => {
26
- const provider = useAppModule<FeatureFlagModule>('featureFlag');
27
- const { value: feature, error } = useObservableState(_useFeatureFlag(key, provider));
28
- const setFeatureEnabled = _useSetFeatureflag(provider);
29
- return { feature, error, setFeatureEnabled };
30
- };
31
-
32
- /**
33
- * useFeatureflags
34
- *
35
- * Hook for getting all featureflags from app.
36
- *
37
- * @param key string
38
- */
39
- export const useFeatureFlags = (): {
40
- features: IFeatureFlag<unknown>[] | undefined;
41
- error: unknown;
42
- setFeatureEnabled: (key: string, enabled: boolean) => void;
43
- } => {
44
- const provider = useAppModule<FeatureFlagModule>('featureFlag');
45
- const { value: features, error } = useObservableState(_useFeatureFlags(provider));
46
- const setFeatureEnabled = _useSetFeatureflag(provider);
47
- return { features, error, setFeatureEnabled };
48
- };
49
-
50
- /**
51
- * useFrameworkFeatureflag
52
- *
53
- * Hook for getting single featureflag from portal.
54
- *
55
- * @param key string
56
- */
57
- export const useFrameworkFeatureFlag = (
58
- key: string,
59
- ): {
60
- feature: IFeatureFlag<unknown> | undefined;
61
- error: unknown;
62
- setFeatureEnabled: (key: string, enabled: boolean) => void;
63
- } => {
64
- const provider = useFramework<[FeatureFlagModule]>().modules.featureFlag;
65
- const { value: feature, error } = useObservableState(_useFeatureFlag(key, provider));
66
- const setFeatureEnabled = _useSetFeatureflag(provider);
67
- return { feature, error, setFeatureEnabled };
68
- };
69
-
70
- /**
71
- * useFrameworkFeatureflags
72
- *
73
- * Hook for getting all featureflags from portal.
74
- *
75
- * @param key string
76
- */
77
- export const useFrameworkFeatureFlags = (): {
78
- features: IFeatureFlag<unknown>[] | undefined;
79
- error: unknown;
80
- setFeatureEnabled: (key: string, enabled: boolean) => void;
81
- } => {
82
- const provider = useFramework<[FeatureFlagModule]>().modules.featureFlag;
83
- const { value: features, error } = useObservableState(_useFeatureFlags(provider));
84
- const setFeatureEnabled = _useSetFeatureflag(provider);
85
- return { features, error, setFeatureEnabled };
86
- };
87
-
88
- const _useFeatureFlag = (key: string, provider?: IFeatureFlagProvider) => {
89
- return useMemo(() => {
90
- return provider ? provider.getFeature(key) : EMPTY;
91
- }, [provider, key]);
92
- };
93
-
94
- const _useFeatureFlags = (provider?: IFeatureFlagProvider) => {
95
- return useMemo(() => {
96
- return provider ? provider.getFeatures((_) => true) : EMPTY;
97
- }, [provider]);
98
- };
99
-
100
- const _useSetFeatureflag = (provider?: IFeatureFlagProvider) => {
101
- return useCallback(
102
- (key: string, enabled: boolean) => {
103
- if (!provider) {
104
- throw new Error('Missing IFeatureFlagProvider.');
105
- }
106
- provider.toggleFeature({ key, enabled });
107
- },
108
- [provider],
109
- );
110
- };