import { Injectable } from '@angular/core'; import { Subject, BehaviorSubject, Observable } from 'rxjs'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Order } from './order.model'; import { UserService } from '../user.service'; import { User } from '../user.model'; import { LineItem} from '../items/lineitem.model'; @Injectable({providedIn: 'root'}) export class OrderService { private dataStore: { user: User, order: Order } = { user:{ address: '', session: '', blocktime: 0 }, order: { address: '', session: '', timestamp: '', closed: false, lines: [ { qty: 1, name: '', cost:0 } ] } }; private _orderUpdated: BehaviorSubject = new BehaviorSubject(this.dataStore.order); public readonly orderUpdate: Observable = this._orderUpdated.asObservable(); public userUpdate: Observable; constructor( private http: HttpClient, public userService: UserService ) { this.userUpdate = userService.userUpdate; this.userUpdate.subscribe((user) => { this.dataStore.user = user; //console.log('OS: const', user); this.getOrder(this.dataStore.user.session); }); } getOrder(session: string) { const params = new HttpParams().append('session', session); let obs = this.http.get<{message: string, order: any}>('http://localhost:3000/api/order', { headers:{}, params:params, observe: 'response'}); obs.subscribe((OrderDataResponse) => { if (OrderDataResponse.status == 200) { this.dataStore.order = OrderDataResponse.body!.order; this._orderUpdated.next(Object.assign({}, this.dataStore).order); } else { console.log('No order found'); } }); return obs; } addToOrder(lineItem: LineItem) { if (this.dataStore.order.address.length == 0) { console.log('No open order, creating...', lineItem); this.createOrder(); } else { console.log('Open order, adding...', lineItem); } } createOrder() { var order:Order = { address: this.dataStore.user.address, session: this.dataStore.user.session, closed: false, lines: [] }; let obs = this.http.post<{message: string}>('http://localhost:3000/api/order', {order: order}); obs.subscribe((orderData) => { console.log('Create order', orderData); this.getOrder(this.dataStore.user.session); }); return obs; } }