import { ChangeDetectorRef, Component, Inject, OnInit, ViewChild, AfterViewInit } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { IFileView } from './interface/file-view.interface'; import { Download, ExternalLink, Minus, Plus, Printer, X, ZoomIn } from 'lucide-angular'; import { NgxExtendedPdfViewerComponent } from 'ngx-extended-pdf-viewer'; @Component({ selector: 'kit-file-viewer', templateUrl: './file-viewer.component.html', styleUrls: ['./file-viewer.component.scss'], }) export class FileViewerComponent implements OnInit, AfterViewInit { title = 'my-lib-test'; readonly xIcon = X; readonly downloadIcon = Download; readonly externalLinkIcon = ExternalLink; readonly printIcon = Printer; readonly plusIcon = Plus; readonly zoomInIcon = ZoomIn; readonly minusIcon = Minus; fileData: IFileView = { url: 'https://energia.gob.cl/sites/default/files/empresas_que_deben_cumplir_con_reporte_energetico_2022_segun_d.e._163.pdf', type: 'pdf', title: 'Ejemplo de PDF', }; @ViewChild('pdfViewer', { static: false }) pdfViewer!: NgxExtendedPdfViewerComponent; currentPage: number = 1; totalPages: number = 0; // Zoom-related properties public isMobile = 'ontouchstart' in document.documentElement; public minZoom = 0.33; public maxZoom = 3; public zoomLevels = ['auto', 'page-actual', 'page-fit', 'page-width', 0.2, 0.25, 0.33, 0.5, 0.75, 1, 1.25, 1.5, 2, 2.5, 3, 3.5, 4]; public zoomSetting: number = 50; public currentZoomFactor!: number; constructor( private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: IFileView, private sanitizer: DomSanitizer, private cdr: ChangeDetectorRef, ) {} ngOnInit(): void { if (this.data) { this.fileData = this.data; } } public updateZoomFactor(zoom: number): void { this.currentZoomFactor = zoom; } zoomIn(): void { if (this.pdfViewer) { this.zoomSetting += 10; // Increment zoom } else { console.error('El componente PDF Viewer no está inicializado o el zoom máximo ha sido alcanzado.'); } } zoomOut(): void { if (this.pdfViewer) { this.zoomSetting -= 10; // Decrement zoom } else { console.error('El componente PDF Viewer no está inicializado o el zoom máximo ha sido alcanzado.'); } } resetZoom(): void { this.zoomSetting = 50; } navigateToPage(pageNumber: number): void { if (this.pdfViewer) { this.pdfViewer.page = pageNumber; } } closeModal(): void { this.dialogRef.close(); } openInNewTab(): void { const url = this.fileData.url; window.open(url, '_blank'); } downloadPdf(): void { const link = document.createElement('a'); link.href = this.fileData.url; link.download = 'documento.pdf'; link.click(); } printPdf(): void { window.print(); // Use the PDF viewer's print functionality } /** * Lifecycle hook that is called after the view is initialized. * Ensures pdfViewer is initialized before subscribing to its events. */ public ngAfterViewInit(): void { this.handleViewerEvents(); } private handleViewerEvents(): void { if (this.pdfViewer) { this.pdfViewer.pageChange.subscribe((pageNumber) => { this.currentPage = pageNumber; this.cdr.detectChanges(); }); this.pdfViewer.pagesLoaded.subscribe((event) => { this.totalPages = event.pagesCount; this.cdr.detectChanges(); }); this.pdfViewer.pageChange.subscribe((event) => { this.currentPage = event < 1 ? 1 : event; this.cdr.detectChanges(); // Forzar la detección de cambios }); } else { console.error('pdfViewer is not initialized'); } } downloadFile(): void { const link = document.createElement('a'); link.href = this.fileData.url; if (this.fileData.type === 'image') { link.download = 'imagen.png'; // Nombre del archivo para la imagen } link.click(); } }