import { DestroyRef, ElementRef, inject, reflectComponentType } from "@angular/core"; import { ActivatedRoute, type CanDeactivateFn } from "@angular/router"; import { SdActivatedModalProvider } from "../modal/sd-activated-modal.provider"; export function setupCanDeactivate(fn: () => boolean): void { const sdActivatedModal = inject(SdActivatedModalProvider, { optional: true }); const activatedRoute = inject(ActivatedRoute, { optional: true }); const elRef = inject(ElementRef); if (sdActivatedModal != null) { sdActivatedModal.canDeactivateFn = fn; return; } if (activatedRoute) { if (!activatedRoute.routeConfig) return; const component = activatedRoute.component; if (component == null || typeof component === "string") return; if ( reflectComponentType(component)?.selector !== elRef.nativeElement.tagName.toLowerCase() ) { return; } const canDeactivateFn: CanDeactivateFn = () => fn(); if (activatedRoute.routeConfig.canDeactivate == null) { activatedRoute.routeConfig.canDeactivate = []; } activatedRoute.routeConfig.canDeactivate.push(canDeactivateFn); const destroyRef = inject(DestroyRef); destroyRef.onDestroy(() => { const idx = activatedRoute.routeConfig!.canDeactivate!.indexOf(canDeactivateFn); if (idx !== -1) { activatedRoute.routeConfig!.canDeactivate!.splice(idx, 1); } }); } }