Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
e38bc4c
feat: dashboard card code type 추가
lee0jae330 Feb 12, 2026
ce16b2f
chore: 대시보드 편집 카드 추가, 삭제 버튼 shadcn button으로 교체
lee0jae330 Feb 12, 2026
b01ffa8
feat: dashboard metric card 상수 변경 및 관련 타입 제너릭 정의
lee0jae330 Feb 13, 2026
95cb8dc
feat: 특정 section의 카드 type 추출 함수 추가
lee0jae330 Feb 13, 2026
6709840
feat: 지표 방향성 관련 상수 추가
lee0jae330 Feb 13, 2026
9223f5b
feat: edit card wrapper inner class 추가
lee0jae330 Feb 13, 2026
59bce54
feat: 미니뷰 metricCardCode 타입 가드 추가
lee0jae330 Feb 13, 2026
14059ca
feat: 매출 현황 관련 카드 content 공통 컴포넌트 추가
lee0jae330 Feb 13, 2026
57d2bfc
feat: 각 지표 방향성을 반환하는 함수 추가
lee0jae330 Feb 13, 2026
ba4ab76
feat: interface의 모든 속성을 nullable하게 만드는 유틸 타입 추가
lee0jae330 Feb 13, 2026
1c708d6
feat: 매출현황 관련 dto 추가
lee0jae330 Feb 13, 2026
4565f8f
feat: 매출현황 - 실매출 카드 컨텐트 추가
lee0jae330 Feb 13, 2026
de5b24f
feat: 카드 편집패널에 실매출 카드 임시로 추가
lee0jae330 Feb 13, 2026
cd1eba4
feat: 매출 관련 단위 상수 정의
lee0jae330 Feb 14, 2026
3d6f7ff
feat: 실매출 관련 상수 정의
lee0jae330 Feb 14, 2026
baf029c
chore: 지표 경향성 계산 관련 유틸 메서드 args interface 분리
lee0jae330 Feb 14, 2026
ff516c0
feat: 지표 관련 비교 message 반환함수 추가
lee0jae330 Feb 14, 2026
cb456d8
feat: 매출현황에 변화율이 없는 경우에 대한 조건부 렌더링 추가
lee0jae330 Feb 14, 2026
4c6d274
feat: 실매출 관련 카드 content 추가
lee0jae330 Feb 14, 2026
77b4284
feat: 불필요한 값 제거
lee0jae330 Feb 14, 2026
b779b49
feat: 변동성이 없는 경우에 대한 image asset 추가
lee0jae330 Feb 14, 2026
94a6abf
feat: 매출 지표 주문 관련 상수 추가
lee0jae330 Feb 14, 2026
e8ed673
chore: 매출 지표 주문건수 dto명 수정
lee0jae330 Feb 14, 2026
aa06e10
feat: 지표에 변동성이 없는 경우, 변동성 없음에 대한 이미지 추가
lee0jae330 Feb 14, 2026
94c165f
feat: 주문 건수 관련 카드 content 추가
lee0jae330 Feb 14, 2026
0e196de
chore: 상수 위치 수정
lee0jae330 Feb 14, 2026
15f792c
fix: 이맘때쯤이 2번 나오는 문제 해결
lee0jae330 Feb 14, 2026
ff4bf99
chore: ooCardContent에서 ooContent로 네이밍 수정
lee0jae330 Feb 14, 2026
9eaddc0
feat: 주문건수 지표 카드 content 추가
lee0jae330 Feb 14, 2026
532c129
style: 여백 제거
lee0jae330 Feb 14, 2026
29d04de
chore: 숫자에 포메팅 추가
lee0jae330 Feb 14, 2026
5ee98bb
feat: 최대 최소가 0인 경우 추가
lee0jae330 Feb 14, 2026
f280f52
feat: 주문 평균가 관련 상수 추가
lee0jae330 Feb 14, 2026
0ff9087
feat: 매출 유입 구조 관련 DTO 추가
lee0jae330 Feb 14, 2026
9e014a4
refactor: 매출 현황 비교 텍스트 관련 유틸함수 네이밍 명확하게 변경
lee0jae330 Feb 14, 2026
5fe6ea2
refactor: dashboard 도메인에서 sales 도메인으로 이동
lee0jae330 Feb 14, 2026
44e91f1
refactor: switch case fall through 및 assertNever를 통한 에러 처리 추가
lee0jae330 Feb 14, 2026
598a507
fix: period context provider 외부에서도 접근한 문제 해결
lee0jae330 Feb 14, 2026
e7a0eed
feat: sales 타입 가드 추가
lee0jae330 Feb 14, 2026
6aea463
feat: 매출 유입 구조 관련 카드 content 추가
lee0jae330 Feb 14, 2026
2fb6c0d
feat: 판매유형별 매출 content 추가
lee0jae330 Feb 14, 2026
7f2eeea
feat: 매출 유입 구조 관련 브리핑 message 반환 함수 추가
lee0jae330 Feb 14, 2026
f806c7d
feat: dto 배럴파일 추가
lee0jae330 Feb 14, 2026
23d474c
feat: 판매유형별 매출 관련 상수 추가
lee0jae330 Feb 14, 2026
1addde0
feat: 주문수단별 매출 추가
lee0jae330 Feb 14, 2026
a9fc9ad
feat: 판매유입구조 도넛 차트 추상화 적용
lee0jae330 Feb 14, 2026
a978d73
feat: 도넛 차트 legend 관련 배럴 파일 추가
lee0jae330 Feb 14, 2026
a27deb2
feat: 주문수단별 매출 content 추가
lee0jae330 Feb 14, 2026
169dc5e
feat: 예시 데이터와 브리핑 text가 일치하도록 변경
lee0jae330 Feb 14, 2026
a6ffbd3
feat: 결제수단별 매출 관련 상수 추가
lee0jae330 Feb 14, 2026
2212eb3
feat: 결제수단별 매출 content 추가
lee0jae330 Feb 14, 2026
7919dc3
feat: 매출 도넛 차트 색상 수정
lee0jae330 Feb 14, 2026
5992cea
feat: 불필요한 변수 제거
lee0jae330 Feb 14, 2026
19490a1
feat: 매출유입구조 top type 정의 및 불필요한 타입 가드 제거
lee0jae330 Feb 15, 2026
1bc71ac
refactor: 대시보드 매출 관련 유틸 함수 도메인 이동
lee0jae330 Feb 15, 2026
b08a266
chore: import 경로 수정
lee0jae330 Feb 15, 2026
b932b7d
refactor: sales 상수 폴더dashboard sub도메인 추가
lee0jae330 Feb 15, 2026
1564ea8
feat: 색상 하이라이트 관련 로직 token 기반으로 통일 진행
lee0jae330 Feb 15, 2026
293e164
feat: lineChart getClientBoundingRect 대신 svg viewbox 높이, 너비를 활용하는 방식으…
lee0jae330 Feb 15, 2026
041077a
refactor: sales 상수 파일 sub domain 세분화 진행
lee0jae330 Feb 15, 2026
8036c58
feat: 매출 패턴 브리핑 메시지 추가
lee0jae330 Feb 15, 2026
4e0c681
feat: 피크타임 line chart 데이터 변환 유틸 함수추가
lee0jae330 Feb 15, 2026
17fee4b
feat: 피크타임 관련 상수 추가
lee0jae330 Feb 15, 2026
a4ffcc7
feat: 피크타임 관련 dto 추가
lee0jae330 Feb 15, 2026
d6fb0ea
feat: 피크타임 card content 추가
lee0jae330 Feb 15, 2026
fca5483
refactor: sales 도메인 util 함수 서브 도메인 세분화 진행
lee0jae330 Feb 15, 2026
cf3879e
feat: 요일별 매출 패턴 dto 추가
lee0jae330 Feb 15, 2026
95bb433
refactor: sales type 서브 도메인 세분화
lee0jae330 Feb 15, 2026
f755040
feat: 요일별 매출 관련 dto 및 type 추가
lee0jae330 Feb 15, 2026
04135fc
feat: 요일별 매출 관련 브리핑 메세지 반환 함수 추가
lee0jae330 Feb 15, 2026
fa1fa44
chore: font-bold 추가
lee0jae330 Feb 15, 2026
6a70fb0
chore: 누락된 브리핑 문구 추가
lee0jae330 Feb 15, 2026
fa327bf
feat: 각 매출분석 대시보드 편집 카드 컴포넌트 추가
lee0jae330 Feb 15, 2026
15d3421
feat: edit card wrapper 사이즈 수정
lee0jae330 Feb 15, 2026
0ddc30a
feat: 요일별 매출 패턴 컴포넌트 임시 커밋
lee0jae330 Feb 15, 2026
256c870
feat: 배럴파일 추가
lee0jae330 Feb 15, 2026
a977350
chore: msw auth refresh 비활성화
lee0jae330 Feb 15, 2026
188996d
feat: Merge branch 'develop' into feature/#194-fe-dashboard-sales-ui
lee0jae330 Feb 15, 2026
c5a1c9f
feat: bar chart 색상 강조 막대를 지정할 수 있도록 변경
lee0jae330 Feb 15, 2026
ffa0371
refactor: 차트 관련 data type 수정
lee0jae330 Feb 15, 2026
16da1e6
feat: 요일별 매출 패턴 관련 상수 정의
lee0jae330 Feb 15, 2026
2af586b
feat: 요일 관련 타입 추가
lee0jae330 Feb 15, 2026
bb900cf
feat: 요일별 매출 패턴 관련 매직넘버 상수 분리
lee0jae330 Feb 15, 2026
fc81eca
feat: 요일별 매출 패턴 card content 추가
lee0jae330 Feb 15, 2026
a04068b
feat: 매출 분석 관련 대시보드 편집 카드 추가 (매출 추이 제외)
lee0jae330 Feb 15, 2026
ee3c325
chore: 배럴 파일 추가
lee0jae330 Feb 15, 2026
34106d8
refactor: 매출분석 카드 props required type으로 변경 및 편집 카드 컴포넌트에서 예시 data를 전달…
lee0jae330 Feb 15, 2026
98f0e74
style: edit card wrapper transform origin 로직 롤백
lee0jae330 Feb 15, 2026
1a5cfdf
chore: shadcn import 경로 수정
lee0jae330 Feb 15, 2026
127ae41
chore: dto 네이밍 오타 수정
lee0jae330 Feb 15, 2026
2a6e257
chore: 파일명 오타수정
lee0jae330 Feb 15, 2026
83d21cc
chore: 조건식 삼항 연산자로 변경
lee0jae330 Feb 15, 2026
247a210
chore: Peaktime -> PeakTime 오타 수정
lee0jae330 Feb 15, 2026
bf4a482
chore: type import 제거
lee0jae330 Feb 15, 2026
65ac399
chore: nullable 타입 삭제
lee0jae330 Feb 15, 2026
b7f3339
chore: git 오류로 인한 커밋
lee0jae330 Feb 15, 2026
f405e8b
chore: 파일명 수정
lee0jae330 Feb 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ import {
} from '@/constants/dashboard';
import { useEditCard } from '@/hooks/dashboard';

