@anker-in/shopify-react 0.1.1-beta.0 → 0.1.1-beta.2

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/index.js CHANGED
@@ -181,25 +181,25 @@ var getMatchedMainProductSubTotal = (cartData, variant_list, main_product) => {
181
181
  return acc + (main_product?.spend_money_type === 1 /* ORIGIN_PRICE */ ? Number(line.subtotalAmount) || 0 : Number(line.totalAmount) || 0);
182
182
  }, 0) || 0;
183
183
  };
184
- var getDiscountEnvAttributeValue = (attributes = []) => {
185
- const attr = attributes.find((attr2) => attr2.key === CUSTOMER_ATTRIBUTE_KEY);
186
- return safeParseJson(attr?.value ?? "") ?? {};
187
- };
188
- var isAttributesEqual = (attrs1 = [], attrs2 = []) => {
189
- if (attrs1.length !== attrs2.length) return false;
190
- const sorted1 = [...attrs1].sort((a, b) => a.key.localeCompare(b.key));
191
- const sorted2 = [...attrs2].sort((a, b) => a.key.localeCompare(b.key));
192
- return sorted1.every(
193
- (attr, i) => attr.key === sorted2[i]?.key && attr.value === sorted2[i]?.value
194
- );
195
- };
196
- var safeParseJson = (str) => {
184
+ var safeParse = (str) => {
197
185
  try {
198
186
  return JSON.parse(str);
199
187
  } catch (err) {
200
188
  return {};
201
189
  }
202
190
  };
191
+ var getDiscountEnvAttributeValue = (attributes = []) => {
192
+ const attr = attributes.find((attr2) => attr2.key === CUSTOMER_ATTRIBUTE_KEY);
193
+ return safeParse(attr?.value ?? "") ?? {};
194
+ };
195
+ var checkAttributesUpdateNeeded = (oldAttributes, newAttributes, customAttributesNeedRemove) => {
196
+ return oldAttributes.some((attr) => {
197
+ const newAttr = newAttributes.find((newAttr2) => newAttr2.key === attr.key);
198
+ return newAttr ? newAttr.value !== attr.value : true;
199
+ }) || newAttributes.some((attr) => !oldAttributes.some((oldAttr) => oldAttr.key === attr.key)) || customAttributesNeedRemove.some(
200
+ (removeAttr) => oldAttributes.some((oldAttr) => oldAttr.key === removeAttr.key)
201
+ );
202
+ };
203
203
  var containsAll = (source, requiredItems = []) => {
204
204
  if (!requiredItems?.length) return true;
205
205
  const sourceSet = new Set(source);
@@ -488,6 +488,14 @@ var useScriptAutoFreeGift = ({
488
488
  set_points_subscribe(!!isPointsSubscribe);
489
489
  }
490
490
  }, [locale]);
491
+ const isActivityAvailable = react.useMemo(() => {
492
+ if (!campaign) return false;
493
+ const query = getQuery();
494
+ const utmCampaign = Cookies5__default.default.get("utm_campaign") || query?.utm_campaign;
495
+ if (campaign.activityAvailableQuery && !utmCampaign?.includes(campaign.activityAvailableQuery))
496
+ return false;
497
+ return true;
498
+ }, [campaign]);
491
499
  const [upgrade_multiple, upgrade_value] = react.useMemo(() => {
492
500
  let upgrade_multiple2 = 1;
493
501
  let upgrade_value2 = 0;
@@ -504,8 +512,8 @@ var useScriptAutoFreeGift = ({
504
512
  return [upgrade_multiple2, upgrade_value2];
505
513
  }, [cart?.lineItems, points_subscribe]);
506
514
  const breakpoints = react.useMemo(() => {
507
- if (!campaign) return [];
508
- return (campaign.breakpoints || []).map((item) => ({
515
+ if (!isActivityAvailable) return [];
516
+ return (campaign?.breakpoints || []).map((item) => ({
509
517
  breakpoint: new Decimal2__default.default(item.breakpoint).minus(new Decimal2__default.default(upgrade_value)).dividedBy(new Decimal2__default.default(upgrade_multiple)).toFixed(2, Decimal2__default.default.ROUND_DOWN),
510
518
  giveawayProducts: item.giveawayProducts || []
511
519
  }));
@@ -529,25 +537,26 @@ var useScriptAutoFreeGift = ({
529
537
  return true;
530
538
  }, [giftHandles]);
531
539
  const involvedLines = react.useMemo(() => {
532
- if (!campaign) return [];
540
+ if (!isActivityAvailable) return [];
533
541
  return (cart?.lineItems || []).filter((line) => {
534
542
  const isNotGift = line?.totalAmount && Number(line.totalAmount) > 0 && line.customAttributes?.every(
535
543
  (item) => item.key !== _giveaway
536
544
  );
537
545
  const hasCampaignTag = line.product?.tags?.some(
538
- (tag) => campaign.includeTags?.includes(tag.trim()) && line.variant?.availableForSale
546
+ (tag) => campaign?.includeTags?.includes(tag.trim()) && line.variant?.availableForSale
539
547
  );
540
548
  return isNotGift && hasCampaignTag;
541
549
  });
542
- }, [cart?.lineItems, campaign, _giveaway]);
550
+ }, [cart?.lineItems, isActivityAvailable, _giveaway]);
543
551
  const involvedSubTotal = react.useMemo(() => {
544
- if (!campaign) return new Decimal2__default.default(0);
552
+ if (!isActivityAvailable) return new Decimal2__default.default(0);
545
553
  return involvedLines.reduce((prev, item) => {
546
- const amount = campaign.useTotalAmount ? item.totalAmount : item.subtotalAmount;
554
+ const amount = campaign?.useTotalAmount ? item.totalAmount : item.subtotalAmount;
547
555
  return new Decimal2__default.default(prev).plus(new Decimal2__default.default(amount || 0));
548
556
  }, new Decimal2__default.default(0));
549
- }, [involvedLines, campaign]);
557
+ }, [involvedLines, isActivityAvailable]);
550
558
  const [freeGiftLevel, nextFreeGiftLevel] = react.useMemo(() => {
559
+ if (!isActivityAvailable) return [null, null];
551
560
  const sortedLevels = [...breakpoints].sort(
552
561
  (a, b) => Number(b.breakpoint) - Number(a.breakpoint)
553
562
  );
@@ -667,8 +676,6 @@ function useAddCartLines(options) {
667
676
  );
668
677
  return useSWRMutation__default.default("add-cart-lines", addLines, options);
669
678
  }
670
-
671
- // src/tracking/ga.ts
672
679
  var gaTrack = (data) => {
673
680
  if (typeof window === "undefined") {
674
681
  return;
@@ -686,18 +693,19 @@ var gaTrack = (data) => {
686
693
  };
687
694
  var trackAddToCartGA = ({
688
695
  lineItems = [],
689
- gtmParams = {},
690
- brand
696
+ gtmParams = {}
691
697
  }) => {
692
698
  if (!lineItems.length || !lineItems[0]?.variant) {
693
699
  return;
694
700
  }
695
701
  const { variant } = lineItems[0];
696
- const currencyCode = variant?.price?.currencyCode;
697
- const totalPrice = lineItems.reduce((sum, item) => {
698
- const price = parseFloat(item.variant?.price?.amount || "0");
699
- return sum + price;
700
- }, 0);
702
+ const currencyCode = variant.product?.price?.currencyCode;
703
+ const totalPrice = lineItems?.reduce(
704
+ (prev, { variant: variant2 }) => prev.plus(
705
+ variant2?.finalPrice?.amount ?? variant2?.compareAtPrice?.amount ?? variant2?.price?.amount ?? 0
706
+ ),
707
+ new Decimal2__default.default(0)
708
+ ).toNumber();
701
709
  gaTrack({
702
710
  event: "ga4Event",
703
711
  event_name: "add_to_cart",
@@ -708,11 +716,11 @@ var trackAddToCartGA = ({
708
716
  position: gtmParams?.position || "",
709
717
  items: lineItems.map(({ variant: variant2, quantity }) => ({
710
718
  item_id: variant2?.sku,
711
- item_name: variant2?.product?.title || variant2?.product?.name,
712
- item_brand: brand || gtmParams?.brand || "",
719
+ item_name: variant2?.product?.title || variant2?.product?.title,
720
+ item_brand: gtmParams?.brand || "",
713
721
  item_category: variant2?.product?.productType || "",
714
- item_variant: variant2?.title || variant2?.name,
715
- price: variant2?.finalPrice?.amount ?? variant2?.price?.amount,
722
+ item_variant: variant2?.title || variant2?.title,
723
+ price: variant2?.compareAtPrice?.amount ?? variant2?.price?.amount,
716
724
  quantity: quantity || 1
717
725
  })),
718
726
  ...gtmParams?.ga4Params
@@ -722,13 +730,17 @@ var trackAddToCartGA = ({
722
730
  var trackBeginCheckoutGA = ({
723
731
  lineItems = [],
724
732
  currencyCode,
725
- totalPrice,
726
- gtmParams = {},
727
- brand
733
+ gtmParams = {}
728
734
  }) => {
729
735
  if (!lineItems.length) {
730
736
  return;
731
737
  }
738
+ const totalPrice = lineItems?.reduce(
739
+ (prev, { variant }) => prev.plus(
740
+ variant?.finalPrice?.amount ?? variant?.compareAtPrice?.amount ?? variant?.price?.amount ?? 0
741
+ ),
742
+ new Decimal2__default.default(0)
743
+ ).toNumber();
732
744
  gaTrack({
733
745
  event: "ga4Event",
734
746
  event_name: "begin_checkout",
@@ -740,10 +752,10 @@ var trackBeginCheckoutGA = ({
740
752
  items: lineItems.map((item) => ({
741
753
  item_id: item.variant?.sku,
742
754
  item_name: item.variant?.product?.title,
743
- item_brand: brand || gtmParams?.brand || "",
755
+ item_brand: gtmParams?.brand || "",
744
756
  item_category: item.variant?.product?.productType,
745
757
  item_variant: item.variant?.title,
746
- price: item.finalPrice?.amount || item.variant?.price?.amount,
758
+ price: item.variant?.compareAtPrice?.amount ?? item.variant?.price?.amount,
747
759
  quantity: item.quantity || 1
748
760
  })),
749
761
  ...gtmParams?.ga4Params
@@ -752,19 +764,19 @@ var trackBeginCheckoutGA = ({
752
764
  };
753
765
  var trackBuyNowGA = ({
754
766
  lineItems = [],
755
- gtmParams = {},
756
- brand
767
+ gtmParams = {}
757
768
  }) => {
758
769
  if (!lineItems.length || !lineItems[0]?.variant) {
759
770
  return;
760
771
  }
761
772
  const { variant } = lineItems[0];
762
773
  const currencyCode = variant.price?.currencyCode;
763
- const totalPrice = lineItems.reduce((sum, item) => {
764
- const price = parseFloat(item.finalPrice?.amount || item.variant?.price?.amount || "0");
765
- const quantity = item.quantity || 1;
766
- return sum + price * quantity;
767
- }, 0);
774
+ const totalPrice = lineItems?.reduce(
775
+ (prev, { variant: variant2 }) => prev.plus(
776
+ variant2?.finalPrice?.amount ?? variant2?.compareAtPrice?.amount ?? (variant2?.price?.amount || 0)
777
+ ),
778
+ new Decimal2__default.default(0)
779
+ ).toNumber();
768
780
  gaTrack({
769
781
  event: "ga4Event",
770
782
  event_name: "begin_checkout",
@@ -776,10 +788,10 @@ var trackBuyNowGA = ({
776
788
  items: lineItems.map((item) => ({
777
789
  item_id: item.variant?.sku,
778
790
  item_name: item.variant?.product?.title || item.variant?.title,
779
- item_brand: item.variant?.product?.vendor || brand || gtmParams?.brand || "",
791
+ item_brand: gtmParams?.brand || "",
780
792
  item_category: item.variant?.product?.productType || "",
781
793
  item_variant: item.variant?.title,
782
- price: item.finalPrice?.amount || item.variant?.price?.amount,
794
+ price: item.variant?.compareAtPrice?.amount ?? item.variant?.price?.amount,
783
795
  quantity: item.quantity || 1
784
796
  })),
785
797
  ...gtmParams?.ga4Params
@@ -793,10 +805,10 @@ var trackAddToCartFBQ = ({ lineItems = [] }) => {
793
805
  return;
794
806
  }
795
807
  if (lineItems.length && lineItems[0]?.variant) {
796
- const { variant, quantity, finalPrice } = lineItems[0];
808
+ const { variant, quantity } = lineItems[0];
797
809
  try {
798
810
  window.fbq("track", "AddToCart", {
799
- value: finalPrice?.amount || variant?.price?.amount,
811
+ value: variant?.compareAtPrice?.amount ?? (variant?.price?.amount || variant?.price || 0),
800
812
  num_items: quantity,
801
813
  currency: variant?.price?.currencyCode,
802
814
  content_name: variant?.product?.title,
@@ -883,9 +895,9 @@ function useRemoveCartCodes(options) {
883
895
  }
884
896
 
885
897
  // src/hooks/cart/use-add-to-cart.ts
886
- function useAddToCart({ withTrack = true, brand } = {}, swrOptions) {
887
- const { client, locale, cartCookieAdapter, userAdapter } = useShopify();
888
- const { mutateCart, cart, metafieldIdentifiers } = useCartContext();
898
+ function useAddToCart({ withTrack = true } = {}, swrOptions) {
899
+ const { client, config, locale, cartCookieAdapter, userAdapter } = useShopify();
900
+ const { cart } = useCartContext();
889
901
  const { trigger: applyCartCodes } = useApplyCartCodes();
890
902
  const { trigger: removeInvalidCodes } = useRemoveCartCodes();
891
903
  const { trigger: addCartLines2 } = useAddCartLines();
@@ -907,7 +919,8 @@ function useAddToCart({ withTrack = true, brand } = {}, swrOptions) {
907
919
  const lines = lineItems.map((item) => ({
908
920
  merchandiseId: item.variant?.id || "",
909
921
  quantity: item.quantity || 1,
910
- attributes: item.attributes
922
+ attributes: item.attributes,
923
+ sellingPlanId: item.sellingPlanId
911
924
  })).filter((item) => item.merchandiseId && item.quantity);
912
925
  if (lines.length === 0) {
913
926
  return;
@@ -942,34 +955,16 @@ function useAddToCart({ withTrack = true, brand } = {}, swrOptions) {
942
955
  discountCodes
943
956
  });
944
957
  }
945
- if (withTrack && resultCart.lineItems) {
946
- const trackingLineItems = resultCart.lineItems.map((line) => ({
947
- variant: {
948
- id: line.variant.id,
949
- sku: line.variant.sku || "",
950
- title: line.variant.name,
951
- price: {
952
- amount: String(line.variant.price),
953
- currencyCode: resultCart.currency.code
954
- },
955
- product: line.product ? {
956
- title: line.product.title || line.name,
957
- productType: line.product.productType,
958
- vendor: line.product.vendor
959
- } : void 0
960
- },
961
- quantity: line.quantity
962
- }));
958
+ if (withTrack) {
963
959
  trackAddToCartGA({
964
- lineItems: trackingLineItems,
965
- gtmParams: { ...gtmParams, brand },
966
- brand
960
+ lineItems,
961
+ gtmParams: { ...gtmParams, brand: config.getBrand() }
967
962
  });
968
- trackAddToCartFBQ({ lineItems: trackingLineItems });
963
+ trackAddToCartFBQ({ lineItems });
969
964
  }
970
965
  return resultCart;
971
966
  },
972
- [client, locale, cartCookieAdapter, userAdapter, cart, withTrack, brand]
967
+ [client, locale, cartCookieAdapter, userAdapter, cart, withTrack]
973
968
  );
974
969
  return useSWRMutation__default.default("add-to-cart", addToCart, swrOptions);
975
970
  }
@@ -1050,8 +1045,8 @@ function useUpdateCartAttributes(mutate, metafieldIdentifiers, options) {
1050
1045
  );
1051
1046
  return useSWRMutation__default.default("update-cart-attributes", updateAttributes, options);
1052
1047
  }
1053
- function useBuyNow({ withTrack = true, brand } = {}, swrOptions) {
1054
- const { client, locale, cartCookieAdapter, userAdapter } = useShopify();
1048
+ function useBuyNow({ withTrack = true } = {}, swrOptions) {
1049
+ const { client, config, locale, cartCookieAdapter, userAdapter } = useShopify();
1055
1050
  const isLoggedIn = userAdapter?.isLoggedIn || false;
1056
1051
  const buyNow = react.useCallback(
1057
1052
  async (_key, { arg }) => {
@@ -1069,9 +1064,10 @@ function useBuyNow({ withTrack = true, brand } = {}, swrOptions) {
1069
1064
  return;
1070
1065
  }
1071
1066
  const lines = lineItems.map((item) => ({
1072
- merchandiseId: item.variant?.id || item.variantId || "",
1067
+ merchandiseId: item.variant?.id || "",
1073
1068
  quantity: item.quantity || 1,
1074
- attributes: item.attributes
1069
+ attributes: item.attributes,
1070
+ sellingPlanId: item.sellingPlanId
1075
1071
  })).filter((item) => item.merchandiseId && item.quantity);
1076
1072
  if (lines.length === 0) {
1077
1073
  return;
@@ -1088,27 +1084,9 @@ function useBuyNow({ withTrack = true, brand } = {}, swrOptions) {
1088
1084
  throw new Error("Failed to create cart for buy now");
1089
1085
  }
1090
1086
  if (withTrack && resultCart.lineItems) {
1091
- const trackingLineItems = resultCart.lineItems.map((line) => ({
1092
- variant: {
1093
- id: line.variantId,
1094
- sku: line.variant.sku || "",
1095
- title: line.variant.name,
1096
- price: {
1097
- amount: String(line.variant.price),
1098
- currencyCode: resultCart.currency.code
1099
- },
1100
- product: line.product ? {
1101
- title: line.product.title || line.name,
1102
- productType: line.product.productType,
1103
- vendor: line.product.vendor
1104
- } : void 0
1105
- },
1106
- quantity: line.quantity
1107
- }));
1108
1087
  trackBuyNowGA({
1109
- lineItems: trackingLineItems,
1110
- gtmParams: { ...gtmParams, brand },
1111
- brand
1088
+ lineItems,
1089
+ gtmParams: { ...gtmParams, brand: config.getBrand() }
1112
1090
  });
1113
1091
  if (fbqTrackConfig) {
1114
1092
  trackBuyNowFBQ({ trackConfig: fbqTrackConfig });
@@ -1125,7 +1103,7 @@ function useBuyNow({ withTrack = true, brand } = {}, swrOptions) {
1125
1103
  }
1126
1104
  return resultCart;
1127
1105
  },
1128
- [client, locale, isLoggedIn, cartCookieAdapter, withTrack, brand]
1106
+ [client, locale, isLoggedIn, cartCookieAdapter, withTrack]
1129
1107
  );
1130
1108
  return useSWRMutation__default.default("buy-now", buyNow, swrOptions);
1131
1109
  }
@@ -2634,11 +2612,43 @@ function useAutoRemovePlusMemberInCart({
2634
2612
  removeCartLines2
2635
2613
  ]);
2636
2614
  }
2615
+ function useAddPlusMemberProductsToCart({
2616
+ cart,
2617
+ memberSetting,
2618
+ selectedPlusMemberMode,
2619
+ selectedPlusMemberProduct
2620
+ }) {
2621
+ const { hasMonthlyPlus, hasAnnualPlus } = useHasPlusMemberInCart({
2622
+ cart,
2623
+ memberSetting
2624
+ });
2625
+ const plusMemberProduct = react.useMemo(() => {
2626
+ if (selectedPlusMemberMode === "free" /* FREE */) {
2627
+ return void 0;
2628
+ }
2629
+ if (selectedPlusMemberMode === "monthly" /* MONTHLY */ && hasMonthlyPlus) {
2630
+ return void 0;
2631
+ }
2632
+ if (selectedPlusMemberMode === "annual" /* ANNUAL */ && hasAnnualPlus) {
2633
+ return void 0;
2634
+ }
2635
+ if (!selectedPlusMemberProduct) {
2636
+ return void 0;
2637
+ }
2638
+ return selectedPlusMemberProduct;
2639
+ }, [
2640
+ selectedPlusMemberMode,
2641
+ selectedPlusMemberProduct?.variant,
2642
+ selectedPlusMemberProduct?.product,
2643
+ hasMonthlyPlus,
2644
+ hasAnnualPlus
2645
+ ]);
2646
+ return plusMemberProduct;
2647
+ }
2637
2648
  var PlusMemberProvider = ({
2638
2649
  variant,
2639
2650
  product,
2640
- shopCommon,
2641
- metafields,
2651
+ memberSetting,
2642
2652
  initialSelectedPlusMemberMode = "free",
2643
2653
  profile,
2644
2654
  locale,
@@ -2658,14 +2668,14 @@ var PlusMemberProvider = ({
2658
2668
  const [deleteMarginBottom, setDeleteMarginBottom] = react.useState(false);
2659
2669
  const shippingMethodsContext = useShippingMethods({
2660
2670
  variant,
2661
- plusMemberMetafields: metafields,
2671
+ plusMemberMetafields: memberSetting,
2662
2672
  selectedPlusMemberMode});
2663
2673
  const plusMemberHandles = react.useMemo(() => {
2664
2674
  return [
2665
- metafields?.plus_monthly_product?.handle,
2666
- metafields?.plus_annual_product?.handle
2675
+ memberSetting?.plus_monthly_product?.handle,
2676
+ memberSetting?.plus_annual_product?.handle
2667
2677
  ].filter(Boolean);
2668
- }, [metafields]);
2678
+ }, [memberSetting]);
2669
2679
  const { data: plusMemberProducts = [] } = useProductsByHandles({
2670
2680
  handles: plusMemberHandles
2671
2681
  });
@@ -2673,25 +2683,24 @@ var PlusMemberProvider = ({
2673
2683
  if (selectedPlusMemberMode === "free" /* FREE */) {
2674
2684
  return null;
2675
2685
  }
2676
- const handle = selectedPlusMemberMode === "monthly" /* MONTHLY */ ? metafields?.plus_monthly_product?.handle : metafields?.plus_annual_product?.handle;
2677
- const sku = selectedPlusMemberMode === "monthly" /* MONTHLY */ ? metafields?.plus_monthly_product?.sku : metafields?.plus_annual_product?.sku;
2686
+ const handle = selectedPlusMemberMode === "monthly" /* MONTHLY */ ? memberSetting?.plus_monthly_product?.handle : memberSetting?.plus_annual_product?.handle;
2687
+ const sku = selectedPlusMemberMode === "monthly" /* MONTHLY */ ? memberSetting?.plus_monthly_product?.sku : memberSetting?.plus_annual_product?.sku;
2678
2688
  const product2 = plusMemberProducts?.find((p) => p.handle === handle);
2679
2689
  const variant2 = product2?.variants?.find((v) => v.sku === sku);
2680
2690
  return product2 && variant2 ? { product: product2, variant: variant2 } : null;
2681
- }, [plusMemberProducts, metafields, selectedPlusMemberMode]);
2691
+ }, [plusMemberProducts, memberSetting, selectedPlusMemberMode]);
2682
2692
  return /* @__PURE__ */ jsxRuntime.jsx(
2683
2693
  PlusMemberContext.Provider,
2684
2694
  {
2685
2695
  value: {
2686
2696
  variant,
2687
- shopCommon,
2688
2697
  zipCode,
2689
2698
  setZipCode,
2690
2699
  allowNextDayDelivery,
2691
2700
  setAllowNextDayDelivery,
2692
2701
  allowThirdDayDelivery,
2693
2702
  setAllowThirdDayDelivery,
2694
- plusMemberMetafields: metafields,
2703
+ plusMemberMetafields: memberSetting,
2695
2704
  selectedPlusMemberMode,
2696
2705
  setSelectedPlusMemberMode,
2697
2706
  showAreaCheckModal,
@@ -2910,6 +2919,9 @@ function CartProvider({
2910
2919
  }) {
2911
2920
  const { client, cartCookieAdapter } = useShopify();
2912
2921
  const [customAttributes, setCustomAttributes] = react.useState([]);
2922
+ const [customAttributesNeedDelete, setCustomAttributesNeedDelete] = react.useState(
2923
+ []
2924
+ );
2913
2925
  const [isCodeChanging, setIsCodeChanging] = react.useState(false);
2914
2926
  const [loadingState, setLoadingState] = react.useState({
2915
2927
  editLineQuantityLoading: false,
@@ -2940,7 +2952,11 @@ function CartProvider({
2940
2952
  ahooks.useRequest(
2941
2953
  () => {
2942
2954
  const newAttributes = [...attributes, ...customAttributes];
2943
- const needUpdate = cart && !isAttributesEqual(cart.customAttributes, newAttributes);
2955
+ const needUpdate = cart && !checkAttributesUpdateNeeded(
2956
+ cart.customAttributes,
2957
+ newAttributes,
2958
+ customAttributesNeedDelete
2959
+ );
2944
2960
  if (needUpdate) {
2945
2961
  return updateAttributes({ attributes: newAttributes });
2946
2962
  } else {
@@ -2961,11 +2977,12 @@ function CartProvider({
2961
2977
  isCartLoading: isCartLoading || isCodeChanging,
2962
2978
  setLoadingState
2963
2979
  });
2964
- const removeCustomAttributes = react.useCallback((attributes2) => {
2965
- setCustomAttributes(
2966
- (prev) => prev.filter((attr) => !attributes2.some((a) => a.key === attr.key))
2967
- );
2968
- }, []);
2980
+ const removeCustomAttributes = react.useCallback(
2981
+ (attributes2) => {
2982
+ setCustomAttributesNeedDelete(attributes2);
2983
+ },
2984
+ [setCustomAttributesNeedDelete]
2985
+ );
2969
2986
  const addCustomAttributes = react.useCallback(
2970
2987
  (attributes2) => {
2971
2988
  const sameAttributes = attributes2.filter(
@@ -3147,6 +3164,7 @@ exports.atobID = atobID;
3147
3164
  exports.browserCartCookieAdapter = browserCartCookieAdapter;
3148
3165
  exports.browserCookieAdapter = browserCookieAdapter;
3149
3166
  exports.btoaID = btoaID;
3167
+ exports.checkAttributesUpdateNeeded = checkAttributesUpdateNeeded;
3150
3168
  exports.clearGeoLocationCache = clearGeoLocationCache;
3151
3169
  exports.currencyCodeMapping = currencyCodeMapping;
3152
3170
  exports.defaultSWRMutationConfiguration = defaultSWRMutationConfiguration;
@@ -3158,15 +3176,15 @@ exports.getDiscountEnvAttributeValue = getDiscountEnvAttributeValue;
3158
3176
  exports.getMatchedMainProductSubTotal = getMatchedMainProductSubTotal;
3159
3177
  exports.getQuery = getQuery;
3160
3178
  exports.getReferralAttributes = getReferralAttributes;
3161
- exports.isAttributesEqual = isAttributesEqual;
3162
3179
  exports.preCheck = preCheck;
3163
- exports.safeParseJson = safeParseJson;
3180
+ exports.safeParse = safeParse;
3164
3181
  exports.trackAddToCartFBQ = trackAddToCartFBQ;
3165
3182
  exports.trackAddToCartGA = trackAddToCartGA;
3166
3183
  exports.trackBeginCheckoutGA = trackBeginCheckoutGA;
3167
3184
  exports.trackBuyNowFBQ = trackBuyNowFBQ;
3168
3185
  exports.trackBuyNowGA = trackBuyNowGA;
3169
3186
  exports.useAddCartLines = useAddCartLines;
3187
+ exports.useAddPlusMemberProductsToCart = useAddPlusMemberProductsToCart;
3170
3188
  exports.useAddToCart = useAddToCart;
3171
3189
  exports.useAllBlogs = useAllBlogs;
3172
3190
  exports.useAllCollections = useAllCollections;