mirror of
https://github.com/Mueller-Patrick/Betterzon.git
synced 2025-05-22 22:39:18 +00:00
119 lines
3.1 KiB
TypeScript
119 lines
3.1 KiB
TypeScript
import {Component, Input, OnInit, ViewChild} from '@angular/core';
|
|
import {Product} from '../../models/product';
|
|
import {ApiService} from '../../services/api.service';
|
|
import {
|
|
ChartComponent,
|
|
ApexAxisChartSeries,
|
|
ApexChart,
|
|
ApexXAxis,
|
|
ApexTitleSubtitle, ApexStroke
|
|
} from 'ng-apexcharts';
|
|
import {Price} from '../../models/price';
|
|
import {Vendor} from '../../models/vendor';
|
|
|
|
export type ChartOptions = {
|
|
series: ApexAxisChartSeries;
|
|
chart: ApexChart;
|
|
xaxis: ApexXAxis;
|
|
title: ApexTitleSubtitle;
|
|
stroke: ApexStroke;
|
|
};
|
|
|
|
@Component({
|
|
selector: 'app-product-details',
|
|
templateUrl: './product-details.component.html',
|
|
styleUrls: ['./product-details.component.css']
|
|
})
|
|
export class ProductDetailsComponent implements OnInit {
|
|
@Input() productId: number;
|
|
product: Product;
|
|
lowestPrices: Price[];
|
|
currentlyLowestPrice: Price;
|
|
currentAmazonPrice: Price;
|
|
vendors: Vendor[] = [];
|
|
vendorMap = {};
|
|
@ViewChild('chart') chart: ChartComponent;
|
|
public chartOptions: ChartOptions;
|
|
|
|
constructor(
|
|
private apiService: ApiService
|
|
) {
|
|
}
|
|
|
|
ngOnInit(): void {
|
|
this.getProduct();
|
|
this.getVendors();
|
|
this.getPrices();
|
|
}
|
|
|
|
getProduct(): void {
|
|
this.apiService.getProduct(this.productId).subscribe(product => this.product = product);
|
|
}
|
|
|
|
getPrices(): void {
|
|
// Lowest prices
|
|
this.apiService.getLowestPrices(this.productId).subscribe(
|
|
prices => {
|
|
this.lowestPrices = prices;
|
|
this.currentlyLowestPrice = prices[prices.length - 1];
|
|
|
|
// Update charts
|
|
this.getChartData();
|
|
});
|
|
|
|
// Amazon price
|
|
this.apiService.getAmazonPrice(this.productId).subscribe(price => {
|
|
this.currentAmazonPrice = price[0];
|
|
});
|
|
}
|
|
|
|
getVendors(): void {
|
|
this.apiService.getVendors().subscribe(vendors => {
|
|
this.vendors = vendors;
|
|
this.vendors.forEach(vendor => {
|
|
this.vendorMap[vendor.vendor_id] = vendor;
|
|
});
|
|
});
|
|
}
|
|
|
|
getChartData(): void {
|
|
const prices = [];
|
|
const categs = [];
|
|
this.lowestPrices?.forEach(price => {
|
|
prices.push(price.price_in_cents / 100);
|
|
categs.push(new Date(price.timestamp).toDateString());
|
|
});
|
|
|
|
this.chartOptions = {
|
|
series: [
|
|
{
|
|
name: 'Lowest Price',
|
|
data: prices
|
|
}
|
|
],
|
|
chart: {
|
|
height: 350,
|
|
type: 'area'
|
|
},
|
|
title: {
|
|
text: 'Lowest price'
|
|
},
|
|
xaxis: {
|
|
categories: categs
|
|
},
|
|
stroke: {
|
|
curve: 'stepline'
|
|
}
|
|
};
|
|
}
|
|
|
|
getAmazonPriceDifference(): number {
|
|
const amazonPrice = this.currentAmazonPrice?.price_in_cents;
|
|
const lowestPrice = this.currentlyLowestPrice?.price_in_cents;
|
|
|
|
const percentage = ((amazonPrice / lowestPrice) - 1) * 100;
|
|
|
|
return Math.round(percentage);
|
|
}
|
|
}
|