import { Injectable, inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable, BehaviorSubject } from 'rxjs'; import { tap, shareReplay } from 'rxjs/operators'; import { LoginRequest, LoginResponse, RegisterRequest } from '../models/mail.models'; @Injectable({ providedIn: 'root' }) export class AuthService { private http = inject(HttpClient); private apiUrl = '/api'; private currentUserSubject = new BehaviorSubject( localStorage.getItem('email') ); currentUser$ = this.currentUserSubject.asObservable(); private tokenSubject = new BehaviorSubject( localStorage.getItem('token') ); token$ = this.tokenSubject.asObservable(); login({ email, password }: LoginRequest): Observable { return this.http.post(`${this.apiUrl}/login`, { email, password }).pipe( tap(({ token, email }) => { localStorage.setItem('token', token); localStorage.setItem('email', email); this.tokenSubject.next(token); this.currentUserSubject.next(email); }) ); } register({ email, password, displayName }: RegisterRequest): Observable { return this.http.post(`${this.apiUrl}/register`, { email, password, displayName }); } logout(): void { localStorage.removeItem('token'); localStorage.removeItem('email'); this.tokenSubject.next(null); this.currentUserSubject.next(null); } getToken(): string | null { return localStorage.getItem('token'); } isLoggedIn(): boolean { return !!localStorage.getItem('token'); } getEmail(): string | null { return localStorage.getItem('email'); } }