@equinor/fusion-framework-react-app 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 (115) hide show
  1. package/CHANGELOG.md +1201 -0
  2. package/LICENSE +21 -0
  3. package/README.md +92 -0
  4. package/dist/esm/bookmark/index.js +3 -0
  5. package/dist/esm/bookmark/index.js.map +1 -0
  6. package/dist/esm/bookmark/useBookmark.js +4 -0
  7. package/dist/esm/bookmark/useBookmark.js.map +1 -0
  8. package/dist/esm/bookmark/useCurrentBookmark.js +4 -0
  9. package/dist/esm/bookmark/useCurrentBookmark.js.map +1 -0
  10. package/dist/esm/context/index.js +5 -0
  11. package/dist/esm/context/index.js.map +1 -0
  12. package/dist/esm/context/useContextProvider.js +4 -0
  13. package/dist/esm/context/useContextProvider.js.map +1 -0
  14. package/dist/esm/context/useCurrentContext.js +5 -0
  15. package/dist/esm/context/useCurrentContext.js.map +1 -0
  16. package/dist/esm/create-component.js +30 -0
  17. package/dist/esm/create-component.js.map +1 -0
  18. package/dist/esm/create-legacy-app.js +21 -0
  19. package/dist/esm/create-legacy-app.js.map +1 -0
  20. package/dist/esm/feature-flag/index.js +2 -0
  21. package/dist/esm/feature-flag/index.js.map +1 -0
  22. package/dist/esm/feature-flag/useFeature.js +33 -0
  23. package/dist/esm/feature-flag/useFeature.js.map +1 -0
  24. package/dist/esm/framework/index.js +3 -0
  25. package/dist/esm/framework/index.js.map +1 -0
  26. package/dist/esm/framework/useFrameworkCurrentContext.js +5 -0
  27. package/dist/esm/framework/useFrameworkCurrentContext.js.map +1 -0
  28. package/dist/esm/http/index.js +2 -0
  29. package/dist/esm/http/index.js.map +1 -0
  30. package/dist/esm/index.js +9 -0
  31. package/dist/esm/index.js.map +1 -0
  32. package/dist/esm/make-component.js +28 -0
  33. package/dist/esm/make-component.js.map +1 -0
  34. package/dist/esm/msal/index.js +4 -0
  35. package/dist/esm/msal/index.js.map +1 -0
  36. package/dist/esm/msal/useAccessToken.js +6 -0
  37. package/dist/esm/msal/useAccessToken.js.map +1 -0
  38. package/dist/esm/msal/useCurrentAccount.js +6 -0
  39. package/dist/esm/msal/useCurrentAccount.js.map +1 -0
  40. package/dist/esm/msal/useToken.js +20 -0
  41. package/dist/esm/msal/useToken.js.map +1 -0
  42. package/dist/esm/navigation/index.js +3 -0
  43. package/dist/esm/navigation/index.js.map +1 -0
  44. package/dist/esm/navigation/useNavigationModule.js +3 -0
  45. package/dist/esm/navigation/useNavigationModule.js.map +1 -0
  46. package/dist/esm/navigation/useRouter.js +7 -0
  47. package/dist/esm/navigation/useRouter.js.map +1 -0
  48. package/dist/esm/render-app.js +10 -0
  49. package/dist/esm/render-app.js.map +1 -0
  50. package/dist/esm/render-component.js +17 -0
  51. package/dist/esm/render-component.js.map +1 -0
  52. package/dist/esm/useAppModule.js +10 -0
  53. package/dist/esm/useAppModule.js.map +1 -0
  54. package/dist/esm/useAppModules.js +4 -0
  55. package/dist/esm/useAppModules.js.map +1 -0
  56. package/dist/esm/version.js +2 -0
  57. package/dist/esm/version.js.map +1 -0
  58. package/dist/tsconfig.tsbuildinfo +1 -0
  59. package/dist/types/bookmark/index.d.ts +3 -0
  60. package/dist/types/bookmark/useBookmark.d.ts +2 -0
  61. package/dist/types/bookmark/useCurrentBookmark.d.ts +3 -0
  62. package/dist/types/context/index.d.ts +4 -0
  63. package/dist/types/context/useContextProvider.d.ts +2 -0
  64. package/dist/types/context/useCurrentContext.d.ts +5 -0
  65. package/dist/types/create-component.d.ts +21 -0
  66. package/dist/types/create-legacy-app.d.ts +4 -0
  67. package/dist/types/feature-flag/index.d.ts +2 -0
  68. package/dist/types/feature-flag/useFeature.d.ts +6 -0
  69. package/dist/types/framework/index.d.ts +2 -0
  70. package/dist/types/framework/useFrameworkCurrentContext.d.ts +5 -0
  71. package/dist/types/http/index.d.ts +1 -0
  72. package/dist/types/index.d.ts +10 -0
  73. package/dist/types/make-component.d.ts +24 -0
  74. package/dist/types/msal/index.d.ts +3 -0
  75. package/dist/types/msal/useAccessToken.d.ts +6 -0
  76. package/dist/types/msal/useCurrentAccount.d.ts +2 -0
  77. package/dist/types/msal/useToken.d.ts +7 -0
  78. package/dist/types/navigation/index.d.ts +2 -0
  79. package/dist/types/navigation/useNavigationModule.d.ts +2 -0
  80. package/dist/types/navigation/useRouter.d.ts +2 -0
  81. package/dist/types/render-app.d.ts +5 -0
  82. package/dist/types/render-component.d.ts +4 -0
  83. package/dist/types/useAppModule.d.ts +4 -0
  84. package/dist/types/useAppModules.d.ts +3 -0
  85. package/dist/types/version.d.ts +1 -0
  86. package/package.json +112 -0
  87. package/src/bookmark/index.ts +4 -0
  88. package/src/bookmark/useBookmark.ts +21 -0
  89. package/src/bookmark/useCurrentBookmark.ts +21 -0
  90. package/src/context/index.ts +6 -0
  91. package/src/context/useContextProvider.ts +6 -0
  92. package/src/context/useCurrentContext.ts +6 -0
  93. package/src/create-component.tsx +114 -0
  94. package/src/create-legacy-app.tsx +35 -0
  95. package/src/feature-flag/README.md +20 -0
  96. package/src/feature-flag/index.ts +6 -0
  97. package/src/feature-flag/useFeature.ts +66 -0
  98. package/src/framework/index.ts +7 -0
  99. package/src/framework/useFrameworkCurrentContext.ts +6 -0
  100. package/src/http/index.ts +1 -0
  101. package/src/index.ts +30 -0
  102. package/src/make-component.tsx +74 -0
  103. package/src/msal/index.ts +3 -0
  104. package/src/msal/useAccessToken.ts +15 -0
  105. package/src/msal/useCurrentAccount.ts +11 -0
  106. package/src/msal/useToken.ts +29 -0
  107. package/src/navigation/index.ts +2 -0
  108. package/src/navigation/useNavigationModule.ts +5 -0
  109. package/src/navigation/useRouter.ts +16 -0
  110. package/src/render-app.ts +14 -0
  111. package/src/render-component.tsx +46 -0
  112. package/src/useAppModule.ts +31 -0
  113. package/src/useAppModules.ts +9 -0
  114. package/src/version.ts +2 -0
  115. package/tsconfig.json +42 -0
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { Fusion } from '@equinor/fusion-framework-react';
3
+ import { AppEnv } from '@equinor/fusion-framework-app';
4
+ import type { AppModuleInitiator, AppModulesInstance } from '@equinor/fusion-framework-app';
5
+ import type { AnyModule } from '@equinor/fusion-framework-module';
6
+ import type { FrameworkEvent, FrameworkEventInit } from '@equinor/fusion-framework-module-event';
7
+ export type ComponentRenderArgs<TFusion extends Fusion = Fusion, TEnv = AppEnv> = {
8
+ fusion: TFusion;
9
+ env: TEnv;
10
+ };
11
+ export type ComponentRenderer<TFusion extends Fusion = Fusion, TEnv = AppEnv> = (fusion: TFusion, env: TEnv) => React.LazyExoticComponent<React.ComponentType>;
12
+ export declare const createComponent: <TModules extends AnyModule[], TRef extends Fusion<unknown> = Fusion<unknown>, TEnv extends AppEnv = AppEnv>(Component: React.ElementType, configure?: AppModuleInitiator<TModules, TRef, TEnv> | undefined) => ComponentRenderer<TRef, TEnv>;
13
+ declare module '@equinor/fusion-framework-module-event' {
14
+ interface FrameworkEventMap {
15
+ onReactAppLoaded: FrameworkEvent<FrameworkEventInit<{
16
+ modules: AppModulesInstance;
17
+ fusion: Fusion;
18
+ }, React.ComponentType>>;
19
+ }
20
+ }
21
+ export default createComponent;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import type { AnyModule } from '@equinor/fusion-framework-module';
3
+ import type { AppModuleInitiator } from '@equinor/fusion-framework-app';
4
+ export declare const createLegacyApp: <TModules extends AnyModule[]>(Component: React.ElementType, configure?: AppModuleInitiator<TModules> | undefined) => () => JSX.Element;
@@ -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
+ };
@@ -0,0 +1,2 @@
1
+ export { useFramework } from '@equinor/fusion-framework-react';
2
+ export { useCurrentUser, useHttpClient as useFrameworkHttpClient, } from '@equinor/fusion-framework-react/hooks';
@@ -0,0 +1,5 @@
1
+ export declare const useFrameworkCurrentContext: () => {
2
+ currentContext: import("@equinor/fusion-framework-react-module-context").ContextItem | null | undefined;
3
+ setCurrentContext: (entry?: string | import("@equinor/fusion-framework-react-module-context").ContextItem | null | undefined) => void | Promise<import("@equinor/fusion-framework-react-module-context").ContextItem<Record<string, unknown>> | null>;
4
+ };
5
+ export default useFrameworkCurrentContext;
@@ -0,0 +1 @@
1
+ export * from '@equinor/fusion-framework-react-module-http';
@@ -0,0 +1,10 @@
1
+ export type { AppConfig, AppEnv, AppModuleInitiator, AppModules, AppModulesInstance, AppManifest, IAppConfigurator, } from '@equinor/fusion-framework-app';
2
+ export { useAppModule } from './useAppModule';
3
+ export { useAppModules } from './useAppModules';
4
+ export { makeComponent, ComponentRenderArgs } from './make-component';
5
+ export { createLegacyApp } from './create-legacy-app';
6
+ export { renderApp } from './render-app';
7
+ export { createComponent } from './create-component';
8
+ export { renderComponent } from './render-component';
9
+ export type { ComponentRenderer } from './create-component';
10
+ export { default } from './render-app';
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import type { Fusion } from '@equinor/fusion-framework-react';
3
+ import { AppEnv } from '@equinor/fusion-framework-app';
4
+ import type { AppModuleInitiator, AppModulesInstance } from '@equinor/fusion-framework-app';
5
+ import type { AnyModule } from '@equinor/fusion-framework-module';
6
+ import type { FrameworkEvent, FrameworkEventInit } from '@equinor/fusion-framework-module-event';
7
+ export type ComponentRenderArgs<TFusion extends Fusion = Fusion, TEnv = AppEnv> = {
8
+ fusion: TFusion;
9
+ env: TEnv;
10
+ };
11
+ export type ComponentRenderer<TFusion extends Fusion = Fusion, TEnv = AppEnv> = (fusion: TFusion, env: TEnv) => React.LazyExoticComponent<React.ComponentType>;
12
+ export declare const makeComponent: <TModules extends AnyModule[], TRef extends Fusion<unknown> = Fusion<unknown>, TEnv extends AppEnv = AppEnv>(Component: React.ReactNode, args: {
13
+ fusion: TRef;
14
+ env: TEnv;
15
+ }, configure?: AppModuleInitiator<TModules, TRef, TEnv> | undefined) => React.LazyExoticComponent<() => import("react/jsx-runtime").JSX.Element>;
16
+ declare module '@equinor/fusion-framework-module-event' {
17
+ interface FrameworkEventMap {
18
+ onReactAppLoaded: FrameworkEvent<FrameworkEventInit<{
19
+ modules: AppModulesInstance;
20
+ fusion: Fusion;
21
+ }, React.ComponentType>>;
22
+ }
23
+ }
24
+ export default makeComponent;
@@ -0,0 +1,3 @@
1
+ export { useCurrentAccount } from './useCurrentAccount';
2
+ export { useAccessToken } from './useAccessToken';
3
+ export { useToken } from './useToken';
@@ -0,0 +1,6 @@
1
+ import { AuthRequest } from '@equinor/fusion-framework-module-msal/client';
2
+ export declare const useAccessToken: (req: AuthRequest) => {
3
+ token?: string | undefined;
4
+ pending: boolean;
5
+ error: unknown;
6
+ };
@@ -0,0 +1,2 @@
1
+ import { AccountInfo } from '@equinor/fusion-framework-module-msal';
2
+ export declare const useCurrentAccount: () => AccountInfo | undefined;
@@ -0,0 +1,7 @@
1
+ import { AuthRequest, AuthenticationResult } from '@equinor/fusion-framework-module-msal/client';
2
+ export declare const useToken: (req: AuthRequest) => {
3
+ token?: AuthenticationResult | undefined;
4
+ pending: boolean;
5
+ error: unknown;
6
+ };
7
+ export default useToken;
@@ -0,0 +1,2 @@
1
+ export { useNavigationModule } from './useNavigationModule';
2
+ export { useRouter } from './useRouter';
@@ -0,0 +1,2 @@
1
+ import { INavigationProvider } from '@equinor/fusion-framework-module-navigation';
2
+ export declare const useNavigationModule: () => INavigationProvider;
@@ -0,0 +1,2 @@
1
+ import { type INavigationProvider } from '@equinor/fusion-framework-module-navigation';
2
+ export declare const useRouter: (routes: Parameters<INavigationProvider['createRouter']>[0]) => ReturnType<INavigationProvider['createRouter']>;
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { RenderTeardown } from './render-component';
3
+ import type { ComponentRenderArgs } from './create-component';
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
+ export default renderApp;
@@ -0,0 +1,4 @@
1
+ import type { ComponentRenderArgs, ComponentRenderer } from './create-component';
2
+ export type RenderTeardown = VoidFunction;
3
+ export declare const renderComponent: (renderer: ComponentRenderer) => (el: HTMLElement, args: ComponentRenderArgs) => RenderTeardown;
4
+ export default renderComponent;
@@ -0,0 +1,4 @@
1
+ import type { AppModules, AppModulesInstance } from '@equinor/fusion-framework-app';
2
+ import { AnyModule, ModuleKey, ModuleType, ModuleTypes } from '@equinor/fusion-framework-module';
3
+ export declare const useAppModule: <TType extends unknown = unknown, TKey extends string = ModuleKey<ModuleTypes<AppModules<[TType]>>>>(module: TKey) => TType extends AnyModule ? ModuleType<TType> : AppModulesInstance[Extract<"event", TKey> | Extract<"http", TKey> | Extract<"auth", TKey> | Extract<"dispose", TKey>];
4
+ export default useAppModule;
@@ -0,0 +1,3 @@
1
+ import type { AppModulesInstance } from '@equinor/fusion-framework-app';
2
+ export declare const useAppModules: <T extends unknown = unknown>() => AppModulesInstance<T>;
3
+ export default useAppModules;
@@ -0,0 +1 @@
1
+ export declare const version = "4.3.0";
package/package.json ADDED
@@ -0,0 +1,112 @@
1
+ {
2
+ "name": "@equinor/fusion-framework-react-app",
3
+ "version": "0.0.0-context-error-20240131144633",
4
+ "description": "",
5
+ "main": "dist/esm/index.js",
6
+ "exports": {
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"
15
+ },
16
+ "types": "./dist/types/index.d.ts",
17
+ "typesVersions": {
18
+ "*": {
19
+ "bookmark": [
20
+ "dist/types/bookmark/index.d.ts"
21
+ ],
22
+ "context": [
23
+ "dist/types/context/index.d.ts"
24
+ ],
25
+ "feature-flag": [
26
+ "dist/types/feature-flag/index.d.ts"
27
+ ],
28
+ "framework": [
29
+ "dist/types/framework/index.d.ts"
30
+ ],
31
+ "http": [
32
+ "dist/types/http/index.d.ts"
33
+ ],
34
+ "msal": [
35
+ "dist/types/msal/index.d.ts"
36
+ ],
37
+ "navigation": [
38
+ "dist/types/navigation/index.d.ts"
39
+ ]
40
+ }
41
+ },
42
+ "keywords": [],
43
+ "author": "",
44
+ "license": "ISC",
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/equinor/fusion-framework.git",
51
+ "directory": "packages/react"
52
+ },
53
+ "dependencies": {
54
+ "@equinor/fusion-framework-app": "^0.0.0-context-error-20240131144633",
55
+ "@equinor/fusion-framework-module": "^4.2.6",
56
+ "@equinor/fusion-framework-module-app": "^5.2.12",
57
+ "@equinor/fusion-framework-module-navigation": "^3.1.3",
58
+ "@equinor/fusion-framework-react": "^0.0.0-context-error-20240131144633",
59
+ "@equinor/fusion-framework-react-module": "^3.0.7",
60
+ "@equinor/fusion-framework-react-module-http": "^4.0.5"
61
+ },
62
+ "devDependencies": {
63
+ "@types/react": "^18.2.20",
64
+ "@types/react-dom": "^18.2.7",
65
+ "react": "^18.2.0",
66
+ "react-dom": "^18.2.0",
67
+ "rxjs": "^7.8.1",
68
+ "typescript": "^5.1.3",
69
+ "@equinor/fusion-framework-module-event": "^4.0.7",
70
+ "@equinor/fusion-framework-module-msal": "^3.0.9",
71
+ "@equinor/fusion-framework-module-feature-flag": "^1.0.0",
72
+ "@equinor/fusion-framework-react-module-bookmark": "^0.0.0-context-error-20240131144633",
73
+ "@equinor/fusion-framework-react-module-context": "^0.0.0-context-error-20240131144633",
74
+ "@equinor/fusion-observable": "^8.1.4"
75
+ },
76
+ "peerDependencies": {
77
+ "@types/react": "^17.0.0 || ^18.0.0",
78
+ "react": "^17.0.0 || ^18.0.0",
79
+ "react-dom": "^17.0.0 || ^18.0.0",
80
+ "rxjs": "^7.8.1",
81
+ "@equinor/fusion-framework-module-msal": "^3.0.9"
82
+ },
83
+ "peerDependenciesMeta": {
84
+ "@equinor/fusion-framework-react-module-context": {
85
+ "optional": true
86
+ },
87
+ "@equinor/fusion-framework-module-navigation": {
88
+ "optional": true
89
+ },
90
+ "@equinor/fusion-framework-react-module-bookmark": {
91
+ "optional": true
92
+ },
93
+ "@equinor/fusion-framework-module-feature-flag": {
94
+ "optional": true
95
+ },
96
+ "@equinor/fusion-observable": {
97
+ "optional": true
98
+ },
99
+ "@types/react": {
100
+ "optional": true
101
+ },
102
+ "react-dom": {
103
+ "optional": true
104
+ },
105
+ "rxjs": {
106
+ "optional": true
107
+ }
108
+ },
109
+ "scripts": {
110
+ "build": "tsc -b"
111
+ }
112
+ }
@@ -0,0 +1,4 @@
1
+ export type { CreateBookMarkFn } from '@equinor/fusion-framework-react-module-bookmark';
2
+
3
+ export { default, useCurrentBookmark } from './useCurrentBookmark';
4
+ export { useBookmark } from './useBookmark';
@@ -0,0 +1,21 @@
1
+ import { useBookmark as _useBookmark } from '@equinor/fusion-framework-react-module-bookmark';
2
+
3
+ /**
4
+ * For application development the useCurrentBookmark should be sufficient enough
5
+ *
6
+ * Functionality provided here is:
7
+ * - addBookmarkCreator
8
+ * - getAllBookmarks
9
+ * - createBookmark
10
+ * - updateBookmark
11
+ * - deleteBookmarkById
12
+ * - setCurrentBookmark
13
+ * - currentBookmark
14
+ * - bookmarks,
15
+ *
16
+ * @template TData - Current applications bookmark type
17
+ * @return {*} {Bookmarks<TData>} the full api fro handling bookmarks
18
+ */
19
+ export const useBookmark = <TData>() => _useBookmark<TData>();
20
+
21
+ export default useBookmark;
@@ -0,0 +1,21 @@
1
+ import {
2
+ CreateBookMarkFn,
3
+ useCurrentBookmark as _useCurrentBookmark,
4
+ } from '@equinor/fusion-framework-react-module-bookmark';
5
+
6
+ /**
7
+ * By providing a CreateBookMarkFn bookmarks is enabled for the current application.
8
+ *
9
+ * @template TData - Type of data stored in bookmark
10
+ * @param {CreateBookMarkFn<TData>} [createBookmarkState] - Function for creating bookmark payload, this function should be wrapped in useCallback
11
+ *
12
+ * ```TS
13
+ * // Example
14
+ * const { currentBookmark } = useCurrentBookmark(useCallback(()=> someState, [someState]))
15
+ * ```
16
+ * @return {*} {CurrentBookmark<TData>}
17
+ */
18
+ export const useCurrentBookmark = <TData>(createBookmarkState?: CreateBookMarkFn<TData>) =>
19
+ _useCurrentBookmark(createBookmarkState);
20
+
21
+ export default useCurrentBookmark;
@@ -0,0 +1,6 @@
1
+ export * from '@equinor/fusion-framework-react-module-context';
2
+
3
+ export { useContextProvider } from './useContextProvider';
4
+ export { useCurrentContext } from './useCurrentContext';
5
+
6
+ export { useFrameworkCurrentContext } from '../framework/useFrameworkCurrentContext';
@@ -0,0 +1,6 @@
1
+ import { type ContextModule } from '@equinor/fusion-framework-react-module-context';
2
+ import { useAppModule } from '../useAppModule';
3
+
4
+ export const useContextProvider = () => useAppModule<ContextModule>('context');
5
+
6
+ export default useContextProvider;
@@ -0,0 +1,6 @@
1
+ import { useCurrentContext as _useCurrentContext } from '@equinor/fusion-framework-react-module-context';
2
+ import useContextProvider from './useContextProvider';
3
+
4
+ export const useCurrentContext = () => _useCurrentContext(useContextProvider());
5
+
6
+ export default useCurrentContext;
@@ -0,0 +1,114 @@
1
+ import React, { lazy } from 'react';
2
+
3
+ import { FrameworkProvider } from '@equinor/fusion-framework-react';
4
+ import type { Fusion } from '@equinor/fusion-framework-react';
5
+
6
+ import { AppEnv, configureModules } from '@equinor/fusion-framework-app';
7
+ import type { AppModuleInitiator, AppModulesInstance } from '@equinor/fusion-framework-app';
8
+
9
+ import type { AnyModule } from '@equinor/fusion-framework-module';
10
+
11
+ import type { FrameworkEvent, FrameworkEventInit } from '@equinor/fusion-framework-module-event';
12
+
13
+ import { ModuleProvider as AppModuleProvider } from '@equinor/fusion-framework-react-module';
14
+
15
+ export type ComponentRenderArgs<TFusion extends Fusion = Fusion, TEnv = AppEnv> = {
16
+ fusion: TFusion;
17
+ env: TEnv;
18
+ };
19
+
20
+ export type ComponentRenderer<TFusion extends Fusion = Fusion, TEnv = AppEnv> = (
21
+ fusion: TFusion,
22
+ env: TEnv,
23
+ ) => React.LazyExoticComponent<React.ComponentType>;
24
+
25
+ /**
26
+ * @deprecated
27
+ * Creates an lazy loading Component which configures modules
28
+ * and provides context to framework and configured modules
29
+ *
30
+ *
31
+ * ```mermaid
32
+ * sequenceDiagram
33
+ * App ->>+Framework: createApp
34
+ * Framework->>-Framework: initializeModules
35
+ * Framework->>App: configure(modules, framework, args)
36
+ * App-->Framework: await configuration
37
+ * Framework->>App: React.LazyExoticComponent
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * const configCallback: AppConfigurator = (configurator) => {
43
+ * configurator.http.configureClient(
44
+ * 'bar', {
45
+ * baseUri: 'https://somewhere-test.com',
46
+ * defaultScopes: ['foo/.default']
47
+ * }
48
+ * );
49
+ * };
50
+ *
51
+ * export const App = () => {
52
+ * const client = useHttpClient('bar');
53
+ * const [foo, setFoo] = useState('no value');
54
+ * const onClick = useCallback(() => {
55
+ * client.fetchAsync('api').then(x => x.json).then(setFoo);
56
+ * }, [client]);
57
+ * return <Button onClick={onClick}>{foo}</Button>
58
+ * }
59
+ *
60
+ * export const render = createApp(App, configCallback);
61
+ *
62
+ * export default render;
63
+ * ```
64
+ *
65
+ *
66
+ * __Exposed providers__
67
+ * @see {@link @equinor/fusion-framework-react.FrameworkProvider | FrameworkProvider}
68
+ * @see {@link ModuleProvider | ModuleProvider}
69
+ *
70
+ * @template TModules module types included in configuration.
71
+ * @param Component - React component to render
72
+ * @param configure - Callback for configuring application
73
+ * @param modules - required modules for application
74
+ */
75
+ export const createComponent =
76
+ <TModules extends Array<AnyModule>, TRef extends Fusion = Fusion, TEnv extends AppEnv = AppEnv>(
77
+ Component: React.ElementType,
78
+ configure?: AppModuleInitiator<TModules, TRef, TEnv>,
79
+ ): ComponentRenderer<TRef, TEnv> =>
80
+ (fusion, env) =>
81
+ lazy(async () => {
82
+ const init = configureModules<TModules, TRef, TEnv>(configure);
83
+ const modules = (await init({
84
+ fusion,
85
+ env,
86
+ })) as unknown as AppModulesInstance;
87
+
88
+ modules.event.dispatchEvent('onReactAppLoaded', {
89
+ detail: { modules, fusion },
90
+ source: Component,
91
+ });
92
+ return {
93
+ default: () => (
94
+ <FrameworkProvider value={fusion}>
95
+ <AppModuleProvider value={modules}>
96
+ {/* TODO */}
97
+ {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment*/}
98
+ {/* @ts-ignore */}
99
+ <Component />
100
+ </AppModuleProvider>
101
+ </FrameworkProvider>
102
+ ),
103
+ };
104
+ });
105
+
106
+ declare module '@equinor/fusion-framework-module-event' {
107
+ interface FrameworkEventMap {
108
+ onReactAppLoaded: FrameworkEvent<
109
+ FrameworkEventInit<{ modules: AppModulesInstance; fusion: Fusion }, React.ComponentType>
110
+ >;
111
+ }
112
+ }
113
+
114
+ export default createComponent;
@@ -0,0 +1,35 @@
1
+ import { Suspense, useMemo } from 'react';
2
+
3
+ import { useFramework } from '@equinor/fusion-framework-react';
4
+
5
+ import type { AnyModule } from '@equinor/fusion-framework-module';
6
+ import type { AppEnv, AppModuleInitiator } from '@equinor/fusion-framework-app';
7
+
8
+ import { createComponent } from './create-component';
9
+ import { AppModule } from '@equinor/fusion-framework-module-app';
10
+
11
+ export const createLegacyApp = <TModules extends Array<AnyModule>>(
12
+ Component: React.ElementType,
13
+ configure?: AppModuleInitiator<TModules>,
14
+ ) => {
15
+ const LegacyComponent = (): JSX.Element => {
16
+ const fusion = useFramework<[AppModule]>();
17
+ const RenderComponent = useMemo(() => {
18
+ const creator = createComponent(Component, configure);
19
+ // @eikeland
20
+ // TODO - recheck when legacy fusion-cli is updated!
21
+ const appProvider = fusion.modules.app;
22
+ if (appProvider?.current) {
23
+ const { config, manifest } = appProvider.current;
24
+ return creator(fusion, { config, manifest } as unknown as AppEnv);
25
+ }
26
+ return creator(fusion, {} as unknown as AppEnv);
27
+ }, [fusion]);
28
+ return (
29
+ <Suspense fallback={<p>loading app</p>}>
30
+ <RenderComponent />
31
+ </Suspense>
32
+ );
33
+ };
34
+ return LegacyComponent;
35
+ };
@@ -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
+ };
@@ -0,0 +1,7 @@
1
+ export { useFramework } from '@equinor/fusion-framework-react';
2
+
3
+ // TODO
4
+ export {
5
+ useCurrentUser,
6
+ useHttpClient as useFrameworkHttpClient,
7
+ } from '@equinor/fusion-framework-react/hooks';
@@ -0,0 +1,6 @@
1
+ import { useFramework } from '@equinor/fusion-framework-react';
2
+ import { useCurrentContext } from '@equinor/fusion-framework-react-module-context';
3
+
4
+ export const useFrameworkCurrentContext = () => useCurrentContext(useFramework().modules.context);
5
+
6
+ export default useFrameworkCurrentContext;
@@ -0,0 +1 @@
1
+ export * from '@equinor/fusion-framework-react-module-http';
package/src/index.ts ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * [[include:react-app/README.MD]]
3
+ * @module
4
+ */
5
+
6
+ export type {
7
+ AppConfig,
8
+ AppEnv,
9
+ AppModuleInitiator,
10
+ AppModules,
11
+ AppModulesInstance,
12
+ AppManifest,
13
+ IAppConfigurator,
14
+ } from '@equinor/fusion-framework-app';
15
+
16
+ export { useAppModule } from './useAppModule';
17
+ export { useAppModules } from './useAppModules';
18
+
19
+ export { makeComponent, ComponentRenderArgs } from './make-component';
20
+
21
+ export { createLegacyApp } from './create-legacy-app';
22
+
23
+ // TODO deprecate
24
+ export { renderApp } from './render-app';
25
+ export { createComponent } from './create-component';
26
+ export { renderComponent } from './render-component';
27
+
28
+ export type { ComponentRenderer } from './create-component';
29
+
30
+ export { default } from './render-app';