//OrderService
import { HttpHeaders, HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { CartItemViewModel, CartViewModel, Product, WishlistItemViewModel, WishlistViewModel } from '../shared/order';
import { BehaviorSubject, map, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class OrderService {
private cartItemsCountSource = new BehaviorSubject<number>(0);
cartItemsCount = this.cartItemsCountSource.asObservable();
private wishlistItemsCountSource = new BehaviorSubject<number>(0);
wishlistItemsCount = this.wishlistItemsCountSource.asObservable();
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
};
constructor(private http: HttpClient) {}
apiUrl: string = "https://localhost:7185/api/Order";
//navbar count
updateCartCount(count: number) {
this.cartItemsCountSource.next(count);
}
loadCartItems(): void {
this.getCartItems().subscribe({
next: (items) => {
const totalCount = items.reduce((sum, item) => sum + item.quantity, 0);
this.updateCartCount(totalCount);
},
error: (err) => {
console.error('Error loading cart items', err);
}
});
}
updateWishlistCount(count: number) {
this.wishlistItemsCountSource.next(count);
}
loadWishlistItems(): void {
this.getWishlistItems().subscribe({
next: (items) => {
this.updateWishlistCount(items.length);
},
error: (err) => {
console.error('Error loading wishlist items', err);
}
});
}
//products
getAllProducts(): Observable<Product[]> {
return this.http.get<Product[]>(`${this.apiUrl}/GetAllProducts`, this.httpOptions);
}
getProductById(product_id: number): Observable<Product> {
return this.http.get<Product>(`${this.apiUrl}/GetProductById/${product_id}`, this.httpOptions);
}
//cart
getCartItems(): Observable<CartItemViewModel[]> {
const token = localStorage.getItem('token');
console.log('Retrieved token from localStorage:', token);
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.get<CartItemViewModel[]>(`${this.apiUrl}/GetCart`, httpOptionsWithAuth);
}
addToCart(cartViewModel: { product_ID: number; quantity: number; size: string }): Observable<any> {
const token = localStorage.getItem('token');
console.log('Retrieved token from localStorage:', token);
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.post<any>(`${this.apiUrl}/AddToCart`, cartViewModel, httpOptionsWithAuth);
}
updateCart(cartViewModel: CartViewModel): Observable<any> {
const token = localStorage.getItem('token');
console.log('Retrieved token from localStorage:', token);
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.put<any>(`${this.apiUrl}/UpdateCart`, cartViewModel, httpOptionsWithAuth);
}
removeFromCart(productId: number): Observable<any> {
const token = localStorage.getItem('token');
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.delete<any>(`${this.apiUrl}/RemoveFromCart/${productId}`, httpOptionsWithAuth);
}
//wishlist
getWishlistItems(): Observable<WishlistItemViewModel[]> {
const token = localStorage.getItem('token');
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.get<WishlistItemViewModel[]>(`${this.apiUrl}/GetWishlist`, httpOptionsWithAuth);
}
addToWishlist(wishlistViewModel: WishlistViewModel): Observable<any> {
const token = localStorage.getItem('token');
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.post<any>(`${this.apiUrl}/AddToWishlist`, wishlistViewModel, httpOptionsWithAuth);
}
removeFromWishlist(productId: number): Observable<any> {
const token = localStorage.getItem('token');
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
})
};
return this.http.delete<any>(`${this.apiUrl}/RemoveFromWishlist/${productId}`, httpOptionsWithAuth);
}
moveFromWishlistToCart(product_ID: number): Observable<any> {
const token = localStorage.getItem('token');
const httpOptionsWithAuth = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}),
responseType: 'text' as 'json' // Specify response type as text
};
return this.http.post<any>(`${this.apiUrl}/MoveFromWishlistToCart`, { product_ID, quantity: 1 }, httpOptionsWithAuth);
}
//payfast
getTotalAmount(): Observable<number> {
return this.getCartItems().pipe(
map(items => items.reduce((sum, item) => sum + (item.unit_Price * item.quantity), 0))
);
}
getUserData(): any {
// Replace this with your actual implementation to get user data
return {
email: 'user@example.com'
};
}
}