import { Injectable, effect, } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { Router as AngularRouter, NavigationExtras, NavigationEnd, } from '@angular/router'; const IsBot = require('../util/is-bot.js'); let debounceGoogleAnalyticsTimeout: any; import { SettingsService } from './settings'; @Injectable() export class RouterService { analytics = false; constructor( private router: AngularRouter, private settings: SettingsService, ) { if (typeof window === 'undefined' || typeof navigator === 'undefined') return; if (navigator.userAgent.toLowerCase().includes('corifeus') || IsBot()) return; const eventsSig = toSignal(this.router.events); /* Fires on every router event, but only does work once GA is ready and we see a NavigationEnd. Registered in injection context so it cleans up with the service. */ effect(() => { const event = eventsSig(); if (!this.analytics) return; if (!(event instanceof NavigationEnd)) return; clearTimeout(debounceGoogleAnalyticsTimeout); debounceGoogleAnalyticsTimeout = setTimeout(() => { window['gtag']('config', settings.data.core.integration.google.analytics, { 'page_path': event.urlAfterRedirects, }); }, 333); }); setTimeout(() => { if ( settings.data.core.hasOwnProperty('integration') && settings.data.core.integration.hasOwnProperty('google') && settings.data.core.integration.google.hasOwnProperty('analytics') && settings.data.core.integration.google.analytics !== '' ) { const loadSettings = setInterval(() => { if (window['gtag'] !== undefined) { clearInterval(loadSettings); window['gtag']('config', settings.data.core.integration.google.analytics, { 'page_path': location.pathname, }); this.analytics = true; } else { console.info('corifeus-web is waiting for gtag to be available'); } }, 333); } }); } scrollToTop() { if (typeof window === 'undefined' || typeof document === 'undefined') return; window.scrollTo(0, 0); const elements = document.querySelectorAll('[cdk-scrollable]'); for (let i = 0; i < elements.length; ++i) { (elements[i] as any).scrollTop = 0; } const sideNavDivs = document.getElementsByTagName('mat-sidenav-content'); for (let i = 0; i < sideNavDivs.length; i++) { sideNavDivs[i].scrollTop = 0; } } navigateTop(commands: any[], extras?: NavigationExtras): Promise { this.scrollToTop(); return this.navigate(commands, extras); } navigate(commands: any[], extras?: NavigationExtras): Promise { return this.router.navigate(commands, extras); } get events() { return this.router.events; } }