import {Component, ViewEncapsulation} from '@angular/core'; import {MatSidenavModule} from "@angular/material/sidenav"; import {Router, RouterOutlet} from "@angular/router"; import {MatCard} from "@angular/material/card"; import {MatButton} from "@angular/material/button"; import {NavigationService} from "@service/navigation.service"; import {catchError, Observable} from "rxjs"; import {DataSpinnerComponent} from "@component/common/data-spinner/data-spinner.component"; import SetupService from "@api/v1/setup.service"; import {ToastrService} from "ngx-toastr"; @Component({ selector: 'app-setup', standalone: true, imports: [ MatSidenavModule, RouterOutlet, MatCard, MatButton, DataSpinnerComponent ], templateUrl: './setup.component.html', styleUrl: './setup.component.css', encapsulation: ViewEncapsulation.None, providers: [SetupService] }) export class SetupComponent { protected nextButtonDisabled: boolean = false; protected skipButtonDisabled: boolean = false; protected loaderActive: boolean = false; protected routes: Array = ['', 'welcome', 'database', 'cache', 'password-policy', 'schedule', 'logging', 'create-admin', 'two-factor', 'summary']; private index: number = 1; protected get getIndex() { return this.index; } constructor(private router: Router, private navigationService: NavigationService, api: SetupService, private notify: ToastrService) { api.isConfigured().subscribe(x => { if (x) this.router.navigate(['/']).then(); }); if (!this.router.url.includes(this.routes[this.index])) { this.router.navigate(['setup/', this.routes[this.index]]).then(); } this.initializeButtonSubscriptions(); this.navigationService.autoSkipNavigation$.subscribe(action => { if (!this.navigationService.isNavigationUserInitiated) { this.executeAction(action); } }); } private initializeButtonSubscriptions() { this.navigationService.nextButtonState$.subscribe(state => { this.nextButtonDisabled = !state; }); this.navigationService.skipButtonState$.subscribe(state => { this.skipButtonDisabled = !state; }); } private executeAction(action: () => Observable) { this.loaderActive = true; action() .pipe( catchError(error => { this.nextButtonDisabled = true; this.loaderActive = false; throw error; }) ) .subscribe(success => { if (success) { this.moveToNextPage(); } else { this.notify.error('Некорректно введены данные'); this.nextButtonDisabled = true; } this.loaderActive = false; }); } protected onSkipClick() { this.navigationService.skipButtonAction().subscribe(success => { if (success) { this.moveToNextPage(); } }); } protected onNextClick() { this.executeAction(this.navigationService.nextButtonAction); } protected onPreviousClick() { this.navigationService.setUserInitiatedNavigation(true); this.moveToPreviousPage(); } private moveToNextPage() { if (this.index < this.routes.length - 1) { this.index++; this.router.navigate(['setup/', this.routes[this.index]]).then(); this.initializePage(); } else { this.router.navigate(['/']).then(); } } private moveToPreviousPage() { if (this.index > 0) { this.index--; this.router.navigate(['setup/', this.routes[this.index]]).then(); this.initializePage(); } } private initializePage() { this.navigationService.resetButtonStates(); } }