@abra-promotions/webhooks-for-tapcart 2.0.0-beta.4 → 2.0.0

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.cjs CHANGED
@@ -14,6 +14,36 @@ const productGidFromId = (id) => {
14
14
  return "gid://shopify/Product/" + id;
15
15
  };
16
16
 
17
+ // A percentage discount on one unit. Shopify truncates USD percentage discounts per unit to the
18
+ // cent before multiplying by quantity (https://community.shopify.dev/t/28655/10), so the price
19
+ // shown matches checkout. Other currencies, and values that aren't plain decimals, keep the exact
20
+ // amount. `divisor` is 1 for a fraction (0.2) and 100 for a percentage (20).
21
+ const percentageDiscount = (money, percentage, divisor = 100) => {
22
+ const exact = parseFloat(money?.amount) * (percentage / divisor);
23
+ if (money?.currencyCode !== "USD") return exact;
24
+
25
+ const amount = String(money?.amount).match(/^(\d+)(?:\.(\d{1,2})0*)?$/);
26
+ const rate = String(percentage).match(/^(\d+)(?:\.(\d+))?$/);
27
+ if (!amount || !rate || (divisor !== 1 && divisor !== 100)) return exact;
28
+ const rateFraction = (rate[2] || "").replace(/0+$/, "");
29
+ const unitCents =
30
+ Number(amount[1]) * 100 + Number((amount[2] || "").padEnd(2, "0"));
31
+ const rateNumerator = Number(rate[1] + rateFraction);
32
+ const rateDenominator = divisor * 10 ** rateFraction.length;
33
+ const numerator = unitCents * rateNumerator;
34
+ if (
35
+ !Number.isSafeInteger(unitCents) ||
36
+ !Number.isSafeInteger(rateNumerator) ||
37
+ !Number.isSafeInteger(rateDenominator) ||
38
+ !Number.isSafeInteger(numerator) ||
39
+ rateNumerator > rateDenominator
40
+ )
41
+ return exact;
42
+
43
+ // integer math: flooring a floating dollar amount can lose a cent at exact-cent boundaries
44
+ return (numerator - (numerator % rateDenominator)) / rateDenominator / 100;
45
+ };
46
+
17
47
  // BXGY customer-gets: new payloads carry cards on customerGets.productCards,
18
48
  // legacy payloads a single {quantity, items} pair at the root.
