1
+ import { useMoney as parseMoney } from "@shopify/hydrogen" ;
1
2
import type { MoneyV2 } from "@shopify/hydrogen/storefront-api-types" ;
2
3
import { useThemeSettings } from "@weaverse/hydrogen" ;
3
4
import { clsx } from "clsx" ;
@@ -33,8 +34,8 @@ export function NewBadge({
33
34
publishedAt,
34
35
className,
35
36
} : { publishedAt : string ; className ?: string } ) {
36
- let { newBadgeText, newBadgeColor } = useThemeSettings ( ) ;
37
- if ( isNewArrival ( publishedAt ) ) {
37
+ let { newBadgeText, newBadgeColor, newBadgeDaysOld } = useThemeSettings ( ) ;
38
+ if ( isNewArrival ( publishedAt , newBadgeDaysOld ) ) {
38
39
return (
39
40
< Badge
40
41
text = { newBadgeText }
@@ -73,16 +74,16 @@ export function SaleBadge({
73
74
compareAtPrice,
74
75
className,
75
76
} : { price : MoneyV2 ; compareAtPrice : MoneyV2 ; className ?: string } ) {
76
- let { saleBadgeContent, saleBadgeText, saleBadgeColor } = useThemeSettings ( ) ;
77
- let discount = calculateSalePercentage ( price , compareAtPrice ) ;
78
- if ( discount > 0 ) {
77
+ let { saleBadgeText = "Sale" , saleBadgeColor } = useThemeSettings ( ) ;
78
+ let { amount, percentage } = calculateDiscount ( price , compareAtPrice ) ;
79
+ let text = saleBadgeText
80
+ . replace ( "[amount]" , amount . toString ( ) )
81
+ . replace ( "[percentage]" , percentage . toString ( ) ) ;
82
+
83
+ if ( percentage > 0 ) {
79
84
return (
80
85
< Badge
81
- text = {
82
- saleBadgeContent === "percentage"
83
- ? `-${ discount } % Off`
84
- : saleBadgeText
85
- }
86
+ text = { text }
86
87
backgroundColor = { saleBadgeColor }
87
88
className = { className }
88
89
/>
@@ -98,15 +99,21 @@ function isNewArrival(date: string, daysOld = 30) {
98
99
) ;
99
100
}
100
101
101
- function calculateSalePercentage ( price : MoneyV2 , compareAtPrice : MoneyV2 ) {
102
+ function calculateDiscount ( price : MoneyV2 , compareAtPrice : MoneyV2 ) {
102
103
if ( price ?. amount && compareAtPrice ?. amount ) {
103
104
let priceNumber = Number ( price . amount ) ;
104
105
let compareAtPriceNumber = Number ( compareAtPrice . amount ) ;
105
106
if ( compareAtPriceNumber > priceNumber ) {
106
- return Math . round (
107
- ( ( compareAtPriceNumber - priceNumber ) / compareAtPriceNumber ) * 100 ,
108
- ) ;
107
+ return {
108
+ amount : parseMoney ( {
109
+ amount : String ( compareAtPriceNumber - priceNumber ) ,
110
+ currencyCode : price . currencyCode ,
111
+ } ) . withoutTrailingZeros ,
112
+ percentage : Math . round (
113
+ ( ( compareAtPriceNumber - priceNumber ) / compareAtPriceNumber ) * 100 ,
114
+ ) ,
115
+ } ;
109
116
}
110
117
}
111
- return 0 ;
118
+ return { amount : "0" , percentage : 0 } ;
112
119
}
0 commit comments