import {HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest} from '@angular/common/http'; import {inject} from "@angular/core"; import {AuthService} from "../../infrastructure/services/auth-service"; import {catchError, Observable, switchMap, throwError} from "rxjs"; import {ToastService} from "../../infrastructure/services/toast.service"; import {Router} from '@angular/router'; import {RefreshTokenRequest} from "../models/refresh-token-request"; export const tokenInterceptor: HttpInterceptorFn = (req, next) => { const authService = inject(AuthService); const token = authService.getToken(); const toastService = inject(ToastService); const router = inject(Router); if (token) { req = req.clone({ setHeaders: {Authorization: `Bearer ${token}`} }); } return next(req).pipe( catchError((err: any) => { if (err instanceof HttpErrorResponse) { if (err.status === 401) { return handleUnAuthorizedError(req, next, authService, router, toastService); } } console.log("interceptor error",err.error?.error?.message); return throwError(() => err); }) ); }; function handleUnAuthorizedError( req: HttpRequest, next: HttpHandlerFn, authenticateService: AuthService, router: Router, toastService: ToastService ): Observable> { const refreshTokenRequest = new RefreshTokenRequest(); refreshTokenRequest.refreshToken = authenticateService.getRefreshToken()!; refreshTokenRequest.userId = authenticateService.getUserIdFromToken()!; return authenticateService.renewToken(refreshTokenRequest).pipe( switchMap((data) => { const tokenResponse = data.value; authenticateService.storeRefreshToken(tokenResponse.refreshToken); authenticateService.storeToken(tokenResponse.accessToken); req = req.clone({ setHeaders: {Authorization: `Bearer ${tokenResponse.accessToken}`} }); return next(req); }), catchError((err) => { return throwError(() => { authenticateService.signOut(); router.navigate(['login']).then(success => { if (success) { toastService.show(err.error?.error?.message ||'Token is expired, login again!', { classname: 'bg-warning text-light', delay: 2000 }); } }) }); }) ); }