@nuskin/ns-shop 5.18.5 → 5.18.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import $ from '@nuskin/nuskinjquery';
|
|
2
2
|
import {UserService} from '@nuskin/ns-account';
|
|
3
|
+
import { retrieveToggles } from '@nuskin/ns-feature-flags';
|
|
3
4
|
import {ConfigService, events, StringService, RunConfigService, storage, NsNotQualifiedException} from '@nuskin/ns-util';
|
|
4
|
-
import ProductService from '
|
|
5
|
+
import {ProductService, CartService} from '@nuskin/ns-shop'
|
|
5
6
|
import axios from 'axios';
|
|
6
7
|
|
|
7
8
|
const QUALIFICATION_URL = "/qualification/v1";
|
|
@@ -13,6 +14,17 @@ let _activeEvents = [];
|
|
|
13
14
|
let getPromise = {promise: null};
|
|
14
15
|
let managePromise = {promise: null};
|
|
15
16
|
|
|
17
|
+
let featureFlags = false
|
|
18
|
+
|
|
19
|
+
let variantMappings = {}
|
|
20
|
+
|
|
21
|
+
const checkFlag = async (flag) => {
|
|
22
|
+
if (!featureFlags) {
|
|
23
|
+
featureFlags = await retrieveToggles()
|
|
24
|
+
}
|
|
25
|
+
return featureFlags.has(flag)
|
|
26
|
+
}
|
|
27
|
+
|
|
16
28
|
/*
|
|
17
29
|
-----------------------------
|
|
18
30
|
Private Methods
|
|
@@ -41,6 +53,40 @@ const _getHeaders = (jwt) => {
|
|
|
41
53
|
return headers;
|
|
42
54
|
};
|
|
43
55
|
|
|
56
|
+
const _mapSkusToBase = async (skuList, exclusiveProductsOnly) => {
|
|
57
|
+
|
|
58
|
+
// load product data
|
|
59
|
+
await loadVariantMappings(skuList)
|
|
60
|
+
|
|
61
|
+
return skuList
|
|
62
|
+
.map(sku => '' + sku)
|
|
63
|
+
.filter(sku => variantMappings[sku].isExclusive || !exclusiveProductsOnly)
|
|
64
|
+
.reduce((result, sku) => {
|
|
65
|
+
result[sku] = variantMappings[sku].sku
|
|
66
|
+
return result
|
|
67
|
+
}, {})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const _convertCartDataToBaseSkus = async (cartList, exclusiveProductsOnly) => {
|
|
71
|
+
|
|
72
|
+
const mappings = await _mapSkusToBase(cartList.map(entry => entry.sku), exclusiveProductsOnly)
|
|
73
|
+
|
|
74
|
+
const result = cartList
|
|
75
|
+
.filter(item => mappings[item.sku])
|
|
76
|
+
.reduce((result, item) => {
|
|
77
|
+
const baseSku = mappings[item.sku]
|
|
78
|
+
if (!result[baseSku]) {
|
|
79
|
+
result[baseSku] = {
|
|
80
|
+
sku: baseSku,
|
|
81
|
+
qty: 0
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
result[baseSku].qty += item.qty
|
|
85
|
+
return result
|
|
86
|
+
}, {})
|
|
87
|
+
return result
|
|
88
|
+
}
|
|
89
|
+
|
|
44
90
|
const _loadAddons = async (qualifications) => {
|
|
45
91
|
await Promise.all(
|
|
46
92
|
Object.keys(qualifications)
|
|
@@ -49,9 +95,7 @@ const _loadAddons = async (qualifications) => {
|
|
|
49
95
|
// eslint-disable-next-line no-async-promise-executor
|
|
50
96
|
new Promise(async (resolve) => {
|
|
51
97
|
try {
|
|
52
|
-
let productData = await ProductService.getProductBySku({
|
|
53
|
-
sku: sku
|
|
54
|
-
});
|
|
98
|
+
let productData = await ProductService.getProductBySku({sku: sku})
|
|
55
99
|
|
|
56
100
|
if (productData && productData.product && productData.product.addOns && Array.isArray(productData.product.addOns)) {
|
|
57
101
|
qualifications[sku].addOns = productData.product.addOns.map(element => element.sku ? element.sku : element + '')
|
|
@@ -499,6 +543,12 @@ const returnQualifications = async (sku) => {
|
|
|
499
543
|
* @returns {Promise<*>}
|
|
500
544
|
*/
|
|
501
545
|
const getQualification = async (sku) => {
|
|
546
|
+
|
|
547
|
+
const featureEnabled = await checkFlag('cx15-4373')
|
|
548
|
+
if (featureEnabled) {
|
|
549
|
+
sku = (await _mapSkusToBase([sku]))[sku]
|
|
550
|
+
}
|
|
551
|
+
|
|
502
552
|
let qualifications = await getQualifications();
|
|
503
553
|
return qualifications[sku];
|
|
504
554
|
};
|
|
@@ -511,16 +561,72 @@ const getQualification = async (sku) => {
|
|
|
511
561
|
* @returns {Promise<*>}
|
|
512
562
|
*/
|
|
513
563
|
const isQualified = async (sku, qty) => {
|
|
514
|
-
|
|
515
|
-
|
|
564
|
+
const featureEnabled = await checkFlag('cx15-4373')
|
|
565
|
+
if (featureEnabled) {
|
|
566
|
+
const cartItem = CartService.getItemData().find(item => item.sku == sku)
|
|
567
|
+
let quantityChange = qty
|
|
568
|
+
if (cartItem) {
|
|
569
|
+
quantityChange = qty - cartItem.qty
|
|
570
|
+
}
|
|
516
571
|
|
|
517
|
-
|
|
518
|
-
retVal = qualification.isConsumable;
|
|
519
|
-
}
|
|
572
|
+
sku = (await _mapSkusToBase([sku]))[sku]
|
|
520
573
|
|
|
521
|
-
|
|
574
|
+
if (!sku) {
|
|
575
|
+
return true// the product isn't exclusive
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
const newCartContentsBaseSkus = await _convertCartDataToBaseSkus(
|
|
579
|
+
[...CartService.getItemData(), {sku: sku, qty: quantityChange}],
|
|
580
|
+
true)
|
|
581
|
+
const qualification = await getQualification(sku);
|
|
582
|
+
|
|
583
|
+
return qualification && qualification.quantity >= newCartContentsBaseSkus[sku].qty && qualification.isConsumable
|
|
584
|
+
} else {
|
|
585
|
+
let retVal = false,
|
|
586
|
+
qualification = await getQualification(sku);
|
|
587
|
+
|
|
588
|
+
if (qualification && qualification.quantity >= qty) {
|
|
589
|
+
retVal = qualification.isConsumable;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
return retVal;
|
|
593
|
+
}
|
|
522
594
|
};
|
|
523
595
|
|
|
596
|
+
/**
|
|
597
|
+
* Allows you to pass a list of product sku's to load variant data for
|
|
598
|
+
* @param {*} skuList
|
|
599
|
+
*/
|
|
600
|
+
const loadVariantMappings = async (skuList, loadBaseProducts) => {
|
|
601
|
+
const promises = skuList
|
|
602
|
+
.map(sku => '' + sku)
|
|
603
|
+
.filter(sku => !variantMappings[sku])
|
|
604
|
+
.map(sku => ProductService.getProductBySku({sku: sku})
|
|
605
|
+
.then(result => {
|
|
606
|
+
const sku = result.product.sku
|
|
607
|
+
variantMappings[sku] = {
|
|
608
|
+
isExclusive: result.product.isExclusive,
|
|
609
|
+
sku: result.product.baseSku || sku
|
|
610
|
+
}
|
|
611
|
+
return result;
|
|
612
|
+
})
|
|
613
|
+
)
|
|
614
|
+
let products = await Promise.all(promises)
|
|
615
|
+
|
|
616
|
+
// once we have loaded the variants, also load all their parent products
|
|
617
|
+
|
|
618
|
+
if (loadBaseProducts) {
|
|
619
|
+
const baseProductSkus = products
|
|
620
|
+
.map(result => result.product)
|
|
621
|
+
.filter(product => product.baseSku)
|
|
622
|
+
.map(product => product.baseSku)
|
|
623
|
+
|
|
624
|
+
if (baseProductSkus.length > 0) {
|
|
625
|
+
loadVariantMappings(baseProductSkus, false)
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
524
630
|
/**
|
|
525
631
|
* Return whether to show qualification banner
|
|
526
632
|
*/
|
|
@@ -548,6 +654,7 @@ $(document).ready(_setListeners);
|
|
|
548
654
|
const qualificationService = {
|
|
549
655
|
_setListeners, // Only exposed for unit testing purposes this is called above in the jquery ready function
|
|
550
656
|
_clearQualifications, // exposed for unit testing
|
|
657
|
+
loadVariantMappings,
|
|
551
658
|
getQualifications,
|
|
552
659
|
getQualification,
|
|
553
660
|
isQualified,
|