+ if (nextSearchParams.toString() !== previousSearchParams.toString()) {
+ resetScroll = true
+ }
+ } catch (e) {
+ console.error('Cannot parse URL to check next scroll.', e)
+ resetScroll = true
+ }
+ })
+
+ // Plugin hooks
+ navigationEndEvent.subscribe(e => {
+ this.hooks.runAction('action:router.navigation-end', 'common', { path: e.url })
+ })
+
+ // Automatically hide/display the menu
+ eventsObs.pipe(
+ filter((e: Event): e is GuardsCheckStart => e instanceof GuardsCheckStart),
+ filter(() => this.screenService.isInSmallView() || this.screenService.isInTouchScreen())
+ ).subscribe(() => this.menu.setMenuDisplay(false)) // User clicked on a link in the menu, change the page
+
+ // Handle lazy loaded module
+ eventsObs.pipe(
+ filter((e: Event): e is RouteConfigLoadStart => e instanceof RouteConfigLoadStart)
+ ).subscribe(() => this.loadingBar.useRef().start())
+
+ eventsObs.pipe(
+ filter((e: Event): e is RouteConfigLoadEnd => e instanceof RouteConfigLoadEnd)
+ ).subscribe(() => this.loadingBar.useRef().complete())
+ }
+
+ private async injectBroadcastMessage () {
+ this.broadcastMessage = null
+ this.screenService.isBroadcastMessageDisplayed = false
+
+ const messageConfig = this.serverConfig.broadcastMessage
+
+ if (messageConfig.enabled) {
+ // Already dismissed this message?
+ if (messageConfig.dismissable && localStorage.getItem(AppComponent.BROADCAST_MESSAGE_KEY) === messageConfig.message) {
+ return
+ }
+
+ const classes: { [id in BroadcastMessageLevel]: string } = {
+ info: 'alert-info',
+ warning: 'alert-warning',
+ error: 'alert-danger'
+ }
+
+ this.broadcastMessage = {
+ message: await this.markdownService.unsafeMarkdownToHTML(messageConfig.message, true),
+ dismissable: messageConfig.dismissable,
+ class: classes[messageConfig.level]
+ }
+
+ this.screenService.isBroadcastMessageDisplayed = true
+ }
+ }
+
+ private injectJS () {