Skip to content

Commit fcd7289

Browse files
committed
refactor: show discount percentage data from back
1 parent bc67872 commit fcd7289

File tree

9 files changed

+104
-63
lines changed

9 files changed

+104
-63
lines changed

src/app/[locale]/(main)/(container)/cart/page.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,16 @@ const Page = () => {
238238
}}
239239
/>
240240
)}
241+
{!isOutOfStock && (
242+
<PriceLabel
243+
value={_item.total}
244+
TypographyProps={{
245+
sx: {
246+
fontWeight: 600,
247+
},
248+
}}
249+
/>
250+
)}
241251
</Stack>
242252
{!isLast && <Divider />}
243253
</Stack>

src/app/[locale]/(main)/(container)/products/[...params]/components/BuyBox.tsx

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
'use client';
22

33
import { useProductContext } from '@/app/[locale]/(main)/(container)/products/[...params]/hooks/useProductContext';
4-
import { Variations } from '@/app/[locale]/(main)/(container)/products/types/common';
54
import CartItemController from '@/components/CartItemController/CartItemController';
65
import useNewDialog from '@/components/Dialog/hooks/useNewDialog';
76
import ButtonWithLoading from '@/components/common/ButtonWithLoading';
87
import { getFragmentData } from '@/graphql/types';
98
import {
9+
GetSingleProductQuery,
1010
ProductVariationContentSliceFragmentDoc,
1111
StockStatusEnum,
1212
} from '@/graphql/types/graphql';
@@ -48,34 +48,26 @@ const listItems = [
4848
];
4949

5050
export interface BuyBoxProps {
51-
variations: Variations;
52-
stockStatus: StockStatusEnum | null | undefined;
51+
product: Extract<
52+
NonNullable<GetSingleProductQuery['product']>,
53+
{ __typename?: 'VariableProduct' }
54+
>;
5355
}
5456

