UNPKG

@vendasta/store

Version:

Components and data for Store

99 lines 12.8 kB
import { Pricing as ProtoPricing, Currency as ProtoCurrency, } from '@vendasta/marketplace-packages'; import { File } from '../files/shared/file.model'; export class PackageDetails { get isPackageFree() { const isFreeHelper = (prices) => { return prices ? prices.some((p) => p.price === 0 || p.price === undefined) : false; }; return this.pricing && isFreeHelper(this.pricing.prices); } } export function convertToPackageDetails(data, products) { if (!data) { return undefined; } const newPackage = new PackageDetails(); if (!data.pricing) { data.pricing = ProtoPricing.fromProto({ currency: undefined, prices: [ { price: 0, frequency: undefined, isStartingPrice: false, }, ], }); } Object.assign(newPackage, data); if (!newPackage.name) { newPackage.name = 'Untitled'; } if (data.created) { newPackage.createdDate = new Date(data.created); } if (data.updated) { newPackage.updatedDate = new Date(data.updated); } if (data.lineItems) { newPackage.line_items = convertProtoLineItemsToStoreLineItems(data.lineItems, products); } if (typeof data.pricing.currency === 'number') { newPackage.pricing.currency = ProtoCurrency[data.pricing.currency]; } return newPackage; } export function convertProtoLineItemsToStoreLineItems(protoLineItems, products) { if (!protoLineItems || !protoLineItems.lineItems || protoLineItems.lineItems.length === 0 || !products || products.length === 0) { return []; } return protoLineItems.lineItems.map((lineItem) => { const product = products.find((p) => p.productId === lineItem.id); let parent; if (!!lineItem.parentId) { parent = products.find((p) => p.productId === lineItem.parentId); } return convertProtoLineItemToStoreLineItem(lineItem, product, parent); }); } function convertProtoLineItemToStoreLineItem(protoLineItem, product, parentProduct) { if (!product || !protoLineItem) { return undefined; } let files = []; if (product.pdfUploadUrls && product.pdfUploadUrls.length > 0) { files = product.pdfUploadUrls.map((url) => new File(url)); } const lineItem = { item: { id: protoLineItem.id, editionId: protoLineItem.editionId, icon: product.iconUrl, name: product.name, editionName: '', description: product.description, keySellingPoints: product.keySellingPoints, faqs: product.faqs, files: files, screenshotUrls: product.screenshotUrls, lmiCategories: [], }, quantity: protoLineItem.quantity, parent: {}, }; if (protoLineItem.parentId && parentProduct) { lineItem.parent = { id: protoLineItem.parentId, editionId: '', icon: parentProduct.iconUrl, name: parentProduct.name, editionName: '', }; } return lineItem; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRldGFpbHMtdjIvcGFja2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBS0wsT0FBTyxJQUFJLFlBQVksRUFDdkIsUUFBUSxJQUFJLGFBQWEsR0FFMUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbEQsTUFBTSxPQUFPLGNBQWM7SUFrQnpCLElBQUksYUFBYTtRQUNmLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBZSxFQUFXLEVBQUU7WUFDaEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyRixDQUFDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLElBQWtCLEVBQUUsUUFBNEI7SUFDdEYsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDcEMsUUFBUSxFQUFFLFNBQVM7WUFDbkIsTUFBTSxFQUFFO2dCQUNOO29CQUNFLEtBQUssRUFBRSxDQUFDO29C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RUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixXQUFXLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixLQUFLLEVBQUUsS0FBSztZQUNaLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxhQUFhLEVBQUUsRUFBRTtTQUNsQjtRQUNELFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtRQUNoQyxNQUFNLEVBQUUsRUFBRTtLQUNNLENBQUM7SUFFbkIsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsRUFBRTtRQUMzQyxRQUFRLENBQUMsTUFBTSxHQUFHO1lBQ2hCLEVBQUUsRUFBRSxhQUFhLENBQUMsUUFBUTtZQUMxQixTQUFTLEVBQUUsRUFBRTtZQUNiLElBQUksRUFBRSxhQUFhLENBQUMsT0FBTztZQUMzQixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7WUFDeEIsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztLQUNIO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0b3JlTGluZUl0ZW0gfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMaW5lSXRlbSBhcyBQcm90b0xpbmVJdGVtLFxuICBQcm9kdWN0SW50ZXJmYWNlLFxuICBMaW5lSXRlbXMgYXMgUHJvdG9MaW5lSXRlbXMsXG4gIFBhY2thZ2UgYXMgUHJvdG9QYWNrYWdlLFxuICBQcmljaW5nIGFzIFByb3RvUHJpY2luZyxcbiAgQ3VycmVuY3kgYXMgUHJvdG9DdXJyZW5jeSxcbiAgTWFya2V0QWN0aW9uLFxufSBmcm9tICdAdmVuZGFzdGEvbWFya2V0cGxhY2UtcGFja2FnZXMnO1xuaW1wb3J0IHsgUHJpY2UsIFByaWNpbmcgfSBmcm9tICcuLi9wcmljaW5nL3ByaWNpbmcnO1xuaW1wb3J0IHsgRmlsZSB9IGZyb20gJy4uL2ZpbGVzL3NoYXJlZC9maWxlLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIFBhY2thZ2VEZXRhaWxzIHtcbiAgc29sdXRpb25faWQ6IHN0cmluZztcbiAgcGFydG5lcl9pZDogc3RyaW5nO1xuICBtYXJrZXRfaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICB0YWdsaW5lOiBzdHJpbmc7XG4gIGhlYWRlcl9pbWFnZV91cmw6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xuICBoaWRlX3Byb2R1Y3RfaWNvbnNfYW5kX25hbWVzOiBib29sZWFuO1xuICBoaWRlX3Byb2R1Y3RfZGV0YWlsczogYm9vbGVhbjtcbiAgY3JlYXRlZERhdGU6IERhdGU7XG4gIHVwZGF0ZWREYXRlOiBEYXRlO1xuICBwcmljaW5nOiBQcmljaW5nO1xuICBsaW5lX2l0ZW1zOiBTdG9yZUxpbmVJdGVtW107XG4gIG1hcmtldF9hY3Rpb246IE1hcmtldEFjdGlvbjtcblxuICBnZXQgaXNQYWNrYWdlRnJlZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0ZyZWVIZWxwZXIgPSAocHJpY2VzOiBQcmljZVtdKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gcHJpY2VzID8gcHJpY2VzLnNvbWUoKHApID0+IHAucHJpY2UgPT09IDAgfHwgcC5wcmljZSA9PT0gdW5kZWZpbmVkKSA6IGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHJpY2luZyAmJiBpc0ZyZWVIZWxwZXIodGhpcy5wcmljaW5nLnByaWNlcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1BhY2thZ2VEZXRhaWxzKGRhdGE6IFByb3RvUGFja2FnZSwgcHJvZHVjdHM6IFByb2R1Y3RJbnRlcmZhY2VbXSk6IFBhY2thZ2VEZXRhaWxzIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG5ld1BhY2thZ2UgPSBuZXcgUGFja2FnZURldGFpbHMoKTtcbiAgaWYgKCFkYXRhLnByaWNpbmcpIHtcbiAgICBkYXRhLnByaWNpbmcgPSBQcm90b1ByaWNpbmcuZnJvbVByb3RvKHtcbiAgICAgIGN1cnJlbmN5OiB1bmRlZmluZWQsXG4gICAgICBwcmljZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByaWNlOiAwLFxuICAgICAgICAgIGZyZXF1ZW5jeTogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzU3RhcnRpbmdQcmljZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihuZXdQYWNrYWdlLCBkYXRhKTtcblxuICBpZiAoIW5ld1BhY2thZ2UubmFtZSkge1xuICAgIG5ld1BhY2thZ2UubmFtZSA9ICdVbnRpdGxlZCc7XG4gIH1cbiAgaWYgKGRhdGEuY3JlYXRlZCkge1xuICAgIG5ld1BhY2thZ2UuY3JlYXRlZERhdGUgPSBuZXcgRGF0ZShkYXRhLmNyZWF0ZWQpO1xuICB9XG4gIGlmIChkYXRhLnVwZGF0ZWQpIHtcbiAgICBuZXdQYWNrYWdlLnVwZGF0ZWREYXRlID0gbmV3IERhdGUoZGF0YS51cGRhdGVkKTtcbiAgfVxuICBpZiAoZGF0YS5saW5lSXRlbXMpIHtcbiAgICBuZXdQYWNrYWdlLmxpbmVfaXRlbXMgPSBjb252ZXJ0UHJvdG9MaW5lSXRlbXNUb1N0b3JlTGluZUl0ZW1zKGRhdGEubGluZUl0ZW1zLCBwcm9kdWN0cyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhLnByaWNpbmcuY3VycmVuY3kgPT09ICdudW1iZXInKSB7XG4gICAgbmV3UGFja2FnZS5wcmljaW5nLmN1cnJlbmN5ID0gUHJvdG9DdXJyZW5jeVtkYXRhLnByaWNpbmcuY3VycmVuY3ldO1xuICB9XG5cbiAgcmV0dXJuIG5ld1BhY2thZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UHJvdG9MaW5lSXRlbXNUb1N0b3JlTGluZUl0ZW1zKFxuICBwcm90b0xpbmVJdGVtczogUHJvdG9MaW5lSXRlbXMsXG4gIHByb2R1Y3RzOiBQcm9kdWN0SW50ZXJmYWNlW10sXG4pOiBTdG9yZUxpbmVJdGVtW10ge1xuICBpZiAoXG4gICAgIXByb3RvTGluZUl0ZW1zIHx8XG4gICAgIXByb3RvTGluZUl0ZW1zLmxpbmVJdGVtcyB8fFxuICAgIHByb3RvTGluZUl0ZW1zLmxpbmVJdGVtcy5sZW5ndGggPT09IDAgfHxcbiAgICAhcHJvZHVjdHMgfHxcbiAgICBwcm9kdWN0cy5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBwcm90b0xpbmVJdGVtcy5saW5lSXRlbXMubWFwKChsaW5lSXRlbSkgPT4ge1xuICAgIGNvbnN0IHByb2R1Y3QgPSBwcm9kdWN0cy5maW5kKChwKSA9PiBwLnByb2R1Y3RJZCA9PT0gbGluZUl0ZW0uaWQpO1xuICAgIGxldCBwYXJlbnQ7XG4gICAgaWYgKCEhbGluZUl0ZW0ucGFyZW50SWQpIHtcbiAgICAgIHBhcmVudCA9IHByb2R1Y3RzLmZpbmQoKHApID0+IHAucHJvZHVjdElkID09PSBsaW5lSXRlbS5wYXJlbnRJZCk7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0UHJvdG9MaW5lSXRlbVRvU3RvcmVMaW5lSXRlbShsaW5lSXRlbSwgcHJvZHVjdCwgcGFyZW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQcm90b0xpbmVJdGVtVG9TdG9yZUxpbmVJdGVtKFxuICBwcm90b0xpbmVJdGVtOiBQcm90b0xpbmVJdGVtLFxuICBwcm9kdWN0OiBQcm9kdWN0SW50ZXJmYWNlLFxuICBwYXJlbnRQcm9kdWN0PzogUHJvZHVjdEludGVyZmFjZSxcbik6IFN0b3JlTGluZUl0ZW0ge1xuICBpZiAoIXByb2R1Y3QgfHwgIXByb3RvTGluZUl0ZW0pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGZpbGVzID0gW107XG4gIGlmIChwcm9kdWN0LnBkZlVwbG9hZFVybHMgJiYgcHJvZHVjdC5wZGZVcGxvYWRVcmxzLmxlbmd0aCA+IDApIHtcbiAgICBmaWxlcyA9IHByb2R1Y3QucGRmVXBsb2FkVXJscy5tYXAoKHVybCkgPT4gbmV3IEZpbGUodXJsKSk7XG4gIH1cblxuICBjb25zdCBsaW5lSXRlbSA9IHtcbiAgICBpdGVtOiB7XG4gICAgICBpZDogcHJvdG9MaW5lSXRlbS5pZCxcbiAgICAgIGVkaXRpb25JZDogcHJvdG9MaW5lSXRlbS5lZGl0aW9uSWQsXG4gICAgICBpY29uOiBwcm9kdWN0Lmljb25VcmwsXG4gICAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICBlZGl0aW9uTmFtZTogJycsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5kZXNjcmlwdGlvbixcbiAgICAgIGtleVNlbGxpbmdQb2ludHM6IHByb2R1Y3Qua2V5U2VsbGluZ1BvaW50cyxcbiAgICAgIGZhcXM6IHByb2R1Y3QuZmFxcyxcbiAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgIHNjcmVlbnNob3RVcmxzOiBwcm9kdWN0LnNjcmVlbnNob3RVcmxzLFxuICAgICAgbG1pQ2F0ZWdvcmllczogW10sXG4gICAgfSxcbiAgICBxdWFudGl0eTogcHJvdG9MaW5lSXRlbS5xdWFudGl0eSxcbiAgICBwYXJlbnQ6IHt9LFxuICB9IGFzIFN0b3JlTGluZUl0ZW07XG5cbiAgaWYgKHByb3RvTGluZUl0ZW0ucGFyZW50SWQgJiYgcGFyZW50UHJvZHVjdCkge1xuICAgIGxpbmVJdGVtLnBhcmVudCA9IHtcbiAgICAgIGlkOiBwcm90b0xpbmVJdGVtLnBhcmVudElkLFxuICAgICAgZWRpdGlvbklkOiAnJyxcbiAgICAgIGljb246IHBhcmVudFByb2R1Y3QuaWNvblVybCxcbiAgICAgIG5hbWU6IHBhcmVudFByb2R1Y3QubmFtZSxcbiAgICAgIGVkaXRpb25OYW1lOiAnJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiBsaW5lSXRlbTtcbn1cbiJdfQ==