- make the cart service dependable on BehavorialSubject, migrated from siganls - implement add to cart service
62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import { HttpClient, HttpErrorResponse } from "@angular/common/http";
|
|
import { effect, inject, Injectable, signal } from "@angular/core";
|
|
import { API_URL } from "../tokens/api-url-tokens";
|
|
import { CartItemModel, CartItemRequest, CartModel } from "../models/cart.model";
|
|
import { AuthService, AuthState } from "@app/features/auth/services/auth-service";
|
|
import { Cart } from "@app/shared/components/cart/cart";
|
|
import { BehaviorSubject, tap } from "rxjs";
|
|
|
|
@Injectable({
|
|
providedIn: "root",
|
|
})
|
|
export class CartService {
|
|
private authService = inject(AuthService);
|
|
// dependencies
|
|
private http = inject(HttpClient);
|
|
private apiUrl = inject(API_URL);
|
|
|
|
private _cartItem = new BehaviorSubject<CartModel>({} as CartModel);
|
|
|
|
cartItem$ = this._cartItem.asObservable();
|
|
|
|
constructor() {
|
|
effect(() => {
|
|
if (this.authService.isAuthenticated()) {
|
|
this.fetchCart();
|
|
} else {
|
|
this._cartItem.next({} as CartModel);
|
|
}
|
|
});
|
|
}
|
|
|
|
fetchCart() {
|
|
return this.http.get<CartModel>(this.apiUrl + "/cart").subscribe({
|
|
next: (data) => this._cartItem.next(data),
|
|
error: (error: HttpErrorResponse) => {
|
|
if (error.status === 401) {
|
|
this.authService.purgeAuth();
|
|
}
|
|
// show an error in toast
|
|
},
|
|
});
|
|
}
|
|
|
|
addToCart(data: CartItemRequest) {
|
|
return this.http
|
|
.post<CartModel>(this.apiUrl + "/cart", data)
|
|
.pipe(tap((updatedCart: CartModel) => this._cartItem.next(updatedCart)));
|
|
}
|
|
|
|
updateCart(data: CartItemRequest) {
|
|
return this.http
|
|
.patch<CartModel>(this.apiUrl + "/cart", data)
|
|
.pipe(tap((updatedCart: CartModel) => this._cartItem.next(updatedCart)));
|
|
}
|
|
|
|
removeFromCart(productId: number) {
|
|
return this.http
|
|
.delete<CartModel>(this.apiUrl + "/cart", { body: { productId: productId } })
|
|
.pipe(tap((updatedCart: CartModel) => this._cartItem.next(updatedCart)));
|
|
}
|
|
}
|