import { EditCardContent } from './EditCardContent';

interface CardEditViewCardProps {
cardCode: MetricCardCode;
}

export const CardEditViewCard = ({ cardCode }: CardEditViewCardProps) => {
const { addCard, removeCard, isAdded } = useEditCard();

Expand All @@ -29,7 +32,7 @@ export const CardEditViewCard = ({ cardCode }: CardEditViewCardProps) => {
return null; // 카드 정보가 없는 경우 렌더링하지 않음
}

const { code, label, type, period, sizeX, sizeY } = card;
const { period, sizeX } = card;

return (
<li style={{ gridColumn: `span ${sizeX}` }}>
Expand All @@ -38,17 +41,10 @@ export const CardEditViewCard = ({ cardCode }: CardEditViewCardProps) => {
period={period}
className="min-w-full"
sizeX={sizeX}
sizeY={sizeY}
onClickAddButton={handleAddCard}
onClickDeleteButton={handleDeleteCard}
>
{label}
<br />
{code}
<br />
{type}
<br />
{sizeX} x {sizeY}
<EditCardContent cardCode={cardCode} />
</EditCardWrapper>
</li>
);
Expand Down
157 changes: 157 additions & 0 deletions frontend/src/components/dashboard/dashboard-edit/EditCardContent.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
import {
AveragePriceContent,
OrderCountContent,
OrderMethodContent,
PaymentMethodContent,
PeakTimeContent,
RealSalesContent,
SalesByDayContent,
SalesTypeContent,
} from '@/components/sales';
import type { MetricCardCode } from '@/constants/dashboard';
import {
AVERAGE_PRICE,
ORDER_COUNT,
ORDER_METHOD,
PAYMENT_METHOD,
PEAK_TIME,
REAL_SALES,
SALES_BY_DAY,
SALES_TYPE,
} from '@/constants/sales';

interface EditCardContentProps {
cardCode: MetricCardCode;
}

const {
EXAMPLE_AMOUNT: REAL_SALES_EXAMPLE_AMOUNT,
EXAMPLE_CHANGE_RATE: REAL_SALES_EXAMPLE_CHANGE_RATE,
EXAMPLE_HAS_PREVIOUS_DATA: REAL_SALES_EXAMPLE_HAS_PREVIOUS_DATA,
} = REAL_SALES;
const {
EXAMPLE_AMOUNT: ORDER_COUNT_EXAMPLE_AMOUNT,
EXAMPLE_CHANGE_RATE: ORDER_COUNT_EXAMPLE_CHANGE_RATE,
EXAMPLE_HAS_PREVIOUS_DATA: ORDER_COUNT_EXAMPLE_HAS_PREVIOUS_DATA,
} = ORDER_COUNT;
const {
EXAMPLE_AMOUNT: AVERAGE_PRICE_EXAMPLE_AMOUNT,
EXAMPLE_COMPARISON_AMOUNT: AVERAGE_PRICE_EXAMPLE_COMPARISON_AMOUNT,
EXAMPLE_HAS_PREVIOUS_DATA: AVERAGE_PRICE_EXAMPLE_HAS_PREVIOUS_DATA,
} = AVERAGE_PRICE;
const {
EXAMPLE_TOP_TYPE: SALES_TYPE_EXAMPLE_TOP_TYPE,
EXAMPLE_TOP_SHARE: SALES_TYPE_EXAMPLE_TOP_SHARE,
EXAMPLE_DELTA_SHARE: SALES_TYPE_EXAMPLE_DELTA_SHARE,
EXAMPLE_SALES_SOURCE_DATA: SALES_TYPE_EXAMPLE_SALES_SOURCE_DATA,
} = SALES_TYPE;
const {
EXAMPLE_TOP_TYPE: ORDER_METHOD_EXAMPLE_TOP_TYPE,
EXAMPLE_TOP_SHARE: ORDER_METHOD_EXAMPLE_TOP_SHARE,
EXAMPLE_DELTA_SHARE: ORDER_METHOD_EXAMPLE_DELTA_SHARE,
EXAMPLE_ORDER_METHOD_DATA: ORDER_METHOD_EXAMPLE_ORDER_METHOD_DATA,
} = ORDER_METHOD;
const {
EXAMPLE_TOP_TYPE: PAYMENT_METHOD_EXAMPLE_TOP_TYPE,
EXAMPLE_TOP_SHARE: PAYMENT_METHOD_EXAMPLE_TOP_SHARE,
EXAMPLE_DELTA_SHARE: PAYMENT_METHOD_EXAMPLE_DELTA_SHARE,
EXAMPLE_PAYMENT_METHOD_DATA: PAYMENT_METHOD_EXAMPLE_PAYMENT_METHOD_DATA,
} = PAYMENT_METHOD;
const { EXAMPLE_DATA: PEAK_TIME_EXAMPLE_DATA } = PEAK_TIME;
const {
EXAMPLE_DATA: SALES_BY_DAY_EXAMPLE_DATA,
EXAMPLE_TOP_DAY: SALES_BY_DAY_EXAMPLE_TOP_DAY,
EXAMPLE_IS_SIGNIFICANT: SALES_BY_DAY_EXAMPLE_IS_SIGNIFICANT,
} = SALES_BY_DAY;

export const EditCardContent = ({ cardCode }: EditCardContentProps) => {
switch (cardCode) {
case 'SLS_01_01':
case 'SLS_01_02':
case 'SLS_01_03':
return (
<RealSalesContent
cardCode={cardCode}
netAmount={REAL_SALES_EXAMPLE_AMOUNT}
changeRate={REAL_SALES_EXAMPLE_CHANGE_RATE}
hasPreviousData={REAL_SALES_EXAMPLE_HAS_PREVIOUS_DATA}
/>
);
case 'SLS_02_01':
case 'SLS_02_02':
case 'SLS_02_03':
return (
<OrderCountContent
cardCode={cardCode}
orderCount={ORDER_COUNT_EXAMPLE_AMOUNT}
changeRate={ORDER_COUNT_EXAMPLE_CHANGE_RATE}
hasPreviousData={ORDER_COUNT_EXAMPLE_HAS_PREVIOUS_DATA}
/>
);
case 'SLS_03_01':
case 'SLS_03_02':
case 'SLS_03_03':
return (
<AveragePriceContent
cardCode={cardCode}
averageOrderAmount={AVERAGE_PRICE_EXAMPLE_AMOUNT}
differenceAmount={AVERAGE_PRICE_EXAMPLE_COMPARISON_AMOUNT}
hasPreviousData={AVERAGE_PRICE_EXAMPLE_HAS_PREVIOUS_DATA}
/>
);
case 'SLS_06_01':
case 'SLS_06_02':
case 'SLS_06_03':
return (
<SalesTypeContent
cardCode={cardCode}
insight={{
topType: SALES_TYPE_EXAMPLE_TOP_TYPE,
topShare: SALES_TYPE_EXAMPLE_TOP_SHARE,
deltaShare: SALES_TYPE_EXAMPLE_DELTA_SHARE,
}}
items={SALES_TYPE_EXAMPLE_SALES_SOURCE_DATA}
/>
);
case 'SLS_07_01':
case 'SLS_07_02':
case 'SLS_07_03':
return (
<OrderMethodContent
cardCode={cardCode}
insight={{
topType: ORDER_METHOD_EXAMPLE_TOP_TYPE,
topShare: ORDER_METHOD_EXAMPLE_TOP_SHARE,
deltaShare: ORDER_METHOD_EXAMPLE_DELTA_SHARE,
}}
items={ORDER_METHOD_EXAMPLE_ORDER_METHOD_DATA}
/>
);
case 'SLS_08_01':
case 'SLS_08_02':
case 'SLS_08_03':
return (
<PaymentMethodContent
cardCode={cardCode}
insight={{
topType: PAYMENT_METHOD_EXAMPLE_TOP_TYPE,
topShare: PAYMENT_METHOD_EXAMPLE_TOP_SHARE,
deltaShare: PAYMENT_METHOD_EXAMPLE_DELTA_SHARE,
}}
items={PAYMENT_METHOD_EXAMPLE_PAYMENT_METHOD_DATA}
/>
);
case 'SLS_13_01':
return <PeakTimeContent peakTimeData={PEAK_TIME_EXAMPLE_DATA} />;
case 'SLS_14_06':
return (
<SalesByDayContent
salesByDayItems={SALES_BY_DAY_EXAMPLE_DATA}
topDay={SALES_BY_DAY_EXAMPLE_TOP_DAY}
isSignificant={SALES_BY_DAY_EXAMPLE_IS_SIGNIFICANT}
/>
);
default:
return null;
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import {
DASHBOARD_METRIC_CARDS,
DASHBOARD_METRICS,
type ExtractCardCodes,
} from '@/constants/dashboard';
import { AVERAGE_PRICE, SALES_UNIT } from '@/constants/sales';
import type { GetAveragePriceResponseDto } from '@/types/sales';
import { getMetricTrend } from '@/utils/dashboard';
import { getSalesCurrentComparisonMessage } from '@/utils/sales';

import { CurrentSalesContent } from './CurrentSalesContent';

const {
EXAMPLE_AMOUNT,
EXAMPLE_COMPARISON_AMOUNT,
EXAMPLE_HAS_PREVIOUS_DATA,
MIN_CHANGE_RATE,
MAX_CHANGE_RATE,
METRIC_LABEL,
} = AVERAGE_PRICE;

type AveragePriceCardCodes = ExtractCardCodes<
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[p5] 타입 내러잉 좋습니다! 상세분석 컴포넌트들도 리팩터링이 ,, 필요하겠군요

typeof DASHBOARD_METRICS.SALES.sections.CURRENT_SALES.items.AVERAGE_PRICE
>;

interface AveragePriceContentProps extends GetAveragePriceResponseDto {
cardCode: AveragePriceCardCodes;
className?: string;
}

export const AveragePriceContent = ({
cardCode,
averageOrderAmount = EXAMPLE_AMOUNT,
differenceAmount = EXAMPLE_COMPARISON_AMOUNT,
hasPreviousData = EXAMPLE_HAS_PREVIOUS_DATA,
className,
}: AveragePriceContentProps) => {
const periodType = DASHBOARD_METRIC_CARDS[cardCode].period;
const metricTrend = getMetricTrend({
comparisonAmount: differenceAmount,
minValue: MIN_CHANGE_RATE,
maxValue: MAX_CHANGE_RATE,
});
const comparisonMessageTokens = getSalesCurrentComparisonMessage({
periodType,
hasPreviousData,
metricTrend,
metricLabel: METRIC_LABEL,
comparisonAmount: differenceAmount,
unit: SALES_UNIT.WON,
});
return (
<CurrentSalesContent className={className}>
<CurrentSalesContent.TrendBadge trend={metricTrend} />
<CurrentSalesContent.Amount
amount={averageOrderAmount}
unit={SALES_UNIT.WON}
/>
<CurrentSalesContent.ComparisonMessage
comparisonMessageTokens={comparisonMessageTokens}
/>
</CurrentSalesContent>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import { type ReactNode, useMemo } from 'react';

import { METRIC_TREND, type MetricTrend } from '@/constants/dashboard';
import { CDN_BASE_URL } from '@/constants/shared';
import type { MessageToken } from '@/utils/sales/dashboard/createMessageToken';
import { cn, formatNumber } from '@/utils/shared';

interface CurrentSalesContentProps {
className?: string;
children?: ReactNode;
}

export const CurrentSalesContent = ({
children,
className,
}: CurrentSalesContentProps) => {
return (
<article
className={cn(
'flex w-75 flex-col items-start justify-start gap-1',
className,
)}
>
{children}
</article>
);
};

interface CurrentSalesTrendBadgeProps {
trend: MetricTrend;
}

const CurrentSalesTrendBadge = ({ trend }: CurrentSalesTrendBadgeProps) => {
const iconSrc = useMemo(() => {
switch (trend) {
case METRIC_TREND.UP:
return '/assets/images/graph_up.svg';
case METRIC_TREND.DOWN:
return '/assets/images/graph_down.svg';
case METRIC_TREND.SAME:
return '/assets/images/graph_same.svg';
default:
return null;
}
}, [trend]);

if (!iconSrc) {
return <div className="size-6" />;
}

return <object data={`${CDN_BASE_URL}${iconSrc}`} className="size-6" />;
};

interface CurrentSalesContentAmountProps {
amount: number;
unit: string;
className?: string;
}

const CurrentSalesContentAmount = ({
amount,
unit,
className,
}: CurrentSalesContentAmountProps) => {
return (
<span className={cn('flex items-center gap-1', className)}>
<span className="headline-medium-bold text-grey-900">
{formatNumber(amount)}
</span>
<span className="title-medium-semibold text-grey-900">{unit}</span>
</span>
);
};

interface CurrentSalesContentComparisonMessageProps {
comparisonMessageTokens: MessageToken[];
className?: string;
}

const CurrentSalesContentComparisonMessage = ({
comparisonMessageTokens,
className,
}: CurrentSalesContentComparisonMessageProps) => {
return (
<p className={cn('title-large-semibold', className)}>
{comparisonMessageTokens.map(
({ text, isHighlight, highlightColor }, index) => {
return (
<span
key={index}
className={cn(
'text-grey-900 break-keep whitespace-pre-wrap',
isHighlight && highlightColor,
)}
>
{text}
</span>
);
},
)}
</p>
);
};

CurrentSalesContent.TrendBadge = CurrentSalesTrendBadge;
CurrentSalesContent.Amount = CurrentSalesContentAmount;
CurrentSalesContent.ComparisonMessage = CurrentSalesContentComparisonMessage;
Loading
Loading