@equinor/fusion-framework-react 0.0.0-context-error-20240131144633

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +1019 -0
  2. package/LICENSE +21 -0
  3. package/README.md +44 -0
  4. package/dist/esm/Framework.js +10 -0
  5. package/dist/esm/Framework.js.map +1 -0
  6. package/dist/esm/app/index.js +6 -0
  7. package/dist/esm/app/index.js.map +1 -0
  8. package/dist/esm/app/useAppProvider.js +10 -0
  9. package/dist/esm/app/useAppProvider.js.map +1 -0
  10. package/dist/esm/app/useApps.js +16 -0
  11. package/dist/esm/app/useApps.js.map +1 -0
  12. package/dist/esm/app/useCurrentApp.js +19 -0
  13. package/dist/esm/app/useCurrentApp.js.map +1 -0
  14. package/dist/esm/app/useCurrentAppModule.js +11 -0
  15. package/dist/esm/app/useCurrentAppModule.js.map +1 -0
  16. package/dist/esm/app/useCurrentAppModules.js +21 -0
  17. package/dist/esm/app/useCurrentAppModules.js.map +1 -0
  18. package/dist/esm/context/index.js +3 -0
  19. package/dist/esm/context/index.js.map +1 -0
  20. package/dist/esm/context/useCurrentContext.js +5 -0
  21. package/dist/esm/context/useCurrentContext.js.map +1 -0
  22. package/dist/esm/context.js +4 -0
  23. package/dist/esm/context.js.map +1 -0
  24. package/dist/esm/create-framework-provider.js +24 -0
  25. package/dist/esm/create-framework-provider.js.map +1 -0
  26. package/dist/esm/feature-flag/index.js +6 -0
  27. package/dist/esm/feature-flag/index.js.map +1 -0
  28. package/dist/esm/feature-flag/useCurrentAppFeatures.js +12 -0
  29. package/dist/esm/feature-flag/useCurrentAppFeatures.js.map +1 -0
  30. package/dist/esm/feature-flag/useFeature.js +16 -0
  31. package/dist/esm/feature-flag/useFeature.js.map +1 -0
  32. package/dist/esm/feature-flag/useFeatures.js +27 -0
  33. package/dist/esm/feature-flag/useFeatures.js.map +1 -0
  34. package/dist/esm/feature-flag/useFrameworkFeature.js +11 -0
  35. package/dist/esm/feature-flag/useFrameworkFeature.js.map +1 -0
  36. package/dist/esm/feature-flag/useFrameworkFeatures.js +11 -0
  37. package/dist/esm/feature-flag/useFrameworkFeatures.js.map +1 -0
  38. package/dist/esm/hooks/index.js +3 -0
  39. package/dist/esm/hooks/index.js.map +1 -0
  40. package/dist/esm/hooks/use-current-user.js +6 -0
  41. package/dist/esm/hooks/use-current-user.js.map +1 -0
  42. package/dist/esm/hooks/use-http-client.js +13 -0
  43. package/dist/esm/hooks/use-http-client.js.map +1 -0
  44. package/dist/esm/http/index.js +3 -0
  45. package/dist/esm/http/index.js.map +1 -0
  46. package/dist/esm/index.js +7 -0
  47. package/dist/esm/index.js.map +1 -0
  48. package/dist/esm/signalr/index.js +10 -0
  49. package/dist/esm/signalr/index.js.map +1 -0
  50. package/dist/esm/useFramework.js +15 -0
  51. package/dist/esm/useFramework.js.map +1 -0
  52. package/dist/esm/useFrameworkModule.js +10 -0
  53. package/dist/esm/useFrameworkModule.js.map +1 -0
  54. package/dist/esm/version.js +2 -0
  55. package/dist/esm/version.js.map +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/dist/types/Framework.d.ts +8 -0
  58. package/dist/types/app/index.d.ts +6 -0
  59. package/dist/types/app/useAppProvider.d.ts +4 -0
  60. package/dist/types/app/useApps.d.ts +8 -0
  61. package/dist/types/app/useCurrentApp.d.ts +9 -0
  62. package/dist/types/app/useCurrentAppModule.d.ts +8 -0
  63. package/dist/types/app/useCurrentAppModules.d.ts +8 -0
  64. package/dist/types/context/index.d.ts +2 -0
  65. package/dist/types/context/useCurrentContext.d.ts +5 -0
  66. package/dist/types/context.d.ts +4 -0
  67. package/dist/types/create-framework-provider.d.ts +4 -0
  68. package/dist/types/feature-flag/index.d.ts +6 -0
  69. package/dist/types/feature-flag/useCurrentAppFeatures.d.ts +2 -0
  70. package/dist/types/feature-flag/useFeature.d.ts +8 -0
  71. package/dist/types/feature-flag/useFeatures.d.ts +9 -0
  72. package/dist/types/feature-flag/useFrameworkFeature.d.ts +3 -0
  73. package/dist/types/feature-flag/useFrameworkFeatures.d.ts +3 -0
  74. package/dist/types/hooks/index.d.ts +2 -0
  75. package/dist/types/hooks/use-current-user.d.ts +8 -0
  76. package/dist/types/hooks/use-http-client.d.ts +5 -0
  77. package/dist/types/http/index.d.ts +2 -0
  78. package/dist/types/index.d.ts +7 -0
  79. package/dist/types/signalr/index.d.ts +2 -0
  80. package/dist/types/useFramework.d.ts +4 -0
  81. package/dist/types/useFrameworkModule.d.ts +3 -0
  82. package/dist/types/version.d.ts +1 -0
  83. package/package.json +94 -0
  84. package/src/Framework.tsx +22 -0
  85. package/src/app/index.ts +7 -0
  86. package/src/app/useAppProvider.ts +19 -0
  87. package/src/app/useApps.ts +30 -0
  88. package/src/app/useCurrentApp.ts +38 -0
  89. package/src/app/useCurrentAppModule.ts +43 -0
  90. package/src/app/useCurrentAppModules.ts +44 -0
  91. package/src/context/index.ts +3 -0
  92. package/src/context/useCurrentContext.ts +6 -0
  93. package/src/context.ts +25 -0
  94. package/src/create-framework-provider.tsx +42 -0
  95. package/src/feature-flag/README.md +44 -0
  96. package/src/feature-flag/index.ts +7 -0
  97. package/src/feature-flag/useCurrentAppFeatures.ts +19 -0
  98. package/src/feature-flag/useFeature.ts +47 -0
  99. package/src/feature-flag/useFeatures.ts +77 -0
  100. package/src/feature-flag/useFrameworkFeature.ts +22 -0
  101. package/src/feature-flag/useFrameworkFeatures.ts +20 -0
  102. package/src/hooks/index.ts +2 -0
  103. package/src/hooks/use-current-user.ts +15 -0
  104. package/src/hooks/use-http-client.ts +19 -0
  105. package/src/http/index.ts +3 -0
  106. package/src/index.tsx +15 -0
  107. package/src/signalr/index.ts +38 -0
  108. package/src/useFramework.ts +27 -0
  109. package/src/useFrameworkModule.ts +31 -0
  110. package/src/version.ts +2 -0
  111. package/tsconfig.json +41 -0
