@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.
- package/CHANGELOG.md +211 -193
- package/README.md +2 -0
- package/dist/esm/create-legacy-app.js.map +1 -1
- package/dist/esm/feature-flag/index.js +1 -1
- package/dist/esm/feature-flag/index.js.map +1 -1
- package/dist/esm/feature-flag/useFeature.js +33 -0
- package/dist/esm/feature-flag/useFeature.js.map +1 -0
- package/dist/esm/useAppModule.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/feature-flag/index.d.ts +2 -1
- package/dist/types/feature-flag/useFeature.d.ts +6 -0
- package/dist/types/render-app.d.ts +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +8 -8
- package/src/feature-flag/README.md +20 -0
- package/src/feature-flag/index.ts +5 -5
- package/src/feature-flag/useFeature.ts +66 -0
- package/src/version.ts +1 -1
- package/dist/esm/feature-flag/useFeatureFlags.js +0 -48
- package/dist/esm/feature-flag/useFeatureFlags.js.map +0 -1
- package/dist/types/feature-flag/useFeatureFlags.d.ts +0 -21
- package/src/feature-flag/useFeatureFlags.ts +0 -110
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { IFeatureFlag, IFeatureFlagProvider, FeatureFlagModule, } from '@equinor/fusion-framework-module-feature-flag';
|
|
2
|
+
export { useFeature } from './useFeature';
|
|
@@ -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;
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.
|
|
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.
|
|
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": "^
|
|
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": "^
|
|
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-
|
|
72
|
-
"@equinor/fusion-framework-
|
|
73
|
-
"@equinor/fusion-
|
|
74
|
-
"@equinor/fusion-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from './
|
|
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
|
+
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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAMtE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAS7B,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,GAAW,EAKb,EAAE;IACA,MAAM,QAAQ,GAAG,YAAY,CAAoB,aAAa,CAAC,CAAC;IAChE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACjD,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,eAAe,GAAG,GAI7B,EAAE;IACA,MAAM,QAAQ,GAAG,YAAY,CAAoB,aAAa,CAAC,CAAC;IAChE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AAClD,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACnC,GAAW,EAKb,EAAE;IACA,MAAM,QAAQ,GAAG,YAAY,EAAuB,CAAC,OAAO,CAAC,WAAW,CAAC;IACzE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACjD,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAItC,EAAE;IACA,MAAM,QAAQ,GAAG,YAAY,EAAuB,CAAC,OAAO,CAAC,WAAW,CAAC;IACzE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,QAA+B,EAAE,EAAE;IACrE,OAAO,OAAO,CAAC,GAAG,EAAE;QAChB,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACvD,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAA+B,EAAE,EAAE;IACzD,OAAO,OAAO,CAAC,GAAG,EAAE;QAChB,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,QAA+B,EAAE,EAAE;IAC3D,OAAO,WAAW,CACd,CAAC,GAAW,EAAE,OAAgB,EAAE,EAAE;QAC9B,IAAI,CAAC,QAAQ,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QACD,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC,EACD,CAAC,QAAQ,CAAC,CACb,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -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
|
-
};
|