251 lines
7.4 KiB
TypeScript
251 lines
7.4 KiB
TypeScript
import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core';
|
|
//import {NavigationComponent} from '../navigation/navigation.component';
|
|
|
|
import {Router, RouterLink, RouterOutlet} from '@angular/router';
|
|
import {MatToolbar} from '@angular/material/toolbar';
|
|
import {MatButton, MatFabButton, MatMiniFabButton} from '@angular/material/button';
|
|
import {IconDirective, IconService} from '@ant-design/icons-angular';
|
|
import {MatDialog} from '@angular/material/dialog';
|
|
import {Subscription} from 'rxjs';
|
|
import {TokenStorageService} from '../../services/token-storage.service';
|
|
import {AuthService} from '../../services/auth.service';
|
|
import {EventBusService} from '../../_shared/event-bus.service';
|
|
import {DialogComponent} from '../../components/dialog/dialog.component';
|
|
|
|
import {CommonModule} from '@angular/common';
|
|
import {MatIcon} from '@angular/material/icon';
|
|
import {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';
|
|
import {MatTooltip} from '@angular/material/tooltip';
|
|
import {DialogSignupComponent} from '../../components/dialog-signup.component/dialog-signup.component';
|
|
import {MatLabel} from '@angular/material/input';
|
|
import {HttpClient} from '@angular/common/http';
|
|
|
|
import { environment } from '../../../environments/environment';
|
|
|
|
@Component({
|
|
selector: 'app-main.component',
|
|
imports: [
|
|
|
|
MatToolbar,
|
|
MatButton,
|
|
RouterLink,
|
|
IconDirective,
|
|
RouterOutlet,
|
|
CommonModule,
|
|
MatIcon,
|
|
MatMiniFabButton,
|
|
MatMenuTrigger,
|
|
MatMenu,
|
|
MatMenuItem,
|
|
MatTooltip,
|
|
MatLabel,
|
|
MatFabButton
|
|
|
|
],
|
|
schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
|
|
templateUrl: './main.component.html',
|
|
styleUrl: './main.component.scss'
|
|
})
|
|
export class MainComponent implements OnInit{
|
|
// public props
|
|
navCollapsed: boolean = false;
|
|
navCollapsedMob: boolean = false;
|
|
|
|
readonly dialog = inject(MatDialog);
|
|
//private authService = new AuthService(provideHttpClient())
|
|
public dialogLoginData : DialogLoginData = {password: "", username: ""};
|
|
public dialogSignupData : DialogSignupData = {password: "", username: "", email: "", confirmPassword: ""};
|
|
|
|
|
|
private roles: string[] = [];
|
|
isLoggedIn = false;
|
|
showAdminBoard = false;
|
|
showModeratorBoard = false;
|
|
showUserBoard = false;
|
|
username?: string;
|
|
|
|
eventBusSub?: Subscription;
|
|
|
|
private environment = environment;
|
|
|
|
private storageService: TokenStorageService = inject(TokenStorageService);
|
|
private authService: AuthService = inject(AuthService);
|
|
private eventBusService: EventBusService = inject(EventBusService);
|
|
|
|
constructor(private router: Router,private http: HttpClient) {
|
|
|
|
}
|
|
|
|
ngOnInit(): void {
|
|
|
|
|
|
this.refreshToolbar();
|
|
|
|
this.eventBusSub = this.eventBusService.on('logout', () => {
|
|
this.logout();
|
|
});
|
|
}
|
|
|
|
refreshToolbar() {
|
|
this.isLoggedIn = this.storageService.isLoggedIn();
|
|
if (this.isLoggedIn) {
|
|
const user = this.storageService.getUser();
|
|
this.roles = user.roles;
|
|
|
|
this.showAdminBoard = this.roles.includes('ROLE_ADMIN');
|
|
this.showModeratorBoard = this.roles.includes('ROLE_MODERATOR');
|
|
this.showUserBoard = this.roles.includes('ROLE_USER');
|
|
|
|
this.username = user.username;
|
|
}
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
if (this.eventBusSub) {
|
|
this.eventBusSub.unsubscribe();
|
|
}
|
|
}
|
|
|
|
// public method
|
|
navMobClick() {
|
|
if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
|
|
this.navCollapsedMob = !this.navCollapsedMob;
|
|
setTimeout(() => {
|
|
this.navCollapsedMob = !this.navCollapsedMob;
|
|
}, 100);
|
|
} else {
|
|
this.navCollapsedMob = !this.navCollapsedMob;
|
|
}
|
|
if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) {
|
|
document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed');
|
|
}
|
|
}
|
|
|
|
handleKeyDown(event: KeyboardEvent): void {
|
|
if (event.key === 'Escape') {
|
|
this.closeMenu();
|
|
}
|
|
}
|
|
|
|
closeMenu() {
|
|
if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
|
|
document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open');
|
|
}
|
|
}
|
|
|
|
|
|
logout(): void {
|
|
this.authService.logout().subscribe({
|
|
next: res => {
|
|
console.log(res);
|
|
this.storageService.clean();
|
|
|
|
//window.location.reload();
|
|
this.router.navigate([environment.default_page]).then(() => {
|
|
window.location.reload();
|
|
});
|
|
//window.location.reload();
|
|
},
|
|
error: err => {
|
|
console.log(err);
|
|
}
|
|
});
|
|
}
|
|
|
|
openLoginDialog(enterAnimationDuration: string, exitAnimationDuration: string) {
|
|
|
|
let dialogLoginRef = this.dialog.open(DialogComponent, {
|
|
width: '350px',
|
|
enterAnimationDuration,
|
|
exitAnimationDuration,
|
|
data: {username: this.dialogLoginData.username, password: this.dialogLoginData.password}
|
|
});
|
|
dialogLoginRef.componentInstance.signupClicked.subscribe(result => {
|
|
dialogLoginRef.close();
|
|
this.openSignupDialog(enterAnimationDuration, exitAnimationDuration);
|
|
})
|
|
|
|
const dialogSubmitSubscription = dialogLoginRef.componentInstance.loginClicked
|
|
.subscribe(result => {
|
|
console.log('Got the data!', result);
|
|
|
|
if(result== null){
|
|
return;
|
|
}
|
|
this.dialogLoginData = result;
|
|
|
|
this.authService.login(this.dialogLoginData.username, this.dialogLoginData.password).subscribe(
|
|
data => {
|
|
|
|
|
|
this.storageService.saveUser(data);
|
|
|
|
this.isLoggedIn = true;
|
|
let user = this.storageService.getUser();
|
|
this.roles = user.roles;
|
|
|
|
this.refreshToolbar();
|
|
dialogLoginRef.close()
|
|
this.router.navigate(['main/user/user-welcome']);
|
|
},
|
|
err => {
|
|
dialogLoginRef.componentInstance.openLoginFailedSnackBar(err.error.message);
|
|
}
|
|
);
|
|
|
|
|
|
});
|
|
}
|
|
|
|
openSignupDialog(enterAnimationDuration: string, exitAnimationDuration: string) {
|
|
|
|
let dialogSignupRef = this.dialog.open(DialogSignupComponent, {
|
|
width: '350px',
|
|
enterAnimationDuration,
|
|
exitAnimationDuration,
|
|
data: {username: this.dialogLoginData.username, password: this.dialogLoginData.password}
|
|
});
|
|
|
|
const dialogloginSubscription = dialogSignupRef.componentInstance.loginClicked.subscribe(result => {
|
|
dialogSignupRef.close();
|
|
this.openLoginDialog(enterAnimationDuration, exitAnimationDuration);
|
|
})
|
|
|
|
const dialogSubmitSubscription = dialogSignupRef.componentInstance.signupClicked
|
|
.subscribe(result => {
|
|
console.log('Got the data!', result);
|
|
|
|
if (result == null) {
|
|
return;
|
|
}
|
|
this.dialogSignupData = result;
|
|
|
|
this.authService.register(this.dialogSignupData.username, this.dialogSignupData.email, this.dialogSignupData.password).subscribe(
|
|
data => {
|
|
console.log(data);
|
|
dialogSignupRef.componentInstance.openSignupSuccessSnackBar(data.message)
|
|
dialogSignupRef.close();
|
|
},
|
|
err => {
|
|
dialogSignupRef.componentInstance.openSignupFailedSnackBar(err.error.message);
|
|
}
|
|
);
|
|
|
|
// do something here with the data
|
|
dialogloginSubscription.unsubscribe();
|
|
dialogSubmitSubscription.unsubscribe();
|
|
});
|
|
}
|
|
}
|
|
export interface DialogLoginData {
|
|
username: string;
|
|
password: string;
|
|
}
|
|
|
|
export interface DialogSignupData {
|
|
email: string;
|
|
username: string;
|
|
password: string;
|
|
confirmPassword: string;
|
|
}
|