-
Notifications
You must be signed in to change notification settings - Fork 0
[FE] 대시보드 편집창 - 매출분석 지표 카드 추가 (매출추이 카테고리 제외) #274
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+1,875
−151
Merged
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 ce16b2f
chore: 대시보드 편집 카드 추가, 삭제 버튼 shadcn button으로 교체
lee0jae330 b01ffa8
feat: dashboard metric card 상수 변경 및 관련 타입 제너릭 정의
lee0jae330 95cb8dc
feat: 특정 section의 카드 type 추출 함수 추가
lee0jae330 6709840
feat: 지표 방향성 관련 상수 추가
lee0jae330 9223f5b
feat: edit card wrapper inner class 추가
lee0jae330 59bce54
feat: 미니뷰 metricCardCode 타입 가드 추가
lee0jae330 14059ca
feat: 매출 현황 관련 카드 content 공통 컴포넌트 추가
lee0jae330 57d2bfc
feat: 각 지표 방향성을 반환하는 함수 추가
lee0jae330 ba4ab76
feat: interface의 모든 속성을 nullable하게 만드는 유틸 타입 추가
lee0jae330 1c708d6
feat: 매출현황 관련 dto 추가
lee0jae330 4565f8f
feat: 매출현황 - 실매출 카드 컨텐트 추가
lee0jae330 de5b24f
feat: 카드 편집패널에 실매출 카드 임시로 추가
lee0jae330 cd1eba4
feat: 매출 관련 단위 상수 정의
lee0jae330 3d6f7ff
feat: 실매출 관련 상수 정의
lee0jae330 baf029c
chore: 지표 경향성 계산 관련 유틸 메서드 args interface 분리
lee0jae330 ff516c0
feat: 지표 관련 비교 message 반환함수 추가
lee0jae330 cb456d8
feat: 매출현황에 변화율이 없는 경우에 대한 조건부 렌더링 추가
lee0jae330 4c6d274
feat: 실매출 관련 카드 content 추가
lee0jae330 77b4284
feat: 불필요한 값 제거
lee0jae330 b779b49
feat: 변동성이 없는 경우에 대한 image asset 추가
lee0jae330 94a6abf
feat: 매출 지표 주문 관련 상수 추가
lee0jae330 e8ed673
chore: 매출 지표 주문건수 dto명 수정
lee0jae330 aa06e10
feat: 지표에 변동성이 없는 경우, 변동성 없음에 대한 이미지 추가
lee0jae330 94c165f
feat: 주문 건수 관련 카드 content 추가
lee0jae330 0e196de
chore: 상수 위치 수정
lee0jae330 15f792c
fix: 이맘때쯤이 2번 나오는 문제 해결
lee0jae330 ff4bf99
chore: ooCardContent에서 ooContent로 네이밍 수정
lee0jae330 9eaddc0
feat: 주문건수 지표 카드 content 추가
lee0jae330 532c129
style: 여백 제거
lee0jae330 29d04de
chore: 숫자에 포메팅 추가
lee0jae330 5ee98bb
feat: 최대 최소가 0인 경우 추가
lee0jae330 f280f52
feat: 주문 평균가 관련 상수 추가
lee0jae330 0ff9087
feat: 매출 유입 구조 관련 DTO 추가
lee0jae330 9e014a4
refactor: 매출 현황 비교 텍스트 관련 유틸함수 네이밍 명확하게 변경
lee0jae330 5fe6ea2
refactor: dashboard 도메인에서 sales 도메인으로 이동
lee0jae330 44e91f1
refactor: switch case fall through 및 assertNever를 통한 에러 처리 추가
lee0jae330 598a507
fix: period context provider 외부에서도 접근한 문제 해결
lee0jae330 e7a0eed
feat: sales 타입 가드 추가
lee0jae330 6aea463
feat: 매출 유입 구조 관련 카드 content 추가
lee0jae330 2fb6c0d
feat: 판매유형별 매출 content 추가
lee0jae330 7f2eeea
feat: 매출 유입 구조 관련 브리핑 message 반환 함수 추가
lee0jae330 f806c7d
feat: dto 배럴파일 추가
lee0jae330 23d474c
feat: 판매유형별 매출 관련 상수 추가
lee0jae330 1addde0
feat: 주문수단별 매출 추가
lee0jae330 a9fc9ad
feat: 판매유입구조 도넛 차트 추상화 적용
lee0jae330 a978d73
feat: 도넛 차트 legend 관련 배럴 파일 추가
lee0jae330 a27deb2
feat: 주문수단별 매출 content 추가
lee0jae330 169dc5e
feat: 예시 데이터와 브리핑 text가 일치하도록 변경
lee0jae330 a6ffbd3
feat: 결제수단별 매출 관련 상수 추가
lee0jae330 2212eb3
feat: 결제수단별 매출 content 추가
lee0jae330 7919dc3
feat: 매출 도넛 차트 색상 수정
lee0jae330 5992cea
feat: 불필요한 변수 제거
lee0jae330 19490a1
feat: 매출유입구조 top type 정의 및 불필요한 타입 가드 제거
lee0jae330 1bc71ac
refactor: 대시보드 매출 관련 유틸 함수 도메인 이동
lee0jae330 b08a266
chore: import 경로 수정
lee0jae330 b932b7d
refactor: sales 상수 폴더dashboard sub도메인 추가
lee0jae330 1564ea8
feat: 색상 하이라이트 관련 로직 token 기반으로 통일 진행
lee0jae330 293e164
feat: lineChart getClientBoundingRect 대신 svg viewbox 높이, 너비를 활용하는 방식으…
lee0jae330 041077a
refactor: sales 상수 파일 sub domain 세분화 진행
lee0jae330 8036c58
feat: 매출 패턴 브리핑 메시지 추가
lee0jae330 4e0c681
feat: 피크타임 line chart 데이터 변환 유틸 함수추가
lee0jae330 17fee4b
feat: 피크타임 관련 상수 추가
lee0jae330 a4ffcc7
feat: 피크타임 관련 dto 추가
lee0jae330 d6fb0ea
feat: 피크타임 card content 추가
lee0jae330 fca5483
refactor: sales 도메인 util 함수 서브 도메인 세분화 진행
lee0jae330 cf3879e
feat: 요일별 매출 패턴 dto 추가
lee0jae330 95bb433
refactor: sales type 서브 도메인 세분화
lee0jae330 f755040
feat: 요일별 매출 관련 dto 및 type 추가
lee0jae330 04135fc
feat: 요일별 매출 관련 브리핑 메세지 반환 함수 추가
lee0jae330 fa1fa44
chore: font-bold 추가
lee0jae330 6a70fb0
chore: 누락된 브리핑 문구 추가
lee0jae330 fa327bf
feat: 각 매출분석 대시보드 편집 카드 컴포넌트 추가
lee0jae330 15d3421
feat: edit card wrapper 사이즈 수정
lee0jae330 0ddc30a
feat: 요일별 매출 패턴 컴포넌트 임시 커밋
lee0jae330 256c870
feat: 배럴파일 추가
lee0jae330 a977350
chore: msw auth refresh 비활성화
lee0jae330 188996d
feat: Merge branch 'develop' into feature/#194-fe-dashboard-sales-ui
lee0jae330 c5a1c9f
feat: bar chart 색상 강조 막대를 지정할 수 있도록 변경
lee0jae330 ffa0371
refactor: 차트 관련 data type 수정
lee0jae330 16da1e6
feat: 요일별 매출 패턴 관련 상수 정의
lee0jae330 2af586b
feat: 요일 관련 타입 추가
lee0jae330 bb900cf
feat: 요일별 매출 패턴 관련 매직넘버 상수 분리
lee0jae330 fc81eca
feat: 요일별 매출 패턴 card content 추가
lee0jae330 a04068b
feat: 매출 분석 관련 대시보드 편집 카드 추가 (매출 추이 제외)
lee0jae330 ee3c325
chore: 배럴 파일 추가
lee0jae330 34106d8
refactor: 매출분석 카드 props required type으로 변경 및 편집 카드 컴포넌트에서 예시 data를 전달…
lee0jae330 98f0e74
style: edit card wrapper transform origin 로직 롤백
lee0jae330 1a5cfdf
chore: shadcn import 경로 수정
lee0jae330 127ae41
chore: dto 네이밍 오타 수정
lee0jae330 2a6e257
chore: 파일명 오타수정
lee0jae330 83d21cc
chore: 조건식 삼항 연산자로 변경
lee0jae330 247a210
chore: Peaktime -> PeakTime 오타 수정
lee0jae330 bf4a482
chore: type import 제거
lee0jae330 65ac399
chore: nullable 타입 삭제
lee0jae330 b7f3339
chore: git 오류로 인한 커밋
lee0jae330 f405e8b
chore: 파일명 수정
lee0jae330 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
157 changes: 157 additions & 0 deletions
157
frontend/src/components/dashboard/dashboard-edit/EditCardContent.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; | ||
| } | ||
| }; |
64 changes: 64 additions & 0 deletions
64
frontend/src/components/sales/dashboard-current-sales/AveragePriceContent.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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< | ||
| 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> | ||
| ); | ||
| }; | ||
107 changes: 107 additions & 0 deletions
107
frontend/src/components/sales/dashboard-current-sales/CurrentSalesContent.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[p5] 타입 내러잉 좋습니다! 상세분석 컴포넌트들도 리팩터링이 ,, 필요하겠군요