feat: store UserId in localStorage and display User Initials in HeaderComponent

This commit is contained in:
Chneemann 2025-03-23 22:31:03 +01:00
parent 39e03d2fab
commit dff56e2e40
4 changed files with 80 additions and 10 deletions

View file

@ -34,6 +34,10 @@ export class ApiService {
// ------------- USERS ------------- // // ------------- USERS ------------- //
getUserById(userId: string): Observable<User> {
return this.http.get<User>(`${this.apiUrl}/api/users/${userId}/`);
}
getUsersByIds(userIds: string[]): Observable<User[]> { getUsersByIds(userIds: string[]): Observable<User[]> {
return this.http.get<User[]>(`${this.apiUrl}/api/users/`, { return this.http.get<User[]>(`${this.apiUrl}/api/users/`, {
params: { ids: userIds.join(',') }, params: { ids: userIds.join(',') },

View file

@ -1,6 +1,13 @@
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { catchError, lastValueFrom, map, Observable, of } from 'rxjs'; import {
BehaviorSubject,
catchError,
lastValueFrom,
map,
Observable,
of,
} from 'rxjs';
import { apiConfig } from '../environments/config'; import { apiConfig } from '../environments/config';
@Injectable({ @Injectable({
@ -9,13 +16,25 @@ import { apiConfig } from '../environments/config';
export class AuthService { export class AuthService {
private apiUrl = apiConfig.apiUrl; private apiUrl = apiConfig.apiUrl;
constructor(private http: HttpClient) {} private currentUserIdSubject: BehaviorSubject<string | null> =
new BehaviorSubject<string | null>(null);
constructor(private http: HttpClient) {
const storedUserId =
localStorage.getItem('currentUserId') ||
sessionStorage.getItem('currentUserId');
this.currentUserIdSubject = new BehaviorSubject<string | null>(
storedUserId
);
}
async login(body: any, storage: boolean) { async login(body: any, storage: boolean) {
const data = (await lastValueFrom( const data = (await lastValueFrom(
this.http.post(`${this.apiUrl}/auth/login/`, body) this.http.post(`${this.apiUrl}/auth/login/`, body)
)) as { token: string }; )) as { token: string; user_id: string };
this.storeAuthToken(data.token, storage); this.storeAuthToken(data.token, storage);
this.storeUserId(data.user_id, storage);
this.currentUserIdSubject.next(data.user_id);
} }
async logout() { async logout() {
@ -31,6 +50,7 @@ export class AuthService {
).catch((error) => console.error('Logout failed:', error)); ).catch((error) => console.error('Logout failed:', error));
this.deleteAuthToken(); this.deleteAuthToken();
this.deleteUserId();
window.location.href = '/login'; window.location.href = '/login';
} }
@ -60,14 +80,32 @@ export class AuthService {
: sessionStorage.setItem('authToken', data.toString()); : sessionStorage.setItem('authToken', data.toString());
} }
private storeUserId(userId: string, storage: boolean) {
if (storage) {
localStorage.setItem('currentUserId', userId);
} else {
sessionStorage.setItem('currentUserId', userId);
}
}
private deleteAuthToken() { private deleteAuthToken() {
localStorage.removeItem('authToken'); localStorage.removeItem('authToken');
sessionStorage.removeItem('authToken'); sessionStorage.removeItem('authToken');
} }
private deleteUserId() {
localStorage.removeItem('currentUserId');
sessionStorage.removeItem('currentUserId');
this.currentUserIdSubject.next(null);
}
checkAuthToken(): string | null { checkAuthToken(): string | null {
return ( return (
localStorage.getItem('authToken') || sessionStorage.getItem('authToken') localStorage.getItem('authToken') || sessionStorage.getItem('authToken')
); );
} }
getCurrentUserId(): Observable<string | null> {
return this.currentUserIdSubject.asObservable();
}
} }

View file

@ -18,12 +18,7 @@
/> />
</div> </div>
<div class="img-user" (click)="toggleNavbar()"> <div class="img-user" (click)="toggleNavbar()">
{{ {{ currentUser?.initials || "" }}
this.firebaseService.getUserDetails(
firebaseService.getCurrentUserId(),
"initials"
)
}}
</div> </div>
</div> </div>
</div> </div>

View file

@ -4,6 +4,9 @@ import { NavbarComponent } from './navbar/navbar.component';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FirebaseService } from '../../../services/firebase.service'; import { FirebaseService } from '../../../services/firebase.service';
import { Observable } from 'rxjs';
import { AuthService } from '../../../services/auth.service';
import { ApiService } from '../../../services/api.service';
@Component({ @Component({
selector: 'app-header', selector: 'app-header',
@ -15,8 +18,38 @@ import { FirebaseService } from '../../../services/firebase.service';
export class HeaderComponent { export class HeaderComponent {
navbarVisible: boolean = false; navbarVisible: boolean = false;
navbarLanguageVisible: boolean = false; navbarLanguageVisible: boolean = false;
currentUser: any = null;
constructor(public firebaseService: FirebaseService) {} constructor(
public firebaseService: FirebaseService,
private authService: AuthService,
private apiService: ApiService
) {}
/**
* Loads the current user data by calling the loadCurrentUser method.
*/
ngOnInit() {
this.loadCurrentUser();
}
/**
* Loads the current user data by calling the getCurrentUserId method of the AuthService.
*/
loadCurrentUser(): void {
this.authService.getCurrentUserId().subscribe((userId) => {
if (userId) {
this.apiService.getUserById(userId).subscribe(
(userData) => {
this.currentUser = userData;
},
() => {
this.currentUser = {};
}
);
}
});
}
/** /**
* Toggles the visibility of the navbar. * Toggles the visibility of the navbar.