MyRankBar.tsx 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. 'use client';
  2. import { User } from 'lucide-react';
  3. import type { MyRankInfo, RankingType } from '@/types/response/ranking';
  4. interface Props {
  5. info: MyRankInfo;
  6. type: RankingType;
  7. }
  8. function formatAmount(amount: number): string {
  9. if (amount >= 100000000) {
  10. return `${(amount / 100000000).toFixed(1)}억`;
  11. }
  12. if (amount >= 10000) {
  13. return `${(amount / 10000).toFixed(1)}만`;
  14. }
  15. return amount.toLocaleString('ko-KR');
  16. }
  17. export default function MyRankBar({ info, type }: Props) {
  18. const suffix = type === 'donor' ? 'P' : '원';
  19. return (
  20. <aside className="ranking__my-bar" role="status">
  21. <div className="ranking__my-bar-icon">
  22. <User size={18} />
  23. </div>
  24. <div className="ranking__my-bar-text">
  25. <strong>내 순위</strong>
  26. <span>{info.rank}위</span>
  27. {info.rankChange !== null && info.rankChange !== 0 ? (
  28. <em className={info.rankChange > 0 ? 'ranking__my-bar-up' : 'ranking__my-bar-down'}>
  29. {info.rankChange > 0 ? `▲${info.rankChange}` : `▼${Math.abs(info.rankChange)}`}
  30. </em>
  31. ) : null}
  32. </div>
  33. <div className="ranking__my-bar-amount">{formatAmount(info.moneyAmount)}{suffix}</div>
  34. </aside>
  35. );
  36. }