import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import '../l10n/app_localizations.dart'; /// 카테고리별 구독 그룹의 헤더 위젯 /// /// 카테고리 이름, 구독 개수, 총 비용을 표시합니다. /// 통화별로 구분하여 표시하며, 혼재된 경우 각각 표시합니다. class CategoryHeaderWidget extends StatelessWidget { final String categoryName; final int subscriptionCount; final double totalCostUSD; final double totalCostKRW; final double totalCostJPY; final double totalCostCNY; const CategoryHeaderWidget({ Key? key, required this.categoryName, required this.subscriptionCount, required this.totalCostUSD, required this.totalCostKRW, required this.totalCostJPY, required this.totalCostCNY, }) : super(key: key); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.fromLTRB(20, 16, 20, 4), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( categoryName, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w700, color: Theme.of(context).colorScheme.onSurface, ), ), Text( _buildCostDisplay(context), style: TextStyle( fontSize: 12, fontWeight: FontWeight.w500, color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), ], ), const SizedBox(height: 8), Divider( height: 1, thickness: 1, color: Theme.of(context).colorScheme.outline.withValues(alpha: 0.3), ), ], ), ); } /// 통화별 합계를 표시하는 문자열을 생성합니다. String _buildCostDisplay(BuildContext context) { final parts = []; // 개수는 항상 표시 parts .add(AppLocalizations.of(context).subscriptionCount(subscriptionCount)); // 통화 부분을 별도로 처리 final currencyParts = []; // 달러가 있는 경우 if (totalCostUSD > 0) { final formatter = NumberFormat.currency( locale: 'en_US', symbol: '\$', decimalDigits: 2, ); currencyParts.add(formatter.format(totalCostUSD)); } // 원화가 있는 경우 if (totalCostKRW > 0) { final formatter = NumberFormat.currency( locale: 'ko_KR', symbol: '₩', decimalDigits: 0, ); currencyParts.add(formatter.format(totalCostKRW)); } // 엔화가 있는 경우 if (totalCostJPY > 0) { final formatter = NumberFormat.currency( locale: 'ja_JP', symbol: '¥', decimalDigits: 0, ); currencyParts.add(formatter.format(totalCostJPY)); } // 위안화가 있는 경우 if (totalCostCNY > 0) { final formatter = NumberFormat.currency( locale: 'zh_CN', symbol: '¥', decimalDigits: 2, ); currencyParts.add(formatter.format(totalCostCNY)); } // 통화가 하나 이상 있는 경우 if (currencyParts.isNotEmpty) { // 통화가 여러 개인 경우 + 로 연결, 하나인 경우 그대로 final currencyDisplay = currencyParts.join(' + '); parts.add(currencyDisplay); } return parts.join(' · '); } }