feat: 폼 필드 컴포넌트 분리 및 구독 카드 인터랙션 개선

- billing_cycle_selector, category_selector, currency_selector 컴포넌트 분리
- 구독 카드 클릭 이슈 해결을 위한 리팩토링
- SMS 스캔 화면 UI/UX 개선 및 기능 강화
- 상세 화면 컨트롤러 로직 개선
- 알림 서비스 및 구독 URL 매칭 기능 추가
- CLAUDE.md 프로젝트 가이드라인 대폭 확장
- 전반적인 코드 구조 개선 및 타입 안정성 강화

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
JiWoong Sul
2025-07-14 15:47:46 +09:00
parent 2f60ef585a
commit 111c519883
39 changed files with 2376 additions and 1231 deletions

View File

@@ -42,10 +42,8 @@ class SubscriptionListWidget extends StatelessWidget {
child: CategoryHeaderWidget(
categoryName: category,
subscriptionCount: subscriptions.length,
totalCost: subscriptions.fold(
0.0,
(sum, sub) => sum + sub.monthlyCost,
),
totalCostUSD: _calculateTotalByCurrency(subscriptions, 'USD'),
totalCostKRW: _calculateTotalByCurrency(subscriptions, 'KRW'),
),
),
// 카테고리별 구독 목록
@@ -87,10 +85,7 @@ class SubscriptionListWidget extends StatelessWidget {
child: SwipeableSubscriptionCard(
subscription: subscriptions[subIndex],
onTap: () {
AppNavigator.toDetail(context, subscriptions[subIndex]);
},
onEdit: () {
// 편집 화면으로 이동
print('[SubscriptionListWidget] SwipeableSubscriptionCard onTap 호출됨');
AppNavigator.toDetail(context, subscriptions[subIndex]);
},
onDelete: () async {
@@ -111,7 +106,7 @@ class SubscriptionListWidget extends StatelessWidget {
);
if (context.mounted) {
AppSnackBar.showSuccess(
AppSnackBar.showError(
context: context,
message: '${subscriptions[subIndex].serviceName} 구독이 삭제되었습니다.',
icon: Icons.delete_forever_rounded,
@@ -134,6 +129,13 @@ class SubscriptionListWidget extends StatelessWidget {
),
);
}
/// 특정 통화의 총 합계를 계산합니다.
double _calculateTotalByCurrency(List<SubscriptionModel> subscriptions, String currency) {
return subscriptions
.where((sub) => sub.currency == currency)
.fold(0.0, (sum, sub) => sum + sub.monthlyCost);
}
}
/// 여러 Sliver 위젯을 하나의 위젯으로 감싸는 도우미 위젯