@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 +54 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +54 -18
- package/dist/index.esm.js.map +1 -1
- package/package.json +3 -3
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
|
-
|
|
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
|
-
|
|
98
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
|
|
303
|
-
|
|
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
|
-
|
|
483
|
-
|
|
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
|
-
|
|
677
|
-
|
|
710
|
+
discountAmount = percentageDiscount(
|
|
711
|
+
selectedVariant.price,
|
|
712
|
+
discount.value.percentage,
|
|
713
|
+
);
|
|
678
714
|
}
|
|
679
715
|
return Math.max(max, discountAmount);
|
|
680
716
|
}, 0);
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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
|
-
|
|
301
|
-
|
|
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
|
-
|
|
481
|
-
|
|
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
|
-
|
|
675
|
-
|
|
708
|
+
discountAmount = percentageDiscount(
|
|
709
|
+
selectedVariant.price,
|
|
710
|
+
discount.value.percentage,
|
|
711
|
+
);
|
|
676
712
|
}
|
|
677
713
|
return Math.max(max, discountAmount);
|
|
678
714
|
}, 0);
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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
|
|
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.
|
|
46
|
+
"@rollup/plugin-terser": "^1.0.2",
|
|
47
47
|
"rollup": "^4.9.1",
|
|
48
48
|
"rollup-plugin-dts": "^6.1.0",
|
|
49
|
-
"rimraf": "^
|
|
49
|
+
"rimraf": "^6.1.4",
|
|
50
50
|
"eslint": "^9.14.0",
|
|
51
51
|
"prettier": "^3.3.3"
|
|
52
52
|
},
|