@entur-partner/micro-frontend 2.8.0-alpha.2 → 2.9.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/dist/events.d.ts +17 -2
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.mjs +48 -31
- package/dist/index.mjs.map +1 -1
- package/dist/registerMicroFrontend.d.ts +5 -6
- package/dist/types.d.ts +0 -11
- package/dist/useAfterRouteChange.d.ts +11 -0
- package/package.json +5 -5
package/dist/events.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { MicroFrontendPayload
|
|
1
|
+
import type { MicroFrontendPayload } from "./types";
|
|
2
2
|
type MountEventDetail = {
|
|
3
3
|
id: string;
|
|
4
4
|
mountPoint: HTMLDivElement;
|
|
5
|
-
payload: MicroFrontendPayload
|
|
5
|
+
payload: MicroFrontendPayload;
|
|
6
6
|
};
|
|
7
7
|
type UnmountEventDetail = {
|
|
8
8
|
id: string;
|
|
@@ -20,8 +20,23 @@ export declare const ROUTE_CHANGE_EVENT_TYPE = "@entur-partner:after-route-chang
|
|
|
20
20
|
export type RouteAction = "PUSH" | "POP" | "REPLACE";
|
|
21
21
|
type RouteChangeEventDetail = {
|
|
22
22
|
location: Location;
|
|
23
|
+
path: string;
|
|
23
24
|
action: RouteAction;
|
|
24
25
|
};
|
|
25
26
|
export declare class RouteChangeEvent extends CustomEvent<RouteChangeEventDetail> {
|
|
26
27
|
}
|
|
28
|
+
export declare function createRouteChangeEvent(detail: RouteChangeEventDetail): RouteChangeEvent;
|
|
29
|
+
export interface MenuItemsEvent extends CustomEvent<MenuItemsEventDetail> {
|
|
30
|
+
}
|
|
31
|
+
export declare const MENU_ITEMS_EVENT_TYPE = "@entur-partner:menu-items-added";
|
|
32
|
+
export interface MenuItemDetail {
|
|
33
|
+
title: string;
|
|
34
|
+
to: string;
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
}
|
|
37
|
+
type MenuItemsEventDetail = {
|
|
38
|
+
path: string;
|
|
39
|
+
items: MenuItemDetail[];
|
|
40
|
+
};
|
|
41
|
+
export declare function createMenuItemsEvent(detail: MenuItemsEventDetail): CustomEvent<MenuItemsEventDetail>;
|
|
27
42
|
export {};
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@entur-partner/util`),t=require(`react`),n=require(`react/jsx-runtime`);var r=(0,t.createContext)(void 0),i=()=>{let n=(0,t.useContext)(r);return(0,e.assertIsDefined)(n),n.user},a=()=>{let n=(0,t.useContext)(r);return(0,e.assertIsDefined)(n),n.activeOrgId},o=()=>{let n=(0,t.useContext)(r);return(0,e.assertIsDefined)(n),n.navigate},s=({children:e,organisationId:i,getPermissions:a,...o})=>{let[s,c]=(0,t.useState)([]);return(0,t.useEffect)(()=>{async function e(){try{c(await a())}catch(e){console.error(`Fetching permissions with the provided getPermissions function failed in AppProvider with the following error:`,e)}}e()},[a]),(0,n.jsx)(r.Provider,{value:{...o,user:{...o.user,permissions:s},activeOrgId:Number(i)},children:e})},c=`@entur-partner:mount`,l=`@entur-partner:unmount`;function u(e){return new CustomEvent(c,{detail:e})}function d(e){return new CustomEvent(l,{detail:e})}var f=`@entur-partner:after-route-change`,p=class extends CustomEvent{};function m(e){let{unmount:t,microFrontendId:n,mount:r}=e,
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@entur-partner/util`),t=require(`react`),n=require(`react/jsx-runtime`);var r=(0,t.createContext)(void 0),i=()=>{let n=(0,t.useContext)(r);return(0,e.assertIsDefined)(n),n.user},a=()=>{let n=(0,t.useContext)(r);return(0,e.assertIsDefined)(n),n.activeOrgId},o=()=>{let n=(0,t.useContext)(r);return(0,e.assertIsDefined)(n),n.navigate},s=({children:e,organisationId:i,getPermissions:a,...o})=>{let[s,c]=(0,t.useState)([]);return(0,t.useEffect)(()=>{async function e(){try{c(await a())}catch(e){console.error(`Fetching permissions with the provided getPermissions function failed in AppProvider with the following error:`,e)}}e()},[a]),(0,n.jsx)(r.Provider,{value:{...o,user:{...o.user,permissions:s},activeOrgId:Number(i)},children:e})},c=`@entur-partner:mount`,l=`@entur-partner:unmount`;function u(e){return new CustomEvent(c,{detail:e})}function d(e){return new CustomEvent(l,{detail:e})}var f=`@entur-partner:after-route-change`,p=class extends CustomEvent{};function m(e){return new p(f,{detail:e,cancelable:!0})}var h=`@entur-partner:menu-items-added`;function g(e){return new CustomEvent(h,{detail:e})}function _(e){let{unmount:t,microFrontendId:n,mount:r}=e;window.addEventListener(c,(e=>{e.detail.id.startsWith(n)&&r(e.detail.mountPoint,e.detail.payload,e.detail.mountPoint)})),window.addEventListener(l,(e=>{e.detail.id.startsWith(n)&&t(e.detail.mountPoint)}))}function v(e){let n=(0,t.useRef)(e);(0,t.useEffect)(()=>{n.current=e}),(0,t.useEffect)(()=>{let e=e=>{n.current(e)};return window.addEventListener(f,e),()=>{window.removeEventListener(f,e)}},[])}exports.AppProvider=s,exports.MENU_ITEMS_EVENT_TYPE=h,exports.MOUNT_EVENT_TYPE=c,exports.ROUTE_CHANGE_EVENT_TYPE=f,exports.RouteChangeEvent=p,exports.UNMOUNT_EVENT_TYPE=l,exports.createMenuItemsEvent=g,exports.createMountEvent=u,exports.createRouteChangeEvent=m,exports.createUnmountEvent=d,exports.registerMicroFrontend=_,exports.useActiveOrgId=a,exports.useAfterRouteChange=v,exports.useNavigate=o,exports.useUser=i;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/AppProvider.tsx","../src/events.ts","../src/registerMicroFrontend.ts"],"sourcesContent":["import type { Permission } from \"@entur-partner/permission-client-node\";\nimport { assertIsDefined } from \"@entur-partner/util\";\nimport {\n\tcreateContext,\n\ttype FC,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from \"react\";\n\nimport type { User } from \"./types\";\n\ninterface AppContextType {\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tlogout?: () => void;\n\tactiveOrgId: number;\n\tnavigate: (path: string) => void;\n}\n\nexport const AppContext = createContext<AppContextType | undefined>(undefined);\n\nexport const useUser = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.user;\n};\n\nexport const useActiveOrgId = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.activeOrgId;\n};\n\nexport interface AppProviderProps {\n\tchildren: ReactNode;\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tgetPermissions: () => Promise<Permission[]>;\n\torganisationId: string;\n\tnavigate: (path: string) => void;\n}\n\nexport const useNavigate = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.navigate;\n};\n\nexport const AppProvider: FC<AppProviderProps> = ({\n\tchildren,\n\torganisationId,\n\tgetPermissions,\n\t...rest\n}) => {\n\tconst [permissions, setPermissions] = useState<Permission[]>([]);\n\n\tuseEffect(() => {\n\t\tasync function fetchData() {\n\t\t\ttry {\n\t\t\t\tconst fetchedPermissions = await getPermissions();\n\t\t\t\tsetPermissions(fetchedPermissions);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Fetching permissions with the provided getPermissions function failed in AppProvider with the following error:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfetchData();\n\t}, [getPermissions]);\n\n\treturn (\n\t\t<AppContext.Provider\n\t\t\tvalue={{\n\t\t\t\t...rest,\n\t\t\t\tuser: { ...rest.user, permissions: permissions },\n\t\t\t\tactiveOrgId: Number(organisationId),\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AppContext.Provider>\n\t);\n};\n","import type { MicroFrontendPayload
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/AppProvider.tsx","../src/events.ts","../src/registerMicroFrontend.ts","../src/useAfterRouteChange.ts"],"sourcesContent":["import type { Permission } from \"@entur-partner/permission-client-node\";\nimport { assertIsDefined } from \"@entur-partner/util\";\nimport {\n\tcreateContext,\n\ttype FC,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from \"react\";\n\nimport type { User } from \"./types\";\n\ninterface AppContextType {\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tlogout?: () => void;\n\tactiveOrgId: number;\n\tnavigate: (path: string) => void;\n}\n\nexport const AppContext = createContext<AppContextType | undefined>(undefined);\n\nexport const useUser = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.user;\n};\n\nexport const useActiveOrgId = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.activeOrgId;\n};\n\nexport interface AppProviderProps {\n\tchildren: ReactNode;\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tgetPermissions: () => Promise<Permission[]>;\n\torganisationId: string;\n\tnavigate: (path: string) => void;\n}\n\nexport const useNavigate = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.navigate;\n};\n\nexport const AppProvider: FC<AppProviderProps> = ({\n\tchildren,\n\torganisationId,\n\tgetPermissions,\n\t...rest\n}) => {\n\tconst [permissions, setPermissions] = useState<Permission[]>([]);\n\n\tuseEffect(() => {\n\t\tasync function fetchData() {\n\t\t\ttry {\n\t\t\t\tconst fetchedPermissions = await getPermissions();\n\t\t\t\tsetPermissions(fetchedPermissions);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Fetching permissions with the provided getPermissions function failed in AppProvider with the following error:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfetchData();\n\t}, [getPermissions]);\n\n\treturn (\n\t\t<AppContext.Provider\n\t\t\tvalue={{\n\t\t\t\t...rest,\n\t\t\t\tuser: { ...rest.user, permissions: permissions },\n\t\t\t\tactiveOrgId: Number(organisationId),\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AppContext.Provider>\n\t);\n};\n","import type { MicroFrontendPayload } from \"./types\";\n\ntype MountEventDetail = {\n\tid: string;\n\tmountPoint: HTMLDivElement;\n\tpayload: MicroFrontendPayload;\n};\n\ntype UnmountEventDetail = {\n\tid: string;\n\tmountPoint: HTMLDivElement;\n};\n\nexport const MOUNT_EVENT_TYPE = \"@entur-partner:mount\";\nexport const UNMOUNT_EVENT_TYPE = \"@entur-partner:unmount\";\n\nexport interface MountEvent extends CustomEvent<MountEventDetail> {}\nexport interface UnmountEvent extends CustomEvent<UnmountEventDetail> {}\n\nexport function createMountEvent(detail: MountEventDetail) {\n\treturn new CustomEvent<MountEventDetail>(MOUNT_EVENT_TYPE, { detail });\n}\n\nexport function createUnmountEvent(detail: UnmountEventDetail) {\n\treturn new CustomEvent<UnmountEventDetail>(UNMOUNT_EVENT_TYPE, { detail });\n}\n\nexport const ROUTE_CHANGE_EVENT_TYPE = \"@entur-partner:after-route-change\";\n\nexport type RouteAction = \"PUSH\" | \"POP\" | \"REPLACE\";\n\ntype RouteChangeEventDetail = {\n\tlocation: Location;\n\tpath: string;\n\taction: RouteAction;\n};\n\nexport class RouteChangeEvent extends CustomEvent<RouteChangeEventDetail> {}\n\nexport function createRouteChangeEvent(detail: RouteChangeEventDetail) {\n\treturn new RouteChangeEvent(ROUTE_CHANGE_EVENT_TYPE, {\n\t\tdetail,\n\t\tcancelable: true, // Allow listeners to call event.preventDefault() to indicate they handled the navigation\n\t});\n}\n\nexport interface MenuItemsEvent extends CustomEvent<MenuItemsEventDetail> {}\n\nexport const MENU_ITEMS_EVENT_TYPE = \"@entur-partner:menu-items-added\";\n\nexport interface MenuItemDetail {\n\ttitle: string;\n\tto: string;\n\tdisabled?: boolean;\n}\n\ntype MenuItemsEventDetail = {\n\tpath: string;\n\titems: MenuItemDetail[];\n};\n\nexport function createMenuItemsEvent(detail: MenuItemsEventDetail) {\n\treturn new CustomEvent<MenuItemsEventDetail>(MENU_ITEMS_EVENT_TYPE, {\n\t\tdetail,\n\t});\n}\n","import {\n\tMOUNT_EVENT_TYPE,\n\ttype MountEvent,\n\tUNMOUNT_EVENT_TYPE,\n\ttype UnmountEvent,\n} from \"./events\";\nimport type { MicroFrontendPayload } from \"./types\";\n\ninterface Config {\n\tmicroFrontendId: string;\n\tmount: (\n\t\tmountPoint: HTMLDivElement,\n\t\tpayload: MicroFrontendPayload,\n\t\tdeprecatedMountPoint: HTMLDivElement,\n\t) => void;\n\tunmount: (mountPoint: HTMLDivElement) => void;\n}\n\nexport function registerMicroFrontend(config: Config): void {\n\tconst { unmount, microFrontendId, mount } = config;\n\n\twindow.addEventListener(MOUNT_EVENT_TYPE, ((event: MountEvent) => {\n\t\tif (!event.detail.id.startsWith(microFrontendId)) {\n\t\t\treturn;\n\t\t}\n\t\tmount(\n\t\t\tevent.detail.mountPoint,\n\t\t\tevent.detail.payload,\n\t\t\tevent.detail.mountPoint,\n\t\t);\n\t}) as EventListener);\n\n\twindow.addEventListener(UNMOUNT_EVENT_TYPE, ((event: UnmountEvent) => {\n\t\tif (!event.detail.id.startsWith(microFrontendId)) {\n\t\t\treturn;\n\t\t}\n\t\tunmount(event.detail.mountPoint);\n\t}) as EventListener);\n}\n","import { useEffect, useRef } from \"react\";\n\nimport { ROUTE_CHANGE_EVENT_TYPE, type RouteChangeEvent } from \"./events\";\n\n/**\n * Subscribes to the `@entur-partner:after-route-change` event dispatched by\n * the sidebar when a navigation link is activated. The event is cancelable:\n * call `event.preventDefault()` inside the handler to signal that the host\n * application handled the navigation.\n *\n * The handler is stored in a ref so callers do not need to memoize it; the\n * listener itself is subscribed once per mount.\n */\nexport function useAfterRouteChange(\n\thandler: (event: RouteChangeEvent) => void,\n): void {\n\tconst handlerRef = useRef(handler);\n\n\tuseEffect(() => {\n\t\thandlerRef.current = handler;\n\t});\n\n\tuseEffect(() => {\n\t\tconst listener = (event: Event) => {\n\t\t\thandlerRef.current(event as RouteChangeEvent);\n\t\t};\n\t\twindow.addEventListener(ROUTE_CHANGE_EVENT_TYPE, listener);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(ROUTE_CHANGE_EVENT_TYPE, listener);\n\t\t};\n\t}, []);\n}\n"],"mappings":"0JAqBA,IAAa,GAAA,EAAA,EAAA,eAAuD,IAAA,GAAU,CAEjE,MAAgB,CAC5B,IAAM,GAAA,EAAA,EAAA,YAAqB,EAAW,CAEtC,OADA,EAAA,EAAA,iBAAgB,EAAQ,CACjB,EAAQ,MAGH,MAAuB,CACnC,IAAM,GAAA,EAAA,EAAA,YAAqB,EAAW,CAEtC,OADA,EAAA,EAAA,iBAAgB,EAAQ,CACjB,EAAQ,aAYH,MAAoB,CAChC,IAAM,GAAA,EAAA,EAAA,YAAqB,EAAW,CAEtC,OADA,EAAA,EAAA,iBAAgB,EAAQ,CACjB,EAAQ,UAGH,GAAqC,CACjD,WACA,iBACA,iBACA,GAAG,KACE,CACL,GAAM,CAAC,EAAa,IAAA,EAAA,EAAA,UAAyC,EAAE,CAAC,CAkBhE,OAhBA,EAAA,EAAA,eAAgB,CACf,eAAe,GAAY,CAC1B,GAAI,CAEH,EAD2B,MAAM,GAAgB,CACf,OAC1B,EAAO,CACf,QAAQ,MACP,iHACA,EACA,EAIH,GAAW,EACT,CAAC,EAAe,CAAC,EAGnB,EAAA,EAAA,KAAC,EAAW,SAAZ,CACC,MAAO,CACN,GAAG,EACH,KAAM,CAAE,GAAG,EAAK,KAAmB,cAAa,CAChD,YAAa,OAAO,EAAe,CACnC,CAEA,WACoB,CAAA,ECtEX,EAAmB,uBACnB,EAAqB,yBAKlC,SAAgB,EAAiB,EAA0B,CAC1D,OAAO,IAAI,YAA8B,EAAkB,CAAE,SAAQ,CAAC,CAGvE,SAAgB,EAAmB,EAA4B,CAC9D,OAAO,IAAI,YAAgC,EAAoB,CAAE,SAAQ,CAAC,CAG3E,IAAa,EAA0B,oCAU1B,EAAb,cAAsC,WAAoC,GAE1E,SAAgB,EAAuB,EAAgC,CACtE,OAAO,IAAI,EAAiB,EAAyB,CACpD,SACA,WAAY,GACZ,CAAC,CAKH,IAAa,EAAwB,kCAarC,SAAgB,EAAqB,EAA8B,CAClE,OAAO,IAAI,YAAkC,EAAuB,CACnE,SACA,CAAC,CC9CH,SAAgB,EAAsB,EAAsB,CAC3D,GAAM,CAAE,UAAS,kBAAiB,SAAU,EAE5C,OAAO,iBAAiB,GAAoB,GAAsB,CAC5D,EAAM,OAAO,GAAG,WAAW,EAAgB,EAGhD,EACC,EAAM,OAAO,WACb,EAAM,OAAO,QACb,EAAM,OAAO,WACb,GACkB,CAEpB,OAAO,iBAAiB,GAAsB,GAAwB,CAChE,EAAM,OAAO,GAAG,WAAW,EAAgB,EAGhD,EAAQ,EAAM,OAAO,WAAW,GACb,CCxBrB,SAAgB,EACf,EACO,CACP,IAAM,GAAA,EAAA,EAAA,QAAoB,EAAQ,EAElC,EAAA,EAAA,eAAgB,CACf,EAAW,QAAU,GACpB,EAEF,EAAA,EAAA,eAAgB,CACf,IAAM,EAAY,GAAiB,CAClC,EAAW,QAAQ,EAA0B,EAG9C,OADA,OAAO,iBAAiB,EAAyB,EAAS,KAC7C,CACZ,OAAO,oBAAoB,EAAyB,EAAS,GAE5D,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export type { AppProviderProps } from "./AppProvider";
|
|
2
2
|
export { AppProvider, useActiveOrgId, useNavigate, useUser, } from "./AppProvider";
|
|
3
|
-
export type { MountEvent, RouteAction, UnmountEvent, } from "./events";
|
|
4
|
-
export { createMountEvent, createUnmountEvent, MOUNT_EVENT_TYPE, ROUTE_CHANGE_EVENT_TYPE, RouteChangeEvent, UNMOUNT_EVENT_TYPE, } from "./events";
|
|
5
|
-
export { registerMicroFrontend
|
|
6
|
-
export type { MenuItem, MicroFrontendPayload, NavigationFunction,
|
|
3
|
+
export type { MenuItemDetail, MenuItemsEvent, MountEvent, RouteAction, UnmountEvent, } from "./events";
|
|
4
|
+
export { createMenuItemsEvent, createMountEvent, createRouteChangeEvent, createUnmountEvent, MENU_ITEMS_EVENT_TYPE, MOUNT_EVENT_TYPE, ROUTE_CHANGE_EVENT_TYPE, RouteChangeEvent, UNMOUNT_EVENT_TYPE, } from "./events";
|
|
5
|
+
export { registerMicroFrontend } from "./registerMicroFrontend";
|
|
6
|
+
export type { MenuItem, MicroFrontendPayload, NavigationFunction, User, } from "./types";
|
|
7
|
+
export { useAfterRouteChange } from "./useAfterRouteChange";
|
package/dist/index.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { assertIsDefined as e } from "@entur-partner/util";
|
|
2
|
-
import { createContext as t, useContext as n, useEffect as r,
|
|
3
|
-
import { jsx as
|
|
2
|
+
import { createContext as t, useContext as n, useEffect as r, useRef as i, useState as a } from "react";
|
|
3
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
4
4
|
//#region src/AppProvider.tsx
|
|
5
|
-
var
|
|
6
|
-
let t = n(
|
|
5
|
+
var s = t(void 0), c = () => {
|
|
6
|
+
let t = n(s);
|
|
7
7
|
return e(t), t.user;
|
|
8
|
-
}, c = () => {
|
|
9
|
-
let t = n(o);
|
|
10
|
-
return e(t), t.activeOrgId;
|
|
11
8
|
}, l = () => {
|
|
12
|
-
let t = n(
|
|
9
|
+
let t = n(s);
|
|
10
|
+
return e(t), t.activeOrgId;
|
|
11
|
+
}, u = () => {
|
|
12
|
+
let t = n(s);
|
|
13
13
|
return e(t), t.navigate;
|
|
14
|
-
},
|
|
15
|
-
let [c, l] =
|
|
14
|
+
}, d = ({ children: e, organisationId: t, getPermissions: n, ...i }) => {
|
|
15
|
+
let [c, l] = a([]);
|
|
16
16
|
return r(() => {
|
|
17
17
|
async function e() {
|
|
18
18
|
try {
|
|
@@ -22,44 +22,61 @@ var o = t(void 0), s = () => {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
e();
|
|
25
|
-
}, [n]), /* @__PURE__ */
|
|
25
|
+
}, [n]), /* @__PURE__ */ o(s.Provider, {
|
|
26
26
|
value: {
|
|
27
|
-
...
|
|
27
|
+
...i,
|
|
28
28
|
user: {
|
|
29
|
-
...
|
|
29
|
+
...i.user,
|
|
30
30
|
permissions: c
|
|
31
31
|
},
|
|
32
32
|
activeOrgId: Number(t)
|
|
33
33
|
},
|
|
34
34
|
children: e
|
|
35
35
|
});
|
|
36
|
-
},
|
|
37
|
-
function p(e) {
|
|
38
|
-
return new CustomEvent(d, { detail: e });
|
|
39
|
-
}
|
|
36
|
+
}, f = "@entur-partner:mount", p = "@entur-partner:unmount";
|
|
40
37
|
function m(e) {
|
|
41
38
|
return new CustomEvent(f, { detail: e });
|
|
42
39
|
}
|
|
43
|
-
|
|
40
|
+
function h(e) {
|
|
41
|
+
return new CustomEvent(p, { detail: e });
|
|
42
|
+
}
|
|
43
|
+
var g = "@entur-partner:after-route-change", _ = class extends CustomEvent {};
|
|
44
|
+
function v(e) {
|
|
45
|
+
return new _(g, {
|
|
46
|
+
detail: e,
|
|
47
|
+
cancelable: !0
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
var y = "@entur-partner:menu-items-added";
|
|
51
|
+
function b(e) {
|
|
52
|
+
return new CustomEvent(y, { detail: e });
|
|
53
|
+
}
|
|
44
54
|
//#endregion
|
|
45
55
|
//#region src/registerMicroFrontend.ts
|
|
46
|
-
function
|
|
47
|
-
let { unmount: t, microFrontendId: n, mount: r } = e
|
|
56
|
+
function x(e) {
|
|
57
|
+
let { unmount: t, microFrontendId: n, mount: r } = e;
|
|
58
|
+
window.addEventListener(f, ((e) => {
|
|
48
59
|
e.detail.id.startsWith(n) && r(e.detail.mountPoint, e.detail.payload, e.detail.mountPoint);
|
|
49
|
-
}),
|
|
60
|
+
})), window.addEventListener(p, ((e) => {
|
|
50
61
|
e.detail.id.startsWith(n) && t(e.detail.mountPoint);
|
|
51
|
-
});
|
|
52
|
-
return window.addEventListener(d, i), window.addEventListener(f, a), () => {
|
|
53
|
-
window.removeEventListener(d, i), window.removeEventListener(f, a);
|
|
54
|
-
};
|
|
62
|
+
}));
|
|
55
63
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/useAfterRouteChange.ts
|
|
66
|
+
function S(e) {
|
|
67
|
+
let t = i(e);
|
|
68
|
+
r(() => {
|
|
69
|
+
t.current = e;
|
|
70
|
+
}), r(() => {
|
|
71
|
+
let e = (e) => {
|
|
72
|
+
t.current(e);
|
|
73
|
+
};
|
|
74
|
+
return window.addEventListener(g, e), () => {
|
|
75
|
+
window.removeEventListener(g, e);
|
|
76
|
+
};
|
|
77
|
+
}, []);
|
|
61
78
|
}
|
|
62
79
|
//#endregion
|
|
63
|
-
export {
|
|
80
|
+
export { d as AppProvider, y as MENU_ITEMS_EVENT_TYPE, f as MOUNT_EVENT_TYPE, g as ROUTE_CHANGE_EVENT_TYPE, _ as RouteChangeEvent, p as UNMOUNT_EVENT_TYPE, b as createMenuItemsEvent, m as createMountEvent, v as createRouteChangeEvent, h as createUnmountEvent, x as registerMicroFrontend, l as useActiveOrgId, S as useAfterRouteChange, u as useNavigate, c as useUser };
|
|
64
81
|
|
|
65
82
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/AppProvider.tsx","../src/events.ts","../src/registerMicroFrontend.ts"],"sourcesContent":["import type { Permission } from \"@entur-partner/permission-client-node\";\nimport { assertIsDefined } from \"@entur-partner/util\";\nimport {\n\tcreateContext,\n\ttype FC,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from \"react\";\n\nimport type { User } from \"./types\";\n\ninterface AppContextType {\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tlogout?: () => void;\n\tactiveOrgId: number;\n\tnavigate: (path: string) => void;\n}\n\nexport const AppContext = createContext<AppContextType | undefined>(undefined);\n\nexport const useUser = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.user;\n};\n\nexport const useActiveOrgId = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.activeOrgId;\n};\n\nexport interface AppProviderProps {\n\tchildren: ReactNode;\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tgetPermissions: () => Promise<Permission[]>;\n\torganisationId: string;\n\tnavigate: (path: string) => void;\n}\n\nexport const useNavigate = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.navigate;\n};\n\nexport const AppProvider: FC<AppProviderProps> = ({\n\tchildren,\n\torganisationId,\n\tgetPermissions,\n\t...rest\n}) => {\n\tconst [permissions, setPermissions] = useState<Permission[]>([]);\n\n\tuseEffect(() => {\n\t\tasync function fetchData() {\n\t\t\ttry {\n\t\t\t\tconst fetchedPermissions = await getPermissions();\n\t\t\t\tsetPermissions(fetchedPermissions);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Fetching permissions with the provided getPermissions function failed in AppProvider with the following error:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfetchData();\n\t}, [getPermissions]);\n\n\treturn (\n\t\t<AppContext.Provider\n\t\t\tvalue={{\n\t\t\t\t...rest,\n\t\t\t\tuser: { ...rest.user, permissions: permissions },\n\t\t\t\tactiveOrgId: Number(organisationId),\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AppContext.Provider>\n\t);\n};\n","import type { MicroFrontendPayload
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/AppProvider.tsx","../src/events.ts","../src/registerMicroFrontend.ts","../src/useAfterRouteChange.ts"],"sourcesContent":["import type { Permission } from \"@entur-partner/permission-client-node\";\nimport { assertIsDefined } from \"@entur-partner/util\";\nimport {\n\tcreateContext,\n\ttype FC,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from \"react\";\n\nimport type { User } from \"./types\";\n\ninterface AppContextType {\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tlogout?: () => void;\n\tactiveOrgId: number;\n\tnavigate: (path: string) => void;\n}\n\nexport const AppContext = createContext<AppContextType | undefined>(undefined);\n\nexport const useUser = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.user;\n};\n\nexport const useActiveOrgId = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.activeOrgId;\n};\n\nexport interface AppProviderProps {\n\tchildren: ReactNode;\n\tgetToken: () => Promise<string>;\n\tuser: User;\n\tgetPermissions: () => Promise<Permission[]>;\n\torganisationId: string;\n\tnavigate: (path: string) => void;\n}\n\nexport const useNavigate = () => {\n\tconst context = useContext(AppContext);\n\tassertIsDefined(context);\n\treturn context.navigate;\n};\n\nexport const AppProvider: FC<AppProviderProps> = ({\n\tchildren,\n\torganisationId,\n\tgetPermissions,\n\t...rest\n}) => {\n\tconst [permissions, setPermissions] = useState<Permission[]>([]);\n\n\tuseEffect(() => {\n\t\tasync function fetchData() {\n\t\t\ttry {\n\t\t\t\tconst fetchedPermissions = await getPermissions();\n\t\t\t\tsetPermissions(fetchedPermissions);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Fetching permissions with the provided getPermissions function failed in AppProvider with the following error:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfetchData();\n\t}, [getPermissions]);\n\n\treturn (\n\t\t<AppContext.Provider\n\t\t\tvalue={{\n\t\t\t\t...rest,\n\t\t\t\tuser: { ...rest.user, permissions: permissions },\n\t\t\t\tactiveOrgId: Number(organisationId),\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AppContext.Provider>\n\t);\n};\n","import type { MicroFrontendPayload } from \"./types\";\n\ntype MountEventDetail = {\n\tid: string;\n\tmountPoint: HTMLDivElement;\n\tpayload: MicroFrontendPayload;\n};\n\ntype UnmountEventDetail = {\n\tid: string;\n\tmountPoint: HTMLDivElement;\n};\n\nexport const MOUNT_EVENT_TYPE = \"@entur-partner:mount\";\nexport const UNMOUNT_EVENT_TYPE = \"@entur-partner:unmount\";\n\nexport interface MountEvent extends CustomEvent<MountEventDetail> {}\nexport interface UnmountEvent extends CustomEvent<UnmountEventDetail> {}\n\nexport function createMountEvent(detail: MountEventDetail) {\n\treturn new CustomEvent<MountEventDetail>(MOUNT_EVENT_TYPE, { detail });\n}\n\nexport function createUnmountEvent(detail: UnmountEventDetail) {\n\treturn new CustomEvent<UnmountEventDetail>(UNMOUNT_EVENT_TYPE, { detail });\n}\n\nexport const ROUTE_CHANGE_EVENT_TYPE = \"@entur-partner:after-route-change\";\n\nexport type RouteAction = \"PUSH\" | \"POP\" | \"REPLACE\";\n\ntype RouteChangeEventDetail = {\n\tlocation: Location;\n\tpath: string;\n\taction: RouteAction;\n};\n\nexport class RouteChangeEvent extends CustomEvent<RouteChangeEventDetail> {}\n\nexport function createRouteChangeEvent(detail: RouteChangeEventDetail) {\n\treturn new RouteChangeEvent(ROUTE_CHANGE_EVENT_TYPE, {\n\t\tdetail,\n\t\tcancelable: true, // Allow listeners to call event.preventDefault() to indicate they handled the navigation\n\t});\n}\n\nexport interface MenuItemsEvent extends CustomEvent<MenuItemsEventDetail> {}\n\nexport const MENU_ITEMS_EVENT_TYPE = \"@entur-partner:menu-items-added\";\n\nexport interface MenuItemDetail {\n\ttitle: string;\n\tto: string;\n\tdisabled?: boolean;\n}\n\ntype MenuItemsEventDetail = {\n\tpath: string;\n\titems: MenuItemDetail[];\n};\n\nexport function createMenuItemsEvent(detail: MenuItemsEventDetail) {\n\treturn new CustomEvent<MenuItemsEventDetail>(MENU_ITEMS_EVENT_TYPE, {\n\t\tdetail,\n\t});\n}\n","import {\n\tMOUNT_EVENT_TYPE,\n\ttype MountEvent,\n\tUNMOUNT_EVENT_TYPE,\n\ttype UnmountEvent,\n} from \"./events\";\nimport type { MicroFrontendPayload } from \"./types\";\n\ninterface Config {\n\tmicroFrontendId: string;\n\tmount: (\n\t\tmountPoint: HTMLDivElement,\n\t\tpayload: MicroFrontendPayload,\n\t\tdeprecatedMountPoint: HTMLDivElement,\n\t) => void;\n\tunmount: (mountPoint: HTMLDivElement) => void;\n}\n\nexport function registerMicroFrontend(config: Config): void {\n\tconst { unmount, microFrontendId, mount } = config;\n\n\twindow.addEventListener(MOUNT_EVENT_TYPE, ((event: MountEvent) => {\n\t\tif (!event.detail.id.startsWith(microFrontendId)) {\n\t\t\treturn;\n\t\t}\n\t\tmount(\n\t\t\tevent.detail.mountPoint,\n\t\t\tevent.detail.payload,\n\t\t\tevent.detail.mountPoint,\n\t\t);\n\t}) as EventListener);\n\n\twindow.addEventListener(UNMOUNT_EVENT_TYPE, ((event: UnmountEvent) => {\n\t\tif (!event.detail.id.startsWith(microFrontendId)) {\n\t\t\treturn;\n\t\t}\n\t\tunmount(event.detail.mountPoint);\n\t}) as EventListener);\n}\n","import { useEffect, useRef } from \"react\";\n\nimport { ROUTE_CHANGE_EVENT_TYPE, type RouteChangeEvent } from \"./events\";\n\n/**\n * Subscribes to the `@entur-partner:after-route-change` event dispatched by\n * the sidebar when a navigation link is activated. The event is cancelable:\n * call `event.preventDefault()` inside the handler to signal that the host\n * application handled the navigation.\n *\n * The handler is stored in a ref so callers do not need to memoize it; the\n * listener itself is subscribed once per mount.\n */\nexport function useAfterRouteChange(\n\thandler: (event: RouteChangeEvent) => void,\n): void {\n\tconst handlerRef = useRef(handler);\n\n\tuseEffect(() => {\n\t\thandlerRef.current = handler;\n\t});\n\n\tuseEffect(() => {\n\t\tconst listener = (event: Event) => {\n\t\t\thandlerRef.current(event as RouteChangeEvent);\n\t\t};\n\t\twindow.addEventListener(ROUTE_CHANGE_EVENT_TYPE, listener);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(ROUTE_CHANGE_EVENT_TYPE, listener);\n\t\t};\n\t}, []);\n}\n"],"mappings":";;;;AAqBA,IAAa,IAAa,EAA0C,KAAA,EAAU,EAEjE,UAAgB;CAC5B,IAAM,IAAU,EAAW,EAAW;AAEtC,QADA,EAAgB,EAAQ,EACjB,EAAQ;GAGH,UAAuB;CACnC,IAAM,IAAU,EAAW,EAAW;AAEtC,QADA,EAAgB,EAAQ,EACjB,EAAQ;GAYH,UAAoB;CAChC,IAAM,IAAU,EAAW,EAAW;AAEtC,QADA,EAAgB,EAAQ,EACjB,EAAQ;GAGH,KAAqC,EACjD,aACA,mBACA,mBACA,GAAG,QACE;CACL,IAAM,CAAC,GAAa,KAAkB,EAAuB,EAAE,CAAC;AAkBhE,QAhBA,QAAgB;EACf,eAAe,IAAY;AAC1B,OAAI;AAEH,MAD2B,MAAM,GAAgB,CACf;YAC1B,GAAO;AACf,YAAQ,MACP,kHACA,EACA;;;AAIH,KAAW;IACT,CAAC,EAAe,CAAC,EAGnB,kBAAC,EAAW,UAAZ;EACC,OAAO;GACN,GAAG;GACH,MAAM;IAAE,GAAG,EAAK;IAAmB;IAAa;GAChD,aAAa,OAAO,EAAe;GACnC;EAEA;EACoB,CAAA;GCtEX,IAAmB,wBACnB,IAAqB;AAKlC,SAAgB,EAAiB,GAA0B;AAC1D,QAAO,IAAI,YAA8B,GAAkB,EAAE,WAAQ,CAAC;;AAGvE,SAAgB,EAAmB,GAA4B;AAC9D,QAAO,IAAI,YAAgC,GAAoB,EAAE,WAAQ,CAAC;;AAG3E,IAAa,IAA0B,qCAU1B,IAAb,cAAsC,YAAoC;AAE1E,SAAgB,EAAuB,GAAgC;AACtE,QAAO,IAAI,EAAiB,GAAyB;EACpD;EACA,YAAY;EACZ,CAAC;;AAKH,IAAa,IAAwB;AAarC,SAAgB,EAAqB,GAA8B;AAClE,QAAO,IAAI,YAAkC,GAAuB,EACnE,WACA,CAAC;;;;AC9CH,SAAgB,EAAsB,GAAsB;CAC3D,IAAM,EAAE,YAAS,oBAAiB,aAAU;AAa5C,CAXA,OAAO,iBAAiB,KAAoB,MAAsB;AAC5D,IAAM,OAAO,GAAG,WAAW,EAAgB,IAGhD,EACC,EAAM,OAAO,YACb,EAAM,OAAO,SACb,EAAM,OAAO,WACb;IACkB,EAEpB,OAAO,iBAAiB,KAAsB,MAAwB;AAChE,IAAM,OAAO,GAAG,WAAW,EAAgB,IAGhD,EAAQ,EAAM,OAAO,WAAW;IACb;;;;ACxBrB,SAAgB,EACf,GACO;CACP,IAAM,IAAa,EAAO,EAAQ;AAMlC,CAJA,QAAgB;AACf,IAAW,UAAU;GACpB,EAEF,QAAgB;EACf,IAAM,KAAY,MAAiB;AAClC,KAAW,QAAQ,EAA0B;;AAG9C,SADA,OAAO,iBAAiB,GAAyB,EAAS,QAC7C;AACZ,UAAO,oBAAoB,GAAyB,EAAS;;IAE5D,EAAE,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type { MicroFrontendPayload
|
|
2
|
-
|
|
1
|
+
import type { MicroFrontendPayload } from "./types";
|
|
2
|
+
interface Config {
|
|
3
3
|
microFrontendId: string;
|
|
4
|
-
mount: (mountPoint: HTMLDivElement, payload:
|
|
4
|
+
mount: (mountPoint: HTMLDivElement, payload: MicroFrontendPayload, deprecatedMountPoint: HTMLDivElement) => void;
|
|
5
5
|
unmount: (mountPoint: HTMLDivElement) => void;
|
|
6
|
-
}
|
|
7
|
-
export declare function registerMicroFrontend(config: Config
|
|
8
|
-
export declare function registerPublicMicroFrontend(config: Config<PublicMicroFrontendPayload>): () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerMicroFrontend(config: Config): void;
|
|
9
8
|
export {};
|
package/dist/types.d.ts
CHANGED
|
@@ -31,8 +31,6 @@ export interface MenuItem {
|
|
|
31
31
|
navigate: (path: string) => void;
|
|
32
32
|
/** Is menu item disabled? */
|
|
33
33
|
disabled?: boolean;
|
|
34
|
-
/** Is public menu item? */
|
|
35
|
-
isPublic?: boolean;
|
|
36
34
|
/** Permissions required to view menu item */
|
|
37
35
|
requiredPermissions?: {
|
|
38
36
|
oneOf?: BusinessCapability[];
|
|
@@ -60,12 +58,3 @@ export interface MicroFrontendPayload {
|
|
|
60
58
|
* will try to use the navigate function from the first menu item instead. */
|
|
61
59
|
setMFNavigate: (navigate: NavigationFunction) => void;
|
|
62
60
|
}
|
|
63
|
-
export type PublicMicroFrontendPayload = Pick<MicroFrontendPayload, "language" | "navigate" | "setMFNavigate" | "addMenuItems"> & {
|
|
64
|
-
user?: User;
|
|
65
|
-
/** Function for getting an accessToken */
|
|
66
|
-
getToken?(options?: GetTokenSilentlyOptions): Promise<string>;
|
|
67
|
-
/** Active organisation identifier*/
|
|
68
|
-
organisationId?: string;
|
|
69
|
-
/** Log the user out */
|
|
70
|
-
logout?: () => void;
|
|
71
|
-
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type RouteChangeEvent } from "./events";
|
|
2
|
+
/**
|
|
3
|
+
* Subscribes to the `@entur-partner:after-route-change` event dispatched by
|
|
4
|
+
* the sidebar when a navigation link is activated. The event is cancelable:
|
|
5
|
+
* call `event.preventDefault()` inside the handler to signal that the host
|
|
6
|
+
* application handled the navigation.
|
|
7
|
+
*
|
|
8
|
+
* The handler is stored in a ref so callers do not need to memoize it; the
|
|
9
|
+
* listener itself is subscribed once per mount.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useAfterRouteChange(handler: (event: RouteChangeEvent) => void): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@entur-partner/micro-frontend",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"license": "EUPL-1.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"react-dom": ">=18.0.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@auth0/auth0-spa-js": "2.19.
|
|
33
|
+
"@auth0/auth0-spa-js": "2.19.2",
|
|
34
34
|
"@entur-partner/permission-client-node": "3.6.2",
|
|
35
|
-
"posthog-js": "^1.
|
|
35
|
+
"posthog-js": "^1.369.5"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@entur-partner/util": "^1.
|
|
38
|
+
"@entur-partner/util": "^1.3.11"
|
|
39
39
|
},
|
|
40
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "f8fe5c1165bd5929248e45e8292f15660456bcab"
|
|
41
41
|
}
|