@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.
- package/CHANGELOG.md +1201 -0
- package/LICENSE +21 -0
- package/README.md +92 -0
- package/dist/esm/bookmark/index.js +3 -0
- package/dist/esm/bookmark/index.js.map +1 -0
- package/dist/esm/bookmark/useBookmark.js +4 -0
- package/dist/esm/bookmark/useBookmark.js.map +1 -0
- package/dist/esm/bookmark/useCurrentBookmark.js +4 -0
- package/dist/esm/bookmark/useCurrentBookmark.js.map +1 -0
- package/dist/esm/context/index.js +5 -0
- package/dist/esm/context/index.js.map +1 -0
- package/dist/esm/context/useContextProvider.js +4 -0
- package/dist/esm/context/useContextProvider.js.map +1 -0
- package/dist/esm/context/useCurrentContext.js +5 -0
- package/dist/esm/context/useCurrentContext.js.map +1 -0
- package/dist/esm/create-component.js +30 -0
- package/dist/esm/create-component.js.map +1 -0
- package/dist/esm/create-legacy-app.js +21 -0
- package/dist/esm/create-legacy-app.js.map +1 -0
- package/dist/esm/feature-flag/index.js +2 -0
- package/dist/esm/feature-flag/index.js.map +1 -0
- package/dist/esm/feature-flag/useFeature.js +33 -0
- package/dist/esm/feature-flag/useFeature.js.map +1 -0
- package/dist/esm/framework/index.js +3 -0
- package/dist/esm/framework/index.js.map +1 -0
- package/dist/esm/framework/useFrameworkCurrentContext.js +5 -0
- package/dist/esm/framework/useFrameworkCurrentContext.js.map +1 -0
- package/dist/esm/http/index.js +2 -0
- package/dist/esm/http/index.js.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/make-component.js +28 -0
- package/dist/esm/make-component.js.map +1 -0
- package/dist/esm/msal/index.js +4 -0
- package/dist/esm/msal/index.js.map +1 -0
- package/dist/esm/msal/useAccessToken.js +6 -0
- package/dist/esm/msal/useAccessToken.js.map +1 -0
- package/dist/esm/msal/useCurrentAccount.js +6 -0
- package/dist/esm/msal/useCurrentAccount.js.map +1 -0
- package/dist/esm/msal/useToken.js +20 -0
- package/dist/esm/msal/useToken.js.map +1 -0
- package/dist/esm/navigation/index.js +3 -0
- package/dist/esm/navigation/index.js.map +1 -0
- package/dist/esm/navigation/useNavigationModule.js +3 -0
- package/dist/esm/navigation/useNavigationModule.js.map +1 -0
- package/dist/esm/navigation/useRouter.js +7 -0
- package/dist/esm/navigation/useRouter.js.map +1 -0
- package/dist/esm/render-app.js +10 -0
- package/dist/esm/render-app.js.map +1 -0
- package/dist/esm/render-component.js +17 -0
- package/dist/esm/render-component.js.map +1 -0
- package/dist/esm/useAppModule.js +10 -0
- package/dist/esm/useAppModule.js.map +1 -0
- package/dist/esm/useAppModules.js +4 -0
- package/dist/esm/useAppModules.js.map +1 -0
- package/dist/esm/version.js +2 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/bookmark/index.d.ts +3 -0
- package/dist/types/bookmark/useBookmark.d.ts +2 -0
- package/dist/types/bookmark/useCurrentBookmark.d.ts +3 -0
- package/dist/types/context/index.d.ts +4 -0
- package/dist/types/context/useContextProvider.d.ts +2 -0
- package/dist/types/context/useCurrentContext.d.ts +5 -0
- package/dist/types/create-component.d.ts +21 -0
- package/dist/types/create-legacy-app.d.ts +4 -0
- package/dist/types/feature-flag/index.d.ts +2 -0
- package/dist/types/feature-flag/useFeature.d.ts +6 -0
- package/dist/types/framework/index.d.ts +2 -0
- package/dist/types/framework/useFrameworkCurrentContext.d.ts +5 -0
- package/dist/types/http/index.d.ts +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/make-component.d.ts +24 -0
- package/dist/types/msal/index.d.ts +3 -0
- package/dist/types/msal/useAccessToken.d.ts +6 -0
- package/dist/types/msal/useCurrentAccount.d.ts +2 -0
- package/dist/types/msal/useToken.d.ts +7 -0
- package/dist/types/navigation/index.d.ts +2 -0
- package/dist/types/navigation/useNavigationModule.d.ts +2 -0
- package/dist/types/navigation/useRouter.d.ts +2 -0
- package/dist/types/render-app.d.ts +5 -0
- package/dist/types/render-component.d.ts +4 -0
- package/dist/types/useAppModule.d.ts +4 -0
- package/dist/types/useAppModules.d.ts +3 -0
- package/dist/types/version.d.ts +1 -0
- package/package.json +112 -0
- package/src/bookmark/index.ts +4 -0
- package/src/bookmark/useBookmark.ts +21 -0
- package/src/bookmark/useCurrentBookmark.ts +21 -0
- package/src/context/index.ts +6 -0
- package/src/context/useContextProvider.ts +6 -0
- package/src/context/useCurrentContext.ts +6 -0
- package/src/create-component.tsx +114 -0
- package/src/create-legacy-app.tsx +35 -0
- package/src/feature-flag/README.md +20 -0
- package/src/feature-flag/index.ts +6 -0
- package/src/feature-flag/useFeature.ts +66 -0
- package/src/framework/index.ts +7 -0
- package/src/framework/useFrameworkCurrentContext.ts +6 -0
- package/src/http/index.ts +1 -0
- package/src/index.ts +30 -0
- package/src/make-component.tsx +74 -0
- package/src/msal/index.ts +3 -0
- package/src/msal/useAccessToken.ts +15 -0
- package/src/msal/useCurrentAccount.ts +11 -0
- package/src/msal/useToken.ts +29 -0
- package/src/navigation/index.ts +2 -0
- package/src/navigation/useNavigationModule.ts +5 -0
- package/src/navigation/useRouter.ts +16 -0
- package/src/render-app.ts +14 -0
- package/src/render-component.tsx +46 -0
- package/src/useAppModule.ts +31 -0
- package/src/useAppModules.ts +9 -0
- package/src/version.ts +2 -0
- 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,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,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,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 @@
|
|
|
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,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 { 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,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,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';
|