55-
const BuyBox: FC<BuyBoxProps> = ({ variations, stockStatus }) => {
57+
const BuyBox: FC<BuyBoxProps> = ({ product }) => {
5658
const { params } = useParams();
5759

5860
const { isMobile } = useAppContext();
5961
const t = useTranslations();
6062

6163
const { selectedVariantId } = useProductContext();
6264

63-
const sortBySalePriceVariations = variations?.nodes.sort((a, b) => {
64-
const first = getFragmentData(ProductVariationContentSliceFragmentDoc, a);
65-
const second = getFragmentData(ProductVariationContentSliceFragmentDoc, b);
66-
67-
return (
68-
(extractNumbers(first?.salePrice) ?? 0) -
69-
(extractNumbers(second?.salePrice) ?? 0)
70-
);
71-
});
72-
7365
const _variant = useMemo(() => {
7466
if (!selectedVariantId) {
75-
return sortBySalePriceVariations?.[0];
67+
return null;
7668
}
7769

78-
return variations?.nodes.find((item) => {
70+
return product.variations?.nodes.find((item) => {
7971
const fragment = getFragmentData(
8072
ProductVariationContentSliceFragmentDoc,
8173
item,
@@ -119,7 +111,11 @@ const BuyBox: FC<BuyBoxProps> = ({ variations, stockStatus }) => {
119111

120112
const height = 55;
121113

122-
const outOfStock = stockStatus === StockStatusEnum.OutOfStock;
114+
const isOutOfStock = product.stockStatus === StockStatusEnum.OutOfStock;
115+
116+
const discountPercentage =
117+
(variant === null && product?.discountPercentage) ||
118+
(variant !== null && variant?.discountPercentage);
123119

124120
return (
125121
<>
@@ -129,7 +125,7 @@ const BuyBox: FC<BuyBoxProps> = ({ variations, stockStatus }) => {
129125
value={variant!}
130126
/>
131127

132-
{outOfStock ? (
128+
{isOutOfStock ? (
133129
<Typography
134130
color="error"
135131
variant="h6"
@@ -192,16 +188,24 @@ const BuyBox: FC<BuyBoxProps> = ({ variations, stockStatus }) => {
192188
gap: 0.5,
193189
}}
194190
>
195-
{variant?.price !== variant?.regularPrice && (
191+
{!!discountPercentage && (
196192
<>
197193
<OldPrice
198-
value={variant?.regularPrice}
194+
value={
195+
variant ? variant?.regularPrice : product.regularPrice
196+
}
199197
TypographyProps={{
200198
variant: 'body1',
201199
}}
202200
/>
203201

204-
<DiscountPercentage value={profitMarginPercentage} />
202+
<DiscountPercentage
203+
value={
204+
variant
205+
? variant.discountPercentage
206+
: product.discountPercentage
207+
}
208+
/>
205209
</>
206210
)}
207211
</Box>
@@ -210,7 +214,7 @@ const BuyBox: FC<BuyBoxProps> = ({ variations, stockStatus }) => {
210214
variant: 'h6',
211215
fontWeight: 600,
212216
}}
213-
value={variant?.salePrice}
217+
value={variant ? variant.price : product.price}
214218
/>
215219
</Box>
216220

src/app/[locale]/(main)/(container)/products/[...params]/page.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,7 @@ const Page: FC<PageProps> = async ({ params: { params } }) => {
9999
<Grid item md={3} xs={12}>
100100
<Card variant="outlined">
101101
<CardContent>
102-
<BuyBox
103-
stockStatus={product.stockStatus}
104-
variations={product.variations}
105-
/>
102+
<BuyBox product={product} />
106103
</CardContent>
107104
</Card>
108105
</Grid>

src/components/VariableProductItem/VariableProductItem.tsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,16 @@
22

33
import { Box, Card, CardContent, Typography } from '@mui/material';
44

5+
import { StockStatusEnum } from '@/graphql/types/graphql';
56
import { useAppContext } from '@/hooks/useAppContext';
6-
import {
7-
extractNumbers,
8-
getMinOfRangePrice,
9-
getProfitPercentage,
10-
} from '@/utils/price';
117
import { Link as NextLink } from '@/navigation';
8+
import Image from 'next/image';
129
import { FC } from 'react';
1310
import DiscountPercentage from '../common/DiscountPercentage';
14-
import Image from 'next/image';
1511
import OldPrice from '../common/OldPrice';
12+
import OutOfStock from '../common/OutOfStock';
1613
import PriceLabel from '../common/PriceLabel';
1714
import { VariableProduct } from './types';
18-
import { StockStatusEnum } from '@/graphql/types/graphql';
19-
import OutOfStock from '../common/OutOfStock';
2015

2116
export interface ProductItemProps {
2217
data: VariableProduct;
@@ -25,11 +20,6 @@ export interface ProductItemProps {
2520
const VariableProductItem: FC<ProductItemProps> = ({ data }) => {
2621
const { isMobile, variantImageSize } = useAppContext();
2722

28-
const profitMarginPercentage = getProfitPercentage(
29-
extractNumbers(getMinOfRangePrice(data.price)),
30-
extractNumbers(data.regularPrice),
31-
);
32-
3323
const outOfStock = data.stockStatus === StockStatusEnum.OutOfStock;
3424

3525
return (
@@ -102,7 +92,7 @@ const VariableProductItem: FC<ProductItemProps> = ({ data }) => {
10292
) : (
10393
<>
10494
{data.onSale && (
105-
<DiscountPercentage value={profitMarginPercentage} />
95+
<DiscountPercentage value={data.discountPercentage ?? 0} />
10696
)}
10797

10898
<Box>

src/components/common/DiscountPercentage.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1-
"use client";
2-
import { Chip } from "@mui/material";
3-
import React, { FC } from "react";
1+
'use client';
2+
import { Chip } from '@mui/material';
3+
import React, { FC } from 'react';
44

55
export interface DiscountPercentageProps {
6-
value: number;
6+
value?: number | null;
77
}
88

99
const DiscountPercentage: FC<DiscountPercentageProps> = ({ value }) => {
10+
if (!value) {
11+
return null;
12+
}
1013
return (
1114
<Chip
1215
size="small"
1316
color="error"
14-
label={`${value}%`}
17+
label={`${Math.floor(value)}%`}
1518
sx={{
1619
fontWeight: 600,
1720
fontSize: (theme) => theme.typography.caption.fontSize,

src/graphql/queries/cart.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ export const ProductVariationContentSlice = gql`
5555
price
5656
regularPrice
5757
salePrice
58+
discountAmount
59+
discountPercentage
5860
stockStatus
5961
}
6062
`;

src/graphql/queries/products.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ export const GET_VARIABLE_PRODUCTS_QUERY = gql`
4242
regularPrice
4343
salePrice
4444
stockStatus
45+
discountAmount
46+
discountPercentage
4547
}
4648
}
4749
}
@@ -94,6 +96,11 @@ export const GET_SINGLE_VARIABLE_PRODUCT_QUERY = gql`
9496
stockStatus
9597
slug
9698
averageRating
99+
price
100+
regularPrice
101+
salePrice
102+
discountPercentage
103+
discountAmount
97104
variations(where: { stockStatus: IN_STOCK }) {
98105
nodes {
99106
...ProductVariationContentSlice

0 commit comments

Comments
 (0)