@tapcart/mobile-components 0.7.60 → 0.7.61
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/components/hooks/use-customer.d.ts +10 -0
- package/dist/components/hooks/use-customer.d.ts.map +1 -0
- package/dist/components/hooks/use-customer.js +24 -0
- package/dist/components/hooks/use-tap.d.ts +8 -0
- package/dist/components/hooks/use-tap.d.ts.map +1 -0
- package/dist/components/hooks/use-tap.js +100 -0
- package/dist/components/ui/apple-pay-button.d.ts +8 -1
- package/dist/components/ui/apple-pay-button.d.ts.map +1 -1
- package/dist/components/ui/apple-pay-button.js +2 -5
- package/package.json +1 -1
- package/dist/components/libs/cart/calculated-cart-values.util.d.ts +0 -16
- package/dist/components/libs/cart/calculated-cart-values.util.d.ts.map +0 -1
- package/dist/components/libs/cart/calculated-cart-values.util.js +0 -144
- package/dist/components/libs/cart/calculated-cart-values.util.test.d.ts +0 -2
- package/dist/components/libs/cart/calculated-cart-values.util.test.d.ts.map +0 -1
- package/dist/components/libs/cart/calculated-cart-values.util.test.js +0 -150
- package/dist/components/libs/cart/calculatedCartValues.util.d.ts +0 -1
- package/dist/components/libs/cart/calculatedCartValues.util.d.ts.map +0 -1
- package/dist/components/libs/cart/calculatedCartValues.util.js +0 -1
- package/dist/lib/cart.util copy.d.ts +0 -1
- package/dist/lib/cart.util copy.d.ts.map +0 -1
- package/dist/lib/cart.util copy.js +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type Customer = {
|
|
2
|
+
isAuthenticated: boolean;
|
|
3
|
+
};
|
|
4
|
+
type UseCustomerProps = {};
|
|
5
|
+
type UseCustomerReturn = {
|
|
6
|
+
customer: Customer;
|
|
7
|
+
};
|
|
8
|
+
export declare const useCustomer: (props: UseCustomerProps | null) => UseCustomerReturn;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=use-customer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-customer.d.ts","sourceRoot":"","sources":["../../../components/hooks/use-customer.ts"],"names":[],"mappings":"AAWA,KAAK,QAAQ,GAAG;IACd,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AAGD,KAAK,gBAAgB,GAAG,EAAE,CAAA;AAE1B,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,QAAQ,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,WAAW,UACf,gBAAgB,GAAG,IAAI,KAC7B,iBAuBF,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
// @ts-ignore -- webbridge-react is not typed (yet)
|
|
4
|
+
import { useActions } from "@tapcart/webbridge-react";
|
|
5
|
+
export const useCustomer = (props) => {
|
|
6
|
+
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
|
7
|
+
const [customer, setCustomer] = useState({});
|
|
8
|
+
const actions = useActions();
|
|
9
|
+
// verify customer
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
try {
|
|
12
|
+
// webbridge method to get customerIdentity
|
|
13
|
+
actions.getCustomerIdentity(null, {
|
|
14
|
+
onSuccess: (user) => setIsAuthenticated(!!(user === null || user === void 0 ? void 0 : user.email)),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
console.log("unable to get customer identity ", e);
|
|
19
|
+
}
|
|
20
|
+
}, [actions]);
|
|
21
|
+
return {
|
|
22
|
+
customer: Object.assign({ isAuthenticated }, customer),
|
|
23
|
+
};
|
|
24
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
declare const useTap: (tapThreshold?: number) => {
|
|
3
|
+
onTap: (handler: (event: any) => void) => (event: any) => void;
|
|
4
|
+
isPressed: boolean;
|
|
5
|
+
ref: React.MutableRefObject<null>;
|
|
6
|
+
};
|
|
7
|
+
export { useTap };
|
|
8
|
+
//# sourceMappingURL=use-tap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tap.d.ts","sourceRoot":"","sources":["../../../components/hooks/use-tap.ts"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAuFvE,QAAA,MAAM,MAAM;6BAuBkC,GAAG,KAAK,IAAI,aACvC,GAAG;;;CAerB,CAAA;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useEffect, useCallback, useRef } from "react";
|
|
3
|
+
// Shared manager for all instances of the hook
|
|
4
|
+
const tapManager = (() => {
|
|
5
|
+
const elements = new Map();
|
|
6
|
+
let isListening = false;
|
|
7
|
+
const startListening = () => {
|
|
8
|
+
if (isListening)
|
|
9
|
+
return;
|
|
10
|
+
const handleTouchStart = (e) => {
|
|
11
|
+
const touch = e.touches[0];
|
|
12
|
+
elements.forEach((data, el) => {
|
|
13
|
+
if (el.contains(touch.target)) {
|
|
14
|
+
data.touchStarted = true;
|
|
15
|
+
data.touchMoved = false;
|
|
16
|
+
data.startPosition = { x: touch.clientX, y: touch.clientY };
|
|
17
|
+
// Don't set isPressed here, wait to determine if it's a tap or drag
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
const handleTouchMove = (e) => {
|
|
22
|
+
const touch = e.touches[0];
|
|
23
|
+
elements.forEach((data, el) => {
|
|
24
|
+
if (data.touchStarted) {
|
|
25
|
+
const deltaX = Math.abs(touch.clientX - data.startPosition.x);
|
|
26
|
+
const deltaY = Math.abs(touch.clientY - data.startPosition.y);
|
|
27
|
+
if (deltaX > data.tapThreshold || deltaY > data.tapThreshold) {
|
|
28
|
+
data.touchMoved = true;
|
|
29
|
+
data.setIsPressed(false);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const handleTouchEnd = () => {
|
|
35
|
+
elements.forEach((data) => {
|
|
36
|
+
if (data.touchStarted) {
|
|
37
|
+
data.touchStarted = false;
|
|
38
|
+
if (!data.touchMoved) {
|
|
39
|
+
// It's a tap, set isPressed briefly
|
|
40
|
+
data.setIsPressed(true);
|
|
41
|
+
setTimeout(() => data.setIsPressed(false), 100);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
document.addEventListener("touchstart", (e) => handleTouchStart(e), { passive: true });
|
|
47
|
+
document.addEventListener("touchmove", (e) => handleTouchMove(e), { passive: true });
|
|
48
|
+
document.addEventListener("touchend", () => handleTouchEnd(), {
|
|
49
|
+
passive: true,
|
|
50
|
+
});
|
|
51
|
+
isListening = true;
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
register: (el, data) => {
|
|
55
|
+
elements.set(el, data);
|
|
56
|
+
startListening();
|
|
57
|
+
},
|
|
58
|
+
unregister: (el) => {
|
|
59
|
+
elements.delete(el);
|
|
60
|
+
},
|
|
61
|
+
elements,
|
|
62
|
+
};
|
|
63
|
+
})();
|
|
64
|
+
const useTap = (tapThreshold = 10) => {
|
|
65
|
+
const [isPressed, setIsPressed] = useState(false);
|
|
66
|
+
const elementRef = useRef(null);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
const element = elementRef.current;
|
|
69
|
+
if (!element)
|
|
70
|
+
return;
|
|
71
|
+
const data = {
|
|
72
|
+
touchStarted: false,
|
|
73
|
+
touchMoved: false,
|
|
74
|
+
startPosition: { x: 0, y: 0 },
|
|
75
|
+
setIsPressed,
|
|
76
|
+
tapThreshold,
|
|
77
|
+
};
|
|
78
|
+
tapManager.register(element, data);
|
|
79
|
+
return () => {
|
|
80
|
+
tapManager.unregister(element);
|
|
81
|
+
};
|
|
82
|
+
}, [tapThreshold]);
|
|
83
|
+
const onTap = useCallback((handler) => {
|
|
84
|
+
return (event) => {
|
|
85
|
+
const data = tapManager.elements.get(elementRef.current);
|
|
86
|
+
if (!data)
|
|
87
|
+
return;
|
|
88
|
+
if (event.type === "touchend" && !data.touchMoved) {
|
|
89
|
+
handler(event);
|
|
90
|
+
}
|
|
91
|
+
else if (event.type === "click" && !data.touchStarted) {
|
|
92
|
+
handler(event);
|
|
93
|
+
setIsPressed(true);
|
|
94
|
+
setTimeout(() => setIsPressed(false), 100);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}, []);
|
|
98
|
+
return { onTap, isPressed, ref: elementRef };
|
|
99
|
+
};
|
|
100
|
+
export { useTap };
|
|
@@ -17,13 +17,20 @@ export interface ApplePayButtonProps extends React.ButtonHTMLAttributes<HTMLButt
|
|
|
17
17
|
supportedNetworks?: string[];
|
|
18
18
|
buttonType?: ApplePayButtonType;
|
|
19
19
|
buttonStyle?: ApplePayButtonStyle;
|
|
20
|
+
applePayButtonStyle?: {
|
|
21
|
+
width?: string | undefined;
|
|
22
|
+
height?: string | undefined;
|
|
23
|
+
borderRadius?: string | undefined;
|
|
24
|
+
padding?: string | undefined;
|
|
25
|
+
boxSizing?: string | undefined;
|
|
26
|
+
} | undefined;
|
|
20
27
|
onPaymentAuthorized?: (paymentData: ApplePayJS.ApplePayPayment) => Promise<boolean>;
|
|
21
28
|
onShippingContactSelected?: (shippingContact: ApplePayJS.ApplePayPaymentContact) => Promise<ApplePayJS.ApplePayShippingMethodUpdate>;
|
|
22
29
|
onShippingMethodSelected?: (shippingMethod: ApplePayJS.ApplePayShippingMethod) => Promise<ApplePayJS.ApplePayShippingMethodUpdate>;
|
|
23
30
|
onPaymentCancelled?: (event?: ApplePayJS.Event) => void;
|
|
24
31
|
}
|
|
25
32
|
declare const ApplePayButton: {
|
|
26
|
-
({ displayName, amount, requiredBillingContactFields, requiredShippingContactFields, startSessionURL, startSessionCacheBypass, appId, domainName, countryCode, currencyCode, merchantCapabilities, supportedNetworks, buttonType, buttonStyle, onPaymentAuthorized, onShippingContactSelected, onShippingMethodSelected, onPaymentCancelled, }: ApplePayButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
({ displayName, amount, requiredBillingContactFields, requiredShippingContactFields, startSessionURL, startSessionCacheBypass, appId, domainName, countryCode, currencyCode, merchantCapabilities, supportedNetworks, buttonType, buttonStyle, applePayButtonStyle, onPaymentAuthorized, onShippingContactSelected, onShippingMethodSelected, onPaymentCancelled, }: ApplePayButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
27
34
|
displayName: string;
|
|
28
35
|
};
|
|
29
36
|
export { ApplePayButton };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apple-pay-button.d.ts","sourceRoot":"","sources":["../../../components/ui/apple-pay-button.tsx"],"names":[],"mappings":";AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,WAAW,GACX,MAAM,GACN,KAAK,GACL,WAAW,GACX,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,OAAO,GACP,KAAK,GACL,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,WAAW,GACX,SAAS,GACT,KAAK,GACL,QAAQ,CAAA;AAEZ,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,CAAA;AAErE,MAAM,WAAW,mBACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B,CAAC,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAA;IAChE,6BAA6B,CAAC,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAA;IACjE,eAAe,EAAE,MAAM,CAAA;IACvB,uBAAuB,EAAE,OAAO,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAA;IAC9D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAC/B,WAAW,CAAC,EAAE,mBAAmB,CAAA;IACjC,mBAAmB,CAAC,EAAE,CACpB,WAAW,EAAE,UAAU,CAAC,eAAe,KACpC,OAAO,CAAC,OAAO,CAAC,CAAA;IACrB,yBAAyB,CAAC,EAAE,CAC1B,eAAe,EAAE,UAAU,CAAC,sBAAsB,KAC/C,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IACrD,wBAAwB,CAAC,EAAE,CACzB,cAAc,EAAE,UAAU,CAAC,sBAAsB,KAC9C,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IACrD,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,KAAK,IAAI,CAAA;CACxD;AAED,QAAA,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"apple-pay-button.d.ts","sourceRoot":"","sources":["../../../components/ui/apple-pay-button.tsx"],"names":[],"mappings":";AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,WAAW,GACX,MAAM,GACN,KAAK,GACL,WAAW,GACX,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,OAAO,GACP,KAAK,GACL,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,WAAW,GACX,SAAS,GACT,KAAK,GACL,QAAQ,CAAA;AAEZ,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,CAAA;AAErE,MAAM,WAAW,mBACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B,CAAC,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAA;IAChE,6BAA6B,CAAC,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAA;IACjE,eAAe,EAAE,MAAM,CAAA;IACvB,uBAAuB,EAAE,OAAO,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAA;IAC9D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAC/B,WAAW,CAAC,EAAE,mBAAmB,CAAA;IACjC,mBAAmB,CAAC,EAChB;QACE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACjC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,GACD,SAAS,CAAA;IACb,mBAAmB,CAAC,EAAE,CACpB,WAAW,EAAE,UAAU,CAAC,eAAe,KACpC,OAAO,CAAC,OAAO,CAAC,CAAA;IACrB,yBAAyB,CAAC,EAAE,CAC1B,eAAe,EAAE,UAAU,CAAC,sBAAsB,KAC/C,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IACrD,wBAAwB,CAAC,EAAE,CACzB,cAAc,EAAE,UAAU,CAAC,sBAAsB,KAC9C,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IACrD,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,KAAK,IAAI,CAAA;CACxD;AAED,QAAA,MAAM,cAAc;yWAoBjB,mBAAmB;;CAsKrB,CAAA;AAID,OAAO,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
12
|
import ApplePayButtonComponent from "apple-pay-button";
|
|
13
|
-
const ApplePayButton = ({ displayName, amount, requiredBillingContactFields = ["name", "postalAddress", "phone", "email"], requiredShippingContactFields = ["name", "postalAddress", "phone", "email"], startSessionURL, startSessionCacheBypass = false, appId, domainName, countryCode = "US", currencyCode = "USD", merchantCapabilities = ["supports3DS"], supportedNetworks = ["visa", "masterCard", "amex", "discover"], buttonType = "plain", buttonStyle = "white-outline", onPaymentAuthorized, onShippingContactSelected, onShippingMethodSelected, onPaymentCancelled, }) => {
|
|
13
|
+
const ApplePayButton = ({ displayName, amount, requiredBillingContactFields = ["name", "postalAddress", "phone", "email"], requiredShippingContactFields = ["name", "postalAddress", "phone", "email"], startSessionURL, startSessionCacheBypass = false, appId, domainName, countryCode = "US", currencyCode = "USD", merchantCapabilities = ["supports3DS"], supportedNetworks = ["visa", "masterCard", "amex", "discover"], buttonType = "plain", buttonStyle = "white-outline", applePayButtonStyle, onPaymentAuthorized, onShippingContactSelected, onShippingMethodSelected, onPaymentCancelled, }) => {
|
|
14
14
|
const onClick = () => {
|
|
15
15
|
const applePayRequest = {
|
|
16
16
|
countryCode,
|
|
@@ -127,10 +127,7 @@ const ApplePayButton = ({ displayName, amount, requiredBillingContactFields = ["
|
|
|
127
127
|
console.log("Session Cancelled.", event);
|
|
128
128
|
};
|
|
129
129
|
};
|
|
130
|
-
return (_jsx(ApplePayButtonComponent, { onClick: onClick, style:
|
|
131
|
-
height: "48px",
|
|
132
|
-
borderRadius: "4px",
|
|
133
|
-
}, type: buttonType, buttonStyle: buttonStyle }));
|
|
130
|
+
return (_jsx(ApplePayButtonComponent, { onClick: onClick, style: applePayButtonStyle, type: buttonType, buttonStyle: buttonStyle }));
|
|
134
131
|
};
|
|
135
132
|
ApplePayButton.displayName = "ApplePayButton";
|
|
136
133
|
export { ApplePayButton };
|
package/package.json
CHANGED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { EnrichedCart, CartCalculatedDiscount, CartCalculatedAppliedGiftCard } from "app-studio-types";
|
|
2
|
-
export declare const isOrderLevelDiscount: (code: string, cart: EnrichedCart) => boolean;
|
|
3
|
-
export declare const isLineItemDiscount: (code: string, cart: EnrichedCart) => boolean;
|
|
4
|
-
export type CalculatedData = {
|
|
5
|
-
orderAndLineItemDiscounts: CartCalculatedDiscount[];
|
|
6
|
-
appliedGiftCards: CartCalculatedAppliedGiftCard[];
|
|
7
|
-
isFreeShipping: boolean;
|
|
8
|
-
discountsTotalAmount: number;
|
|
9
|
-
giftCardsTotalAmount: number;
|
|
10
|
-
salesAmount: number;
|
|
11
|
-
totalCompareAtPrice: number;
|
|
12
|
-
totalDiscountedPrice: number;
|
|
13
|
-
};
|
|
14
|
-
export declare const DEFAULT_CALCULATED_DATA: CalculatedData;
|
|
15
|
-
export declare const getData: (cart: EnrichedCart) => CalculatedData;
|
|
16
|
-
//# sourceMappingURL=calculated-cart-values.util.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculated-cart-values.util.d.ts","sourceRoot":"","sources":["../../../../components/libs/cart/calculated-cart-values.util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,EAC9B,MAAM,kBAAkB,CAAA;AAuCzB,eAAO,MAAM,oBAAoB,SAAU,MAAM,QAAQ,YAAY,YAGpE,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAU,MAAM,QAAQ,YAAY,YAGlE,CAAA;AAgGD,MAAM,MAAM,cAAc,GAAG;IAC3B,yBAAyB,EAAE,sBAAsB,EAAE,CAAA;IACnD,gBAAgB,EAAE,6BAA6B,EAAE,CAAA;IACjD,cAAc,EAAE,OAAO,CAAA;IACvB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oBAAoB,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,cASrC,CAAA;AAED,eAAO,MAAM,OAAO,SAAU,YAAY,KAAG,cA4B5C,CAAA"}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
const getOrderLevelDiscounts = (cart) => {
|
|
2
|
-
var _a;
|
|
3
|
-
const discountMap = (_a = cart.discountAllocations) === null || _a === void 0 ? void 0 : _a.filter((discount) => discount.targetType !== "SHIPPING_LINE").reduce((acc, discount) => {
|
|
4
|
-
var _a;
|
|
5
|
-
const code = (_a = discount.code) !== null && _a !== void 0 ? _a : "unknown";
|
|
6
|
-
if (!acc[code]) {
|
|
7
|
-
acc[code] = 0;
|
|
8
|
-
}
|
|
9
|
-
acc[code] += parseFloat(discount.discountedAmount.amount);
|
|
10
|
-
return acc;
|
|
11
|
-
}, {});
|
|
12
|
-
if (!discountMap)
|
|
13
|
-
return [];
|
|
14
|
-
return Object.entries(discountMap)
|
|
15
|
-
.map(([code, amount]) => ({
|
|
16
|
-
id: code,
|
|
17
|
-
amount,
|
|
18
|
-
name: `Discount - ${code}`,
|
|
19
|
-
type: "ORDER_LEVEL",
|
|
20
|
-
}))
|
|
21
|
-
.filter((discount) => cart.discounts.includes(discount.id));
|
|
22
|
-
};
|
|
23
|
-
const getShippingDiscounts = (cart) => {
|
|
24
|
-
var _a;
|
|
25
|
-
if (!(cart === null || cart === void 0 ? void 0 : cart.discountAllocations))
|
|
26
|
-
return [];
|
|
27
|
-
return (_a = cart.discountAllocations) === null || _a === void 0 ? void 0 : _a.filter((discount) => discount.targetType === "SHIPPING_LINE").map((discount) => ({
|
|
28
|
-
amount: discount.discountedAmount.amount,
|
|
29
|
-
code: discount.code,
|
|
30
|
-
type: discount.targetType,
|
|
31
|
-
}));
|
|
32
|
-
};
|
|
33
|
-
export const isOrderLevelDiscount = (code, cart) => {
|
|
34
|
-
const orderLevelDiscounts = getOrderLevelDiscounts(cart);
|
|
35
|
-
return orderLevelDiscounts.some((discount) => discount.id === code);
|
|
36
|
-
};
|
|
37
|
-
export const isLineItemDiscount = (code, cart) => {
|
|
38
|
-
const lineItemDiscounts = getLineItemDiscounts(cart);
|
|
39
|
-
return lineItemDiscounts.some((discount) => discount.id === code);
|
|
40
|
-
};
|
|
41
|
-
const getAppliedGiftCards = (cart) => {
|
|
42
|
-
var _a;
|
|
43
|
-
return (_a = cart.appliedGiftCards) === null || _a === void 0 ? void 0 : _a.map((giftCard) => ({
|
|
44
|
-
id: giftCard.id,
|
|
45
|
-
amount: +giftCard.amountUsed.amount,
|
|
46
|
-
name: `Gift Card - ${giftCard.lastCharacters}`,
|
|
47
|
-
}));
|
|
48
|
-
};
|
|
49
|
-
const getSalesAmount = (cart) => {
|
|
50
|
-
var _a;
|
|
51
|
-
return (_a = cart.items) === null || _a === void 0 ? void 0 : _a.reduce((acc, item) => {
|
|
52
|
-
var _a, _b, _c, _d;
|
|
53
|
-
const compareAtPrice = +(((_b = (_a = item.variantDetails) === null || _a === void 0 ? void 0 : _a.compareAtPrice) === null || _b === void 0 ? void 0 : _b.amount) || 0);
|
|
54
|
-
const price = +(((_d = (_c = item.variantDetails) === null || _c === void 0 ? void 0 : _c.price) === null || _d === void 0 ? void 0 : _d.amount) || 0);
|
|
55
|
-
const quantity = item.quantity || 1;
|
|
56
|
-
if (compareAtPrice && compareAtPrice > price) {
|
|
57
|
-
return acc + (compareAtPrice - price) * quantity;
|
|
58
|
-
}
|
|
59
|
-
return acc;
|
|
60
|
-
}, 0);
|
|
61
|
-
};
|
|
62
|
-
const getLineItemDiscounts = (cart) => {
|
|
63
|
-
var _a, _b;
|
|
64
|
-
const discountMap = (_a = cart.items) === null || _a === void 0 ? void 0 : _a.reduce((acc, item) => {
|
|
65
|
-
var _a;
|
|
66
|
-
(_a = item === null || item === void 0 ? void 0 : item.discounts) === null || _a === void 0 ? void 0 : _a.forEach((discount) => {
|
|
67
|
-
const code = discount === null || discount === void 0 ? void 0 : discount.code;
|
|
68
|
-
if (!code)
|
|
69
|
-
return;
|
|
70
|
-
if (!acc[code]) {
|
|
71
|
-
acc[code] = { amount: 0, type: discount.type };
|
|
72
|
-
}
|
|
73
|
-
acc[code].amount += discount.amount;
|
|
74
|
-
});
|
|
75
|
-
return acc;
|
|
76
|
-
}, {});
|
|
77
|
-
if (!discountMap)
|
|
78
|
-
return [];
|
|
79
|
-
return (_b = Object.entries(discountMap)) === null || _b === void 0 ? void 0 : _b.map(([code, { amount, type }]) => ({
|
|
80
|
-
id: code,
|
|
81
|
-
name: `Discount - ${code}`,
|
|
82
|
-
amount,
|
|
83
|
-
type,
|
|
84
|
-
})).filter((discount) => cart.discounts.includes(discount.id));
|
|
85
|
-
};
|
|
86
|
-
const getDiscountsTotalAmount = (orderAndLineItemDiscounts) => {
|
|
87
|
-
return orderAndLineItemDiscounts === null || orderAndLineItemDiscounts === void 0 ? void 0 : orderAndLineItemDiscounts.reduce((acc, discount) => acc + +discount.amount, 0);
|
|
88
|
-
};
|
|
89
|
-
const getGiftCardsTotalAmount = (appliedGiftCards) => {
|
|
90
|
-
return appliedGiftCards === null || appliedGiftCards === void 0 ? void 0 : appliedGiftCards.reduce((acc, giftCard) => acc + +giftCard.amount, 0);
|
|
91
|
-
};
|
|
92
|
-
const getTotalCompareAtPrice = (cart) => {
|
|
93
|
-
var _a;
|
|
94
|
-
return (_a = cart.items) === null || _a === void 0 ? void 0 : _a.reduce((acc, item) => {
|
|
95
|
-
var _a, _b, _c, _d;
|
|
96
|
-
const compareAtPrice = ((_b = (_a = item.variantDetails) === null || _a === void 0 ? void 0 : _a.compareAtPrice) === null || _b === void 0 ? void 0 : _b.amount) ||
|
|
97
|
-
((_d = (_c = item.variantDetails) === null || _c === void 0 ? void 0 : _c.price) === null || _d === void 0 ? void 0 : _d.amount);
|
|
98
|
-
const quantity = item.quantity || 1;
|
|
99
|
-
return acc + +(compareAtPrice || 0) * quantity;
|
|
100
|
-
}, 0);
|
|
101
|
-
};
|
|
102
|
-
const getTotalDiscountedPrice = (totalCompareAtPrice, discountsTotalAmount, salesAmount, giftCardsTotalAmount) => {
|
|
103
|
-
const total = (totalCompareAtPrice === undefined || isNaN(totalCompareAtPrice)
|
|
104
|
-
? 0
|
|
105
|
-
: totalCompareAtPrice) -
|
|
106
|
-
(discountsTotalAmount === undefined || isNaN(discountsTotalAmount)
|
|
107
|
-
? 0
|
|
108
|
-
: discountsTotalAmount) -
|
|
109
|
-
(salesAmount === undefined || isNaN(salesAmount) ? 0 : salesAmount) -
|
|
110
|
-
(giftCardsTotalAmount === undefined || isNaN(giftCardsTotalAmount)
|
|
111
|
-
? 0
|
|
112
|
-
: giftCardsTotalAmount);
|
|
113
|
-
return isNaN(total) ? 0 : total;
|
|
114
|
-
};
|
|
115
|
-
export const DEFAULT_CALCULATED_DATA = {
|
|
116
|
-
orderAndLineItemDiscounts: [],
|
|
117
|
-
appliedGiftCards: [],
|
|
118
|
-
isFreeShipping: false,
|
|
119
|
-
discountsTotalAmount: 0,
|
|
120
|
-
salesAmount: 0,
|
|
121
|
-
giftCardsTotalAmount: 0,
|
|
122
|
-
totalCompareAtPrice: 0,
|
|
123
|
-
totalDiscountedPrice: 0,
|
|
124
|
-
};
|
|
125
|
-
export const getData = (cart) => {
|
|
126
|
-
const orderAndLineItemDiscounts = getOrderLevelDiscounts(cart).concat(getLineItemDiscounts(cart));
|
|
127
|
-
const appliedGiftCards = getAppliedGiftCards(cart);
|
|
128
|
-
const isFreeShipping = getShippingDiscounts(cart).length > 0;
|
|
129
|
-
const discountsTotalAmount = getDiscountsTotalAmount(orderAndLineItemDiscounts);
|
|
130
|
-
const giftCardsTotalAmount = getGiftCardsTotalAmount(appliedGiftCards);
|
|
131
|
-
const salesAmount = getSalesAmount(cart);
|
|
132
|
-
const totalCompareAtPrice = getTotalCompareAtPrice(cart);
|
|
133
|
-
const totalDiscountedPrice = getTotalDiscountedPrice(totalCompareAtPrice, discountsTotalAmount, salesAmount, giftCardsTotalAmount);
|
|
134
|
-
return {
|
|
135
|
-
orderAndLineItemDiscounts,
|
|
136
|
-
appliedGiftCards,
|
|
137
|
-
isFreeShipping,
|
|
138
|
-
discountsTotalAmount,
|
|
139
|
-
giftCardsTotalAmount,
|
|
140
|
-
salesAmount,
|
|
141
|
-
totalCompareAtPrice,
|
|
142
|
-
totalDiscountedPrice,
|
|
143
|
-
};
|
|
144
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculated-cart-values.util.test.d.ts","sourceRoot":"","sources":["../../../../components/libs/cart/calculated-cart-values.util.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { getData } from "./calculated-cart-values.util";
|
|
2
|
-
import { DiscountApplicationTargetType } from "app-studio-types";
|
|
3
|
-
const baseCartData = {
|
|
4
|
-
id: "cart123",
|
|
5
|
-
subtotal: 100.0,
|
|
6
|
-
currency: "USD",
|
|
7
|
-
discounts: [],
|
|
8
|
-
attributes: [],
|
|
9
|
-
note: "",
|
|
10
|
-
items: [],
|
|
11
|
-
discountAllocations: [],
|
|
12
|
-
appliedGiftCards: [],
|
|
13
|
-
delivery: {
|
|
14
|
-
addresses: [],
|
|
15
|
-
},
|
|
16
|
-
deliveryGroups: [],
|
|
17
|
-
cost: {
|
|
18
|
-
subtotalAmount: { amount: "0", currencyCode: "" },
|
|
19
|
-
totalAmount: { amount: "0", currencyCode: "" },
|
|
20
|
-
totalTaxAmount: { amount: "0", currencyCode: "" },
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
describe("cart-provider.util", () => {
|
|
24
|
-
describe("getData", () => {
|
|
25
|
-
it("should calculate order level discounts correctly", () => {
|
|
26
|
-
const mockCart = Object.assign(Object.assign({}, baseCartData), { discounts: ["DISCOUNT10"], items: [], discountAllocations: [
|
|
27
|
-
{
|
|
28
|
-
targetType: DiscountApplicationTargetType.LineItem,
|
|
29
|
-
discountedAmount: { amount: "10.00", currencyCode: "USD" },
|
|
30
|
-
code: "DISCOUNT10",
|
|
31
|
-
},
|
|
32
|
-
], appliedGiftCards: [], deliveryGroups: [] });
|
|
33
|
-
const result = getData(mockCart);
|
|
34
|
-
expect(result.orderAndLineItemDiscounts).toHaveLength(1);
|
|
35
|
-
expect(result.orderAndLineItemDiscounts[0]).toEqual({
|
|
36
|
-
id: "DISCOUNT10",
|
|
37
|
-
amount: 10,
|
|
38
|
-
name: "Discount - DISCOUNT10",
|
|
39
|
-
type: "ORDER_LEVEL",
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
it("should calculate gift cards correctly", () => {
|
|
43
|
-
const mockCart = Object.assign(Object.assign({}, baseCartData), { discounts: [], items: [], discountAllocations: [], appliedGiftCards: [
|
|
44
|
-
{
|
|
45
|
-
id: "giftcard1",
|
|
46
|
-
amountUsed: { amount: "25.00", currencyCode: "USD" },
|
|
47
|
-
balance: { amount: "75.00", currencyCode: "USD" },
|
|
48
|
-
lastCharacters: "1234",
|
|
49
|
-
presentmentAmountUsed: { amount: "25.00", currencyCode: "USD" },
|
|
50
|
-
},
|
|
51
|
-
], deliveryGroups: [] });
|
|
52
|
-
const result = getData(mockCart);
|
|
53
|
-
expect(result.appliedGiftCards).toHaveLength(1);
|
|
54
|
-
expect(result.appliedGiftCards[0]).toEqual({
|
|
55
|
-
id: "giftcard1",
|
|
56
|
-
amount: 25,
|
|
57
|
-
name: "Gift Card - 1234",
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
it("should calculate sales amount correctly", () => {
|
|
61
|
-
const mockCart = Object.assign(Object.assign({}, baseCartData), { discounts: [], items: [
|
|
62
|
-
{
|
|
63
|
-
id: "line1",
|
|
64
|
-
quantity: 2,
|
|
65
|
-
productId: "prod1",
|
|
66
|
-
variantId: "var1",
|
|
67
|
-
productDetails: {},
|
|
68
|
-
variantDetails: {
|
|
69
|
-
compareAtPrice: { amount: "20.00", currencyCode: "USD" },
|
|
70
|
-
price: { amount: "15.00", currencyCode: "USD" },
|
|
71
|
-
},
|
|
72
|
-
discounts: [],
|
|
73
|
-
cost: { totalAmount: { amount: "30.00", currencyCode: "USD" } },
|
|
74
|
-
},
|
|
75
|
-
], discountAllocations: [], appliedGiftCards: [], deliveryGroups: [] });
|
|
76
|
-
const result = getData(mockCart);
|
|
77
|
-
expect(result.salesAmount).toBe(10); // (20-15) * 2
|
|
78
|
-
});
|
|
79
|
-
it("should detect free shipping", () => {
|
|
80
|
-
const mockCart = Object.assign(Object.assign({}, baseCartData), { discounts: [], items: [], discountAllocations: [
|
|
81
|
-
{
|
|
82
|
-
targetType: DiscountApplicationTargetType.ShippingLine,
|
|
83
|
-
discountedAmount: { amount: "5.00", currencyCode: "USD" },
|
|
84
|
-
code: "FREESHIP",
|
|
85
|
-
},
|
|
86
|
-
], appliedGiftCards: [], deliveryGroups: [] });
|
|
87
|
-
const result = getData(mockCart);
|
|
88
|
-
expect(result.isFreeShipping).toBe(true);
|
|
89
|
-
});
|
|
90
|
-
it("should calculate total discounted price correctly", () => {
|
|
91
|
-
const mockCart = Object.assign(Object.assign({}, baseCartData), { discounts: ["DISCOUNT10"], items: [
|
|
92
|
-
{
|
|
93
|
-
id: "line1",
|
|
94
|
-
quantity: 1,
|
|
95
|
-
productId: "prod1",
|
|
96
|
-
variantId: "var1",
|
|
97
|
-
productDetails: {},
|
|
98
|
-
variantDetails: {
|
|
99
|
-
compareAtPrice: { amount: "100.00", currencyCode: "USD" },
|
|
100
|
-
price: { amount: "80.00", currencyCode: "USD" },
|
|
101
|
-
},
|
|
102
|
-
discounts: [
|
|
103
|
-
{
|
|
104
|
-
amount: 10,
|
|
105
|
-
type: "LINE_ITEM",
|
|
106
|
-
code: "DISCOUNT10",
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
cost: { totalAmount: { amount: "80.00", currencyCode: "USD" } },
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
id: "line2",
|
|
113
|
-
quantity: 1,
|
|
114
|
-
productId: "prod2",
|
|
115
|
-
variantId: "var2",
|
|
116
|
-
productDetails: {},
|
|
117
|
-
variantDetails: {
|
|
118
|
-
compareAtPrice: { amount: "100.00", currencyCode: "USD" },
|
|
119
|
-
price: { amount: "80.00", currencyCode: "USD" },
|
|
120
|
-
},
|
|
121
|
-
discounts: [
|
|
122
|
-
{
|
|
123
|
-
amount: 10,
|
|
124
|
-
type: "LINE_ITEM",
|
|
125
|
-
code: "DISCOUNT10",
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
cost: { totalAmount: { amount: "80.00", currencyCode: "USD" } },
|
|
129
|
-
},
|
|
130
|
-
], discountAllocations: [
|
|
131
|
-
{
|
|
132
|
-
targetType: DiscountApplicationTargetType.LineItem,
|
|
133
|
-
discountedAmount: { amount: "10.00", currencyCode: "USD" },
|
|
134
|
-
code: "DISCOUNT10",
|
|
135
|
-
},
|
|
136
|
-
], appliedGiftCards: [
|
|
137
|
-
{
|
|
138
|
-
id: "giftcard1",
|
|
139
|
-
amountUsed: { amount: "5.00", currencyCode: "USD" },
|
|
140
|
-
balance: { amount: "95.00", currencyCode: "USD" },
|
|
141
|
-
lastCharacters: "1234",
|
|
142
|
-
presentmentAmountUsed: { amount: "5.00", currencyCode: "USD" },
|
|
143
|
-
},
|
|
144
|
-
], deliveryGroups: [] });
|
|
145
|
-
const result = getData(mockCart);
|
|
146
|
-
// 100 (compare) - 10 (discount) - 20 (sale) - 5 (gift card) = 65
|
|
147
|
-
expect(result.totalDiscountedPrice).toBe(125);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=calculatedCartValues.util.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculatedCartValues.util.d.ts","sourceRoot":"","sources":["../../../../components/libs/cart/calculatedCartValues.util.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=cart.util%20copy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cart.util copy.d.ts","sourceRoot":"","sources":["../../lib/cart.util copy.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|