@anker-in/shopify-react 1.3.0-beta.2 → 1.3.0-beta.4

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.d.mts CHANGED
@@ -2,7 +2,7 @@ export { AppContext, CartContextValue, CartProvider, CartProviderProps, LoadingS
2
2
  export { C as CookieAdapter, a as CookieOptions, P as PerformanceAdapter, R as RouterAdapter, U as UserContextAdapter } from './types-SKDHauqk.mjs';
3
3
  export { BrowserPerformanceAdapter, browserCartCookieAdapter, browserCookieAdapter } from './adapters/index.mjs';
4
4
  export { AddCartLinesInput, ApplyCartCodesInput, AutoFreeGift, AutoFreeGiftCartLineInput, AutoFreeGiftConfig, AutoFreeGiftItem, AutoFreeGiftList, AutoFreeGiftMainProduct, BuyNowInput, BuyRuleType, CODE_AMOUNT_KEY, CUSTOMER_ATTRIBUTE_KEY, CUSTOMER_SCRIPT_GIFT_KEY, Config, CreateCartInput, DiscountLabel, FormattedGift, FunctionGiftResult, GeoLocationData, GetCartAttributesProps, GiftProduct, GiftProductItem, GiftTier, HasPlusMemberInCartProps, HasPlusMemberInCartResult, HasPlusMemberInLinesResult, ImageMedia, LocaleMapping, MAIN_PRODUCT_CODE, MEMBER_PRICE_ATTRIBUTE_KEY, MainProductInfo, NormalizedSearchResultItem, Options, OrderBasePriceType, OrderDiscountConfig, OrderDiscountResult, OrderDiscountType, PlusMemberContext, PlusMemberContextValue, PlusMemberProvider, PlusMemberProviderProps, PriceBasePriceType, PriceDiscountConfig, PriceDiscountType, RemoveCartCodesInput, RemoveCartLinesInput, RewardItem, RuleCondition, RuleType, SCRIPT_CODE_AMOUNT_KEY, SearchResult, SearchResultType, SelectedOptionsResult, ShippingMethodsContext, SiteInfo, SpendMoneyType, TieredDiscount, UpdateBuyerIdentityInput, UpdateCartAttributesInput, UseAllBlogsOptions, UseAllCollectionsOptions, UseAllProductsOptions, UseArticleOptions, UseArticlesInBlogOptions, UseArticlesOptions, UseAutoRemovePlusMemberInCartProps, UseAvailableDeliveryCouponResult, UseBlogOptions, UseBuyNowOptions, UseCalcGiftsFromLinesOptions, UseCalcGiftsFromLinesResult, UseCollectionOptions, UseCollectionsOptions, UseExposureOptions, UseGeoLocationOptions, UseHasPlusMemberInLinesProps, UseIntersectionOptions, UsePlusMemberVariantsOptions, UsePlusMemberVariantsResult, UsePriceOptions, UsePriceResult, UseProductOptions, UseProductsByHandlesOptions, UseSearchOptions, UseShippingMethodsOptions, UseShippingMethodsResult, UseSiteOptions, UseUpdateBuyerIdentityOptions, UseUpdateCartAttributesOptions, VariantItem, VariantMedia, VideoMedia, clearGeoLocationCache, createMockCartFromLines, currencyCodeMapping, defaultSWRMutationConfiguration, formatFunctionAutoFreeGift, formatScriptAutoFreeGift, getCachedGeoLocation, getCartBasicAttributes, getDiscountEnvAttributeValue, getGA4Attributes, getGA4AttributesAsync, getMatchedMainProductSubTotal, getOperatingSystem, getQuery, getReferralAttributes, getUserType, hasPlusMemberInCart, hasPlusMemberInLines, normalizeAddToCartLines, preCheck, safeParse, useAddCartLines, useAddToCart, useAllBlogs, useAllCollections, useAllProducts, useApplyCartCodes, useArticle, useArticles, useArticlesInBlog, useAutoRemovePlusMemberInCart, useAvailableDeliveryCoupon, useBlog, useBuyNow, useCalcAutoFreeGift, useCalcGiftsFromLines, useCalcOrderDiscount, useCartAttributes, useCartItemQuantityLimit, useCollection, useCollections, useCreateCart, useExposure, useGeoLocation, useHasPlusMemberInCart, useHasPlusMemberInLines, useIntersection, usePlusMemberCheckoutCustomAttributes, usePlusMemberContext, usePlusMemberNeedAddToCart, usePlusMemberVariants, usePrice, useProduct, useProductUrl, useProductsByHandles, useRemoveCartCodes, useRemoveCartLines, useReplaceCartPlusMember, useSearch, useSelectedOptions, useShippingMethods, useSite, useUpdateBuyerIdentity, useUpdateCartAttributes, useUpdateCartLines, useUpdateLineCodeAmountAttributes, useUpdateVariantQuery, useVariant, useVariantMedia } from './hooks/index.mjs';
5
- export { g as AddToCartInput, A as AddToCartLineItem, C as BuyNowTrackConfig, p as DeliveryCustomData, D as DeliveryPlusType, v as GA4Data, G as GtmParams, P as PLUS_MEMBER_TYPE, j as PlusMemberMode, n as PlusMemberSettingsMetafields, m as PlusMemberShippingMethodConfig, l as PlusMemberShippingMethodMetafields, S as ScriptAutoFreeGiftConfig, o as SelectedPlusMemberVariant, k as ShippingMethodMode, h as UseAddToCartOptions, U as UseAutoRemoveFreeGiftsOptions, a as UseAutoRemoveFreeGiftsResult, e as UseScriptAutoFreeGiftResult, q as gaTrack, x as getGA4ClientId, z as getGA4Data, y as getGA4SessionId, d as isAnyGift, c as isBuyGetGift, i as isFunctionGift, b as isScriptGift, B as trackAddToCartFBQ, t as trackAddToCartGA, r as trackBeginCheckoutGA, E as trackBuyNowFBQ, s as trackBuyNowGA, u as useAutoRemoveFreeGifts, f as useScriptAutoFreeGift, w as waitForGtagReady } from './types-CM5QrlnE.mjs';
5
+ export { g as AddToCartInput, A as AddToCartLineItem, C as BuyNowTrackConfig, p as DeliveryCustomData, D as DeliveryPlusType, v as GA4Data, G as GtmParams, P as PLUS_MEMBER_TYPE, j as PlusMemberMode, n as PlusMemberSettingsMetafields, m as PlusMemberShippingMethodConfig, l as PlusMemberShippingMethodMetafields, S as ScriptAutoFreeGiftConfig, o as SelectedPlusMemberVariant, k as ShippingMethodMode, h as UseAddToCartOptions, U as UseAutoRemoveFreeGiftsOptions, a as UseAutoRemoveFreeGiftsResult, e as UseScriptAutoFreeGiftResult, q as gaTrack, x as getGA4ClientId, z as getGA4Data, y as getGA4SessionId, d as isAnyGift, c as isBuyGetGift, i as isFunctionGift, b as isScriptGift, B as trackAddToCartFBQ, t as trackAddToCartGA, r as trackBeginCheckoutGA, E as trackBuyNowFBQ, s as trackBuyNowGA, u as useAutoRemoveFreeGifts, f as useScriptAutoFreeGift, w as waitForGtagReady } from './types-C0UyuPrG.mjs';
6
6
  export * from '@anker-in/shopify-sdk';
7
7
  import 'react';
8
8
  import 'react/jsx-runtime';
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { AppContext, CartContextValue, CartProvider, CartProviderProps, LoadingS
2
2
  export { C as CookieAdapter, a as CookieOptions, P as PerformanceAdapter, R as RouterAdapter, U as UserContextAdapter } from './types-SKDHauqk.js';
3
3
  export { BrowserPerformanceAdapter, browserCartCookieAdapter, browserCookieAdapter } from './adapters/index.js';
4
4
  export { AddCartLinesInput, ApplyCartCodesInput, AutoFreeGift, AutoFreeGiftCartLineInput, AutoFreeGiftConfig, AutoFreeGiftItem, AutoFreeGiftList, AutoFreeGiftMainProduct, BuyNowInput, BuyRuleType, CODE_AMOUNT_KEY, CUSTOMER_ATTRIBUTE_KEY, CUSTOMER_SCRIPT_GIFT_KEY, Config, CreateCartInput, DiscountLabel, FormattedGift, FunctionGiftResult, GeoLocationData, GetCartAttributesProps, GiftProduct, GiftProductItem, GiftTier, HasPlusMemberInCartProps, HasPlusMemberInCartResult, HasPlusMemberInLinesResult, ImageMedia, LocaleMapping, MAIN_PRODUCT_CODE, MEMBER_PRICE_ATTRIBUTE_KEY, MainProductInfo, NormalizedSearchResultItem, Options, OrderBasePriceType, OrderDiscountConfig, OrderDiscountResult, OrderDiscountType, PlusMemberContext, PlusMemberContextValue, PlusMemberProvider, PlusMemberProviderProps, PriceBasePriceType, PriceDiscountConfig, PriceDiscountType, RemoveCartCodesInput, RemoveCartLinesInput, RewardItem, RuleCondition, RuleType, SCRIPT_CODE_AMOUNT_KEY, SearchResult, SearchResultType, SelectedOptionsResult, ShippingMethodsContext, SiteInfo, SpendMoneyType, TieredDiscount, UpdateBuyerIdentityInput, UpdateCartAttributesInput, UseAllBlogsOptions, UseAllCollectionsOptions, UseAllProductsOptions, UseArticleOptions, UseArticlesInBlogOptions, UseArticlesOptions, UseAutoRemovePlusMemberInCartProps, UseAvailableDeliveryCouponResult, UseBlogOptions, UseBuyNowOptions, UseCalcGiftsFromLinesOptions, UseCalcGiftsFromLinesResult, UseCollectionOptions, UseCollectionsOptions, UseExposureOptions, UseGeoLocationOptions, UseHasPlusMemberInLinesProps, UseIntersectionOptions, UsePlusMemberVariantsOptions, UsePlusMemberVariantsResult, UsePriceOptions, UsePriceResult, UseProductOptions, UseProductsByHandlesOptions, UseSearchOptions, UseShippingMethodsOptions, UseShippingMethodsResult, UseSiteOptions, UseUpdateBuyerIdentityOptions, UseUpdateCartAttributesOptions, VariantItem, VariantMedia, VideoMedia, clearGeoLocationCache, createMockCartFromLines, currencyCodeMapping, defaultSWRMutationConfiguration, formatFunctionAutoFreeGift, formatScriptAutoFreeGift, getCachedGeoLocation, getCartBasicAttributes, getDiscountEnvAttributeValue, getGA4Attributes, getGA4AttributesAsync, getMatchedMainProductSubTotal, getOperatingSystem, getQuery, getReferralAttributes, getUserType, hasPlusMemberInCart, hasPlusMemberInLines, normalizeAddToCartLines, preCheck, safeParse, useAddCartLines, useAddToCart, useAllBlogs, useAllCollections, useAllProducts, useApplyCartCodes, useArticle, useArticles, useArticlesInBlog, useAutoRemovePlusMemberInCart, useAvailableDeliveryCoupon, useBlog, useBuyNow, useCalcAutoFreeGift, useCalcGiftsFromLines, useCalcOrderDiscount, useCartAttributes, useCartItemQuantityLimit, useCollection, useCollections, useCreateCart, useExposure, useGeoLocation, useHasPlusMemberInCart, useHasPlusMemberInLines, useIntersection, usePlusMemberCheckoutCustomAttributes, usePlusMemberContext, usePlusMemberNeedAddToCart, usePlusMemberVariants, usePrice, useProduct, useProductUrl, useProductsByHandles, useRemoveCartCodes, useRemoveCartLines, useReplaceCartPlusMember, useSearch, useSelectedOptions, useShippingMethods, useSite, useUpdateBuyerIdentity, useUpdateCartAttributes, useUpdateCartLines, useUpdateLineCodeAmountAttributes, useUpdateVariantQuery, useVariant, useVariantMedia } from './hooks/index.js';
5
- export { g as AddToCartInput, A as AddToCartLineItem, C as BuyNowTrackConfig, p as DeliveryCustomData, D as DeliveryPlusType, v as GA4Data, G as GtmParams, P as PLUS_MEMBER_TYPE, j as PlusMemberMode, n as PlusMemberSettingsMetafields, m as PlusMemberShippingMethodConfig, l as PlusMemberShippingMethodMetafields, S as ScriptAutoFreeGiftConfig, o as SelectedPlusMemberVariant, k as ShippingMethodMode, h as UseAddToCartOptions, U as UseAutoRemoveFreeGiftsOptions, a as UseAutoRemoveFreeGiftsResult, e as UseScriptAutoFreeGiftResult, q as gaTrack, x as getGA4ClientId, z as getGA4Data, y as getGA4SessionId, d as isAnyGift, c as isBuyGetGift, i as isFunctionGift, b as isScriptGift, B as trackAddToCartFBQ, t as trackAddToCartGA, r as trackBeginCheckoutGA, E as trackBuyNowFBQ, s as trackBuyNowGA, u as useAutoRemoveFreeGifts, f as useScriptAutoFreeGift, w as waitForGtagReady } from './types-CM5QrlnE.js';
5
+ export { g as AddToCartInput, A as AddToCartLineItem, C as BuyNowTrackConfig, p as DeliveryCustomData, D as DeliveryPlusType, v as GA4Data, G as GtmParams, P as PLUS_MEMBER_TYPE, j as PlusMemberMode, n as PlusMemberSettingsMetafields, m as PlusMemberShippingMethodConfig, l as PlusMemberShippingMethodMetafields, S as ScriptAutoFreeGiftConfig, o as SelectedPlusMemberVariant, k as ShippingMethodMode, h as UseAddToCartOptions, U as UseAutoRemoveFreeGiftsOptions, a as UseAutoRemoveFreeGiftsResult, e as UseScriptAutoFreeGiftResult, q as gaTrack, x as getGA4ClientId, z as getGA4Data, y as getGA4SessionId, d as isAnyGift, c as isBuyGetGift, i as isFunctionGift, b as isScriptGift, B as trackAddToCartFBQ, t as trackAddToCartGA, r as trackBeginCheckoutGA, E as trackBuyNowFBQ, s as trackBuyNowGA, u as useAutoRemoveFreeGifts, f as useScriptAutoFreeGift, w as waitForGtagReady } from './types-C0UyuPrG.js';
6
6
  export * from '@anker-in/shopify-sdk';
7
7
  import 'react';
8
8
  import 'react/jsx-runtime';
package/dist/index.js CHANGED
@@ -1163,6 +1163,26 @@ function useRemoveCartCodes(options) {
1163
1163
  );
1164
1164
  return useSWRMutation__default.default("remove-codes", removeCodes, options);
1165
1165
  }
1166
+ function useUpdateCartLines(options) {
1167
+ const { client, locale, cartCookieAdapter } = useShopify();
1168
+ const { mutateCart, metafieldIdentifiers } = useCartContext();
1169
+ const updateLines = react.useCallback(
1170
+ async (_key, { arg }) => {
1171
+ const updatedCart = await shopifySdk.updateCartLines(client, {
1172
+ ...arg,
1173
+ metafieldIdentifiers,
1174
+ cookieAdapter: cartCookieAdapter
1175
+ });
1176
+ if (updatedCart) {
1177
+ mutateCart(updatedCart);
1178
+ }
1179
+ console.log("use-update-cart-lines updatedCart", metafieldIdentifiers, updatedCart);
1180
+ return updatedCart;
1181
+ },
1182
+ [client, locale, cartCookieAdapter, mutateCart, metafieldIdentifiers]
1183
+ );
1184
+ return useSWRMutation__default.default("update-cart-lines", updateLines, options);
1185
+ }
1166
1186
  var initSameLinesAttributes = ({
1167
1187
  cart,
1168
1188
  line
@@ -1295,9 +1315,13 @@ function useAutoRemoveFreeGifts(options = {}) {
1295
1315
  const {
1296
1316
  removeFunctionGifts = true,
1297
1317
  removeScriptGifts = true,
1298
- isGiftLineItem
1318
+ isGiftLineItem,
1319
+ runOnlyOnceAfterInit = false,
1320
+ initDelay = 500
1299
1321
  } = options;
1300
1322
  const [isRemoving, setIsRemoving] = react.useState(false);
1323
+ const [isInitialized, setIsInitialized] = react.useState(!runOnlyOnceAfterInit);
1324
+ const [isFinished, setIsFinished] = react.useState(false);
1301
1325
  const { cart } = useCartContext();
1302
1326
  const { trigger: removeCartLines2 } = useRemoveCartLines();
1303
1327
  const giftsToRemove = react.useMemo(() => {
@@ -1334,7 +1358,29 @@ function useAutoRemoveFreeGifts(options = {}) {
1334
1358
  return false;
1335
1359
  });
1336
1360
  }, [cart, removeFunctionGifts, removeScriptGifts, isGiftLineItem]);
1361
+ ahooks.useDebounceEffect(
1362
+ () => {
1363
+ if (!runOnlyOnceAfterInit || isInitialized || isFinished) {
1364
+ return;
1365
+ }
1366
+ if (!cart?.lineItems?.length) {
1367
+ return;
1368
+ }
1369
+ setIsInitialized(true);
1370
+ if (giftsToRemove.length === 0) {
1371
+ setIsFinished(true);
1372
+ }
1373
+ },
1374
+ [runOnlyOnceAfterInit, isInitialized, isFinished, cart?.lineItems, giftsToRemove.length],
1375
+ {
1376
+ trailing: true,
1377
+ wait: initDelay
1378
+ }
1379
+ );
1337
1380
  react.useEffect(() => {
1381
+ if (runOnlyOnceAfterInit && (!isInitialized || isFinished)) {
1382
+ return;
1383
+ }
1338
1384
  if (isRemoving || giftsToRemove.length === 0) {
1339
1385
  return;
1340
1386
  }
@@ -1348,10 +1394,16 @@ function useAutoRemoveFreeGifts(options = {}) {
1348
1394
  console.error("Failed to remove free gifts:", error);
1349
1395
  } finally {
1350
1396
  setIsRemoving(false);
1397
+ if (runOnlyOnceAfterInit) {
1398
+ setIsFinished(true);
1399
+ }
1351
1400
  }
1352
1401
  };
1353
1402
  performRemoval();
1354
1403
  }, [
1404
+ runOnlyOnceAfterInit,
1405
+ isInitialized,
1406
+ isFinished,
1355
1407
  isRemoving,
1356
1408
  giftsToRemove,
1357
1409
  removeCartLines2
@@ -2463,6 +2515,7 @@ function useAddToCart({ withTrack = true } = {}, swrOptions) {
2463
2515
  const { trigger: applyCartCodes } = useApplyCartCodes();
2464
2516
  const { trigger: removeInvalidCodes } = useRemoveCartCodes();
2465
2517
  const { trigger: addCartLines2 } = useAddCartLines();
2518
+ const { trigger: updateCartLines3 } = useUpdateCartLines();
2466
2519
  const { trigger: createCart4 } = useCreateCart({
2467
2520
  updateCookie: true
2468
2521
  });
@@ -2515,10 +2568,36 @@ function useAddToCart({ withTrack = true } = {}, swrOptions) {
2515
2568
  // 初次加购时,就把所有 cart attributes 带上
2516
2569
  });
2517
2570
  } else {
2518
- resultCart = await addCartLines2({
2519
- cartId,
2520
- lines
2571
+ const linesToUpdate = [];
2572
+ const linesToAddNew = lines.filter((lineToAdd) => {
2573
+ const existingLine = cart?.lineItems?.find(
2574
+ (item) => item.variant?.id === lineToAdd.merchandiseId
2575
+ );
2576
+ if (existingLine) {
2577
+ linesToUpdate.push({
2578
+ id: existingLine.id,
2579
+ quantity: existingLine.quantity + (lineToAdd.quantity || 1),
2580
+ attributes: lineToAdd.attributes || void 0
2581
+ });
2582
+ return false;
2583
+ }
2584
+ return true;
2521
2585
  });
2586
+ if (linesToUpdate.length > 0) {
2587
+ resultCart = await updateCartLines3({
2588
+ cartId,
2589
+ lines: linesToUpdate
2590
+ });
2591
+ }
2592
+ if (linesToAddNew.length > 0) {
2593
+ resultCart = await addCartLines2({
2594
+ cartId: resultCart?.id || cartId,
2595
+ lines: linesToAddNew
2596
+ });
2597
+ }
2598
+ if (!resultCart) {
2599
+ resultCart = cart;
2600
+ }
2522
2601
  console.log("npm addCartLines resultCart", resultCart);
2523
2602
  if (resultCart && resultCart.discountCodes && resultCart.discountCodes.length > 0) {
2524
2603
  const unapplicableCodes = resultCart.discountCodes.filter((item) => !item.applicable).map((item) => item.code);
@@ -2579,6 +2658,7 @@ function useAddToCart({ withTrack = true } = {}, swrOptions) {
2579
2658
  performanceAdapter,
2580
2659
  createCart4,
2581
2660
  addCartLines2,
2661
+ updateCartLines3,
2582
2662
  applyCartCodes,
2583
2663
  removeInvalidCodes,
2584
2664
  addCustomAttributes,
@@ -2588,26 +2668,6 @@ function useAddToCart({ withTrack = true } = {}, swrOptions) {
2588
2668
  );
2589
2669
  return useSWRMutation__default.default("add-to-cart", addToCart, swrOptions);
2590
2670
  }
2591
- function useUpdateCartLines(options) {
2592
- const { client, locale, cartCookieAdapter } = useShopify();
2593
- const { mutateCart, metafieldIdentifiers } = useCartContext();
2594
- const updateLines = react.useCallback(
2595
- async (_key, { arg }) => {
2596
- const updatedCart = await shopifySdk.updateCartLines(client, {
2597
- ...arg,
2598
- metafieldIdentifiers,
2599
- cookieAdapter: cartCookieAdapter
2600
- });
2601
- if (updatedCart) {
2602
- mutateCart(updatedCart);
2603
- }
2604
- console.log("use-update-cart-lines updatedCart", metafieldIdentifiers, updatedCart);
2605
- return updatedCart;
2606
- },
2607
- [client, locale, cartCookieAdapter, mutateCart, metafieldIdentifiers]
2608
- );
2609
- return useSWRMutation__default.default("update-cart-lines", updateLines, options);
2610
- }
2611
2671
  function useUpdateCartAttributes({
2612
2672
  mutate,
2613
2673
  metafieldIdentifiers,
@@ -3746,7 +3806,9 @@ function CartProvider({
3746
3806
  const autoRemoveFreeGiftsOptions = react.useMemo(() => {
3747
3807
  return {
3748
3808
  removeFunctionGifts: !!functionAutoFreeGiftConfig,
3749
- removeScriptGifts: !!scriptAutoFreeGiftConfig
3809
+ removeScriptGifts: !!scriptAutoFreeGiftConfig,
3810
+ runOnlyOnceAfterInit: true,
3811
+ initDelay: 500
3750
3812
  };
3751
3813
  }, [functionAutoFreeGiftConfig, scriptAutoFreeGiftConfig]);
3752
3814
  const value = react.useMemo(