@@ -0,0 +1,77 @@
1
+ import { useCallback, useMemo } from 'react';
2
+
3
+ import { of } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+
6
+ import {
7
+ type IFeatureFlagProvider,
8
+ type IFeatureFlag,
9
+ } from '@equinor/fusion-framework-module-feature-flag';
10
+
11
+ import { type FeatureSelectorFn } from '@equinor/fusion-framework-module-feature-flag/selectors';
12
+
13
+ import { useObservableState } from '@equinor/fusion-observable/react';
14
+
15
+ export interface UseFeaturesResult {
16
+ features: IFeatureFlag[];
17
+ error: unknown;
18
+ /**
19
+ * @param key - The key of the feature flag.
20
+ * @param enable - Optional provide new enabled state of the feature flag. _Defaults to inversion of current feature flag state_
21
+ */
22
+ toggleFeature: (key: string, enable?: boolean) => void;
23
+ }
24
+
25
+ /**
26
+ * Custom hook that provides access to the feature flags and their values.
27
+ *
28
+ * @param provider - The feature flag provider.
29
+ * @param selector - Optional function to filter the feature flags.
30
+ * @returns An object containing the features, any error that occurred while retrieving them, and a function to set the enabled state of a feature flag.
31
+ * @throws Error if the feature flag provider is missing.
32
+ */
33
+ export const useFeatures = (
34
+ provider?: IFeatureFlagProvider | null,
35
+ selector?: FeatureSelectorFn,
36
+ ): UseFeaturesResult => {
37
+ /**
38
+ * Custom hook that provides access to the feature flags and their values.
39
+ *
40
+ * @returns An object containing the features and any error that occurred while retrieving them.
41
+ */
42
+ const { value: features, error } = useObservableState(
43
+ useMemo(() => {
44
+ if (provider) {
45
+ return provider?.features$.pipe(
46
+ map((x) => {
47
+ const values = Object.values(x);
48
+ return selector ? values.filter(selector) : values;
49
+ }),
50
+ );
51
+ }
52
+ return of([]);
53
+ }, [provider, selector]),
54
+ { initial: Object.values(provider?.features ?? {}) },
55
+ );
56
+ /**
57
+ * Sets the enabled state of a feature flag.
58
+ *
59
+ * @param key - The key of the feature flag.
60
+ * @param enable - The new enabled state of the feature flag.
61
+ * @throws Error if IFeatureFlagProvider is missing.
62
+ */
63
+ const toggleFeature = useCallback(
64
+ (key: string, enable?: boolean) => {
65
+ if (!provider) {
66
+ throw new Error('Missing IFeatureFlagProvider.');
67
+ }
68
+ const enabled = enable === undefined ? !provider.getFeature(key)?.enabled : enable;
69
+
70
+ provider.toggleFeature({ key, enabled });
71
+ },
72
+ [provider],
73
+ );
74
+ return { features, error, toggleFeature };
75
+ };
76
+
77
+ export default useFeatures;
@@ -0,0 +1,22 @@
1
+ import { type FeatureFlagModule } from '@equinor/fusion-framework-module-feature-flag';
2
+
3
+ import { useFrameworkModule } from '../useFrameworkModule';
4
+ import { useFeature } from './useFeature';
5
+
6
+ /**
7
+ * Custom hook that allows accessing a framework feature based on a given feature flag key.
8
+ *
9
+ * @template T - The type of the feature.
10
+ * @param {string} key - The feature flag key.
11
+ * @returns {ReturnType<typeof useFeature<T>>} - The result of the feature hook.
12
+ * @throws {Error} - If feature flagging is not enabled in the framework.
13
+ */
14
+ export const useFrameworkFeature = <T>(key: string): ReturnType<typeof useFeature<T>> => {
15
+ const provider = useFrameworkModule<FeatureFlagModule>('featureFlag');
16
+ if (!provider) {
17
+ throw Error('Feature flagging is not enabled in the framework');
18
+ }
19
+ return useFeature(provider, key);
20
+ };
21
+
22
+ export default useFrameworkFeature;
@@ -0,0 +1,20 @@
1
+ import { type FeatureFlagModule } from '@equinor/fusion-framework-module-feature-flag';
2
+
3
+ import { useFrameworkModule } from '../useFrameworkModule';
4
+ import { useFeatures } from './useFeatures';
5
+
6
+ /**
7
+ * Custom hook that provides access to framework-specific feature flags.
8
+ * It returns the result of the `useFeatures` hook from the `featureFlag` module.
9
+ * @returns The result of the `useFeatures` hook.
10
+ * @throws Error if feature flagging is not enabled in the framework.
11
+ */
12
+ export const useFrameworkFeatures = (): ReturnType<typeof useFeatures> => {
13
+ const provider = useFrameworkModule<FeatureFlagModule>('featureFlag');
14
+ if (!provider) {
15
+ throw Error('Feature flagging is not enabled in the framework');
16
+ }
17
+ return useFeatures(provider);
18
+ };
19
+
20
+ export default useFrameworkFeatures;
@@ -0,0 +1,2 @@
1
+ export { useCurrentUser } from './use-current-user';
2
+ export { useHttpClient } from './use-http-client';
@@ -0,0 +1,15 @@
1
+ import { useFramework } from '../useFramework';
2
+
3
+ export type AccountInfo = {
4
+ // homeAccountId: string;
5
+ environment: string;
6
+ tenantId: string;
7
+ username: string;
8
+ localAccountId: string;
9
+ name?: string;
10
+ };
11
+
12
+ export const useCurrentUser = (): AccountInfo | undefined => {
13
+ const framework = useFramework();
14
+ return framework.modules.auth.defaultClient.account;
15
+ };
@@ -0,0 +1,19 @@
1
+ import { useMemo } from 'react';
2
+ import { Fusion } from '@equinor/fusion-framework';
3
+ import { useFramework } from '../useFramework';
4
+
5
+ type HttpClient = ReturnType<Fusion['modules']['http']['createClient']>;
6
+ type FrameworkHttpClient = 'portal' | 'people';
7
+
8
+ export const useHttpClient = (name: FrameworkHttpClient): HttpClient => {
9
+ const framework = useFramework();
10
+
11
+ const client = useMemo(() => {
12
+ if (framework.modules.http.hasClient(name)) {
13
+ return framework.modules.http.createClient(name);
14
+ }
15
+ throw Error(`no configured client for key [${name}]`);
16
+ }, [framework, name]);
17
+ // TODO - abort on unmount?
18
+ return client;
19
+ };
@@ -0,0 +1,3 @@
1
+ export { useHttpClient as useFrameworkHttpClient } from '../hooks/use-http-client';
2
+
3
+ export * from '@equinor/fusion-framework-react-module-http';
package/src/index.tsx ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * [[include:framework-react/README.MD]]
3
+ * @module
4
+ */
5
+
6
+ export type { Fusion } from '@equinor/fusion-framework';
7
+ export { FusionConfigurator } from '@equinor/fusion-framework';
8
+
9
+ export { createFrameworkProvider } from './create-framework-provider';
10
+ export { FrameworkProvider } from './context';
11
+
12
+ export { useFramework } from './useFramework';
13
+ export { useFrameworkModule } from './useFrameworkModule';
14
+
15
+ export { default, Framework } from './Framework';
@@ -0,0 +1,38 @@
1
+ import { useFramework } from '../useFramework';
2
+
3
+ import { SignalRModule, useProviderTopic } from '@equinor/fusion-framework-react-module-signalr';
4
+
5
+ /**
6
+ * hook for subscribing to a topic of a SignalR hub
7
+ *
8
+ * @example
9
+ ```ts
10
+ // config.ts
11
+ import {enableSignalR} from '@equinor/fusion-framework-react-module-signalr';
12
+ (configurator) => enableSignalR(configurator, 'notifications');
13
+
14
+ // myHook.ts
15
+ const myHook = () => {
16
+ const topic = useSignalR('notifications', 'foo');
17
+ return useObservableState(topic).next;
18
+ }
19
+ ```
20
+ *
21
+ * @see {@link [module signalr](https://equinor.github.io/fusion-framework/modules/signalr)}
22
+ *
23
+ * @param hubId identifier of connection hub (must be configured)
24
+ * @param topicId identifier of topic to connect to
25
+ * @returns Topic
26
+ */
27
+ export const useSignalR = <T>(
28
+ hubId: string,
29
+ topicId: string,
30
+ ): ReturnType<typeof useProviderTopic<T>> => {
31
+ const provider = useFramework<[SignalRModule]>().modules.signalR;
32
+ if (!provider) {
33
+ throw Error(
34
+ 'SignalR is not configured, see @equinor/fusion-framework-react-module-signalr',
35
+ );
36
+ }
37
+ return useProviderTopic(provider, hubId, topicId);
38
+ };
@@ -0,0 +1,27 @@
1
+ import type { Fusion } from '@equinor/fusion-framework';
2
+ import type { AnyModule } from '@equinor/fusion-framework-module';
3
+
4
+ import { useContext } from 'react';
5
+ import { context } from './context';
6
+ /**
7
+ * @example
8
+ * ```ts
9
+ * const useSometing = () => {
10
+ * const fusion = useFramework();
11
+ * return fusion.something;
12
+ * }
13
+ * ```
14
+ */
15
+ export const useFramework = <TModules extends Array<AnyModule> = []>(): Fusion<TModules> => {
16
+ let framework = useContext(context);
17
+ if (!framework) {
18
+ console.warn('could not locate fusion in context!');
19
+ }
20
+ framework ??= window.Fusion;
21
+ if (!framework) {
22
+ console.error('Could not load framework, might not be initiated?');
23
+ }
24
+ return framework;
25
+ };
26
+
27
+ export default useFramework;
@@ -0,0 +1,31 @@
1
+ import type { FusionModules, FusionModulesInstance } from '@equinor/fusion-framework';
2
+ import { useFramework } from './useFramework';
3
+ import { AnyModule, ModuleKey, ModuleType, ModuleTypes } from '@equinor/fusion-framework-module';
4
+
5
+ /**
6
+ * Retrieves a module from the framework instance based on its name.
7
+ *
8
+ * @template TType - The type of the module to retrieve.
9
+ * @template TKey - The type of the module name.
10
+ * @param name - The name of the module to retrieve.
11
+ * @returns The requested module from the framework instance.
12
+ * @throws Error if the requested module is not included in the framework instance.
13
+ */
14
+ export const useFrameworkModule = <
15
+ TType extends AnyModule | unknown = unknown,
16
+ TKey extends string = ModuleKey<ModuleTypes<FusionModules<[TType]>>>,
17
+ >(
18
+ name: TKey,
19
+ ): TType extends AnyModule
20
+ ? ModuleType<TType> | undefined
21
+ : FusionModulesInstance[Extract<keyof FusionModulesInstance, TKey>] | undefined => {
22
+ const framework = useFramework();
23
+ // TODO
24
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
+ // @ts-ignore
26
+ const module = framework.modules[name];
27
+ if (!module) {
28
+ console.warn(`the requested module [${module}] is not included in the framework instance`);
29
+ }
30
+ return module;
31
+ };
package/src/version.ts ADDED
@@ -0,0 +1,2 @@
1
+ // Generated by genversion.
2
+ export const version = '6.0.0';
package/tsconfig.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "extends": "../tsconfig.react.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist/esm",
5
+ "rootDir": "src",
6
+ "declarationDir": "./dist/types",
7
+ "paths": {
8
+ "react": [ "./node_modules/@types/react" ],
9
+ },
10
+ },
11
+ "references": [
12
+ {
13
+ "path": "../../framework"
14
+ },
15
+ {
16
+ "path": "../../modules/app"
17
+ },
18
+ {
19
+ "path": "../../modules/feature-flag"
20
+ },
21
+ {
22
+ "path": "../../modules/service-discovery"
23
+ },
24
+ {
25
+ "path": "../modules/context"
26
+ },
27
+ {
28
+ "path": "../modules/http"
29
+ },
30
+ {
31
+ "path": "../modules/signalr"
32
+ },
33
+ ],
34
+ "include": [
35
+ "src/**/*",
36
+ ],
37
+ "exclude": [
38
+ "node_modules",
39
+ "lib"
40
+ ]
41
+ }