I am creating an Angular ecommerce website using CommerceJS for my backend. I followed a tutorial to implement a spinner across the app that is supposed to appear any time my application is waiting for a response. To do so, I use an Interceptor, however it does not seem to fire (much less perform its function of setting spinner) when making requests using the commerceJS API.
app.module.ts file
import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { MatSidenavModule } from "@angular/material/sidenav";
import { MatGridListModule } from "@angular/material/grid-list";
import { MatMenuModule } from "@angular/material/menu";
import { MatButtonModule } from "@angular/material/button";
import { MatCardModule } from "@angular/material/card";
import { MatIconModule } from "@angular/material/icon";
import { MatExpansionModule } from "@angular/material/expansion";
import { MatTreeModule } from "@angular/material/tree";
import { MatListModule } from "@angular/material/list";
import { MatToolbarModule } from "@angular/material/toolbar";
import { MatTableModule } from "@angular/material/table";
import { MatBadgeModule } from "@angular/material/badge";
import { MatSnackBarModule } from "@angular/material/snack-bar";
import { AppRoutingModule } from "./app-routing.module";
import { AppComponent } from "./app.component";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { HeaderComponent } from "./components/header/header.component";
import { ProductCardComponent } from "./pages/products/product-card/product-card.component";
import { ProductsComponent } from "./pages/products/products.component";
import { MatTooltipModule } from "@angular/material/tooltip";
import { MatDialogModule } from "@angular/material/dialog";
import { ProductCardModalComponent } from "./pages/products/product-card/product-card-modal/product-card-modal.component";
import { HTTP_INTERCEPTORS, HttpClientModule } from "@angular/common/http";
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
import { SpinnerComponent } from "./components/spinner/spinner.component";
import { LoadingInterceptor } from "src/loading.interceptor";
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
ProductCardComponent,
ProductsComponent,
ProductCardModalComponent,
SpinnerComponent,
],
imports: [
BrowserModule,
AppRoutingModule,
BrowserAnimationsModule,
MatSidenavModule,
MatGridListModule,
MatMenuModule,
MatButtonModule,
MatCardModule,
MatIconModule,
MatExpansionModule,
MatTreeModule,
MatListModule,
MatToolbarModule,
MatTableModule,
MatBadgeModule,
MatSnackBarModule,
MatDialogModule,
HttpClientModule,
MatProgressSpinnerModule,
MatTooltipModule,
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: LoadingInterceptor,
multi: true,
},
],
bootstrap: [AppComponent],
})
export class AppModule {}
loading.interceptor.ts file
import { Injectable } from "@angular/core";
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor,
} from "@angular/common/http";
import { Observable } from "rxjs";
import { finalize } from "rxjs/operators";
import { LoaderService } from "./services/loader.service";
@Injectable()
export class LoadingInterceptor implements HttpInterceptor {
private totalRequests = 0;
constructor(private loadingService: LoaderService) {}
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
console.log("caught");
this.totalRequests++;
this.loadingService.setLoading(true);
return next.handle(request).pipe(
finalize(() => {
this.totalRequests--;
if (this.totalRequests == 0) {
this.loadingService.setLoading(false);
}
})
);
}
}
Sample CommerceJS creation and request
const commerce = new Commerce(
"pk_test_412481241241249012491247124192842"
);
commerce.cart.retrieve().then((cart) => this.customerCart$.next(cart));