feat(navbar): implement login/logout buttons based on state
This commit is contained in:
		
					parent
					
						
							
								325bc118ee
							
						
					
				
			
			
				commit
				
					
						e5bd173be9
					
				
			
		
					 5 changed files with 57 additions and 16 deletions
				
			
		|  | @ -19,3 +19,4 @@ export class LandingComponent { | |||
|     this.keycloakService.login({ redirectUri: `${baseUrl}/home` }); | ||||
|   } | ||||
| } | ||||
| export class LandingPageComponent {} | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| <button (click)="login()">Einloggen</button> | ||||
|  | @ -1,5 +1,4 @@ | |||
| import { Component } from '@angular/core'; | ||||
| import { RouterLink } from '@angular/router'; | ||||
| import { ChangeDetectionStrategy, Component } from '@angular/core'; | ||||
| import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; | ||||
| import { faMoneyBillTransfer, faCreditCard, faWallet } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faPaypal, faGooglePay, faApplePay } from '@fortawesome/free-brands-svg-icons'; | ||||
|  | @ -9,11 +8,11 @@ import { faPaypal, faGooglePay, faApplePay } from '@fortawesome/free-brands-svg- | |||
|   standalone: true, | ||||
|   templateUrl: './footer.component.html', | ||||
|   imports: [FontAwesomeModule], | ||||
|   changeDetection: ChangeDetectionStrategy.OnPush, | ||||
| }) | ||||
| export class FooterComponent { | ||||
|   currentYear: number = new Date().getFullYear(); | ||||
| 
 | ||||
|   // Payment method icons
 | ||||
|   faPaypal = faPaypal; | ||||
|   faCreditCard = faCreditCard; | ||||
|   faMoneyBillTransfer = faMoneyBillTransfer; | ||||
|  |  | |||
|  | @ -15,11 +15,22 @@ | |||
|       </div> | ||||
| 
 | ||||
|       <div class="hidden md:flex items-center space-x-4"> | ||||
|         <button | ||||
|           class="cursor-pointer px-4 py-1.5 rounded bg-emerald-500 hover:bg-emerald-600 text-white text-sm font-medium transition-colors duration-200" | ||||
|         > | ||||
|           Login | ||||
|         </button> | ||||
|         @if (!isLoggedIn) { | ||||
|           <button | ||||
|             (click)="login()" | ||||
|             class="cursor-pointer px-4 py-1.5 rounded bg-emerald-500 hover:bg-emerald-600 text-white text-sm font-medium transition-colors duration-200" | ||||
|           > | ||||
|             Login | ||||
|           </button> | ||||
|         } | ||||
|         @if (isLoggedIn) { | ||||
|           <button | ||||
|             (click)="logout()" | ||||
|             class="cursor-pointer px-4 py-1.5 rounded bg-emerald-500 hover:bg-emerald-600 text-white text-sm font-medium transition-colors duration-200" | ||||
|           > | ||||
|             Logout | ||||
|           </button> | ||||
|         } | ||||
|       </div> | ||||
| 
 | ||||
|       <div class="md:hidden"> | ||||
|  | @ -67,11 +78,22 @@ | |||
|           >Games</a | ||||
|         > | ||||
|         <div class="pt-2 space-y-2"> | ||||
|           <button | ||||
|             class="cursor-pointer w-full px-4 py-1.5 rounded bg-emerald-500 hover:bg-emerald-600 text-white text-sm font-medium transition-colors duration-200" | ||||
|           > | ||||
|             Login | ||||
|           </button> | ||||
|           @if (!isLoggedIn) { | ||||
|             <button | ||||
|               (click)="login()" | ||||
|               class="cursor-pointer w-full px-4 py-1.5 rounded bg-emerald-500 hover:bg-emerald-600 text-white text-sm font-medium transition-colors duration-200" | ||||
|             > | ||||
|               Login | ||||
|             </button> | ||||
|           } | ||||
|           @if (isLoggedIn) { | ||||
|             <button | ||||
|               (click)="logout()" | ||||
|               class="cursor-pointer w-full px-4 py-1.5 rounded bg-emerald-500 hover:bg-emerald-600 text-white text-sm font-medium transition-colors duration-200" | ||||
|             > | ||||
|               Logout | ||||
|             </button> | ||||
|           } | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -1,15 +1,33 @@ | |||
| import { Component } from '@angular/core'; | ||||
| import { AsyncPipe } from '@angular/common'; | ||||
| import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; | ||||
| import { RouterModule } from '@angular/router'; | ||||
| import { CommonModule } from '@angular/common'; | ||||
| import { KeycloakService } from 'keycloak-angular'; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'app-navbar', | ||||
|   templateUrl: './navbar.component.html', | ||||
|   standalone: true, | ||||
|   imports: [CommonModule, RouterModule], | ||||
|   imports: [RouterModule, AsyncPipe], | ||||
|   changeDetection: ChangeDetectionStrategy.OnPush, | ||||
| }) | ||||
| export class NavbarComponent { | ||||
|   isMenuOpen = false; | ||||
|   private keycloakService: KeycloakService = inject(KeycloakService); | ||||
| 
 | ||||
|   isLoggedIn = this.keycloakService.isLoggedIn(); | ||||
| 
 | ||||
|   login() { | ||||
|     try { | ||||
|       const baseUrl = window.location.origin; | ||||
|       this.keycloakService.login({ redirectUri: `${baseUrl}/home` }); | ||||
|     } catch (error) { | ||||
|       console.error('Login failed:', error); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   logout() { | ||||
|     this.keycloakService.logout(); | ||||
|   } | ||||
| 
 | ||||
|   toggleMenu() { | ||||
|     this.isMenuOpen = !this.isMenuOpen; | ||||
|  |  | |||
		Reference in a new issue