@faststore/api 1.10.34 → 1.11.3

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/dist/api.esm.js CHANGED
@@ -929,7 +929,7 @@ const isAttachment = value => value.valueReference === VALUE_REFERENCES.attachme
929
929
  const getId = item => {
930
930
  var _item$itemOffered$add;
931
931
 
932
- return [item.itemOffered.sku, item.seller.identifier, item.price, (_item$itemOffered$add = item.itemOffered.additionalProperty) == null ? void 0 : _item$itemOffered$add.filter(isAttachment).map(getPropertyId).join('-')].filter(Boolean).join('::');
932
+ return [item.itemOffered.sku, item.seller.identifier, item.price < 0.01 ? 'Gift' : undefined, (_item$itemOffered$add = item.itemOffered.additionalProperty) == null ? void 0 : _item$itemOffered$add.filter(isAttachment).map(getPropertyId).join('-')].filter(Boolean).join('::');
933
933
  };
934
934
 
935
935
  const orderFormItemToOffer = (item, index) => ({
@@ -967,7 +967,12 @@ const groupById = offers => offers.reduce((acc, item) => {
967
967
  var _acc$get;
968
968
 
969
969
  const id = getId(item);
970
- acc.set(id, (_acc$get = acc.get(id)) != null ? _acc$get : item);
970
+
971
+ if (!acc.has(id)) {
972
+ acc.set(id, []);
973
+ }
974
+
975
+ (_acc$get = acc.get(id)) == null ? void 0 : _acc$get.push(item);
971
976
  return acc;
972
977
  }, new Map());
973
978
 
@@ -986,6 +991,30 @@ const equals = (storeOrder, orderForm) => {
986
991
  return isSameOrder && orderItemsAreSync;
987
992
  };
988
993
 
994
+ const joinItems = form => {
995
+ const itemsById = form.items.reduce((acc, item) => {
996
+ const id = getId(orderFormItemToOffer(item));
997
+
998
+ if (!acc[id]) {
999
+ acc[id] = [];
1000
+ }
1001
+
1002
+ acc[id].push(item);
1003
+ return acc;
1004
+ }, {});
1005
+ return { ...form,
1006
+ items: Object.values(itemsById).map(items => {
1007
+ const [item] = items;
1008
+ const quantity = items.reduce((acc, i) => acc + i.quantity, 0);
1009
+ const totalPrice = items.reduce((acc, i) => acc + i.quantity * i.sellingPrice, 0);
1010
+ return { ...item,
1011
+ quantity,
1012
+ sellingPrice: totalPrice / quantity
1013
+ };
1014
+ })
1015
+ };
1016
+ };
1017
+
989
1018
  const orderFormToCart = async (form, skuLoader) => {
990
1019
  return {
991
1020
  order: {
@@ -1088,7 +1117,7 @@ const validateCart = async (_, {
1088
1117
  const isStale = isOrderFormStale(orderForm);
1089
1118
 
1090
1119
  if (isStale === true && orderNumber) {
1091
- const newOrderForm = await setOrderFormEtag(orderForm, commerce);
1120
+ const newOrderForm = await setOrderFormEtag(orderForm, commerce).then(joinItems);
1092
1121
  return orderFormToCart(newOrderForm, skuLoader);
1093
1122
  }
1094
1123
  } // Step2: Process items from both browser and checkout so they have the same shape
@@ -1096,33 +1125,41 @@ const validateCart = async (_, {
1096
1125
 
1097
1126
  const browserItemsById = groupById(acceptedOffer);
1098
1127
  const originItemsById = groupById(orderForm.items.map(orderFormItemToOffer));
1099
- const browserItems = Array.from(browserItemsById.values()); // items on the user's browser
1128
+ const originItems = Array.from(originItemsById.entries()); // items on the VTEX platform backend
1100
1129
 
1101
- const originItems = Array.from(originItemsById.values()); // items on the VTEX platform backend
1130
+ const browserItems = Array.from(browserItemsById.entries()); // items on the user's browser
1102
1131
  // Step3: Compute delta changes
1103
1132
 
1104
1133
  const {
1105
1134
  itemsToAdd,
1106
1135
  itemsToUpdate
1107
- } = browserItems.reduce((acc, item) => {
1108
- const maybeOriginItem = originItemsById.get(getId(item));
1136
+ } = browserItems.reduce((acc, [id, items]) => {
1137
+ const maybeOriginItem = originItemsById.get(id); // Adding new items to cart
1109
1138
 
1110
1139
  if (!maybeOriginItem) {
1111
- acc.itemsToAdd.push(item);
1112
- } else {
1113
- acc.itemsToUpdate.push({ ...maybeOriginItem,
1114
- quantity: item.quantity
1115
- });
1116
- }
1140
+ items.forEach(item => acc.itemsToAdd.push(item));
1141
+ return acc;
1142
+ } // Update existing items
1143
+
1117
1144
 
1145
+ const [head, ...tail] = maybeOriginItem;
1146
+ const totalQuantity = items.reduce((acc, curr) => acc + curr.quantity, 0); // set total quantity to first item
1147
+
1148
+ acc.itemsToUpdate.push({ ...head,
1149
+ quantity: totalQuantity
1150
+ }); // Remove all the rest
1151
+
1152
+ tail.forEach(item => acc.itemsToUpdate.push({ ...item,
1153
+ quantity: 0
1154
+ }));
1118
1155
  return acc;
1119
1156
  }, {
1120
1157
  itemsToAdd: [],
1121
1158
  itemsToUpdate: []
1122
1159
  });
1123
- const itemsToDelete = originItems.filter(item => !browserItemsById.has(getId(item))).map(item => ({ ...item,
1160
+ const itemsToDelete = originItems.filter(([id]) => !browserItemsById.has(id)).flatMap(([, items]) => items.map(item => ({ ...item,
1124
1161
  quantity: 0
1125
- }));
1162
+ })));
1126
1163
  const changes = [...itemsToAdd, ...itemsToUpdate, ...itemsToDelete].map(offerToOrderItemInput);
1127
1164
 
1128
1165
  if (changes.length === 0) {
@@ -1135,7 +1172,7 @@ const validateCart = async (_, {
1135
1172
  id: orderForm.orderFormId,
1136
1173
  orderItems: changes
1137
1174
  }) // update orderForm etag so we know last time we touched this orderForm
1138
- .then(form => enableOrderFormSync ? setOrderFormEtag(form, commerce) : form); // Step5: If no changes detected before/after updating orderForm, the order is validated
1175
+ .then(form => enableOrderFormSync ? setOrderFormEtag(form, commerce) : form).then(joinItems); // Step5: If no changes detected before/after updating orderForm, the order is validated
1139
1176
 
1140
1177
  if (equals(order, updatedOrderForm)) {
1141
1178
  return null;