@apicart/vue-components
Version:
Apicart Vue.Js components for simple e-commerce platform development
137 lines (110 loc) • 3.87 kB
text/typescript
import Apicart from '@apicart/core-sdk';
class ProductsDownloader {
private _localStorage: Record<string, any> = Apicart.Storage;
private _storageName = 'apicart-products-files';
private _loadedProducts: Record<string, any> = {};
constructor() {
this._loadedProducts = this.getStorage();
}
public getStorageName(): string
{
return this._storageName;
}
public getStorage(): Record<string, any>
{
return this._localStorage.getItem(this.getStorageName()) || {};
}
public getLoadedProducts(): Record<string, Record<string, any>>
{
return this._loadedProducts;
}
public getLoadedProductsData(productsFilesConfigOrUrl: string[] | Record<string, any>): Record<string, any>
{
/* eslint-disable require-atomic-updates */
const products = [];
Apicart.Utils.Loops
.forEach(productsFilesConfigOrUrl, (productDataConfigOrUrl: string | Record<string, any>): void => {
let dataUrl = productDataConfigOrUrl as string;
let pageUrl = null;
let data = null;
if (typeof productDataConfigOrUrl !== 'string') {
dataUrl = productDataConfigOrUrl.dataUrl
pageUrl = productDataConfigOrUrl.pageUrl;
if (productDataConfigOrUrl.data && Object.keys(productDataConfigOrUrl.data).length) {
data = productDataConfigOrUrl.data;
}
}
if (!data && ! (dataUrl in this._loadedProducts)) {
return;
}
products.push({
dataUrl: dataUrl,
data: data || this._loadedProducts[dataUrl].data,
pageUrl: pageUrl || this._loadedProducts[dataUrl].pageUrl
});
});
return products;
}
public async getProductsData(productsFilesConfigOrUrl: string[]|Record<string, any>): Promise<Record<string, any>>
{
const localStorage = Apicart.Storage;
/* eslint-disable require-atomic-updates */
const productsPromises = [];
Apicart.Utils.Loops
.forEach(productsFilesConfigOrUrl, (productDataConfigOrUrl: string|Record<any, string>): void => {
let dataUrl = productDataConfigOrUrl as string;
let pageUrl = null;
let data = null;
if (typeof productDataConfigOrUrl !== 'string') {
dataUrl = productDataConfigOrUrl.dataUrl;
pageUrl = productDataConfigOrUrl.pageUrl;
data = productDataConfigOrUrl.data || null;
}
const dataNotEmpty = data && Object.keys(data).length !== 0;
if (dataUrl in this._loadedProducts || dataNotEmpty) {
productsPromises.push(Promise.resolve({
dataUrl: dataUrl,
data: dataNotEmpty ? data : this._loadedProducts[dataUrl].data,
pageUrl: pageUrl
}));
} else {
productsPromises.push((async (): Promise<Record<string, any>> => {
const productDataResponse = await Apicart.Utils.Ajax.get(dataUrl);
if (typeof productDataResponse !== 'object' || parseInt(productDataResponse.status) !== 200) {
return;
}
return {
dataUrl: dataUrl,
data: productDataResponse.data,
pageUrl: pageUrl
};
})());
}
});
const products = await Promise.all(productsPromises);
const filteredProducts = [];
Apicart.Utils.Loops.forEach(products, (product: Record<string, any>) => {
if (!product) {
return;
}
this._loadedProducts[product.dataUrl] = {
data: product.data,
pageUrl: product.pageUrl
};
filteredProducts.push(product);
});
localStorage.setItem(this._storageName, this._loadedProducts);
return filteredProducts;
}
public async getProductData(productUrl: string): Promise<Record<string, any>>
{
const response = await this.getProductsData([productUrl]);
return response.length === 0 || typeof response[0] === 'undefined' ? null : response[0].data;
}
public getLoadedProductData(productUrl: string): Record<string, any>
{
const products = this.getLoadedProductsData([productUrl]);
return products.length === 1 ? products[0] : null;
}
}
export default new ProductsDownloader();