@entur-partner/micro-frontend 2.8.0 → 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/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){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)}))}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.useNavigate=o,exports.useUser=i;
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
@@ -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 } 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","/*global EventListener*/\n\nimport {\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"],"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,CC5CH,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"}
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
@@ -4,3 +4,4 @@ export type { MenuItemDetail, MenuItemsEvent, MountEvent, RouteAction, UnmountEv
4
4
  export { createMenuItemsEvent, createMountEvent, createRouteChangeEvent, createUnmountEvent, MENU_ITEMS_EVENT_TYPE, MOUNT_EVENT_TYPE, ROUTE_CHANGE_EVENT_TYPE, RouteChangeEvent, UNMOUNT_EVENT_TYPE, } from "./events";
5
5
  export { registerMicroFrontend } from "./registerMicroFrontend";
6
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, useState as i } from "react";
3
- import { jsx as a } from "react/jsx-runtime";
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 o = t(void 0), s = () => {
6
- let t = n(o);
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(o);
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
- }, u = ({ children: e, organisationId: t, getPermissions: n, ...s }) => {
15
- let [c, l] = i([]);
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,46 +22,61 @@ var o = t(void 0), s = () => {
22
22
  }
23
23
  }
24
24
  e();
25
- }, [n]), /* @__PURE__ */ a(o.Provider, {
25
+ }, [n]), /* @__PURE__ */ o(s.Provider, {
26
26
  value: {
27
- ...s,
27
+ ...i,
28
28
  user: {
29
- ...s.user,
29
+ ...i.user,
30
30
  permissions: c
31
31
  },
32
32
  activeOrgId: Number(t)
33
33
  },
34
34
  children: e
35
35
  });
36
- }, d = "@entur-partner:mount", f = "@entur-partner:unmount";
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
- var h = "@entur-partner:after-route-change", g = class extends CustomEvent {};
44
- function _(e) {
45
- return new g(h, {
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
46
  detail: e,
47
47
  cancelable: !0
48
48
  });
49
49
  }
50
- var v = "@entur-partner:menu-items-added";
51
- function y(e) {
52
- return new CustomEvent(v, { detail: e });
50
+ var y = "@entur-partner:menu-items-added";
51
+ function b(e) {
52
+ return new CustomEvent(y, { detail: e });
53
53
  }
54
54
  //#endregion
55
55
  //#region src/registerMicroFrontend.ts
56
- function b(e) {
56
+ function x(e) {
57
57
  let { unmount: t, microFrontendId: n, mount: r } = e;
58
- window.addEventListener(d, ((e) => {
58
+ window.addEventListener(f, ((e) => {
59
59
  e.detail.id.startsWith(n) && r(e.detail.mountPoint, e.detail.payload, e.detail.mountPoint);
60
- })), window.addEventListener(f, ((e) => {
60
+ })), window.addEventListener(p, ((e) => {
61
61
  e.detail.id.startsWith(n) && t(e.detail.mountPoint);
62
62
  }));
63
63
  }
64
64
  //#endregion
65
- export { u as AppProvider, v as MENU_ITEMS_EVENT_TYPE, d as MOUNT_EVENT_TYPE, h as ROUTE_CHANGE_EVENT_TYPE, g as RouteChangeEvent, f as UNMOUNT_EVENT_TYPE, y as createMenuItemsEvent, p as createMountEvent, _ as createRouteChangeEvent, m as createUnmountEvent, b as registerMicroFrontend, c as useActiveOrgId, l as useNavigate, s as useUser };
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
+ }, []);
78
+ }
79
+ //#endregion
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 };
66
81
 
67
82
  //# sourceMappingURL=index.mjs.map
@@ -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 } 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","/*global EventListener*/\n\nimport {\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"],"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;;;;AC5CH,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"}
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"}
@@ -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.8.0",
3
+ "version": "2.9.0",
4
4
  "license": "EUPL-1.2",
5
5
  "type": "module",
6
6
  "exports": {
@@ -37,5 +37,5 @@
37
37
  "dependencies": {
38
38
  "@entur-partner/util": "^1.3.11"
39
39
  },
40
- "gitHead": "1af1998d2cbd7e48b85ee0ce7ea6d53bb2200fa6"
40
+ "gitHead": "f8fe5c1165bd5929248e45e8292f15660456bcab"
41
41
  }