UNPKG

@apicart/vue-components

Version:

Apicart Vue.Js components for simple e-commerce platform development

137 lines (110 loc) 3.87 kB
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();