19
49
  const getBxgyGetsCards = (customerGets) => {
@@ -64,9 +94,10 @@ const getDiscountForProductDiscount = ({
64
94
  if (targetDiscount.discountValue?.type === "DiscountAmount") {
65
95
  return targetDiscount.discountValue.discountAmount.cents / 100;
66
96
  } else if (targetDiscount.discountValue?.type === "DiscountPercentage") {
67
- return (
68
- parseFloat(selectedVariant.price.amount) *
69
- targetDiscount.discountValue.percentage
97
+ return percentageDiscount(
98
+ selectedVariant.price,
99
+ targetDiscount.discountValue.percentage,
100
+ 1,
70
101
  );
71
102
  }
72
103
  };
@@ -93,9 +124,10 @@ const getDiscountForMultiValueCollection = ({
93
124
  if (discountValue.value.type === "DiscountAmount") {
94
125
  discountAmount = discountValue.value.discountAmount.cents / 100;
95
126
  } else if (discountValue.value.type === "DiscountPercentage") {
96
- discountAmount =
97
- parseFloat(selectedVariant.price.amount) *
98
- (discountValue.value.percentage / 100);
127
+ discountAmount = percentageDiscount(
128
+ selectedVariant.price,
129
+ discountValue.value.percentage,
130
+ );
99
131
  }
100
132
 
101
133
  return Math.max(max, discountAmount);
@@ -125,9 +157,10 @@ const getDiscountForMultiValueProduct = ({
125
157
  if (discountValue.value.type === "DiscountAmount") {
126
158
  discountAmount = discountValue.value.discountAmount.cents / 100;
127
159
  } else if (discountValue.value.type === "DiscountPercentage") {
128
- discountAmount =
129
- parseFloat(selectedVariant.price.amount) *
130
- (discountValue.value.percentage / 100);
160
+ discountAmount = percentageDiscount(
161
+ selectedVariant.price,
162
+ discountValue.value.percentage,
163
+ );
131
164
  }
132
165
 
133
166
  return Math.max(max, discountAmount);
@@ -298,9 +331,10 @@ const getDiscountForTierDiscount = ({
298
331
  biggestEligibleTier.value.type === "DiscountPercentage" &&
299
332
  biggestEligibleTier.value.percentage
300
333
  ) {
301
- const discountAmount =
302
- parseFloat(selectedVariant.price.amount) *
303
- (biggestEligibleTier.value.percentage / 100);
334
+ const discountAmount = percentageDiscount(
335
+ selectedVariant.price,
336
+ biggestEligibleTier.value.percentage,
337
+ );
304
338
 
305
339
  return discountAmount;
306
340
  }
@@ -478,9 +512,10 @@ const getDiscountForVolumeDiscount = ({
478
512
  biggestEligibleTier.value.type === "DiscountPercentage" &&
479
513
  biggestEligibleTier.value.percentage
480
514
  ) {
481
- const discountAmount =
482
- parseFloat(selectedVariant.price.amount) *
483
- (biggestEligibleTier.value.percentage / 100);
515
+ const discountAmount = percentageDiscount(
516
+ selectedVariant.price,
517
+ biggestEligibleTier.value.percentage,
518
+ );
484
519
 
485
520
  return discountAmount;
486
521
  }
@@ -672,9 +707,10 @@ const getDiscountForMultiEffectTiers = ({
672
707
  if (discount.value.type === "DiscountAmount") {
673
708
  discountAmount = parseFloat(discount.value.discountAmount.amount);
674
709
  } else if (discount.value.type === "DiscountPercentage") {
675
- discountAmount =
676
- parseFloat(selectedVariant.price.amount) *
677
- (discount.value.percentage / 100);
710
+ discountAmount = percentageDiscount(
711
+ selectedVariant.price,
712
+ discount.value.percentage,
713
+ );
678
714
  }
679
715
  return Math.max(max, discountAmount);
680
716
  }, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/discounts.js","../src/useAbra.js"],"sourcesContent":["// Pure discount math for useAbra. Moved verbatim from src/code-for-updating-custom-component.jsx.\n// getIdFromGid and productGidFromId are copied from @tapcart/mobile-components so the package has no imports.\nexport const getIdFromGid = (gid) => {\n if (!gid) return \"\";\n const arr = gid.split(\"/\");\n return arr[arr.length - 1] || \"\";\n};\n\nexport const productGidFromId = (id) => {\n if (!id) return null;\n if (id.startsWith(\"gid://shopify/Product/\")) return id;\n return \"gid://shopify/Product/\" + id;\n};\n\n// BXGY customer-gets: new payloads carry cards on customerGets.productCards,\n// legacy payloads a single {quantity, items} pair at the root.\nexport const getBxgyGetsCards = (customerGets) => {\n if (\n Array.isArray(customerGets?.productCards) &&\n customerGets.productCards.length > 0\n ) {\n return customerGets.productCards;\n }\n if (customerGets?.items != null) {\n return [\n {\n quantity: customerGets.quantity,\n items: customerGets.items,\n purchaseType: customerGets.purchaseType,\n },\n ];\n }\n return [];\n};\n\nexport const getDiscountForProductDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n}) => {\n const isProductEntitledForProductDiscount = () => {\n if (targetDiscount.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.entitled?.variants) {\n if (variantId && targetDiscount.entitled.variants.includes(variantId)) {\n return true;\n }\n }\n\n if (targetDiscount.entitled?.products) {\n if (handle && targetDiscount.entitled.products.includes(handle)) {\n return true;\n }\n }\n return false;\n };\n if (!isProductEntitledForProductDiscount()) return 0;\n\n if (targetDiscount.discountValue?.type === \"DiscountAmount\") {\n return targetDiscount.discountValue.discountAmount.cents / 100;\n } else if (targetDiscount.discountValue?.type === \"DiscountPercentage\") {\n return (\n parseFloat(selectedVariant.price.amount) *\n targetDiscount.discountValue.percentage\n );\n }\n};\n\nexport const getDiscountForMultiValueCollection = ({\n targetDiscount,\n handle,\n selectedVariant,\n}) => {\n if (\n !targetDiscount?.discountValue?.productDiscounts ||\n targetDiscount.discountValue.productDiscounts.length === 0\n )\n return 0;\n\n const entitledProductDiscounts =\n targetDiscount.discountValue.productDiscounts.filter((discount) =>\n (discount.products ?? []).includes(handle),\n ) || [];\n\n return entitledProductDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (discountValue.value.percentage / 100);\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForMultiValueProduct = ({\n targetDiscount,\n variantId,\n selectedVariant,\n}) => {\n if (!variantId) return 0;\n if (\n !targetDiscount?.discountValue?.variantDiscounts ||\n targetDiscount?.discountValue?.variantDiscounts.length === 0\n )\n return 0;\n\n const entitledVariantDiscounts =\n targetDiscount.discountValue.variantDiscounts.filter((discount) =>\n (discount.variants ?? []).includes(variantId),\n ) ?? [];\n\n return entitledVariantDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (discountValue.value.percentage / 100);\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForTierDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToTierDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.products) {\n if (\n handle &&\n targetDiscount.discountValue?.entitled?.products.includes(handle)\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.variants) {\n if (\n variantId &&\n targetDiscount.discountValue?.entitled?.variants.includes(variantId)\n ) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToTierDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (biggestEligibleTier.value.percentage / 100);\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForVolumeDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n // customer-gets purchaseType gates the displayed price; per-variant mode\n // (ELIGIBLE_VARIANTS) ignores it\n const customerGets = targetDiscount.discountValue?.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n if (getsPurchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan) return 0;\n if (getsPurchaseType === \"ONE_TIME\" && selectedHasSellingPlan) return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToVolumeDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.products) {\n if (handle && targetDiscount?.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.variants) {\n if (variantId && targetDiscount?.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToVolumeDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (biggestEligibleTier.value.percentage / 100);\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForMultiEffectTiers = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const isProductEntitledToDiscount = (discount) => {\n if (discount.entitled?.all) {\n return true;\n }\n\n if (discount.entitled?.collections) {\n if (\n currentCollectionHandle &&\n discount.entitled?.collections.includes(currentCollectionHandle)\n ) {\n return true;\n }\n }\n\n if (discount.entitled?.products) {\n if (handle && discount.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (discount.entitled?.variants) {\n if (variantId && discount.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n log(\"getEntitledQuantityAndTotal\");\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n log(\"getEntitledQuantityAndTotal\", { entitledQuantity, entitledTotal });\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n\n if (\n !targetDiscount.discountValue?.tiers ||\n targetDiscount.discountValue?.tiers.length === 0\n )\n return 0;\n\n log(\"getBiggestEligibleTier\");\n const currentCollectionHandle = product?.sourceCollection?.handle;\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n log(\"getBiggestEligibleTier\", { biggestEligibleTierIndex });\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const productDiscountsAvailableOnTier =\n targetDiscount.discountValue.tiers\n .slice(0, biggestEligibleTierIndex + 1)\n ?.filter((tier) =>\n tier.discounts.some((discount) => discount.type === \"ProductDiscount\"),\n )\n ?.flatMap(\n (tier) =>\n tier.discounts.find((discount) => discount.type === \"ProductDiscount\")\n ?.value ?? [],\n ) ?? [];\n\n // Per-entry purchaseType replaces the promotion-level flags: an entry only\n // affects the price branch matching the selected purchase state.\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const eligibleProductDiscounts = productDiscountsAvailableOnTier.filter(\n (discount) => {\n if (discount.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (discount.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return isProductEntitledToDiscount(discount);\n },\n );\n\n const maxDiscountAmount = eligibleProductDiscounts.reduce((max, discount) => {\n let discountAmount = 0;\n if (discount.value.type === \"DiscountAmount\") {\n discountAmount = parseFloat(discount.value.discountAmount.amount);\n } else if (discount.value.type === \"DiscountPercentage\") {\n discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (discount.value.percentage / 100);\n }\n return Math.max(max, discountAmount);\n }, 0);\n return maxDiscountAmount;\n};\n\nexport const isProductMatchingBxgyCardItems = (handle, variantId, items) => {\n if (!items) return false;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n for (const product of items.products) {\n if (product.handle === handle) {\n if (!product.variants || product.variants.length === 0) return true;\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === variantId || variant.id === variantId) return true;\n }\n }\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (collection.products?.includes(handle)) return true;\n }\n }\n\n return false;\n};\n\nexport const isCartItemMatchingBxgyCard = (item, card) => {\n const items = card.items;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n const itemVariantId = item.variantId?.toString();\n for (const product of items.products) {\n if (product.variants && product.variants.length > 0) {\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === itemVariantId || variant.id === itemVariantId)\n return true;\n }\n }\n if (item.handle && product.handle === item.handle) return true;\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (item.handle && collection.products?.includes(item.handle))\n return true;\n }\n }\n\n return false;\n};\n\nexport const areAllBxgyProductCardsMet = (cart, bxgy) => {\n if (!bxgy?.productCards?.length || !cart?.items) return false;\n\n const globalRequirementType = bxgy.requirementType ?? \"QUANTITY\";\n\n for (const card of bxgy.productCards) {\n const requirementType = card.requirementType ?? globalRequirementType;\n let totalQuantity = 0;\n let totalSubtotal = 0;\n\n for (const item of cart.items) {\n if (isCartItemMatchingBxgyCard(item, card)) {\n // Check purchaseType on the card against the cart item\n const itemHasSellingPlan = Boolean(item.sellingPlanAllocation);\n if (card.purchaseType === \"SUBSCRIPTION\" && !itemHasSellingPlan) {\n continue;\n }\n if (card.purchaseType === \"ONE_TIME\" && itemHasSellingPlan) {\n continue;\n }\n\n totalQuantity += item.quantity || 0;\n totalSubtotal +=\n parseFloat(item.price?.amount || 0) * 100 * (item.quantity || 0);\n }\n }\n\n if (requirementType === \"SUBTOTAL\") {\n const required = card.minimumSubtotal?.cents || 0;\n if (required > 0 && totalSubtotal < required) return false;\n } else {\n const required = card.quantity || 0;\n if (required > 0 && totalQuantity < required) return false;\n }\n }\n\n return true;\n};\n\nexport const getDiscountForBxgyDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n cart,\n}) => {\n const bxgy = targetDiscount.discountValue;\n if (!bxgy?.productCards || !bxgy?.customerGets) return 0;\n\n const customerGetsValueType = bxgy.customerGets.value?.type;\n\n if (\n customerGetsValueType === \"Gift\" ||\n customerGetsValueType === \"FixedPrice\"\n ) {\n return 0;\n }\n\n // Gets-card purchaseType gates the displayed price against the selected\n // purchase state (new payloads carry gets cards; legacy has plain items).\n const getsCards = getBxgyGetsCards(bxgy.customerGets);\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const matchesGetsPurchaseType = (card) => {\n if (card.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (card.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return true;\n };\n\n const isEntitledToReceive = () => {\n if (bxgy.customerGets.applyToProductCardItems) {\n return bxgy.productCards.some((card) =>\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n }\n return getsCards.some(\n (card) =>\n matchesGetsPurchaseType(card) &&\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n };\n\n if (!isEntitledToReceive()) return 0;\n\n // Check if this product matches a productCard with purchase type requirement\n // Look up the actual cart item to check if it has a subscription selected\n const matchingCartItem = (cart?.items || []).find(\n (item) =>\n item.variantId?.toString() === variantId?.toString() ||\n item.handle === handle,\n );\n const cartItemHasSellingPlan = Boolean(\n matchingCartItem?.sellingPlanAllocation,\n );\n\n for (const card of bxgy.productCards) {\n if (isProductMatchingBxgyCardItems(handle, variantId, card.items)) {\n if (card.purchaseType === \"SUBSCRIPTION\" && !cartItemHasSellingPlan) {\n return 0;\n } else if (card.purchaseType === \"ONE_TIME\" && cartItemHasSellingPlan) {\n return 0;\n }\n }\n }\n\n if (!areAllBxgyProductCardsMet(cart, bxgy)) return 0;\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount || 0);\n if (originalPrice <= 0) return 0;\n\n if (customerGetsValueType === \"DiscountPercentage\") {\n const percentage = bxgy.customerGets.value.percentage || 0;\n return originalPrice * (percentage / 100);\n } else if (customerGetsValueType === \"DiscountAmount\") {\n const cents = bxgy.customerGets.value.discountAmount?.cents || 0;\n return Math.min(cents / 100, originalPrice);\n }\n\n return 0;\n};\n\nexport const getDiscountValueForDiscount = ({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n}) => {\n const handle = product?.handle;\n const variantId = getIdFromGid(selectedVariant?.id);\n\n if (!handle || !discount) return 0;\n\n if (discount.discountValue?.type === \"DiscountCodeBxgy\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"Gift\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"BxgyDiscount\") {\n return getDiscountForBxgyDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueProduct\") {\n return getDiscountForMultiValueProduct({\n targetDiscount: discount,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueCollection\") {\n return getDiscountForMultiValueCollection({\n targetDiscount: discount,\n handle,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"TieredDiscount\") {\n return getDiscountForTierDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n return getDiscountForVolumeDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"CollectionOrderDiscount\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n log(\"getDiscountForMultiEffectTiers\");\n return getDiscountForMultiEffectTiers({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n });\n }\n\n if (discount.discountValue?.type === \"ProductDiscount\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountClass === \"ORDER\") {\n return 0;\n }\n if (discount.discountClass === \"SHIPPING\") {\n return 0;\n }\n\n if (discount.discountClass === \"PRODUCT\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n return 0;\n};\n\nexport const getBiggestDiscount = ({\n activePromotion,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const discounts = Object.values(activePromotion?.discounts ?? []);\n log(\"Calculating biggest discount\", {\n discountCount: discounts.length,\n productId: product?.handle,\n collectionId: product?.sourceCollection?.handle,\n variantId: selectedVariant?.id,\n hasSellingPlan: !!selectedVariant?.sellingPlanAllocation,\n });\n\n const biggestDiscount = discounts.reduce((max, discount) => {\n const hasSellingPlan = Boolean(selectedVariant?.sellingPlanAllocation);\n\n // For BXGY discounts, purchase type is checked PER CARD (card.purchaseType),\n // not at the top level. Skip top-level appliesOnSubscription/appliesOnOneTimePurchase.\n // For other discount types, still use the top-level flags — unless a\n // customer-gets purchaseType overrides them (checked per discount type below).\n if (discount.discountValue?.type !== \"BxgyDiscount\") {\n let appliesOnSubscription = discount.appliesOnSubscription;\n let appliesOnOneTimePurchase = discount.appliesOnOneTimePurchase;\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n const customerGets = discount.discountValue.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n if (getsPurchaseType) {\n appliesOnSubscription = getsPurchaseType !== \"ONE_TIME\";\n appliesOnOneTimePurchase = getsPurchaseType !== \"SUBSCRIPTION\";\n }\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n // Entries with their own purchaseType filter themselves in\n // getDiscountForMultiEffectTiers; don't gate the whole discount here.\n const hasPerEntryPurchaseType = (\n discount.discountValue.tiers ?? []\n ).some((tier) =>\n (tier.discounts ?? []).some(\n (tierDiscount) =>\n tierDiscount.type === \"ProductDiscount\" &&\n (Array.isArray(tierDiscount.value)\n ? tierDiscount.value\n : []\n ).some((entry) => entry.purchaseType),\n ),\n );\n if (hasPerEntryPurchaseType) {\n appliesOnSubscription = true;\n appliesOnOneTimePurchase = true;\n }\n }\n\n if (appliesOnSubscription && !appliesOnOneTimePurchase) {\n if (!hasSellingPlan) {\n log(\n \"Skipping subscription-only discount (no subscription selected)\",\n {\n discountType: discount.discountValue?.type,\n },\n );\n return max;\n }\n }\n\n if (!appliesOnSubscription && appliesOnOneTimePurchase) {\n if (hasSellingPlan) {\n log(\"Skipping one-time-only discount (subscription selected)\", {\n discountType: discount.discountValue?.type,\n });\n return max;\n }\n }\n }\n\n const discountValue = getDiscountValueForDiscount({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n });\n log(\"Discount calculated\", {\n discountType: discount.discountValue?.type,\n discountValue,\n maxSoFar: max,\n appliesOnSubscription: discount.appliesOnSubscription,\n appliesOnOneTimePurchase: discount.appliesOnOneTimePurchase,\n hasSellingPlan,\n });\n return Math.max(max, discountValue);\n }, 0);\n\n log(\"Final biggest discount\", { biggestDiscount });\n return biggestDiscount;\n};\n\nexport const parsePromotionIfActive = (promotionObject, now = new Date()) => {\n try {\n // Handle both object and string cases for backward compatibility\n const promotion =\n typeof promotionObject === \"string\"\n ? JSON.parse(promotionObject ?? \"{}\")\n : promotionObject;\n\n // no stored promotion is the normal state, not an error\n if (!promotion?.startsAt || !promotion.status || !promotion.title)\n return undefined;\n const startsAt = new Date(promotion.startsAt);\n const endsAt = promotion.endsAt ? new Date(promotion.endsAt) : null;\n\n if (\n (promotion.status === \"ACTIVE\" || promotion.status === \"SCHEDULED\") &&\n now >= startsAt &&\n (!endsAt || now <= endsAt)\n ) {\n return promotion;\n }\n\n return undefined;\n } catch (error) {\n console.error(\"Failed to parse promotion:\", error);\n return undefined;\n }\n};\n","import {\n getBiggestDiscount,\n parsePromotionIfActive,\n getIdFromGid,\n productGidFromId,\n} from \"./discounts.js\";\n\n// Prints log() lines (including the discount math's) to the console, read over WebView remote\n// debugging, only on the devices in debugDeviceIds (the template's ABRA_CONFIG, set by setup/update\n// --debug <device-id>). Consecutive identical lines are dropped: some fire on every render.\nlet lastConsoleLine = \"\";\nconst consoleLog = (debugDeviceIds, deviceId, message, data) => {\n const device = String(deviceId ?? \"\").toLowerCase();\n if (\n !device ||\n !(debugDeviceIds || []).some((id) => String(id).toLowerCase() === device)\n )\n return;\n let json = \"\";\n if (data != null) {\n try {\n json = ` ${JSON.stringify(data)}`;\n } catch {\n json = ` ${String(data)}`;\n }\n }\n const line = `[Abra useAbra] ${message}${json}`;\n if (line === lastConsoleLine) return;\n lastConsoleLine = line;\n console.log(line);\n};\n\nexport default function useAbra({\n React,\n useTapcart,\n tapcartData,\n debugDeviceIds,\n}) {\n const Tapcart = useTapcart();\n // log() is memoized once; it reads these through a ref\n const consoleRef = React.useRef({});\n consoleRef.current = {\n debugDeviceIds,\n deviceId: Tapcart?.variables?.device?.id,\n };\n const [activePromotion, setActivePromotion] = React.useState(undefined);\n const renderCountRef = React.useRef(0);\n const logRef = React.useRef([]);\n const variables = Tapcart?.variables;\n const { storeFrontAccessToken, storeUrl } =\n tapcartData?.integrations?.find((x) => x.name === \"abra-promotions\") ?? {};\n\n // Stable GraphQL fragment and functions\n const PRODUCT_FRAGMENT = React.useMemo(\n () => `\n id\n handle\n variants(first: 100) {\n edges {\n node {\n id\n handle: title\n price {\n amount\n currencyCode\n }\n }\n }\n }\n `,\n [],\n );\n\n const generateProductsQuery = React.useCallback(\n (ids, country) => {\n const productQueries = ids\n .map(\n (id, index) =>\n `product_${index}: product(id: \"${productGidFromId(id)}\") {\n ${PRODUCT_FRAGMENT}\n }`,\n )\n .join(\"\\n \");\n\n const inContextDirective = country\n ? `@inContext(country: ${country})`\n : \"\";\n\n return `\n query Products ${inContextDirective} {\n ${productQueries}\n }\n `;\n },\n [PRODUCT_FRAGMENT],\n );\n\n const graphqlDefaultBody = React.useCallback(\n (query, variables, storeFrontAccessToken) => {\n return {\n async: true,\n crossDomain: true,\n method: \"POST\",\n headers: {\n \"X-Shopify-Storefront-Access-Token\": storeFrontAccessToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n };\n },\n [],\n );\n\n const fetchProducts = React.useCallback(\n async (ids, storeUrl, storeFrontAccessToken, country) => {\n if (!storeUrl || !storeFrontAccessToken) {\n return { error: \"Missing required configuration\" };\n }\n\n if (!ids || ids.length === 0) {\n return { data: [], error: \"No ids\" };\n }\n\n const GRAPHQL_URL = `https://${storeUrl}/api/2024-04/graphql.json`;\n const query = generateProductsQuery(ids, country);\n\n try {\n const response = await fetch(\n GRAPHQL_URL,\n graphqlDefaultBody(query, {}, storeFrontAccessToken),\n );\n\n if (response?.ok) {\n const responseBody = await response.json();\n const data = responseBody?.data;\n\n if (!data) {\n return { data: [], error: \"No data\" };\n }\n\n const products = Object.values(data).filter((item) => item !== null);\n\n return {\n data: products,\n error: null,\n };\n }\n\n const error = await response.text();\n return { data: [], error: error };\n } catch (err) {\n return { data: [], error: err.message };\n }\n },\n [generateProductsQuery, graphqlDefaultBody],\n );\n\n const useProductsCustom = React.useCallback(\n ({ ids, storeUrl, storeFrontAccessToken, country }) => {\n const [products, setProducts] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState(null);\n\n // Memoize ids to prevent infinite loops\n const idsString = React.useMemo(() => {\n if (!ids || !Array.isArray(ids) || ids.length === 0) return \"\";\n return [...ids].sort().join(\",\");\n }, [ids ? JSON.stringify([...ids].sort()) : \"\"]);\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!storeUrl || !storeFrontAccessToken) {\n if (!storeUrl) {\n setError(\"no store url\");\n }\n if (!storeFrontAccessToken) {\n setError(\"no store front access token\");\n }\n setProducts([]);\n setLoading(false);\n return;\n }\n\n if (!ids || ids.length === 0) {\n setProducts([]);\n setLoading(false);\n return;\n }\n\n const result = await fetchProducts(\n ids,\n storeUrl,\n storeFrontAccessToken,\n country,\n );\n\n try {\n if (result.data && result.data.length > 0) {\n const formattedProducts = result?.data?.map((product) => ({\n id: getIdFromGid(product.id),\n handle: product?.handle,\n variants: product?.variants?.edges?.map((variant) => ({\n id: getIdFromGid(variant?.node?.id),\n handle: variant?.node?.handle,\n price: variant?.node?.price,\n })),\n }));\n setProducts(formattedProducts);\n setError(result.error);\n } else {\n setProducts([]);\n setError(result.error);\n }\n } catch (error) {\n setError(error.message);\n }\n\n setLoading(false);\n };\n\n fetchData();\n }, [idsString, storeUrl, storeFrontAccessToken, country, fetchProducts]);\n\n return { products, loading, error };\n },\n [fetchProducts],\n );\n\n // Stable logging function that doesn't cause re-renders\n const log = React.useCallback((message, data = null) => {\n consoleLog(\n consoleRef.current.debugDeviceIds,\n consoleRef.current.deviceId,\n message,\n data,\n );\n const timestamp = new Date().toISOString();\n const logEntry = {\n timestamp,\n message,\n data: data ? JSON.parse(JSON.stringify(data)) : null,\n renderCount: renderCountRef.current,\n };\n logRef.current.push(logEntry);\n\n // Keep only last 50 logs to prevent memory issues\n if (logRef.current.length > 100) {\n logRef.current = logRef.current.slice(-100);\n }\n }, []);\n\n // Create stable cart items reference to prevent infinite recreations\n const stableCartItems = React.useMemo(() => {\n const currentCartItems = variables?.cart?.items ?? [];\n\n if (!currentCartItems || currentCartItems.length === 0) {\n return [];\n }\n\n const mappedItems = currentCartItems.map((item) => ({\n productId: item.productId,\n variantId: item.variantId,\n quantity: item.quantity,\n sellingPlanAllocation: item.sellingPlanAllocation,\n }));\n\n return mappedItems;\n }, [\n (variables?.cart?.items || [])\n ?.map((item) => `${item.productId}-${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n const ids = React.useMemo(\n () => (stableCartItems ?? []).map((item) => item.productId),\n [stableCartItems],\n );\n\n // Get country from cart currency or tapcartData\n const country = React.useMemo(() => {\n return (\n Tapcart?.variables?.cart?.currency?.slice(0, 2) || tapcartData?.country\n );\n }, [Tapcart?.variables?.cart?.currency, tapcartData?.country]);\n\n const {\n products: cartItems,\n loading: cartItemsLoading,\n error: cartItemsError,\n } = useProductsCustom({\n ids,\n storeUrl: storeUrl,\n storeFrontAccessToken: storeFrontAccessToken,\n country: country,\n });\n\n // Render limiter to prevent infinite recreations\n renderCountRef.current += 1;\n\n // Create stable cart reference to prevent infinite recreations\n const stableCart = React.useMemo(() => {\n if (!variables?.cart) {\n return null;\n }\n if (cartItemsLoading || cartItemsError) {\n return variables.cart;\n }\n\n if (!cartItems || cartItems.length === 0) {\n return variables.cart;\n }\n\n const processedItems = (stableCartItems || []).map((item) => {\n const _cartItem = cartItems?.find(\n (cartItem) => getIdFromGid(cartItem?.id) === item.productId,\n );\n if (!_cartItem) {\n return item;\n }\n const _variant = _cartItem?.variants?.find(\n (variant) => getIdFromGid(variant?.id) === item?.variantId,\n );\n if (!_variant) {\n return item;\n }\n\n const processedItem = {\n ...item,\n handle: _cartItem?.handle,\n price: _variant?.price,\n };\n\n return processedItem;\n });\n\n const result = {\n ...variables.cart,\n items: processedItems,\n };\n\n return result;\n }, [\n cartItems,\n cartItemsLoading,\n cartItemsError,\n (variables?.cart?.items || [])\n ?.map((item) => `${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n // Effect: Initialize from storage and observe changes\n React.useEffect(() => {\n const storage = Tapcart?.variables?.storage || {};\n const abraData = storage[\"abra\"] || {};\n const storedPromotion = parsePromotionIfActive(\n abraData[\"active-promotion\"],\n );\n\n log(\"Storage promotion retrieved\", { storedPromotion });\n\n // Only update activePromotion if the promotion has actually changed\n if (\n storedPromotion?.title &&\n JSON.stringify(activePromotion) !== JSON.stringify(storedPromotion)\n ) {\n setActivePromotion(storedPromotion);\n } else if (!storedPromotion?.title && activePromotion) {\n // Clear promotion if it was removed from storage\n setActivePromotion(undefined);\n }\n }, [Tapcart?.variables?.storage?.[\"abra\"]?.[\"active-promotion\"]]);\n\n let getProductWithDiscount = React.useCallback(\n (product) => {\n if (!activePromotion || !activePromotion.title || !product) {\n log(\"No active promotion or product, returning original product\", {\n hasActivePromotion: !!activePromotion,\n hasProduct: !!product,\n });\n return product;\n }\n\n const _product = JSON.parse(JSON.stringify(product));\n let currencyCode = undefined;\n const variants = _product.variants.map((variant) => {\n const selectedVariant = JSON.parse(JSON.stringify(variant));\n currencyCode = currencyCode || selectedVariant?.price?.currencyCode;\n let biggestDiscount = 0;\n try {\n biggestDiscount = getBiggestDiscount({\n activePromotion,\n product: _product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n } catch (error) {\n log(\"Error calculating discount\", {\n error: error.message,\n variantId: selectedVariant?.id,\n });\n biggestDiscount = 0;\n }\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount ?? 0);\n const compareAtPrice = parseFloat(\n selectedVariant?.compareAtPrice?.amount ?? 0,\n );\n\n let referencePrice = originalPrice;\n if (compareAtPrice) {\n referencePrice = Math.max(originalPrice, compareAtPrice ?? 0);\n }\n\n let discountedPrice = Math.max(originalPrice - biggestDiscount, 0);\n\n selectedVariant.price = {\n amount: discountedPrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n selectedVariant.compareAtPrice = {\n amount: referencePrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n return selectedVariant;\n });\n _product.variants = variants;\n currencyCode = currencyCode || \"USD\";\n _product.compareAtPriceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(\n max,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, 0),\n currencyCode: currencyCode,\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(\n min,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, Infinity),\n currencyCode: currencyCode,\n },\n };\n _product.priceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(max, parseFloat(variant.price.amount));\n }, 0),\n currencyCode: currencyCode || \"USD\",\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(min, parseFloat(variant.price.amount));\n }, Infinity),\n currencyCode: currencyCode || \"USD\",\n },\n };\n _product.abra = true;\n\n return _product;\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n // Discounted price for a single price point (e.g. a selling-plan option in a\n // subscription selector). hasSellingPlan forces the subscription vs one-time\n // price branch regardless of what the variant carries.\n const getDiscountedPrice = React.useCallback(\n (product, variant, price, hasSellingPlan = false) => {\n const basePrice = parseFloat(price ?? variant?.price?.amount ?? 0);\n if (!activePromotion || !activePromotion.title || !product || !variant) {\n return basePrice;\n }\n\n const selectedVariant = {\n ...variant,\n price: {\n amount: basePrice,\n currencyCode: variant?.price?.currencyCode,\n },\n sellingPlanAllocation: hasSellingPlan\n ? (variant?.sellingPlanAllocation ?? { sellingPlan: {} })\n : null,\n };\n\n try {\n const biggestDiscount = getBiggestDiscount({\n activePromotion,\n product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n return Math.max(basePrice - biggestDiscount, 0);\n } catch (error) {\n log(\"Error calculating discounted price\", {\n error: error.message,\n variantId: variant?.id,\n });\n return basePrice;\n }\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n return React.useMemo(\n () => ({\n abra: {\n activePromotion,\n getProductWithDiscount,\n getDiscountedPrice,\n logs: logRef.current,\n },\n }),\n [activePromotion, getProductWithDiscount, getDiscountedPrice],\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/discounts.js","../src/useAbra.js"],"sourcesContent":["// Pure discount math for useAbra. Moved verbatim from src/code-for-updating-custom-component.jsx.\n// getIdFromGid and productGidFromId are copied from @tapcart/mobile-components so the package has no imports.\nexport const getIdFromGid = (gid) => {\n if (!gid) return \"\";\n const arr = gid.split(\"/\");\n return arr[arr.length - 1] || \"\";\n};\n\nexport const productGidFromId = (id) => {\n if (!id) return null;\n if (id.startsWith(\"gid://shopify/Product/\")) return id;\n return \"gid://shopify/Product/\" + id;\n};\n\n// A percentage discount on one unit. Shopify truncates USD percentage discounts per unit to the\n// cent before multiplying by quantity (https://community.shopify.dev/t/28655/10), so the price\n// shown matches checkout. Other currencies, and values that aren't plain decimals, keep the exact\n// amount. `divisor` is 1 for a fraction (0.2) and 100 for a percentage (20).\nexport const percentageDiscount = (money, percentage, divisor = 100) => {\n const exact = parseFloat(money?.amount) * (percentage / divisor);\n if (money?.currencyCode !== \"USD\") return exact;\n\n const amount = String(money?.amount).match(/^(\\d+)(?:\\.(\\d{1,2})0*)?$/);\n const rate = String(percentage).match(/^(\\d+)(?:\\.(\\d+))?$/);\n if (!amount || !rate || (divisor !== 1 && divisor !== 100)) return exact;\n const rateFraction = (rate[2] || \"\").replace(/0+$/, \"\");\n const unitCents =\n Number(amount[1]) * 100 + Number((amount[2] || \"\").padEnd(2, \"0\"));\n const rateNumerator = Number(rate[1] + rateFraction);\n const rateDenominator = divisor * 10 ** rateFraction.length;\n const numerator = unitCents * rateNumerator;\n if (\n !Number.isSafeInteger(unitCents) ||\n !Number.isSafeInteger(rateNumerator) ||\n !Number.isSafeInteger(rateDenominator) ||\n !Number.isSafeInteger(numerator) ||\n rateNumerator > rateDenominator\n )\n return exact;\n\n // integer math: flooring a floating dollar amount can lose a cent at exact-cent boundaries\n return (numerator - (numerator % rateDenominator)) / rateDenominator / 100;\n};\n\n// BXGY customer-gets: new payloads carry cards on customerGets.productCards,\n// legacy payloads a single {quantity, items} pair at the root.\nexport const getBxgyGetsCards = (customerGets) => {\n if (\n Array.isArray(customerGets?.productCards) &&\n customerGets.productCards.length > 0\n ) {\n return customerGets.productCards;\n }\n if (customerGets?.items != null) {\n return [\n {\n quantity: customerGets.quantity,\n items: customerGets.items,\n purchaseType: customerGets.purchaseType,\n },\n ];\n }\n return [];\n};\n\nexport const getDiscountForProductDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n}) => {\n const isProductEntitledForProductDiscount = () => {\n if (targetDiscount.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.entitled?.variants) {\n if (variantId && targetDiscount.entitled.variants.includes(variantId)) {\n return true;\n }\n }\n\n if (targetDiscount.entitled?.products) {\n if (handle && targetDiscount.entitled.products.includes(handle)) {\n return true;\n }\n }\n return false;\n };\n if (!isProductEntitledForProductDiscount()) return 0;\n\n if (targetDiscount.discountValue?.type === \"DiscountAmount\") {\n return targetDiscount.discountValue.discountAmount.cents / 100;\n } else if (targetDiscount.discountValue?.type === \"DiscountPercentage\") {\n return percentageDiscount(\n selectedVariant.price,\n targetDiscount.discountValue.percentage,\n 1,\n );\n }\n};\n\nexport const getDiscountForMultiValueCollection = ({\n targetDiscount,\n handle,\n selectedVariant,\n}) => {\n if (\n !targetDiscount?.discountValue?.productDiscounts ||\n targetDiscount.discountValue.productDiscounts.length === 0\n )\n return 0;\n\n const entitledProductDiscounts =\n targetDiscount.discountValue.productDiscounts.filter((discount) =>\n (discount.products ?? []).includes(handle),\n ) || [];\n\n return entitledProductDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount = percentageDiscount(\n selectedVariant.price,\n discountValue.value.percentage,\n );\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForMultiValueProduct = ({\n targetDiscount,\n variantId,\n selectedVariant,\n}) => {\n if (!variantId) return 0;\n if (\n !targetDiscount?.discountValue?.variantDiscounts ||\n targetDiscount?.discountValue?.variantDiscounts.length === 0\n )\n return 0;\n\n const entitledVariantDiscounts =\n targetDiscount.discountValue.variantDiscounts.filter((discount) =>\n (discount.variants ?? []).includes(variantId),\n ) ?? [];\n\n return entitledVariantDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount = percentageDiscount(\n selectedVariant.price,\n discountValue.value.percentage,\n );\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForTierDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToTierDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.products) {\n if (\n handle &&\n targetDiscount.discountValue?.entitled?.products.includes(handle)\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.variants) {\n if (\n variantId &&\n targetDiscount.discountValue?.entitled?.variants.includes(variantId)\n ) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToTierDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount = percentageDiscount(\n selectedVariant.price,\n biggestEligibleTier.value.percentage,\n );\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForVolumeDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n // customer-gets purchaseType gates the displayed price; per-variant mode\n // (ELIGIBLE_VARIANTS) ignores it\n const customerGets = targetDiscount.discountValue?.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n if (getsPurchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan) return 0;\n if (getsPurchaseType === \"ONE_TIME\" && selectedHasSellingPlan) return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToVolumeDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.products) {\n if (handle && targetDiscount?.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.variants) {\n if (variantId && targetDiscount?.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToVolumeDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount = percentageDiscount(\n selectedVariant.price,\n biggestEligibleTier.value.percentage,\n );\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForMultiEffectTiers = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const isProductEntitledToDiscount = (discount) => {\n if (discount.entitled?.all) {\n return true;\n }\n\n if (discount.entitled?.collections) {\n if (\n currentCollectionHandle &&\n discount.entitled?.collections.includes(currentCollectionHandle)\n ) {\n return true;\n }\n }\n\n if (discount.entitled?.products) {\n if (handle && discount.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (discount.entitled?.variants) {\n if (variantId && discount.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n log(\"getEntitledQuantityAndTotal\");\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n log(\"getEntitledQuantityAndTotal\", { entitledQuantity, entitledTotal });\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n\n if (\n !targetDiscount.discountValue?.tiers ||\n targetDiscount.discountValue?.tiers.length === 0\n )\n return 0;\n\n log(\"getBiggestEligibleTier\");\n const currentCollectionHandle = product?.sourceCollection?.handle;\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n log(\"getBiggestEligibleTier\", { biggestEligibleTierIndex });\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const productDiscountsAvailableOnTier =\n targetDiscount.discountValue.tiers\n .slice(0, biggestEligibleTierIndex + 1)\n ?.filter((tier) =>\n tier.discounts.some((discount) => discount.type === \"ProductDiscount\"),\n )\n ?.flatMap(\n (tier) =>\n tier.discounts.find((discount) => discount.type === \"ProductDiscount\")\n ?.value ?? [],\n ) ?? [];\n\n // Per-entry purchaseType replaces the promotion-level flags: an entry only\n // affects the price branch matching the selected purchase state.\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const eligibleProductDiscounts = productDiscountsAvailableOnTier.filter(\n (discount) => {\n if (discount.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (discount.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return isProductEntitledToDiscount(discount);\n },\n );\n\n const maxDiscountAmount = eligibleProductDiscounts.reduce((max, discount) => {\n let discountAmount = 0;\n if (discount.value.type === \"DiscountAmount\") {\n discountAmount = parseFloat(discount.value.discountAmount.amount);\n } else if (discount.value.type === \"DiscountPercentage\") {\n discountAmount = percentageDiscount(\n selectedVariant.price,\n discount.value.percentage,\n );\n }\n return Math.max(max, discountAmount);\n }, 0);\n return maxDiscountAmount;\n};\n\nexport const isProductMatchingBxgyCardItems = (handle, variantId, items) => {\n if (!items) return false;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n for (const product of items.products) {\n if (product.handle === handle) {\n if (!product.variants || product.variants.length === 0) return true;\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === variantId || variant.id === variantId) return true;\n }\n }\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (collection.products?.includes(handle)) return true;\n }\n }\n\n return false;\n};\n\nexport const isCartItemMatchingBxgyCard = (item, card) => {\n const items = card.items;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n const itemVariantId = item.variantId?.toString();\n for (const product of items.products) {\n if (product.variants && product.variants.length > 0) {\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === itemVariantId || variant.id === itemVariantId)\n return true;\n }\n }\n if (item.handle && product.handle === item.handle) return true;\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (item.handle && collection.products?.includes(item.handle))\n return true;\n }\n }\n\n return false;\n};\n\nexport const areAllBxgyProductCardsMet = (cart, bxgy) => {\n if (!bxgy?.productCards?.length || !cart?.items) return false;\n\n const globalRequirementType = bxgy.requirementType ?? \"QUANTITY\";\n\n for (const card of bxgy.productCards) {\n const requirementType = card.requirementType ?? globalRequirementType;\n let totalQuantity = 0;\n let totalSubtotal = 0;\n\n for (const item of cart.items) {\n if (isCartItemMatchingBxgyCard(item, card)) {\n // Check purchaseType on the card against the cart item\n const itemHasSellingPlan = Boolean(item.sellingPlanAllocation);\n if (card.purchaseType === \"SUBSCRIPTION\" && !itemHasSellingPlan) {\n continue;\n }\n if (card.purchaseType === \"ONE_TIME\" && itemHasSellingPlan) {\n continue;\n }\n\n totalQuantity += item.quantity || 0;\n totalSubtotal +=\n parseFloat(item.price?.amount || 0) * 100 * (item.quantity || 0);\n }\n }\n\n if (requirementType === \"SUBTOTAL\") {\n const required = card.minimumSubtotal?.cents || 0;\n if (required > 0 && totalSubtotal < required) return false;\n } else {\n const required = card.quantity || 0;\n if (required > 0 && totalQuantity < required) return false;\n }\n }\n\n return true;\n};\n\nexport const getDiscountForBxgyDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n cart,\n}) => {\n const bxgy = targetDiscount.discountValue;\n if (!bxgy?.productCards || !bxgy?.customerGets) return 0;\n\n const customerGetsValueType = bxgy.customerGets.value?.type;\n\n if (\n customerGetsValueType === \"Gift\" ||\n customerGetsValueType === \"FixedPrice\"\n ) {\n return 0;\n }\n\n // Gets-card purchaseType gates the displayed price against the selected\n // purchase state (new payloads carry gets cards; legacy has plain items).\n const getsCards = getBxgyGetsCards(bxgy.customerGets);\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const matchesGetsPurchaseType = (card) => {\n if (card.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (card.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return true;\n };\n\n const isEntitledToReceive = () => {\n if (bxgy.customerGets.applyToProductCardItems) {\n return bxgy.productCards.some((card) =>\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n }\n return getsCards.some(\n (card) =>\n matchesGetsPurchaseType(card) &&\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n };\n\n if (!isEntitledToReceive()) return 0;\n\n // Check if this product matches a productCard with purchase type requirement\n // Look up the actual cart item to check if it has a subscription selected\n const matchingCartItem = (cart?.items || []).find(\n (item) =>\n item.variantId?.toString() === variantId?.toString() ||\n item.handle === handle,\n );\n const cartItemHasSellingPlan = Boolean(\n matchingCartItem?.sellingPlanAllocation,\n );\n\n for (const card of bxgy.productCards) {\n if (isProductMatchingBxgyCardItems(handle, variantId, card.items)) {\n if (card.purchaseType === \"SUBSCRIPTION\" && !cartItemHasSellingPlan) {\n return 0;\n } else if (card.purchaseType === \"ONE_TIME\" && cartItemHasSellingPlan) {\n return 0;\n }\n }\n }\n\n if (!areAllBxgyProductCardsMet(cart, bxgy)) return 0;\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount || 0);\n if (originalPrice <= 0) return 0;\n\n if (customerGetsValueType === \"DiscountPercentage\") {\n const percentage = bxgy.customerGets.value.percentage || 0;\n return originalPrice * (percentage / 100);\n } else if (customerGetsValueType === \"DiscountAmount\") {\n const cents = bxgy.customerGets.value.discountAmount?.cents || 0;\n return Math.min(cents / 100, originalPrice);\n }\n\n return 0;\n};\n\nexport const getDiscountValueForDiscount = ({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n}) => {\n const handle = product?.handle;\n const variantId = getIdFromGid(selectedVariant?.id);\n\n if (!handle || !discount) return 0;\n\n if (discount.discountValue?.type === \"DiscountCodeBxgy\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"Gift\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"BxgyDiscount\") {\n return getDiscountForBxgyDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueProduct\") {\n return getDiscountForMultiValueProduct({\n targetDiscount: discount,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueCollection\") {\n return getDiscountForMultiValueCollection({\n targetDiscount: discount,\n handle,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"TieredDiscount\") {\n return getDiscountForTierDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n return getDiscountForVolumeDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"CollectionOrderDiscount\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n log(\"getDiscountForMultiEffectTiers\");\n return getDiscountForMultiEffectTiers({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n });\n }\n\n if (discount.discountValue?.type === \"ProductDiscount\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountClass === \"ORDER\") {\n return 0;\n }\n if (discount.discountClass === \"SHIPPING\") {\n return 0;\n }\n\n if (discount.discountClass === \"PRODUCT\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n return 0;\n};\n\nexport const getBiggestDiscount = ({\n activePromotion,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const discounts = Object.values(activePromotion?.discounts ?? []);\n log(\"Calculating biggest discount\", {\n discountCount: discounts.length,\n productId: product?.handle,\n collectionId: product?.sourceCollection?.handle,\n variantId: selectedVariant?.id,\n hasSellingPlan: !!selectedVariant?.sellingPlanAllocation,\n });\n\n const biggestDiscount = discounts.reduce((max, discount) => {\n const hasSellingPlan = Boolean(selectedVariant?.sellingPlanAllocation);\n\n // For BXGY discounts, purchase type is checked PER CARD (card.purchaseType),\n // not at the top level. Skip top-level appliesOnSubscription/appliesOnOneTimePurchase.\n // For other discount types, still use the top-level flags — unless a\n // customer-gets purchaseType overrides them (checked per discount type below).\n if (discount.discountValue?.type !== \"BxgyDiscount\") {\n let appliesOnSubscription = discount.appliesOnSubscription;\n let appliesOnOneTimePurchase = discount.appliesOnOneTimePurchase;\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n const customerGets = discount.discountValue.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n if (getsPurchaseType) {\n appliesOnSubscription = getsPurchaseType !== \"ONE_TIME\";\n appliesOnOneTimePurchase = getsPurchaseType !== \"SUBSCRIPTION\";\n }\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n // Entries with their own purchaseType filter themselves in\n // getDiscountForMultiEffectTiers; don't gate the whole discount here.\n const hasPerEntryPurchaseType = (\n discount.discountValue.tiers ?? []\n ).some((tier) =>\n (tier.discounts ?? []).some(\n (tierDiscount) =>\n tierDiscount.type === \"ProductDiscount\" &&\n (Array.isArray(tierDiscount.value)\n ? tierDiscount.value\n : []\n ).some((entry) => entry.purchaseType),\n ),\n );\n if (hasPerEntryPurchaseType) {\n appliesOnSubscription = true;\n appliesOnOneTimePurchase = true;\n }\n }\n\n if (appliesOnSubscription && !appliesOnOneTimePurchase) {\n if (!hasSellingPlan) {\n log(\n \"Skipping subscription-only discount (no subscription selected)\",\n {\n discountType: discount.discountValue?.type,\n },\n );\n return max;\n }\n }\n\n if (!appliesOnSubscription && appliesOnOneTimePurchase) {\n if (hasSellingPlan) {\n log(\"Skipping one-time-only discount (subscription selected)\", {\n discountType: discount.discountValue?.type,\n });\n return max;\n }\n }\n }\n\n const discountValue = getDiscountValueForDiscount({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n });\n log(\"Discount calculated\", {\n discountType: discount.discountValue?.type,\n discountValue,\n maxSoFar: max,\n appliesOnSubscription: discount.appliesOnSubscription,\n appliesOnOneTimePurchase: discount.appliesOnOneTimePurchase,\n hasSellingPlan,\n });\n return Math.max(max, discountValue);\n }, 0);\n\n log(\"Final biggest discount\", { biggestDiscount });\n return biggestDiscount;\n};\n\nexport const parsePromotionIfActive = (promotionObject, now = new Date()) => {\n try {\n // Handle both object and string cases for backward compatibility\n const promotion =\n typeof promotionObject === \"string\"\n ? JSON.parse(promotionObject ?? \"{}\")\n : promotionObject;\n\n // no stored promotion is the normal state, not an error\n if (!promotion?.startsAt || !promotion.status || !promotion.title)\n return undefined;\n const startsAt = new Date(promotion.startsAt);\n const endsAt = promotion.endsAt ? new Date(promotion.endsAt) : null;\n\n if (\n (promotion.status === \"ACTIVE\" || promotion.status === \"SCHEDULED\") &&\n now >= startsAt &&\n (!endsAt || now <= endsAt)\n ) {\n return promotion;\n }\n\n return undefined;\n } catch (error) {\n console.error(\"Failed to parse promotion:\", error);\n return undefined;\n }\n};\n","import {\n getBiggestDiscount,\n parsePromotionIfActive,\n getIdFromGid,\n productGidFromId,\n} from \"./discounts.js\";\n\n// Prints log() lines (including the discount math's) to the console, read over WebView remote\n// debugging, only on the devices in debugDeviceIds (the template's ABRA_CONFIG, set by setup/update\n// --debug <device-id>). Consecutive identical lines are dropped: some fire on every render.\nlet lastConsoleLine = \"\";\nconst consoleLog = (debugDeviceIds, deviceId, message, data) => {\n const device = String(deviceId ?? \"\").toLowerCase();\n if (\n !device ||\n !(debugDeviceIds || []).some((id) => String(id).toLowerCase() === device)\n )\n return;\n let json = \"\";\n if (data != null) {\n try {\n json = ` ${JSON.stringify(data)}`;\n } catch {\n json = ` ${String(data)}`;\n }\n }\n const line = `[Abra useAbra] ${message}${json}`;\n if (line === lastConsoleLine) return;\n lastConsoleLine = line;\n console.log(line);\n};\n\nexport default function useAbra({\n React,\n useTapcart,\n tapcartData,\n debugDeviceIds,\n}) {\n const Tapcart = useTapcart();\n // log() is memoized once; it reads these through a ref\n const consoleRef = React.useRef({});\n consoleRef.current = {\n debugDeviceIds,\n deviceId: Tapcart?.variables?.device?.id,\n };\n const [activePromotion, setActivePromotion] = React.useState(undefined);\n const renderCountRef = React.useRef(0);\n const logRef = React.useRef([]);\n const variables = Tapcart?.variables;\n const { storeFrontAccessToken, storeUrl } =\n tapcartData?.integrations?.find((x) => x.name === \"abra-promotions\") ?? {};\n\n // Stable GraphQL fragment and functions\n const PRODUCT_FRAGMENT = React.useMemo(\n () => `\n id\n handle\n variants(first: 100) {\n edges {\n node {\n id\n handle: title\n price {\n amount\n currencyCode\n }\n }\n }\n }\n `,\n [],\n );\n\n const generateProductsQuery = React.useCallback(\n (ids, country) => {\n const productQueries = ids\n .map(\n (id, index) =>\n `product_${index}: product(id: \"${productGidFromId(id)}\") {\n ${PRODUCT_FRAGMENT}\n }`,\n )\n .join(\"\\n \");\n\n const inContextDirective = country\n ? `@inContext(country: ${country})`\n : \"\";\n\n return `\n query Products ${inContextDirective} {\n ${productQueries}\n }\n `;\n },\n [PRODUCT_FRAGMENT],\n );\n\n const graphqlDefaultBody = React.useCallback(\n (query, variables, storeFrontAccessToken) => {\n return {\n async: true,\n crossDomain: true,\n method: \"POST\",\n headers: {\n \"X-Shopify-Storefront-Access-Token\": storeFrontAccessToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n };\n },\n [],\n );\n\n const fetchProducts = React.useCallback(\n async (ids, storeUrl, storeFrontAccessToken, country) => {\n if (!storeUrl || !storeFrontAccessToken) {\n return { error: \"Missing required configuration\" };\n }\n\n if (!ids || ids.length === 0) {\n return { data: [], error: \"No ids\" };\n }\n\n const GRAPHQL_URL = `https://${storeUrl}/api/2024-04/graphql.json`;\n const query = generateProductsQuery(ids, country);\n\n try {\n const response = await fetch(\n GRAPHQL_URL,\n graphqlDefaultBody(query, {}, storeFrontAccessToken),\n );\n\n if (response?.ok) {\n const responseBody = await response.json();\n const data = responseBody?.data;\n\n if (!data) {\n return { data: [], error: \"No data\" };\n }\n\n const products = Object.values(data).filter((item) => item !== null);\n\n return {\n data: products,\n error: null,\n };\n }\n\n const error = await response.text();\n return { data: [], error: error };\n } catch (err) {\n return { data: [], error: err.message };\n }\n },\n [generateProductsQuery, graphqlDefaultBody],\n );\n\n const useProductsCustom = React.useCallback(\n ({ ids, storeUrl, storeFrontAccessToken, country }) => {\n const [products, setProducts] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState(null);\n\n // Memoize ids to prevent infinite loops\n const idsString = React.useMemo(() => {\n if (!ids || !Array.isArray(ids) || ids.length === 0) return \"\";\n return [...ids].sort().join(\",\");\n }, [ids ? JSON.stringify([...ids].sort()) : \"\"]);\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!storeUrl || !storeFrontAccessToken) {\n if (!storeUrl) {\n setError(\"no store url\");\n }\n if (!storeFrontAccessToken) {\n setError(\"no store front access token\");\n }\n setProducts([]);\n setLoading(false);\n return;\n }\n\n if (!ids || ids.length === 0) {\n setProducts([]);\n setLoading(false);\n return;\n }\n\n const result = await fetchProducts(\n ids,\n storeUrl,\n storeFrontAccessToken,\n country,\n );\n\n try {\n if (result.data && result.data.length > 0) {\n const formattedProducts = result?.data?.map((product) => ({\n id: getIdFromGid(product.id),\n handle: product?.handle,\n variants: product?.variants?.edges?.map((variant) => ({\n id: getIdFromGid(variant?.node?.id),\n handle: variant?.node?.handle,\n price: variant?.node?.price,\n })),\n }));\n setProducts(formattedProducts);\n setError(result.error);\n } else {\n setProducts([]);\n setError(result.error);\n }\n } catch (error) {\n setError(error.message);\n }\n\n setLoading(false);\n };\n\n fetchData();\n }, [idsString, storeUrl, storeFrontAccessToken, country, fetchProducts]);\n\n return { products, loading, error };\n },\n [fetchProducts],\n );\n\n // Stable logging function that doesn't cause re-renders\n const log = React.useCallback((message, data = null) => {\n consoleLog(\n consoleRef.current.debugDeviceIds,\n consoleRef.current.deviceId,\n message,\n data,\n );\n const timestamp = new Date().toISOString();\n const logEntry = {\n timestamp,\n message,\n data: data ? JSON.parse(JSON.stringify(data)) : null,\n renderCount: renderCountRef.current,\n };\n logRef.current.push(logEntry);\n\n // Keep only last 50 logs to prevent memory issues\n if (logRef.current.length > 100) {\n logRef.current = logRef.current.slice(-100);\n }\n }, []);\n\n // Create stable cart items reference to prevent infinite recreations\n const stableCartItems = React.useMemo(() => {\n const currentCartItems = variables?.cart?.items ?? [];\n\n if (!currentCartItems || currentCartItems.length === 0) {\n return [];\n }\n\n const mappedItems = currentCartItems.map((item) => ({\n productId: item.productId,\n variantId: item.variantId,\n quantity: item.quantity,\n sellingPlanAllocation: item.sellingPlanAllocation,\n }));\n\n return mappedItems;\n }, [\n (variables?.cart?.items || [])\n ?.map((item) => `${item.productId}-${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n const ids = React.useMemo(\n () => (stableCartItems ?? []).map((item) => item.productId),\n [stableCartItems],\n );\n\n // Get country from cart currency or tapcartData\n const country = React.useMemo(() => {\n return (\n Tapcart?.variables?.cart?.currency?.slice(0, 2) || tapcartData?.country\n );\n }, [Tapcart?.variables?.cart?.currency, tapcartData?.country]);\n\n const {\n products: cartItems,\n loading: cartItemsLoading,\n error: cartItemsError,\n } = useProductsCustom({\n ids,\n storeUrl: storeUrl,\n storeFrontAccessToken: storeFrontAccessToken,\n country: country,\n });\n\n // Render limiter to prevent infinite recreations\n renderCountRef.current += 1;\n\n // Create stable cart reference to prevent infinite recreations\n const stableCart = React.useMemo(() => {\n if (!variables?.cart) {\n return null;\n }\n if (cartItemsLoading || cartItemsError) {\n return variables.cart;\n }\n\n if (!cartItems || cartItems.length === 0) {\n return variables.cart;\n }\n\n const processedItems = (stableCartItems || []).map((item) => {\n const _cartItem = cartItems?.find(\n (cartItem) => getIdFromGid(cartItem?.id) === item.productId,\n );\n if (!_cartItem) {\n return item;\n }\n const _variant = _cartItem?.variants?.find(\n (variant) => getIdFromGid(variant?.id) === item?.variantId,\n );\n if (!_variant) {\n return item;\n }\n\n const processedItem = {\n ...item,\n handle: _cartItem?.handle,\n price: _variant?.price,\n };\n\n return processedItem;\n });\n\n const result = {\n ...variables.cart,\n items: processedItems,\n };\n\n return result;\n }, [\n cartItems,\n cartItemsLoading,\n cartItemsError,\n (variables?.cart?.items || [])\n ?.map((item) => `${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n // Effect: Initialize from storage and observe changes\n React.useEffect(() => {\n const storage = Tapcart?.variables?.storage || {};\n const abraData = storage[\"abra\"] || {};\n const storedPromotion = parsePromotionIfActive(\n abraData[\"active-promotion\"],\n );\n\n log(\"Storage promotion retrieved\", { storedPromotion });\n\n // Only update activePromotion if the promotion has actually changed\n if (\n storedPromotion?.title &&\n JSON.stringify(activePromotion) !== JSON.stringify(storedPromotion)\n ) {\n setActivePromotion(storedPromotion);\n } else if (!storedPromotion?.title && activePromotion) {\n // Clear promotion if it was removed from storage\n setActivePromotion(undefined);\n }\n }, [Tapcart?.variables?.storage?.[\"abra\"]?.[\"active-promotion\"]]);\n\n let getProductWithDiscount = React.useCallback(\n (product) => {\n if (!activePromotion || !activePromotion.title || !product) {\n log(\"No active promotion or product, returning original product\", {\n hasActivePromotion: !!activePromotion,\n hasProduct: !!product,\n });\n return product;\n }\n\n const _product = JSON.parse(JSON.stringify(product));\n let currencyCode = undefined;\n const variants = _product.variants.map((variant) => {\n const selectedVariant = JSON.parse(JSON.stringify(variant));\n currencyCode = currencyCode || selectedVariant?.price?.currencyCode;\n let biggestDiscount = 0;\n try {\n biggestDiscount = getBiggestDiscount({\n activePromotion,\n product: _product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n } catch (error) {\n log(\"Error calculating discount\", {\n error: error.message,\n variantId: selectedVariant?.id,\n });\n biggestDiscount = 0;\n }\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount ?? 0);\n const compareAtPrice = parseFloat(\n selectedVariant?.compareAtPrice?.amount ?? 0,\n );\n\n let referencePrice = originalPrice;\n if (compareAtPrice) {\n referencePrice = Math.max(originalPrice, compareAtPrice ?? 0);\n }\n\n let discountedPrice = Math.max(originalPrice - biggestDiscount, 0);\n\n selectedVariant.price = {\n amount: discountedPrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n selectedVariant.compareAtPrice = {\n amount: referencePrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n return selectedVariant;\n });\n _product.variants = variants;\n currencyCode = currencyCode || \"USD\";\n _product.compareAtPriceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(\n max,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, 0),\n currencyCode: currencyCode,\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(\n min,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, Infinity),\n currencyCode: currencyCode,\n },\n };\n _product.priceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(max, parseFloat(variant.price.amount));\n }, 0),\n currencyCode: currencyCode || \"USD\",\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(min, parseFloat(variant.price.amount));\n }, Infinity),\n currencyCode: currencyCode || \"USD\",\n },\n };\n _product.abra = true;\n\n return _product;\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n // Discounted price for a single price point (e.g. a selling-plan option in a\n // subscription selector). hasSellingPlan forces the subscription vs one-time\n // price branch regardless of what the variant carries.\n const getDiscountedPrice = React.useCallback(\n (product, variant, price, hasSellingPlan = false) => {\n const basePrice = parseFloat(price ?? variant?.price?.amount ?? 0);\n if (!activePromotion || !activePromotion.title || !product || !variant) {\n return basePrice;\n }\n\n const selectedVariant = {\n ...variant,\n price: {\n amount: basePrice,\n currencyCode: variant?.price?.currencyCode,\n },\n sellingPlanAllocation: hasSellingPlan\n ? (variant?.sellingPlanAllocation ?? { sellingPlan: {} })\n : null,\n };\n\n try {\n const biggestDiscount = getBiggestDiscount({\n activePromotion,\n product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n return Math.max(basePrice - biggestDiscount, 0);\n } catch (error) {\n log(\"Error calculating discounted price\", {\n error: error.message,\n variantId: variant?.id,\n });\n return basePrice;\n }\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n return React.useMemo(\n () => ({\n abra: {\n activePromotion,\n getProductWithDiscount,\n getDiscountedPrice,\n logs: logRef.current,\n },\n }),\n [activePromotion, getProductWithDiscount, getDiscountedPrice],\n );\n}\n"],"names":[],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -12,6 +12,36 @@ const productGidFromId = (id) => {
12
12
  return "gid://shopify/Product/" + id;
13
13
  };
14
14
 
15
+ // A percentage discount on one unit. Shopify truncates USD percentage discounts per unit to the
16
+ // cent before multiplying by quantity (https://community.shopify.dev/t/28655/10), so the price
17
+ // shown matches checkout. Other currencies, and values that aren't plain decimals, keep the exact
18
+ // amount. `divisor` is 1 for a fraction (0.2) and 100 for a percentage (20).
19
+ const percentageDiscount = (money, percentage, divisor = 100) => {
20
+ const exact = parseFloat(money?.amount) * (percentage / divisor);
21
+ if (money?.currencyCode !== "USD") return exact;
22
+
23
+ const amount = String(money?.amount).match(/^(\d+)(?:\.(\d{1,2})0*)?$/);
24
+ const rate = String(percentage).match(/^(\d+)(?:\.(\d+))?$/);
25
+ if (!amount || !rate || (divisor !== 1 && divisor !== 100)) return exact;
26
+ const rateFraction = (rate[2] || "").replace(/0+$/, "");
27
+ const unitCents =
28
+ Number(amount[1]) * 100 + Number((amount[2] || "").padEnd(2, "0"));
29
+ const rateNumerator = Number(rate[1] + rateFraction);
30
+ const rateDenominator = divisor * 10 ** rateFraction.length;
31
+ const numerator = unitCents * rateNumerator;
32
+ if (
33
+ !Number.isSafeInteger(unitCents) ||
34
+ !Number.isSafeInteger(rateNumerator) ||
35
+ !Number.isSafeInteger(rateDenominator) ||
36
+ !Number.isSafeInteger(numerator) ||
37
+ rateNumerator > rateDenominator
38
+ )
39
+ return exact;
40
+
41
+ // integer math: flooring a floating dollar amount can lose a cent at exact-cent boundaries
42
+ return (numerator - (numerator % rateDenominator)) / rateDenominator / 100;
43
+ };
44
+
15
45
  // BXGY customer-gets: new payloads carry cards on customerGets.productCards,
16
46
  // legacy payloads a single {quantity, items} pair at the root.
17
47
  const getBxgyGetsCards = (customerGets) => {
@@ -62,9 +92,10 @@ const getDiscountForProductDiscount = ({
62
92
  if (targetDiscount.discountValue?.type === "DiscountAmount") {
63
93
  return targetDiscount.discountValue.discountAmount.cents / 100;
64
94
  } else if (targetDiscount.discountValue?.type === "DiscountPercentage") {
65
- return (
66
- parseFloat(selectedVariant.price.amount) *
67
- targetDiscount.discountValue.percentage
95
+ return percentageDiscount(
96
+ selectedVariant.price,
97
+ targetDiscount.discountValue.percentage,
98
+ 1,
68
99
  );
69
100
  }
70
101
  };
@@ -91,9 +122,10 @@ const getDiscountForMultiValueCollection = ({
91
122
  if (discountValue.value.type === "DiscountAmount") {
92
123
  discountAmount = discountValue.value.discountAmount.cents / 100;
93
124
  } else if (discountValue.value.type === "DiscountPercentage") {
94
- discountAmount =
95
- parseFloat(selectedVariant.price.amount) *
96
- (discountValue.value.percentage / 100);
125
+ discountAmount = percentageDiscount(
126
+ selectedVariant.price,
127
+ discountValue.value.percentage,
128
+ );
97
129
  }
98
130
 
99
131
  return Math.max(max, discountAmount);
@@ -123,9 +155,10 @@ const getDiscountForMultiValueProduct = ({
123
155
  if (discountValue.value.type === "DiscountAmount") {
124
156
  discountAmount = discountValue.value.discountAmount.cents / 100;
125
157
  } else if (discountValue.value.type === "DiscountPercentage") {
126
- discountAmount =
127
- parseFloat(selectedVariant.price.amount) *
128
- (discountValue.value.percentage / 100);
158
+ discountAmount = percentageDiscount(
159
+ selectedVariant.price,
160
+ discountValue.value.percentage,
161
+ );
129
162
  }
130
163
 
131
164
  return Math.max(max, discountAmount);
@@ -296,9 +329,10 @@ const getDiscountForTierDiscount = ({
296
329
  biggestEligibleTier.value.type === "DiscountPercentage" &&
297
330
  biggestEligibleTier.value.percentage
298
331
  ) {
299
- const discountAmount =
300
- parseFloat(selectedVariant.price.amount) *
301
- (biggestEligibleTier.value.percentage / 100);
332
+ const discountAmount = percentageDiscount(
333
+ selectedVariant.price,
334
+ biggestEligibleTier.value.percentage,
335
+ );
302
336
 
303
337
  return discountAmount;
304
338
  }
@@ -476,9 +510,10 @@ const getDiscountForVolumeDiscount = ({
476
510
  biggestEligibleTier.value.type === "DiscountPercentage" &&
477
511
  biggestEligibleTier.value.percentage
478
512
  ) {
479
- const discountAmount =
480
- parseFloat(selectedVariant.price.amount) *
481
- (biggestEligibleTier.value.percentage / 100);
513
+ const discountAmount = percentageDiscount(
514
+ selectedVariant.price,
515
+ biggestEligibleTier.value.percentage,
516
+ );
482
517
 
483
518
  return discountAmount;
484
519
  }
@@ -670,9 +705,10 @@ const getDiscountForMultiEffectTiers = ({
670
705
  if (discount.value.type === "DiscountAmount") {
671
706
  discountAmount = parseFloat(discount.value.discountAmount.amount);
672
707
  } else if (discount.value.type === "DiscountPercentage") {
673
- discountAmount =
674
- parseFloat(selectedVariant.price.amount) *
675
- (discount.value.percentage / 100);
708
+ discountAmount = percentageDiscount(
709
+ selectedVariant.price,
710
+ discount.value.percentage,
711
+ );
676
712
  }
677
713
  return Math.max(max, discountAmount);
678
714
  }, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/discounts.js","../src/useAbra.js"],"sourcesContent":["// Pure discount math for useAbra. Moved verbatim from src/code-for-updating-custom-component.jsx.\n// getIdFromGid and productGidFromId are copied from @tapcart/mobile-components so the package has no imports.\nexport const getIdFromGid = (gid) => {\n if (!gid) return \"\";\n const arr = gid.split(\"/\");\n return arr[arr.length - 1] || \"\";\n};\n\nexport const productGidFromId = (id) => {\n if (!id) return null;\n if (id.startsWith(\"gid://shopify/Product/\")) return id;\n return \"gid://shopify/Product/\" + id;\n};\n\n// BXGY customer-gets: new payloads carry cards on customerGets.productCards,\n// legacy payloads a single {quantity, items} pair at the root.\nexport const getBxgyGetsCards = (customerGets) => {\n if (\n Array.isArray(customerGets?.productCards) &&\n customerGets.productCards.length > 0\n ) {\n return customerGets.productCards;\n }\n if (customerGets?.items != null) {\n return [\n {\n quantity: customerGets.quantity,\n items: customerGets.items,\n purchaseType: customerGets.purchaseType,\n },\n ];\n }\n return [];\n};\n\nexport const getDiscountForProductDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n}) => {\n const isProductEntitledForProductDiscount = () => {\n if (targetDiscount.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.entitled?.variants) {\n if (variantId && targetDiscount.entitled.variants.includes(variantId)) {\n return true;\n }\n }\n\n if (targetDiscount.entitled?.products) {\n if (handle && targetDiscount.entitled.products.includes(handle)) {\n return true;\n }\n }\n return false;\n };\n if (!isProductEntitledForProductDiscount()) return 0;\n\n if (targetDiscount.discountValue?.type === \"DiscountAmount\") {\n return targetDiscount.discountValue.discountAmount.cents / 100;\n } else if (targetDiscount.discountValue?.type === \"DiscountPercentage\") {\n return (\n parseFloat(selectedVariant.price.amount) *\n targetDiscount.discountValue.percentage\n );\n }\n};\n\nexport const getDiscountForMultiValueCollection = ({\n targetDiscount,\n handle,\n selectedVariant,\n}) => {\n if (\n !targetDiscount?.discountValue?.productDiscounts ||\n targetDiscount.discountValue.productDiscounts.length === 0\n )\n return 0;\n\n const entitledProductDiscounts =\n targetDiscount.discountValue.productDiscounts.filter((discount) =>\n (discount.products ?? []).includes(handle),\n ) || [];\n\n return entitledProductDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (discountValue.value.percentage / 100);\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForMultiValueProduct = ({\n targetDiscount,\n variantId,\n selectedVariant,\n}) => {\n if (!variantId) return 0;\n if (\n !targetDiscount?.discountValue?.variantDiscounts ||\n targetDiscount?.discountValue?.variantDiscounts.length === 0\n )\n return 0;\n\n const entitledVariantDiscounts =\n targetDiscount.discountValue.variantDiscounts.filter((discount) =>\n (discount.variants ?? []).includes(variantId),\n ) ?? [];\n\n return entitledVariantDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (discountValue.value.percentage / 100);\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForTierDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToTierDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.products) {\n if (\n handle &&\n targetDiscount.discountValue?.entitled?.products.includes(handle)\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.variants) {\n if (\n variantId &&\n targetDiscount.discountValue?.entitled?.variants.includes(variantId)\n ) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToTierDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (biggestEligibleTier.value.percentage / 100);\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForVolumeDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n // customer-gets purchaseType gates the displayed price; per-variant mode\n // (ELIGIBLE_VARIANTS) ignores it\n const customerGets = targetDiscount.discountValue?.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n if (getsPurchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan) return 0;\n if (getsPurchaseType === \"ONE_TIME\" && selectedHasSellingPlan) return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToVolumeDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.products) {\n if (handle && targetDiscount?.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.variants) {\n if (variantId && targetDiscount?.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToVolumeDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (biggestEligibleTier.value.percentage / 100);\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForMultiEffectTiers = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const isProductEntitledToDiscount = (discount) => {\n if (discount.entitled?.all) {\n return true;\n }\n\n if (discount.entitled?.collections) {\n if (\n currentCollectionHandle &&\n discount.entitled?.collections.includes(currentCollectionHandle)\n ) {\n return true;\n }\n }\n\n if (discount.entitled?.products) {\n if (handle && discount.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (discount.entitled?.variants) {\n if (variantId && discount.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n log(\"getEntitledQuantityAndTotal\");\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n log(\"getEntitledQuantityAndTotal\", { entitledQuantity, entitledTotal });\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n\n if (\n !targetDiscount.discountValue?.tiers ||\n targetDiscount.discountValue?.tiers.length === 0\n )\n return 0;\n\n log(\"getBiggestEligibleTier\");\n const currentCollectionHandle = product?.sourceCollection?.handle;\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n log(\"getBiggestEligibleTier\", { biggestEligibleTierIndex });\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const productDiscountsAvailableOnTier =\n targetDiscount.discountValue.tiers\n .slice(0, biggestEligibleTierIndex + 1)\n ?.filter((tier) =>\n tier.discounts.some((discount) => discount.type === \"ProductDiscount\"),\n )\n ?.flatMap(\n (tier) =>\n tier.discounts.find((discount) => discount.type === \"ProductDiscount\")\n ?.value ?? [],\n ) ?? [];\n\n // Per-entry purchaseType replaces the promotion-level flags: an entry only\n // affects the price branch matching the selected purchase state.\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const eligibleProductDiscounts = productDiscountsAvailableOnTier.filter(\n (discount) => {\n if (discount.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (discount.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return isProductEntitledToDiscount(discount);\n },\n );\n\n const maxDiscountAmount = eligibleProductDiscounts.reduce((max, discount) => {\n let discountAmount = 0;\n if (discount.value.type === \"DiscountAmount\") {\n discountAmount = parseFloat(discount.value.discountAmount.amount);\n } else if (discount.value.type === \"DiscountPercentage\") {\n discountAmount =\n parseFloat(selectedVariant.price.amount) *\n (discount.value.percentage / 100);\n }\n return Math.max(max, discountAmount);\n }, 0);\n return maxDiscountAmount;\n};\n\nexport const isProductMatchingBxgyCardItems = (handle, variantId, items) => {\n if (!items) return false;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n for (const product of items.products) {\n if (product.handle === handle) {\n if (!product.variants || product.variants.length === 0) return true;\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === variantId || variant.id === variantId) return true;\n }\n }\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (collection.products?.includes(handle)) return true;\n }\n }\n\n return false;\n};\n\nexport const isCartItemMatchingBxgyCard = (item, card) => {\n const items = card.items;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n const itemVariantId = item.variantId?.toString();\n for (const product of items.products) {\n if (product.variants && product.variants.length > 0) {\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === itemVariantId || variant.id === itemVariantId)\n return true;\n }\n }\n if (item.handle && product.handle === item.handle) return true;\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (item.handle && collection.products?.includes(item.handle))\n return true;\n }\n }\n\n return false;\n};\n\nexport const areAllBxgyProductCardsMet = (cart, bxgy) => {\n if (!bxgy?.productCards?.length || !cart?.items) return false;\n\n const globalRequirementType = bxgy.requirementType ?? \"QUANTITY\";\n\n for (const card of bxgy.productCards) {\n const requirementType = card.requirementType ?? globalRequirementType;\n let totalQuantity = 0;\n let totalSubtotal = 0;\n\n for (const item of cart.items) {\n if (isCartItemMatchingBxgyCard(item, card)) {\n // Check purchaseType on the card against the cart item\n const itemHasSellingPlan = Boolean(item.sellingPlanAllocation);\n if (card.purchaseType === \"SUBSCRIPTION\" && !itemHasSellingPlan) {\n continue;\n }\n if (card.purchaseType === \"ONE_TIME\" && itemHasSellingPlan) {\n continue;\n }\n\n totalQuantity += item.quantity || 0;\n totalSubtotal +=\n parseFloat(item.price?.amount || 0) * 100 * (item.quantity || 0);\n }\n }\n\n if (requirementType === \"SUBTOTAL\") {\n const required = card.minimumSubtotal?.cents || 0;\n if (required > 0 && totalSubtotal < required) return false;\n } else {\n const required = card.quantity || 0;\n if (required > 0 && totalQuantity < required) return false;\n }\n }\n\n return true;\n};\n\nexport const getDiscountForBxgyDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n cart,\n}) => {\n const bxgy = targetDiscount.discountValue;\n if (!bxgy?.productCards || !bxgy?.customerGets) return 0;\n\n const customerGetsValueType = bxgy.customerGets.value?.type;\n\n if (\n customerGetsValueType === \"Gift\" ||\n customerGetsValueType === \"FixedPrice\"\n ) {\n return 0;\n }\n\n // Gets-card purchaseType gates the displayed price against the selected\n // purchase state (new payloads carry gets cards; legacy has plain items).\n const getsCards = getBxgyGetsCards(bxgy.customerGets);\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const matchesGetsPurchaseType = (card) => {\n if (card.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (card.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return true;\n };\n\n const isEntitledToReceive = () => {\n if (bxgy.customerGets.applyToProductCardItems) {\n return bxgy.productCards.some((card) =>\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n }\n return getsCards.some(\n (card) =>\n matchesGetsPurchaseType(card) &&\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n };\n\n if (!isEntitledToReceive()) return 0;\n\n // Check if this product matches a productCard with purchase type requirement\n // Look up the actual cart item to check if it has a subscription selected\n const matchingCartItem = (cart?.items || []).find(\n (item) =>\n item.variantId?.toString() === variantId?.toString() ||\n item.handle === handle,\n );\n const cartItemHasSellingPlan = Boolean(\n matchingCartItem?.sellingPlanAllocation,\n );\n\n for (const card of bxgy.productCards) {\n if (isProductMatchingBxgyCardItems(handle, variantId, card.items)) {\n if (card.purchaseType === \"SUBSCRIPTION\" && !cartItemHasSellingPlan) {\n return 0;\n } else if (card.purchaseType === \"ONE_TIME\" && cartItemHasSellingPlan) {\n return 0;\n }\n }\n }\n\n if (!areAllBxgyProductCardsMet(cart, bxgy)) return 0;\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount || 0);\n if (originalPrice <= 0) return 0;\n\n if (customerGetsValueType === \"DiscountPercentage\") {\n const percentage = bxgy.customerGets.value.percentage || 0;\n return originalPrice * (percentage / 100);\n } else if (customerGetsValueType === \"DiscountAmount\") {\n const cents = bxgy.customerGets.value.discountAmount?.cents || 0;\n return Math.min(cents / 100, originalPrice);\n }\n\n return 0;\n};\n\nexport const getDiscountValueForDiscount = ({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n}) => {\n const handle = product?.handle;\n const variantId = getIdFromGid(selectedVariant?.id);\n\n if (!handle || !discount) return 0;\n\n if (discount.discountValue?.type === \"DiscountCodeBxgy\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"Gift\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"BxgyDiscount\") {\n return getDiscountForBxgyDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueProduct\") {\n return getDiscountForMultiValueProduct({\n targetDiscount: discount,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueCollection\") {\n return getDiscountForMultiValueCollection({\n targetDiscount: discount,\n handle,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"TieredDiscount\") {\n return getDiscountForTierDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n return getDiscountForVolumeDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"CollectionOrderDiscount\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n log(\"getDiscountForMultiEffectTiers\");\n return getDiscountForMultiEffectTiers({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n });\n }\n\n if (discount.discountValue?.type === \"ProductDiscount\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountClass === \"ORDER\") {\n return 0;\n }\n if (discount.discountClass === \"SHIPPING\") {\n return 0;\n }\n\n if (discount.discountClass === \"PRODUCT\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n return 0;\n};\n\nexport const getBiggestDiscount = ({\n activePromotion,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const discounts = Object.values(activePromotion?.discounts ?? []);\n log(\"Calculating biggest discount\", {\n discountCount: discounts.length,\n productId: product?.handle,\n collectionId: product?.sourceCollection?.handle,\n variantId: selectedVariant?.id,\n hasSellingPlan: !!selectedVariant?.sellingPlanAllocation,\n });\n\n const biggestDiscount = discounts.reduce((max, discount) => {\n const hasSellingPlan = Boolean(selectedVariant?.sellingPlanAllocation);\n\n // For BXGY discounts, purchase type is checked PER CARD (card.purchaseType),\n // not at the top level. Skip top-level appliesOnSubscription/appliesOnOneTimePurchase.\n // For other discount types, still use the top-level flags — unless a\n // customer-gets purchaseType overrides them (checked per discount type below).\n if (discount.discountValue?.type !== \"BxgyDiscount\") {\n let appliesOnSubscription = discount.appliesOnSubscription;\n let appliesOnOneTimePurchase = discount.appliesOnOneTimePurchase;\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n const customerGets = discount.discountValue.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n if (getsPurchaseType) {\n appliesOnSubscription = getsPurchaseType !== \"ONE_TIME\";\n appliesOnOneTimePurchase = getsPurchaseType !== \"SUBSCRIPTION\";\n }\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n // Entries with their own purchaseType filter themselves in\n // getDiscountForMultiEffectTiers; don't gate the whole discount here.\n const hasPerEntryPurchaseType = (\n discount.discountValue.tiers ?? []\n ).some((tier) =>\n (tier.discounts ?? []).some(\n (tierDiscount) =>\n tierDiscount.type === \"ProductDiscount\" &&\n (Array.isArray(tierDiscount.value)\n ? tierDiscount.value\n : []\n ).some((entry) => entry.purchaseType),\n ),\n );\n if (hasPerEntryPurchaseType) {\n appliesOnSubscription = true;\n appliesOnOneTimePurchase = true;\n }\n }\n\n if (appliesOnSubscription && !appliesOnOneTimePurchase) {\n if (!hasSellingPlan) {\n log(\n \"Skipping subscription-only discount (no subscription selected)\",\n {\n discountType: discount.discountValue?.type,\n },\n );\n return max;\n }\n }\n\n if (!appliesOnSubscription && appliesOnOneTimePurchase) {\n if (hasSellingPlan) {\n log(\"Skipping one-time-only discount (subscription selected)\", {\n discountType: discount.discountValue?.type,\n });\n return max;\n }\n }\n }\n\n const discountValue = getDiscountValueForDiscount({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n });\n log(\"Discount calculated\", {\n discountType: discount.discountValue?.type,\n discountValue,\n maxSoFar: max,\n appliesOnSubscription: discount.appliesOnSubscription,\n appliesOnOneTimePurchase: discount.appliesOnOneTimePurchase,\n hasSellingPlan,\n });\n return Math.max(max, discountValue);\n }, 0);\n\n log(\"Final biggest discount\", { biggestDiscount });\n return biggestDiscount;\n};\n\nexport const parsePromotionIfActive = (promotionObject, now = new Date()) => {\n try {\n // Handle both object and string cases for backward compatibility\n const promotion =\n typeof promotionObject === \"string\"\n ? JSON.parse(promotionObject ?? \"{}\")\n : promotionObject;\n\n // no stored promotion is the normal state, not an error\n if (!promotion?.startsAt || !promotion.status || !promotion.title)\n return undefined;\n const startsAt = new Date(promotion.startsAt);\n const endsAt = promotion.endsAt ? new Date(promotion.endsAt) : null;\n\n if (\n (promotion.status === \"ACTIVE\" || promotion.status === \"SCHEDULED\") &&\n now >= startsAt &&\n (!endsAt || now <= endsAt)\n ) {\n return promotion;\n }\n\n return undefined;\n } catch (error) {\n console.error(\"Failed to parse promotion:\", error);\n return undefined;\n }\n};\n","import {\n getBiggestDiscount,\n parsePromotionIfActive,\n getIdFromGid,\n productGidFromId,\n} from \"./discounts.js\";\n\n// Prints log() lines (including the discount math's) to the console, read over WebView remote\n// debugging, only on the devices in debugDeviceIds (the template's ABRA_CONFIG, set by setup/update\n// --debug <device-id>). Consecutive identical lines are dropped: some fire on every render.\nlet lastConsoleLine = \"\";\nconst consoleLog = (debugDeviceIds, deviceId, message, data) => {\n const device = String(deviceId ?? \"\").toLowerCase();\n if (\n !device ||\n !(debugDeviceIds || []).some((id) => String(id).toLowerCase() === device)\n )\n return;\n let json = \"\";\n if (data != null) {\n try {\n json = ` ${JSON.stringify(data)}`;\n } catch {\n json = ` ${String(data)}`;\n }\n }\n const line = `[Abra useAbra] ${message}${json}`;\n if (line === lastConsoleLine) return;\n lastConsoleLine = line;\n console.log(line);\n};\n\nexport default function useAbra({\n React,\n useTapcart,\n tapcartData,\n debugDeviceIds,\n}) {\n const Tapcart = useTapcart();\n // log() is memoized once; it reads these through a ref\n const consoleRef = React.useRef({});\n consoleRef.current = {\n debugDeviceIds,\n deviceId: Tapcart?.variables?.device?.id,\n };\n const [activePromotion, setActivePromotion] = React.useState(undefined);\n const renderCountRef = React.useRef(0);\n const logRef = React.useRef([]);\n const variables = Tapcart?.variables;\n const { storeFrontAccessToken, storeUrl } =\n tapcartData?.integrations?.find((x) => x.name === \"abra-promotions\") ?? {};\n\n // Stable GraphQL fragment and functions\n const PRODUCT_FRAGMENT = React.useMemo(\n () => `\n id\n handle\n variants(first: 100) {\n edges {\n node {\n id\n handle: title\n price {\n amount\n currencyCode\n }\n }\n }\n }\n `,\n [],\n );\n\n const generateProductsQuery = React.useCallback(\n (ids, country) => {\n const productQueries = ids\n .map(\n (id, index) =>\n `product_${index}: product(id: \"${productGidFromId(id)}\") {\n ${PRODUCT_FRAGMENT}\n }`,\n )\n .join(\"\\n \");\n\n const inContextDirective = country\n ? `@inContext(country: ${country})`\n : \"\";\n\n return `\n query Products ${inContextDirective} {\n ${productQueries}\n }\n `;\n },\n [PRODUCT_FRAGMENT],\n );\n\n const graphqlDefaultBody = React.useCallback(\n (query, variables, storeFrontAccessToken) => {\n return {\n async: true,\n crossDomain: true,\n method: \"POST\",\n headers: {\n \"X-Shopify-Storefront-Access-Token\": storeFrontAccessToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n };\n },\n [],\n );\n\n const fetchProducts = React.useCallback(\n async (ids, storeUrl, storeFrontAccessToken, country) => {\n if (!storeUrl || !storeFrontAccessToken) {\n return { error: \"Missing required configuration\" };\n }\n\n if (!ids || ids.length === 0) {\n return { data: [], error: \"No ids\" };\n }\n\n const GRAPHQL_URL = `https://${storeUrl}/api/2024-04/graphql.json`;\n const query = generateProductsQuery(ids, country);\n\n try {\n const response = await fetch(\n GRAPHQL_URL,\n graphqlDefaultBody(query, {}, storeFrontAccessToken),\n );\n\n if (response?.ok) {\n const responseBody = await response.json();\n const data = responseBody?.data;\n\n if (!data) {\n return { data: [], error: \"No data\" };\n }\n\n const products = Object.values(data).filter((item) => item !== null);\n\n return {\n data: products,\n error: null,\n };\n }\n\n const error = await response.text();\n return { data: [], error: error };\n } catch (err) {\n return { data: [], error: err.message };\n }\n },\n [generateProductsQuery, graphqlDefaultBody],\n );\n\n const useProductsCustom = React.useCallback(\n ({ ids, storeUrl, storeFrontAccessToken, country }) => {\n const [products, setProducts] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState(null);\n\n // Memoize ids to prevent infinite loops\n const idsString = React.useMemo(() => {\n if (!ids || !Array.isArray(ids) || ids.length === 0) return \"\";\n return [...ids].sort().join(\",\");\n }, [ids ? JSON.stringify([...ids].sort()) : \"\"]);\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!storeUrl || !storeFrontAccessToken) {\n if (!storeUrl) {\n setError(\"no store url\");\n }\n if (!storeFrontAccessToken) {\n setError(\"no store front access token\");\n }\n setProducts([]);\n setLoading(false);\n return;\n }\n\n if (!ids || ids.length === 0) {\n setProducts([]);\n setLoading(false);\n return;\n }\n\n const result = await fetchProducts(\n ids,\n storeUrl,\n storeFrontAccessToken,\n country,\n );\n\n try {\n if (result.data && result.data.length > 0) {\n const formattedProducts = result?.data?.map((product) => ({\n id: getIdFromGid(product.id),\n handle: product?.handle,\n variants: product?.variants?.edges?.map((variant) => ({\n id: getIdFromGid(variant?.node?.id),\n handle: variant?.node?.handle,\n price: variant?.node?.price,\n })),\n }));\n setProducts(formattedProducts);\n setError(result.error);\n } else {\n setProducts([]);\n setError(result.error);\n }\n } catch (error) {\n setError(error.message);\n }\n\n setLoading(false);\n };\n\n fetchData();\n }, [idsString, storeUrl, storeFrontAccessToken, country, fetchProducts]);\n\n return { products, loading, error };\n },\n [fetchProducts],\n );\n\n // Stable logging function that doesn't cause re-renders\n const log = React.useCallback((message, data = null) => {\n consoleLog(\n consoleRef.current.debugDeviceIds,\n consoleRef.current.deviceId,\n message,\n data,\n );\n const timestamp = new Date().toISOString();\n const logEntry = {\n timestamp,\n message,\n data: data ? JSON.parse(JSON.stringify(data)) : null,\n renderCount: renderCountRef.current,\n };\n logRef.current.push(logEntry);\n\n // Keep only last 50 logs to prevent memory issues\n if (logRef.current.length > 100) {\n logRef.current = logRef.current.slice(-100);\n }\n }, []);\n\n // Create stable cart items reference to prevent infinite recreations\n const stableCartItems = React.useMemo(() => {\n const currentCartItems = variables?.cart?.items ?? [];\n\n if (!currentCartItems || currentCartItems.length === 0) {\n return [];\n }\n\n const mappedItems = currentCartItems.map((item) => ({\n productId: item.productId,\n variantId: item.variantId,\n quantity: item.quantity,\n sellingPlanAllocation: item.sellingPlanAllocation,\n }));\n\n return mappedItems;\n }, [\n (variables?.cart?.items || [])\n ?.map((item) => `${item.productId}-${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n const ids = React.useMemo(\n () => (stableCartItems ?? []).map((item) => item.productId),\n [stableCartItems],\n );\n\n // Get country from cart currency or tapcartData\n const country = React.useMemo(() => {\n return (\n Tapcart?.variables?.cart?.currency?.slice(0, 2) || tapcartData?.country\n );\n }, [Tapcart?.variables?.cart?.currency, tapcartData?.country]);\n\n const {\n products: cartItems,\n loading: cartItemsLoading,\n error: cartItemsError,\n } = useProductsCustom({\n ids,\n storeUrl: storeUrl,\n storeFrontAccessToken: storeFrontAccessToken,\n country: country,\n });\n\n // Render limiter to prevent infinite recreations\n renderCountRef.current += 1;\n\n // Create stable cart reference to prevent infinite recreations\n const stableCart = React.useMemo(() => {\n if (!variables?.cart) {\n return null;\n }\n if (cartItemsLoading || cartItemsError) {\n return variables.cart;\n }\n\n if (!cartItems || cartItems.length === 0) {\n return variables.cart;\n }\n\n const processedItems = (stableCartItems || []).map((item) => {\n const _cartItem = cartItems?.find(\n (cartItem) => getIdFromGid(cartItem?.id) === item.productId,\n );\n if (!_cartItem) {\n return item;\n }\n const _variant = _cartItem?.variants?.find(\n (variant) => getIdFromGid(variant?.id) === item?.variantId,\n );\n if (!_variant) {\n return item;\n }\n\n const processedItem = {\n ...item,\n handle: _cartItem?.handle,\n price: _variant?.price,\n };\n\n return processedItem;\n });\n\n const result = {\n ...variables.cart,\n items: processedItems,\n };\n\n return result;\n }, [\n cartItems,\n cartItemsLoading,\n cartItemsError,\n (variables?.cart?.items || [])\n ?.map((item) => `${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n // Effect: Initialize from storage and observe changes\n React.useEffect(() => {\n const storage = Tapcart?.variables?.storage || {};\n const abraData = storage[\"abra\"] || {};\n const storedPromotion = parsePromotionIfActive(\n abraData[\"active-promotion\"],\n );\n\n log(\"Storage promotion retrieved\", { storedPromotion });\n\n // Only update activePromotion if the promotion has actually changed\n if (\n storedPromotion?.title &&\n JSON.stringify(activePromotion) !== JSON.stringify(storedPromotion)\n ) {\n setActivePromotion(storedPromotion);\n } else if (!storedPromotion?.title && activePromotion) {\n // Clear promotion if it was removed from storage\n setActivePromotion(undefined);\n }\n }, [Tapcart?.variables?.storage?.[\"abra\"]?.[\"active-promotion\"]]);\n\n let getProductWithDiscount = React.useCallback(\n (product) => {\n if (!activePromotion || !activePromotion.title || !product) {\n log(\"No active promotion or product, returning original product\", {\n hasActivePromotion: !!activePromotion,\n hasProduct: !!product,\n });\n return product;\n }\n\n const _product = JSON.parse(JSON.stringify(product));\n let currencyCode = undefined;\n const variants = _product.variants.map((variant) => {\n const selectedVariant = JSON.parse(JSON.stringify(variant));\n currencyCode = currencyCode || selectedVariant?.price?.currencyCode;\n let biggestDiscount = 0;\n try {\n biggestDiscount = getBiggestDiscount({\n activePromotion,\n product: _product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n } catch (error) {\n log(\"Error calculating discount\", {\n error: error.message,\n variantId: selectedVariant?.id,\n });\n biggestDiscount = 0;\n }\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount ?? 0);\n const compareAtPrice = parseFloat(\n selectedVariant?.compareAtPrice?.amount ?? 0,\n );\n\n let referencePrice = originalPrice;\n if (compareAtPrice) {\n referencePrice = Math.max(originalPrice, compareAtPrice ?? 0);\n }\n\n let discountedPrice = Math.max(originalPrice - biggestDiscount, 0);\n\n selectedVariant.price = {\n amount: discountedPrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n selectedVariant.compareAtPrice = {\n amount: referencePrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n return selectedVariant;\n });\n _product.variants = variants;\n currencyCode = currencyCode || \"USD\";\n _product.compareAtPriceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(\n max,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, 0),\n currencyCode: currencyCode,\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(\n min,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, Infinity),\n currencyCode: currencyCode,\n },\n };\n _product.priceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(max, parseFloat(variant.price.amount));\n }, 0),\n currencyCode: currencyCode || \"USD\",\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(min, parseFloat(variant.price.amount));\n }, Infinity),\n currencyCode: currencyCode || \"USD\",\n },\n };\n _product.abra = true;\n\n return _product;\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n // Discounted price for a single price point (e.g. a selling-plan option in a\n // subscription selector). hasSellingPlan forces the subscription vs one-time\n // price branch regardless of what the variant carries.\n const getDiscountedPrice = React.useCallback(\n (product, variant, price, hasSellingPlan = false) => {\n const basePrice = parseFloat(price ?? variant?.price?.amount ?? 0);\n if (!activePromotion || !activePromotion.title || !product || !variant) {\n return basePrice;\n }\n\n const selectedVariant = {\n ...variant,\n price: {\n amount: basePrice,\n currencyCode: variant?.price?.currencyCode,\n },\n sellingPlanAllocation: hasSellingPlan\n ? (variant?.sellingPlanAllocation ?? { sellingPlan: {} })\n : null,\n };\n\n try {\n const biggestDiscount = getBiggestDiscount({\n activePromotion,\n product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n return Math.max(basePrice - biggestDiscount, 0);\n } catch (error) {\n log(\"Error calculating discounted price\", {\n error: error.message,\n variantId: variant?.id,\n });\n return basePrice;\n }\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n return React.useMemo(\n () => ({\n abra: {\n activePromotion,\n getProductWithDiscount,\n getDiscountedPrice,\n logs: logRef.current,\n },\n }),\n [activePromotion, getProductWithDiscount, getDiscountedPrice],\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/discounts.js","../src/useAbra.js"],"sourcesContent":["// Pure discount math for useAbra. Moved verbatim from src/code-for-updating-custom-component.jsx.\n// getIdFromGid and productGidFromId are copied from @tapcart/mobile-components so the package has no imports.\nexport const getIdFromGid = (gid) => {\n if (!gid) return \"\";\n const arr = gid.split(\"/\");\n return arr[arr.length - 1] || \"\";\n};\n\nexport const productGidFromId = (id) => {\n if (!id) return null;\n if (id.startsWith(\"gid://shopify/Product/\")) return id;\n return \"gid://shopify/Product/\" + id;\n};\n\n// A percentage discount on one unit. Shopify truncates USD percentage discounts per unit to the\n// cent before multiplying by quantity (https://community.shopify.dev/t/28655/10), so the price\n// shown matches checkout. Other currencies, and values that aren't plain decimals, keep the exact\n// amount. `divisor` is 1 for a fraction (0.2) and 100 for a percentage (20).\nexport const percentageDiscount = (money, percentage, divisor = 100) => {\n const exact = parseFloat(money?.amount) * (percentage / divisor);\n if (money?.currencyCode !== \"USD\") return exact;\n\n const amount = String(money?.amount).match(/^(\\d+)(?:\\.(\\d{1,2})0*)?$/);\n const rate = String(percentage).match(/^(\\d+)(?:\\.(\\d+))?$/);\n if (!amount || !rate || (divisor !== 1 && divisor !== 100)) return exact;\n const rateFraction = (rate[2] || \"\").replace(/0+$/, \"\");\n const unitCents =\n Number(amount[1]) * 100 + Number((amount[2] || \"\").padEnd(2, \"0\"));\n const rateNumerator = Number(rate[1] + rateFraction);\n const rateDenominator = divisor * 10 ** rateFraction.length;\n const numerator = unitCents * rateNumerator;\n if (\n !Number.isSafeInteger(unitCents) ||\n !Number.isSafeInteger(rateNumerator) ||\n !Number.isSafeInteger(rateDenominator) ||\n !Number.isSafeInteger(numerator) ||\n rateNumerator > rateDenominator\n )\n return exact;\n\n // integer math: flooring a floating dollar amount can lose a cent at exact-cent boundaries\n return (numerator - (numerator % rateDenominator)) / rateDenominator / 100;\n};\n\n// BXGY customer-gets: new payloads carry cards on customerGets.productCards,\n// legacy payloads a single {quantity, items} pair at the root.\nexport const getBxgyGetsCards = (customerGets) => {\n if (\n Array.isArray(customerGets?.productCards) &&\n customerGets.productCards.length > 0\n ) {\n return customerGets.productCards;\n }\n if (customerGets?.items != null) {\n return [\n {\n quantity: customerGets.quantity,\n items: customerGets.items,\n purchaseType: customerGets.purchaseType,\n },\n ];\n }\n return [];\n};\n\nexport const getDiscountForProductDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n}) => {\n const isProductEntitledForProductDiscount = () => {\n if (targetDiscount.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.entitled?.variants) {\n if (variantId && targetDiscount.entitled.variants.includes(variantId)) {\n return true;\n }\n }\n\n if (targetDiscount.entitled?.products) {\n if (handle && targetDiscount.entitled.products.includes(handle)) {\n return true;\n }\n }\n return false;\n };\n if (!isProductEntitledForProductDiscount()) return 0;\n\n if (targetDiscount.discountValue?.type === \"DiscountAmount\") {\n return targetDiscount.discountValue.discountAmount.cents / 100;\n } else if (targetDiscount.discountValue?.type === \"DiscountPercentage\") {\n return percentageDiscount(\n selectedVariant.price,\n targetDiscount.discountValue.percentage,\n 1,\n );\n }\n};\n\nexport const getDiscountForMultiValueCollection = ({\n targetDiscount,\n handle,\n selectedVariant,\n}) => {\n if (\n !targetDiscount?.discountValue?.productDiscounts ||\n targetDiscount.discountValue.productDiscounts.length === 0\n )\n return 0;\n\n const entitledProductDiscounts =\n targetDiscount.discountValue.productDiscounts.filter((discount) =>\n (discount.products ?? []).includes(handle),\n ) || [];\n\n return entitledProductDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount = percentageDiscount(\n selectedVariant.price,\n discountValue.value.percentage,\n );\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForMultiValueProduct = ({\n targetDiscount,\n variantId,\n selectedVariant,\n}) => {\n if (!variantId) return 0;\n if (\n !targetDiscount?.discountValue?.variantDiscounts ||\n targetDiscount?.discountValue?.variantDiscounts.length === 0\n )\n return 0;\n\n const entitledVariantDiscounts =\n targetDiscount.discountValue.variantDiscounts.filter((discount) =>\n (discount.variants ?? []).includes(variantId),\n ) ?? [];\n\n return entitledVariantDiscounts.reduce((max, discountValue) => {\n let discountAmount = 0;\n\n if (discountValue.value.type === \"DiscountAmount\") {\n discountAmount = discountValue.value.discountAmount.cents / 100;\n } else if (discountValue.value.type === \"DiscountPercentage\") {\n discountAmount = percentageDiscount(\n selectedVariant.price,\n discountValue.value.percentage,\n );\n }\n\n return Math.max(max, discountAmount);\n }, 0);\n};\n\nexport const getDiscountForTierDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToTierDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.products) {\n if (\n handle &&\n targetDiscount.discountValue?.entitled?.products.includes(handle)\n ) {\n return true;\n }\n }\n\n if (targetDiscount.discountValue?.entitled?.variants) {\n if (\n variantId &&\n targetDiscount.discountValue?.entitled?.variants.includes(variantId)\n ) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToTierDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount = percentageDiscount(\n selectedVariant.price,\n biggestEligibleTier.value.percentage,\n );\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForVolumeDiscount = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n}) => {\n if (!targetDiscount.discountValue?.tiers) return 0;\n if (targetDiscount.discountValue?.tiersType === \"FREE_GIFT\") return 0;\n\n // customer-gets purchaseType gates the displayed price; per-variant mode\n // (ELIGIBLE_VARIANTS) ignores it\n const customerGets = targetDiscount.discountValue?.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n if (getsPurchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan) return 0;\n if (getsPurchaseType === \"ONE_TIME\" && selectedHasSellingPlan) return 0;\n\n const currentCollectionHandle = product.sourceCollection?.handle;\n const isProductEntitledToVolumeDiscount = () => {\n if (targetDiscount.discountValue?.entitled?.all) {\n return true;\n }\n\n if (targetDiscount.discountValue?.entitled?.collections) {\n if (\n currentCollectionHandle &&\n targetDiscount.discountValue?.entitled?.collections.includes(\n currentCollectionHandle,\n )\n ) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.products) {\n if (handle && targetDiscount?.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (targetDiscount?.entitled?.variants) {\n if (variantId && targetDiscount?.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n if (!isProductEntitledToVolumeDiscount()) return 0;\n\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n if (targetDiscount.entitled.products?.includes(item.handle)) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const biggestEligibleTier =\n targetDiscount.discountValue.tiers[biggestEligibleTierIndex];\n if (!biggestEligibleTier || !biggestEligibleTier.value) return 0;\n\n if (\n biggestEligibleTier.value.type === \"DiscountPercentage\" &&\n biggestEligibleTier.value.percentage\n ) {\n const discountAmount = percentageDiscount(\n selectedVariant.price,\n biggestEligibleTier.value.percentage,\n );\n\n return discountAmount;\n }\n};\n\nexport const getDiscountForMultiEffectTiers = ({\n targetDiscount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const isProductEntitledToDiscount = (discount) => {\n if (discount.entitled?.all) {\n return true;\n }\n\n if (discount.entitled?.collections) {\n if (\n currentCollectionHandle &&\n discount.entitled?.collections.includes(currentCollectionHandle)\n ) {\n return true;\n }\n }\n\n if (discount.entitled?.products) {\n if (handle && discount.entitled?.products.includes(handle)) {\n return true;\n }\n }\n\n if (discount.entitled?.variants) {\n if (variantId && discount.entitled?.variants.includes(variantId)) {\n return true;\n }\n }\n\n return false;\n };\n const getBiggestEligibleTier = () => {\n const isItemEligibleWithSelectedPurchaseType = (item, discount) => {\n if (\n discount.appliesOnSubscription &&\n !discount.appliesOnOneTimePurchase\n ) {\n return Boolean(item.sellingPlanAllocation);\n } else if (\n !discount.appliesOnSubscription &&\n discount.appliesOnOneTimePurchase\n ) {\n return !item.sellingPlanAllocation;\n } else {\n return true;\n }\n };\n const isCartItemEntitledToGiveDiscount = (item) => {\n if (!targetDiscount || !targetDiscount.entitled) {\n return false;\n }\n\n if (targetDiscount.entitled.all) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n if (targetDiscount.entitled.variants) {\n if (\n targetDiscount.entitled.variants?.includes(item.variantId.toString())\n ) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n }\n\n if (targetDiscount.entitled.products) {\n return isItemEligibleWithSelectedPurchaseType(item, targetDiscount);\n }\n\n return false;\n };\n\n const getEntitledQuantityAndTotal = () => {\n const entitledItems = (cart?.items || []).filter((item) => {\n return isCartItemEntitledToGiveDiscount(item);\n });\n\n const { entitledQuantity, entitledTotal } = entitledItems.reduce(\n (acc, item) => {\n acc.entitledQuantity += item.quantity;\n acc.entitledTotal +=\n parseFloat((item.price?.amount ?? 0) * 100) * item.quantity;\n\n return acc;\n },\n { entitledQuantity: 0, entitledTotal: 0 },\n );\n\n return { entitledQuantity, entitledTotal };\n };\n\n const isPrerequisiteValid = (prerequisite, quantity, subtotal) => {\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToQuantity) {\n if (\n Number(quantity) <\n Number(prerequisite.minimumRequirement.greaterThanOrEqualToQuantity)\n ) {\n return false;\n }\n }\n\n if (prerequisite?.minimumRequirement?.greaterThanOrEqualToSubtotal) {\n if (\n subtotal <\n prerequisite.minimumRequirement.greaterThanOrEqualToSubtotal.cents\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n log(\"getEntitledQuantityAndTotal\");\n const { entitledQuantity, entitledTotal } = getEntitledQuantityAndTotal();\n\n log(\"getEntitledQuantityAndTotal\", { entitledQuantity, entitledTotal });\n\n let currentBiggestTierIndex = -1;\n for (let i = 0; i < targetDiscount.discountValue?.tiers?.length; i++) {\n const currentTier = targetDiscount.discountValue.tiers[i];\n if (\n isPrerequisiteValid(\n currentTier.prerequisite,\n entitledQuantity,\n entitledTotal,\n )\n ) {\n currentBiggestTierIndex = i;\n } else {\n break;\n }\n }\n return currentBiggestTierIndex;\n };\n\n if (\n !targetDiscount.discountValue?.tiers ||\n targetDiscount.discountValue?.tiers.length === 0\n )\n return 0;\n\n log(\"getBiggestEligibleTier\");\n const currentCollectionHandle = product?.sourceCollection?.handle;\n const biggestEligibleTierIndex = getBiggestEligibleTier();\n log(\"getBiggestEligibleTier\", { biggestEligibleTierIndex });\n\n if (biggestEligibleTierIndex < 0) return 0;\n\n const productDiscountsAvailableOnTier =\n targetDiscount.discountValue.tiers\n .slice(0, biggestEligibleTierIndex + 1)\n ?.filter((tier) =>\n tier.discounts.some((discount) => discount.type === \"ProductDiscount\"),\n )\n ?.flatMap(\n (tier) =>\n tier.discounts.find((discount) => discount.type === \"ProductDiscount\")\n ?.value ?? [],\n ) ?? [];\n\n // Per-entry purchaseType replaces the promotion-level flags: an entry only\n // affects the price branch matching the selected purchase state.\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const eligibleProductDiscounts = productDiscountsAvailableOnTier.filter(\n (discount) => {\n if (discount.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (discount.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return isProductEntitledToDiscount(discount);\n },\n );\n\n const maxDiscountAmount = eligibleProductDiscounts.reduce((max, discount) => {\n let discountAmount = 0;\n if (discount.value.type === \"DiscountAmount\") {\n discountAmount = parseFloat(discount.value.discountAmount.amount);\n } else if (discount.value.type === \"DiscountPercentage\") {\n discountAmount = percentageDiscount(\n selectedVariant.price,\n discount.value.percentage,\n );\n }\n return Math.max(max, discountAmount);\n }, 0);\n return maxDiscountAmount;\n};\n\nexport const isProductMatchingBxgyCardItems = (handle, variantId, items) => {\n if (!items) return false;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n for (const product of items.products) {\n if (product.handle === handle) {\n if (!product.variants || product.variants.length === 0) return true;\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === variantId || variant.id === variantId) return true;\n }\n }\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (collection.products?.includes(handle)) return true;\n }\n }\n\n return false;\n};\n\nexport const isCartItemMatchingBxgyCard = (item, card) => {\n const items = card.items;\n if (items.type === \"AllProducts\") return true;\n\n if (items.type === \"SpecificProducts\" && items.products) {\n const itemVariantId = item.variantId?.toString();\n for (const product of items.products) {\n if (product.variants && product.variants.length > 0) {\n for (const variant of product.variants) {\n const vId = variant.id?.includes(\"/\")\n ? variant.id.split(\"/\").pop()\n : variant.id;\n if (vId === itemVariantId || variant.id === itemVariantId)\n return true;\n }\n }\n if (item.handle && product.handle === item.handle) return true;\n }\n }\n\n if (items.type === \"SpecificCollections\" && items.collections) {\n for (const collection of items.collections) {\n if (item.handle && collection.products?.includes(item.handle))\n return true;\n }\n }\n\n return false;\n};\n\nexport const areAllBxgyProductCardsMet = (cart, bxgy) => {\n if (!bxgy?.productCards?.length || !cart?.items) return false;\n\n const globalRequirementType = bxgy.requirementType ?? \"QUANTITY\";\n\n for (const card of bxgy.productCards) {\n const requirementType = card.requirementType ?? globalRequirementType;\n let totalQuantity = 0;\n let totalSubtotal = 0;\n\n for (const item of cart.items) {\n if (isCartItemMatchingBxgyCard(item, card)) {\n // Check purchaseType on the card against the cart item\n const itemHasSellingPlan = Boolean(item.sellingPlanAllocation);\n if (card.purchaseType === \"SUBSCRIPTION\" && !itemHasSellingPlan) {\n continue;\n }\n if (card.purchaseType === \"ONE_TIME\" && itemHasSellingPlan) {\n continue;\n }\n\n totalQuantity += item.quantity || 0;\n totalSubtotal +=\n parseFloat(item.price?.amount || 0) * 100 * (item.quantity || 0);\n }\n }\n\n if (requirementType === \"SUBTOTAL\") {\n const required = card.minimumSubtotal?.cents || 0;\n if (required > 0 && totalSubtotal < required) return false;\n } else {\n const required = card.quantity || 0;\n if (required > 0 && totalQuantity < required) return false;\n }\n }\n\n return true;\n};\n\nexport const getDiscountForBxgyDiscount = ({\n targetDiscount,\n handle,\n variantId,\n selectedVariant,\n cart,\n}) => {\n const bxgy = targetDiscount.discountValue;\n if (!bxgy?.productCards || !bxgy?.customerGets) return 0;\n\n const customerGetsValueType = bxgy.customerGets.value?.type;\n\n if (\n customerGetsValueType === \"Gift\" ||\n customerGetsValueType === \"FixedPrice\"\n ) {\n return 0;\n }\n\n // Gets-card purchaseType gates the displayed price against the selected\n // purchase state (new payloads carry gets cards; legacy has plain items).\n const getsCards = getBxgyGetsCards(bxgy.customerGets);\n const selectedHasSellingPlan = Boolean(\n selectedVariant?.sellingPlanAllocation,\n );\n const matchesGetsPurchaseType = (card) => {\n if (card.purchaseType === \"SUBSCRIPTION\" && !selectedHasSellingPlan)\n return false;\n if (card.purchaseType === \"ONE_TIME\" && selectedHasSellingPlan)\n return false;\n return true;\n };\n\n const isEntitledToReceive = () => {\n if (bxgy.customerGets.applyToProductCardItems) {\n return bxgy.productCards.some((card) =>\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n }\n return getsCards.some(\n (card) =>\n matchesGetsPurchaseType(card) &&\n isProductMatchingBxgyCardItems(handle, variantId, card.items),\n );\n };\n\n if (!isEntitledToReceive()) return 0;\n\n // Check if this product matches a productCard with purchase type requirement\n // Look up the actual cart item to check if it has a subscription selected\n const matchingCartItem = (cart?.items || []).find(\n (item) =>\n item.variantId?.toString() === variantId?.toString() ||\n item.handle === handle,\n );\n const cartItemHasSellingPlan = Boolean(\n matchingCartItem?.sellingPlanAllocation,\n );\n\n for (const card of bxgy.productCards) {\n if (isProductMatchingBxgyCardItems(handle, variantId, card.items)) {\n if (card.purchaseType === \"SUBSCRIPTION\" && !cartItemHasSellingPlan) {\n return 0;\n } else if (card.purchaseType === \"ONE_TIME\" && cartItemHasSellingPlan) {\n return 0;\n }\n }\n }\n\n if (!areAllBxgyProductCardsMet(cart, bxgy)) return 0;\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount || 0);\n if (originalPrice <= 0) return 0;\n\n if (customerGetsValueType === \"DiscountPercentage\") {\n const percentage = bxgy.customerGets.value.percentage || 0;\n return originalPrice * (percentage / 100);\n } else if (customerGetsValueType === \"DiscountAmount\") {\n const cents = bxgy.customerGets.value.discountAmount?.cents || 0;\n return Math.min(cents / 100, originalPrice);\n }\n\n return 0;\n};\n\nexport const getDiscountValueForDiscount = ({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n}) => {\n const handle = product?.handle;\n const variantId = getIdFromGid(selectedVariant?.id);\n\n if (!handle || !discount) return 0;\n\n if (discount.discountValue?.type === \"DiscountCodeBxgy\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"Gift\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"BxgyDiscount\") {\n return getDiscountForBxgyDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueProduct\") {\n return getDiscountForMultiValueProduct({\n targetDiscount: discount,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"DiscountMultiValueCollection\") {\n return getDiscountForMultiValueCollection({\n targetDiscount: discount,\n handle,\n selectedVariant,\n });\n }\n\n if (discount.discountValue?.type === \"TieredDiscount\") {\n return getDiscountForTierDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n return getDiscountForVolumeDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n });\n }\n\n if (discount.discountValue?.type === \"CollectionOrderDiscount\") {\n return 0;\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n log(\"getDiscountForMultiEffectTiers\");\n return getDiscountForMultiEffectTiers({\n targetDiscount: discount,\n handle,\n variantId,\n product,\n selectedVariant,\n cart,\n log,\n });\n }\n\n if (discount.discountValue?.type === \"ProductDiscount\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n if (discount.discountClass === \"ORDER\") {\n return 0;\n }\n if (discount.discountClass === \"SHIPPING\") {\n return 0;\n }\n\n if (discount.discountClass === \"PRODUCT\") {\n return getDiscountForProductDiscount({\n targetDiscount: discount,\n handle,\n variantId,\n selectedVariant,\n });\n }\n\n return 0;\n};\n\nexport const getBiggestDiscount = ({\n activePromotion,\n product,\n selectedVariant,\n cart,\n log,\n}) => {\n const discounts = Object.values(activePromotion?.discounts ?? []);\n log(\"Calculating biggest discount\", {\n discountCount: discounts.length,\n productId: product?.handle,\n collectionId: product?.sourceCollection?.handle,\n variantId: selectedVariant?.id,\n hasSellingPlan: !!selectedVariant?.sellingPlanAllocation,\n });\n\n const biggestDiscount = discounts.reduce((max, discount) => {\n const hasSellingPlan = Boolean(selectedVariant?.sellingPlanAllocation);\n\n // For BXGY discounts, purchase type is checked PER CARD (card.purchaseType),\n // not at the top level. Skip top-level appliesOnSubscription/appliesOnOneTimePurchase.\n // For other discount types, still use the top-level flags — unless a\n // customer-gets purchaseType overrides them (checked per discount type below).\n if (discount.discountValue?.type !== \"BxgyDiscount\") {\n let appliesOnSubscription = discount.appliesOnSubscription;\n let appliesOnOneTimePurchase = discount.appliesOnOneTimePurchase;\n\n if (discount.discountValue?.type === \"VolumeDiscount\") {\n const customerGets = discount.discountValue.customerGets;\n const getsAppliesTo = customerGets?.appliesTo || \"ELIGIBLE_VARIANTS\";\n const getsPurchaseType =\n getsAppliesTo !== \"ELIGIBLE_VARIANTS\"\n ? customerGets?.purchaseType\n : undefined;\n if (getsPurchaseType) {\n appliesOnSubscription = getsPurchaseType !== \"ONE_TIME\";\n appliesOnOneTimePurchase = getsPurchaseType !== \"SUBSCRIPTION\";\n }\n }\n\n if (discount.discountValue?.type === \"MultiEffectTiers\") {\n // Entries with their own purchaseType filter themselves in\n // getDiscountForMultiEffectTiers; don't gate the whole discount here.\n const hasPerEntryPurchaseType = (\n discount.discountValue.tiers ?? []\n ).some((tier) =>\n (tier.discounts ?? []).some(\n (tierDiscount) =>\n tierDiscount.type === \"ProductDiscount\" &&\n (Array.isArray(tierDiscount.value)\n ? tierDiscount.value\n : []\n ).some((entry) => entry.purchaseType),\n ),\n );\n if (hasPerEntryPurchaseType) {\n appliesOnSubscription = true;\n appliesOnOneTimePurchase = true;\n }\n }\n\n if (appliesOnSubscription && !appliesOnOneTimePurchase) {\n if (!hasSellingPlan) {\n log(\n \"Skipping subscription-only discount (no subscription selected)\",\n {\n discountType: discount.discountValue?.type,\n },\n );\n return max;\n }\n }\n\n if (!appliesOnSubscription && appliesOnOneTimePurchase) {\n if (hasSellingPlan) {\n log(\"Skipping one-time-only discount (subscription selected)\", {\n discountType: discount.discountValue?.type,\n });\n return max;\n }\n }\n }\n\n const discountValue = getDiscountValueForDiscount({\n product,\n selectedVariant,\n cart,\n discount,\n log,\n });\n log(\"Discount calculated\", {\n discountType: discount.discountValue?.type,\n discountValue,\n maxSoFar: max,\n appliesOnSubscription: discount.appliesOnSubscription,\n appliesOnOneTimePurchase: discount.appliesOnOneTimePurchase,\n hasSellingPlan,\n });\n return Math.max(max, discountValue);\n }, 0);\n\n log(\"Final biggest discount\", { biggestDiscount });\n return biggestDiscount;\n};\n\nexport const parsePromotionIfActive = (promotionObject, now = new Date()) => {\n try {\n // Handle both object and string cases for backward compatibility\n const promotion =\n typeof promotionObject === \"string\"\n ? JSON.parse(promotionObject ?? \"{}\")\n : promotionObject;\n\n // no stored promotion is the normal state, not an error\n if (!promotion?.startsAt || !promotion.status || !promotion.title)\n return undefined;\n const startsAt = new Date(promotion.startsAt);\n const endsAt = promotion.endsAt ? new Date(promotion.endsAt) : null;\n\n if (\n (promotion.status === \"ACTIVE\" || promotion.status === \"SCHEDULED\") &&\n now >= startsAt &&\n (!endsAt || now <= endsAt)\n ) {\n return promotion;\n }\n\n return undefined;\n } catch (error) {\n console.error(\"Failed to parse promotion:\", error);\n return undefined;\n }\n};\n","import {\n getBiggestDiscount,\n parsePromotionIfActive,\n getIdFromGid,\n productGidFromId,\n} from \"./discounts.js\";\n\n// Prints log() lines (including the discount math's) to the console, read over WebView remote\n// debugging, only on the devices in debugDeviceIds (the template's ABRA_CONFIG, set by setup/update\n// --debug <device-id>). Consecutive identical lines are dropped: some fire on every render.\nlet lastConsoleLine = \"\";\nconst consoleLog = (debugDeviceIds, deviceId, message, data) => {\n const device = String(deviceId ?? \"\").toLowerCase();\n if (\n !device ||\n !(debugDeviceIds || []).some((id) => String(id).toLowerCase() === device)\n )\n return;\n let json = \"\";\n if (data != null) {\n try {\n json = ` ${JSON.stringify(data)}`;\n } catch {\n json = ` ${String(data)}`;\n }\n }\n const line = `[Abra useAbra] ${message}${json}`;\n if (line === lastConsoleLine) return;\n lastConsoleLine = line;\n console.log(line);\n};\n\nexport default function useAbra({\n React,\n useTapcart,\n tapcartData,\n debugDeviceIds,\n}) {\n const Tapcart = useTapcart();\n // log() is memoized once; it reads these through a ref\n const consoleRef = React.useRef({});\n consoleRef.current = {\n debugDeviceIds,\n deviceId: Tapcart?.variables?.device?.id,\n };\n const [activePromotion, setActivePromotion] = React.useState(undefined);\n const renderCountRef = React.useRef(0);\n const logRef = React.useRef([]);\n const variables = Tapcart?.variables;\n const { storeFrontAccessToken, storeUrl } =\n tapcartData?.integrations?.find((x) => x.name === \"abra-promotions\") ?? {};\n\n // Stable GraphQL fragment and functions\n const PRODUCT_FRAGMENT = React.useMemo(\n () => `\n id\n handle\n variants(first: 100) {\n edges {\n node {\n id\n handle: title\n price {\n amount\n currencyCode\n }\n }\n }\n }\n `,\n [],\n );\n\n const generateProductsQuery = React.useCallback(\n (ids, country) => {\n const productQueries = ids\n .map(\n (id, index) =>\n `product_${index}: product(id: \"${productGidFromId(id)}\") {\n ${PRODUCT_FRAGMENT}\n }`,\n )\n .join(\"\\n \");\n\n const inContextDirective = country\n ? `@inContext(country: ${country})`\n : \"\";\n\n return `\n query Products ${inContextDirective} {\n ${productQueries}\n }\n `;\n },\n [PRODUCT_FRAGMENT],\n );\n\n const graphqlDefaultBody = React.useCallback(\n (query, variables, storeFrontAccessToken) => {\n return {\n async: true,\n crossDomain: true,\n method: \"POST\",\n headers: {\n \"X-Shopify-Storefront-Access-Token\": storeFrontAccessToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n };\n },\n [],\n );\n\n const fetchProducts = React.useCallback(\n async (ids, storeUrl, storeFrontAccessToken, country) => {\n if (!storeUrl || !storeFrontAccessToken) {\n return { error: \"Missing required configuration\" };\n }\n\n if (!ids || ids.length === 0) {\n return { data: [], error: \"No ids\" };\n }\n\n const GRAPHQL_URL = `https://${storeUrl}/api/2024-04/graphql.json`;\n const query = generateProductsQuery(ids, country);\n\n try {\n const response = await fetch(\n GRAPHQL_URL,\n graphqlDefaultBody(query, {}, storeFrontAccessToken),\n );\n\n if (response?.ok) {\n const responseBody = await response.json();\n const data = responseBody?.data;\n\n if (!data) {\n return { data: [], error: \"No data\" };\n }\n\n const products = Object.values(data).filter((item) => item !== null);\n\n return {\n data: products,\n error: null,\n };\n }\n\n const error = await response.text();\n return { data: [], error: error };\n } catch (err) {\n return { data: [], error: err.message };\n }\n },\n [generateProductsQuery, graphqlDefaultBody],\n );\n\n const useProductsCustom = React.useCallback(\n ({ ids, storeUrl, storeFrontAccessToken, country }) => {\n const [products, setProducts] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState(null);\n\n // Memoize ids to prevent infinite loops\n const idsString = React.useMemo(() => {\n if (!ids || !Array.isArray(ids) || ids.length === 0) return \"\";\n return [...ids].sort().join(\",\");\n }, [ids ? JSON.stringify([...ids].sort()) : \"\"]);\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!storeUrl || !storeFrontAccessToken) {\n if (!storeUrl) {\n setError(\"no store url\");\n }\n if (!storeFrontAccessToken) {\n setError(\"no store front access token\");\n }\n setProducts([]);\n setLoading(false);\n return;\n }\n\n if (!ids || ids.length === 0) {\n setProducts([]);\n setLoading(false);\n return;\n }\n\n const result = await fetchProducts(\n ids,\n storeUrl,\n storeFrontAccessToken,\n country,\n );\n\n try {\n if (result.data && result.data.length > 0) {\n const formattedProducts = result?.data?.map((product) => ({\n id: getIdFromGid(product.id),\n handle: product?.handle,\n variants: product?.variants?.edges?.map((variant) => ({\n id: getIdFromGid(variant?.node?.id),\n handle: variant?.node?.handle,\n price: variant?.node?.price,\n })),\n }));\n setProducts(formattedProducts);\n setError(result.error);\n } else {\n setProducts([]);\n setError(result.error);\n }\n } catch (error) {\n setError(error.message);\n }\n\n setLoading(false);\n };\n\n fetchData();\n }, [idsString, storeUrl, storeFrontAccessToken, country, fetchProducts]);\n\n return { products, loading, error };\n },\n [fetchProducts],\n );\n\n // Stable logging function that doesn't cause re-renders\n const log = React.useCallback((message, data = null) => {\n consoleLog(\n consoleRef.current.debugDeviceIds,\n consoleRef.current.deviceId,\n message,\n data,\n );\n const timestamp = new Date().toISOString();\n const logEntry = {\n timestamp,\n message,\n data: data ? JSON.parse(JSON.stringify(data)) : null,\n renderCount: renderCountRef.current,\n };\n logRef.current.push(logEntry);\n\n // Keep only last 50 logs to prevent memory issues\n if (logRef.current.length > 100) {\n logRef.current = logRef.current.slice(-100);\n }\n }, []);\n\n // Create stable cart items reference to prevent infinite recreations\n const stableCartItems = React.useMemo(() => {\n const currentCartItems = variables?.cart?.items ?? [];\n\n if (!currentCartItems || currentCartItems.length === 0) {\n return [];\n }\n\n const mappedItems = currentCartItems.map((item) => ({\n productId: item.productId,\n variantId: item.variantId,\n quantity: item.quantity,\n sellingPlanAllocation: item.sellingPlanAllocation,\n }));\n\n return mappedItems;\n }, [\n (variables?.cart?.items || [])\n ?.map((item) => `${item.productId}-${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n const ids = React.useMemo(\n () => (stableCartItems ?? []).map((item) => item.productId),\n [stableCartItems],\n );\n\n // Get country from cart currency or tapcartData\n const country = React.useMemo(() => {\n return (\n Tapcart?.variables?.cart?.currency?.slice(0, 2) || tapcartData?.country\n );\n }, [Tapcart?.variables?.cart?.currency, tapcartData?.country]);\n\n const {\n products: cartItems,\n loading: cartItemsLoading,\n error: cartItemsError,\n } = useProductsCustom({\n ids,\n storeUrl: storeUrl,\n storeFrontAccessToken: storeFrontAccessToken,\n country: country,\n });\n\n // Render limiter to prevent infinite recreations\n renderCountRef.current += 1;\n\n // Create stable cart reference to prevent infinite recreations\n const stableCart = React.useMemo(() => {\n if (!variables?.cart) {\n return null;\n }\n if (cartItemsLoading || cartItemsError) {\n return variables.cart;\n }\n\n if (!cartItems || cartItems.length === 0) {\n return variables.cart;\n }\n\n const processedItems = (stableCartItems || []).map((item) => {\n const _cartItem = cartItems?.find(\n (cartItem) => getIdFromGid(cartItem?.id) === item.productId,\n );\n if (!_cartItem) {\n return item;\n }\n const _variant = _cartItem?.variants?.find(\n (variant) => getIdFromGid(variant?.id) === item?.variantId,\n );\n if (!_variant) {\n return item;\n }\n\n const processedItem = {\n ...item,\n handle: _cartItem?.handle,\n price: _variant?.price,\n };\n\n return processedItem;\n });\n\n const result = {\n ...variables.cart,\n items: processedItems,\n };\n\n return result;\n }, [\n cartItems,\n cartItemsLoading,\n cartItemsError,\n (variables?.cart?.items || [])\n ?.map((item) => `${item.variantId}-${item.quantity}`)\n ?.join(\",\"),\n ]);\n\n // Effect: Initialize from storage and observe changes\n React.useEffect(() => {\n const storage = Tapcart?.variables?.storage || {};\n const abraData = storage[\"abra\"] || {};\n const storedPromotion = parsePromotionIfActive(\n abraData[\"active-promotion\"],\n );\n\n log(\"Storage promotion retrieved\", { storedPromotion });\n\n // Only update activePromotion if the promotion has actually changed\n if (\n storedPromotion?.title &&\n JSON.stringify(activePromotion) !== JSON.stringify(storedPromotion)\n ) {\n setActivePromotion(storedPromotion);\n } else if (!storedPromotion?.title && activePromotion) {\n // Clear promotion if it was removed from storage\n setActivePromotion(undefined);\n }\n }, [Tapcart?.variables?.storage?.[\"abra\"]?.[\"active-promotion\"]]);\n\n let getProductWithDiscount = React.useCallback(\n (product) => {\n if (!activePromotion || !activePromotion.title || !product) {\n log(\"No active promotion or product, returning original product\", {\n hasActivePromotion: !!activePromotion,\n hasProduct: !!product,\n });\n return product;\n }\n\n const _product = JSON.parse(JSON.stringify(product));\n let currencyCode = undefined;\n const variants = _product.variants.map((variant) => {\n const selectedVariant = JSON.parse(JSON.stringify(variant));\n currencyCode = currencyCode || selectedVariant?.price?.currencyCode;\n let biggestDiscount = 0;\n try {\n biggestDiscount = getBiggestDiscount({\n activePromotion,\n product: _product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n } catch (error) {\n log(\"Error calculating discount\", {\n error: error.message,\n variantId: selectedVariant?.id,\n });\n biggestDiscount = 0;\n }\n\n const originalPrice = parseFloat(selectedVariant?.price?.amount ?? 0);\n const compareAtPrice = parseFloat(\n selectedVariant?.compareAtPrice?.amount ?? 0,\n );\n\n let referencePrice = originalPrice;\n if (compareAtPrice) {\n referencePrice = Math.max(originalPrice, compareAtPrice ?? 0);\n }\n\n let discountedPrice = Math.max(originalPrice - biggestDiscount, 0);\n\n selectedVariant.price = {\n amount: discountedPrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n selectedVariant.compareAtPrice = {\n amount: referencePrice,\n currencyCode: selectedVariant.price.currencyCode,\n };\n return selectedVariant;\n });\n _product.variants = variants;\n currencyCode = currencyCode || \"USD\";\n _product.compareAtPriceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(\n max,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, 0),\n currencyCode: currencyCode,\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(\n min,\n parseFloat(variant.compareAtPrice.amount ?? variant.price.amount),\n );\n }, Infinity),\n currencyCode: currencyCode,\n },\n };\n _product.priceRange = {\n maxVariantPrice: {\n amount: variants.reduce((max, variant) => {\n return Math.max(max, parseFloat(variant.price.amount));\n }, 0),\n currencyCode: currencyCode || \"USD\",\n },\n minVariantPrice: {\n amount: variants.reduce((min, variant) => {\n return Math.min(min, parseFloat(variant.price.amount));\n }, Infinity),\n currencyCode: currencyCode || \"USD\",\n },\n };\n _product.abra = true;\n\n return _product;\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n // Discounted price for a single price point (e.g. a selling-plan option in a\n // subscription selector). hasSellingPlan forces the subscription vs one-time\n // price branch regardless of what the variant carries.\n const getDiscountedPrice = React.useCallback(\n (product, variant, price, hasSellingPlan = false) => {\n const basePrice = parseFloat(price ?? variant?.price?.amount ?? 0);\n if (!activePromotion || !activePromotion.title || !product || !variant) {\n return basePrice;\n }\n\n const selectedVariant = {\n ...variant,\n price: {\n amount: basePrice,\n currencyCode: variant?.price?.currencyCode,\n },\n sellingPlanAllocation: hasSellingPlan\n ? (variant?.sellingPlanAllocation ?? { sellingPlan: {} })\n : null,\n };\n\n try {\n const biggestDiscount = getBiggestDiscount({\n activePromotion,\n product,\n selectedVariant,\n cart: stableCart,\n log,\n });\n return Math.max(basePrice - biggestDiscount, 0);\n } catch (error) {\n log(\"Error calculating discounted price\", {\n error: error.message,\n variantId: variant?.id,\n });\n return basePrice;\n }\n },\n [\n activePromotion?.title,\n activePromotion?.discounts?.map((discount) => discount.title).join(\",\"),\n stableCart,\n ],\n );\n\n return React.useMemo(\n () => ({\n abra: {\n activePromotion,\n getProductWithDiscount,\n getDiscountedPrice,\n logs: logRef.current,\n },\n }),\n [activePromotion, getProductWithDiscount, getDiscountedPrice],\n );\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abra-promotions/webhooks-for-tapcart",
3
- "version": "2.0.0-beta.4",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "description": "Abra webhooks for enabling abra promotions inside the Tapcart platform",
6
6
  "main": "dist/index.cjs",
@@ -43,10 +43,10 @@
43
43
  "@eslint/js": "^9.14.0",
44
44
  "@rollup/plugin-commonjs": "^25.0.7",
45
45
  "@rollup/plugin-node-resolve": "^15.2.3",
46
- "@rollup/plugin-terser": "^0.4.4",
46
+ "@rollup/plugin-terser": "^1.0.2",
47
47
  "rollup": "^4.9.1",
48
48
  "rollup-plugin-dts": "^6.1.0",
49
- "rimraf": "^5.0.5",
49
+ "rimraf": "^6.1.4",
50
50
  "eslint": "^9.14.0",
51
51
  "prettier": "^3.3.3"
52
52
  },