import { CommonModule, Location } from '@angular/common'; import { Component, inject, OnDestroy, OnInit } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { MatDialogModule } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MatTabsModule } from '@angular/material/tabs'; import { MatTooltipModule } from '@angular/material/tooltip'; import { ActivatedRoute, Router } from '@angular/router'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { PublicationEditionComponent } from '../../components/publication-edition/publication-edition.component'; import { SubmitButtonComponent } from '../../components/submit-button/submit-button.component'; import { Publication } from '../../core/rest-services/publications/model/publication'; import { PublicationRestService } from '../../core/rest-services/publications/publication.rest-service'; import { PictureSelectionDialog } from '../../components/publication-edition/picture-selection-dialog/picture-selection-dialog.component'; @Component({ selector: 'app-publication-update', standalone: true, imports: [ CommonModule, MatDialogModule, MatIconModule, MatInputModule, MatProgressSpinnerModule, MatTabsModule, MatTooltipModule, PictureSelectionDialog, ReactiveFormsModule, SubmitButtonComponent, PublicationEditionComponent ], templateUrl: './publication-update.component.html', styleUrl: './publication-update.component.scss', }) export class PublicationUpdateComponent implements OnInit, OnDestroy { private readonly publicationRestService = inject(PublicationRestService); private readonly activatedRoute = inject(ActivatedRoute); private readonly location = inject(Location); private readonly router = inject(Router); private readonly snackBar = inject(MatSnackBar); private isLoadingSubject = new BehaviorSubject(false); private isSavingSubject = new BehaviorSubject(false); private subscriptions: Subscription[] = []; publication: Publication | undefined; get isLoading$(): Observable { return this.isLoadingSubject.asObservable(); } get isSaving$(): Observable { return this.isSavingSubject.asObservable(); } ngOnInit(): void { this.isLoadingSubject.next(true); this.activatedRoute.paramMap.subscribe(params => { const publicationId = params.get('publicationId'); if (publicationId == undefined) { this.snackBar.open($localize`A technical error occurred while loading publication data.`, $localize`Close`, { duration: 5000 }); this.location.back(); } else { this.publicationRestService.getById(publicationId) .then(publication => { this.publication = publication; }) .catch(error => { const errorMessage = $localize`A technical error occurred while loading publication data.`; this.snackBar.open(errorMessage, $localize`Close`, { duration: 5000 }); console.error(errorMessage, error) }) .finally(() => this.isLoadingSubject.next(false)); } }); } ngOnDestroy(): void { this.subscriptions.forEach(subscription => subscription?.unsubscribe()); } onPublicationSave(publication: Publication): void { this.isSavingSubject.next(true); this.publicationRestService.update(publication) .then(() => { this.snackBar.open($localize`Publication updated succesfully!`, $localize`Close`, { duration: 5000 }); this.router.navigate(['/home']); }) .catch(error => { const errorMessage = $localize`An error occured while saving publication modifications.`; console.error(errorMessage, error); this.snackBar.open(errorMessage, $localize`Close`, { duration: 5000 }); }) .finally(() => this.isSavingSubject.next(false)); } }