From 0d4b9f98ddd9b0489a2a74dc468a108db48c8d39 Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Tue, 22 Oct 2024 09:38:02 +0200 Subject: [PATCH] chore: Refactor LegacyFusionWrapper and create-fusion-context (#825) Co-authored-by: Noggling --- .changeset/pr-825-2137703982.md | 3 + .../components/LegacyFusionWrapper.tsx | 1 - .../legacy-interopt/create-fusion-context.ts | 395 +++++++++--------- .../create-service-resolver.ts | 2 +- 4 files changed, 191 insertions(+), 210 deletions(-) create mode 100644 .changeset/pr-825-2137703982.md diff --git a/.changeset/pr-825-2137703982.md b/.changeset/pr-825-2137703982.md new file mode 100644 index 000000000..017b123fe --- /dev/null +++ b/.changeset/pr-825-2137703982.md @@ -0,0 +1,3 @@ + +--- +--- diff --git a/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/components/LegacyFusionWrapper.tsx b/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/components/LegacyFusionWrapper.tsx index 56069b986..99c8d87ed 100644 --- a/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/components/LegacyFusionWrapper.tsx +++ b/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/components/LegacyFusionWrapper.tsx @@ -41,7 +41,6 @@ export const LegacyFusionWrapper = (props: PropsWithChildren diff --git a/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-fusion-context.ts b/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-fusion-context.ts index a5bbf8255..cd0caae76 100644 --- a/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-fusion-context.ts +++ b/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-fusion-context.ts @@ -1,217 +1,196 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { - createApiClients, - ResourceCache, - EventHub, - HttpClient, - AbortControllerManager, - createResourceCollections, - TelemetryLogger, - FeatureLogger, - SettingsContainer, - ComponentDisplayType, - AppContainer, - TasksContainer, - NotificationCenter, - PeopleContainer, - UserMenuContainer, - FusionContextRefs, - IFusionContext, -} from "@equinor/fusion"; -import { appContainerFactory } from "@equinor/fusion/lib/app/AppContainer"; - -import { NavigationUpdate } from "@equinor/fusion-framework-module-navigation"; - -import { LegacyAppContainer } from "./LegacyAppContainer"; -import { LegacyAuthContainer } from "./LegacyAuthContainer"; - -import createServiceResolver from "./create-service-resolver"; -import type { PortalFramework } from "./types"; -import legacySignIn from "./legacy-api-signin"; -import LegacyContextManager from "./LegacyContextManager"; - -import { GLOBAL_FUSION_CONTEXT_KEY } from "./static"; - -import { AppModule } from "@equinor/fusion-framework-module-app"; -import { AppModulesInstance } from "@equinor/fusion-framework-react-app"; + createApiClients, + ResourceCache, + EventHub, + HttpClient, + AbortControllerManager, + createResourceCollections, + TelemetryLogger, + FeatureLogger, + SettingsContainer, + ComponentDisplayType, + AppContainer, + TasksContainer, + NotificationCenter, + PeopleContainer, + UserMenuContainer, + FusionContextRefs, + IFusionContext, +} from '@equinor/fusion'; +import { appContainerFactory } from '@equinor/fusion/lib/app/AppContainer'; + +import { NavigationUpdate } from '@equinor/fusion-framework-module-navigation'; + +import { LegacyAppContainer } from './LegacyAppContainer'; +import { LegacyAuthContainer } from './LegacyAuthContainer'; + +import createServiceResolver from './create-service-resolver'; +import type { PortalFramework } from './types'; +import legacySignIn from './legacy-api-signin'; +import LegacyContextManager from './LegacyContextManager'; + +import { GLOBAL_FUSION_CONTEXT_KEY } from './static'; + +import { AppModule } from '@equinor/fusion-framework-module-app'; +import { AppModulesInstance } from '@equinor/fusion-framework-react-app'; export type FusionContextOptions = { - loadBundlesFromDisk: boolean; - environment?: { - env: string; - pullRequest?: string; - }; - telemetry?: { - instrumentationKey: string; - }; + loadBundlesFromDisk: boolean; + environment?: { + env: string; + pullRequest?: string; + clientId?: string; + }; + telemetry?: { + instrumentationKey: string; + }; }; export const createFusionContext = async (args: { - framework: PortalFramework; - refs: FusionContextRefs; - options?: FusionContextOptions; - appFramework: AppModulesInstance<[AppModule]>; + framework: PortalFramework; + refs: FusionContextRefs; + options?: FusionContextOptions; + appFramework: AppModulesInstance<[AppModule]>; }): Promise => { - const { framework, refs, options, appFramework } = args; - - const { - environment = { env: "ci" }, - loadBundlesFromDisk = false, - telemetry, - } = options ?? {}; - - const authContainer = new LegacyAuthContainer({ - auth: framework.modules.auth, - }); - - const telemetryLogger = new TelemetryLogger( - telemetry?.instrumentationKey ?? "", - authContainer - ); - - const abortControllerManager = new AbortControllerManager(new EventHub()); - - const { serviceDiscovery } = framework.modules; - if (!serviceDiscovery) { - throw Error("missing module for service discovery"); - } - const serviceResolver = await createServiceResolver( - serviceDiscovery, - authContainer - ); - - const resourceCollections = createResourceCollections(serviceResolver, { - loadBundlesFromDisk, - environment, - }); - - const resourceCache = new ResourceCache(new EventHub()); - - const httpClient = new HttpClient( - authContainer, - resourceCache, - abortControllerManager, - telemetryLogger, - new EventHub() - ); - - const apiClients = createApiClients( - httpClient, - resourceCollections, - serviceResolver - ); - - const featureLogger = new FeatureLogger(apiClients, new EventHub()); - - const history = framework.modules.navigation.navigator; - - const historyListenFn = history.listen.bind(history); - - /** - * TODO - write what this wrapper does!? - */ - // @ts-ignore - history.listen = ( - cb: ( - eventOrLocation: NavigationUpdate | NavigationUpdate["location"], - action?: NavigationUpdate["action"] - ) => void - ) => { - return historyListenFn((e: NavigationUpdate) => { - const event = new Proxy(e, { - get(target, p) { - // eslint-disable-next-line default-case - switch (p) { - case "action": - return target.action; - - case "location": - return target.location; - - case "state": - case "hash": - case "key": - case "search": - case "pathname": - // @ts-ignore - return target.location[p]; - } - }, - }); - cb(event, e.action); - }); - }; - - const coreSettings = new SettingsContainer( - "core", - authContainer.getCachedUser(), - new EventHub(), - { - componentDisplayType: ComponentDisplayType.Comfortable, - } - ); - - const appContainer = new LegacyAppContainer({ - framework, - eventHub: new EventHub(), - featureLogger, - telemetryLogger, - appModules: appFramework, - }) as unknown as AppContainer; - - appContainerFactory(appContainer); - - // @ts-ignore - const contextManager = new LegacyContextManager({ - featureLogger, - framework, - history: history as unknown as History, - }); - - const tasksContainer = new TasksContainer(apiClients, new EventHub()); - const notificationCenter = new NotificationCenter(new EventHub(), apiClients); - const peopleContainer = new PeopleContainer( - apiClients, - resourceCollections, - new EventHub() - ); - const userMenuSectionsContainer = new UserMenuContainer(new EventHub()); - - const fusionContext = { - auth: { container: authContainer }, - http: { - client: httpClient, - resourceCollections, - apiClients, - resourceCache, - serviceResolver, - }, - refs, - history, - settings: { - core: coreSettings, - apps: {}, - }, - app: { - container: appContainer, - }, - contextManager, - tasksContainer, - abortControllerManager, - notificationCenter, - peopleContainer, - userMenuSectionsContainer, - environment, - logging: { - telemetry: telemetryLogger, - feature: featureLogger, - }, - options: { environment }, - }; - // @ts-ignore - window[GLOBAL_FUSION_CONTEXT_KEY] = fusionContext; - - await legacySignIn(framework); - - return fusionContext as unknown as IFusionContext; + const { framework, refs, options, appFramework } = args; + + const { environment = { env: 'ci' }, loadBundlesFromDisk = false, telemetry } = options ?? {}; + + const authContainer = new LegacyAuthContainer({ + auth: framework.modules.auth, + }); + + const telemetryLogger = new TelemetryLogger(telemetry?.instrumentationKey ?? '', authContainer); + + const abortControllerManager = new AbortControllerManager(new EventHub()); + + const { serviceDiscovery } = framework.modules; + if (!serviceDiscovery) { + throw Error('missing module for service discovery'); + } + + const serviceResolver = await createServiceResolver(serviceDiscovery, authContainer, window.clientId); + + const resourceCollections = createResourceCollections(serviceResolver, { + loadBundlesFromDisk, + environment, + }); + + const resourceCache = new ResourceCache(new EventHub()); + + const httpClient = new HttpClient( + authContainer, + resourceCache, + abortControllerManager, + telemetryLogger, + new EventHub() + ); + + const apiClients = createApiClients(httpClient, resourceCollections, serviceResolver); + + const featureLogger = new FeatureLogger(apiClients, new EventHub()); + + const history = framework.modules.navigation.navigator; + + const historyListenFn = history.listen.bind(history); + + /** + * TODO - write what this wrapper does!? + */ + // @ts-ignore + history.listen = ( + cb: ( + eventOrLocation: NavigationUpdate | NavigationUpdate['location'], + action?: NavigationUpdate['action'] + ) => void + ) => { + return historyListenFn((e: NavigationUpdate) => { + const event = new Proxy(e, { + get(target, p) { + // eslint-disable-next-line default-case + switch (p) { + case 'action': + return target.action; + + case 'location': + return target.location; + + case 'state': + case 'hash': + case 'key': + case 'search': + case 'pathname': + // @ts-ignore + return target.location[p]; + } + }, + }); + cb(event, e.action); + }); + }; + + const coreSettings = new SettingsContainer('core', authContainer.getCachedUser(), new EventHub(), { + componentDisplayType: ComponentDisplayType.Comfortable, + }); + + const appContainer = new LegacyAppContainer({ + framework, + eventHub: new EventHub(), + featureLogger, + telemetryLogger, + appModules: appFramework, + }) as unknown as AppContainer; + + appContainerFactory(appContainer); + + // @ts-ignore + const contextManager = new LegacyContextManager({ + featureLogger, + framework, + history: history as unknown as History, + }); + + const tasksContainer = new TasksContainer(apiClients, new EventHub()); + const notificationCenter = new NotificationCenter(new EventHub(), apiClients); + const peopleContainer = new PeopleContainer(apiClients, resourceCollections, new EventHub()); + const userMenuSectionsContainer = new UserMenuContainer(new EventHub()); + + const fusionContext = { + auth: { container: authContainer }, + http: { + client: httpClient, + resourceCollections, + apiClients, + resourceCache, + serviceResolver, + }, + refs, + history, + settings: { + core: coreSettings, + apps: {}, + }, + app: { + container: appContainer, + }, + contextManager, + tasksContainer, + abortControllerManager, + notificationCenter, + peopleContainer, + userMenuSectionsContainer, + environment, + logging: { + telemetry: telemetryLogger, + feature: featureLogger, + }, + options: { environment }, + }; + // @ts-ignore + window[GLOBAL_FUSION_CONTEXT_KEY] = fusionContext; + + await legacySignIn(framework); + + return fusionContext as unknown as IFusionContext; }; diff --git a/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-service-resolver.ts b/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-service-resolver.ts index d3a141853..8fe9599d7 100644 --- a/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-service-resolver.ts +++ b/client/apps/legacyAppLoader/src/app-loader/legacy-interopt/create-service-resolver.ts @@ -4,7 +4,7 @@ import { PortalFramework } from './types'; export const createServiceResolver = async ( provider: PortalFramework['modules']['serviceDiscovery'], authContainer: LegacyAuthContainer, - clientId: string = window.clientId + clientId: string ) => { const services = await provider.resolveServices().then((services) => services.reduce((acc, service) => {