import { Injectable, ComponentRef, createComponent, EnvironmentInjector, ApplicationRef } from '@angular/core'; import { AlertDialogComponent, AlertDialogOptions } from '../components/alert-dialog/alert-dialog.component'; @Injectable({ providedIn: 'root' }) export class AlertService { private alertRef: ComponentRef | null = null; constructor( private injector: EnvironmentInjector, private appRef: ApplicationRef ) {} /** * Muestra un mensaje de alerta tipo Sweet Alert * @param options Opciones de configuración del alert * @returns Una promesa que se resuelve con true (confirmar) o false (cancelar) */ show(options: Partial = {}): Promise { return new Promise((resolve) => { // Si ya existe un alert, lo eliminamos this.closeCurrentAlert(); // Creamos el componente dinámicamente this.alertRef = createComponent(AlertDialogComponent, { environmentInjector: this.injector, }); // Agregamos a la aplicación y al DOM document.body.appendChild(this.alertRef.location.nativeElement); this.appRef.attachView(this.alertRef.hostView); // Configuramos las opciones y mostramos this.alertRef.instance.show(options); // Manejamos la respuesta const subscription = this.alertRef.instance.onConfirm.subscribe((result) => { subscription.unsubscribe(); this.closeCurrentAlert(); resolve(result); }); }); } /** * Muestra un mensaje de éxito * @param message Mensaje a mostrar * @param title Título del alert (opcional) */ success(message: string, title: string = '¡Operación exitosa!'): Promise { return this.show({ title, message, icon: 'success', showCancelButton: false }); } /** * Muestra un mensaje de error * @param message Mensaje a mostrar * @param title Título del alert (opcional) */ error(message: string, title: string = 'Error'): Promise { return this.show({ title, message, icon: 'error', showCancelButton: false }); } /** * Muestra un mensaje de advertencia * @param message Mensaje a mostrar * @param title Título del alert (opcional) */ warning(message: string, title: string = 'Advertencia'): Promise { return this.show({ title, message, icon: 'warning', showCancelButton: false }); } /** * Muestra un mensaje informativo * @param message Mensaje a mostrar * @param title Título del alert (opcional) */ info(message: string, title: string = 'Información'): Promise { return this.show({ title, message, icon: 'info', showCancelButton: false }); } /** * Muestra un diálogo de confirmación * @param message Mensaje a mostrar * @param title Título del alert (opcional) */ confirm(message: string, title: string = '¿Está seguro?'): Promise { return this.show({ title, message, icon: 'question', showCancelButton: true, confirmButtonText: 'Sí, confirmar', cancelButtonText: 'Cancelar' }); } /** * Cierra el alert actual si existe */ private closeCurrentAlert(): void { if (this.alertRef) { this.appRef.detachView(this.alertRef.hostView); this.alertRef.location.nativeElement.remove(); this.alertRef = null; } } }