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

@@ -7,7 +7,36 @@ class CategoryProvider extends ChangeNotifier {
List<CategoryModel> _categories = [];
late Box<CategoryModel> _categoryBox;
List<CategoryModel> get categories => _categories;
// 카테고리 표시 순서 정의
static const List<String> _categoryOrder = [
'음악',
'OTT(동영상)',
'저장/클라우드',
'통신 · 인터넷 · TV',
'생활/라이프스타일',
'쇼핑/이커머스',
'프로그래밍',
'협업/오피스',
'AI 서비스',
'기타',
];
List<CategoryModel> get categories {
// 정의된 순서로 카테고리 정렬
final sortedCategories = List<CategoryModel>.from(_categories);
sortedCategories.sort((a, b) {
final aIndex = _categoryOrder.indexOf(a.name);
final bIndex = _categoryOrder.indexOf(b.name);
// 순서 목록에 없는 카테고리는 맨 뒤로
if (aIndex == -1) return 1;
if (bIndex == -1) return -1;
return aIndex.compareTo(bIndex);
});
return sortedCategories;
}
Future<void> init() async {
_categoryBox = await Hive.openBox<CategoryModel>('categories');
@@ -24,12 +53,16 @@ class CategoryProvider extends ChangeNotifier {
// 기본 카테고리 초기화
Future<void> _initDefaultCategories() async {
final defaultCategories = [
{'name': 'OTT 서비스', 'color': '#3B82F6', 'icon': 'live_tv'},
{'name': '음악 서비스', 'color': '#EC4899', 'icon': 'music_note'},
{'name': 'AI 서비스', 'color': '#8B5CF6', 'icon': 'psychology'},
{'name': '프로그래밍/개발', 'color': '#10B981', 'icon': 'code'},
{'name': '오피스/협업 툴', 'color': '#F59E0B', 'icon': 'business_center'},
{'name': '기타 서비', 'color': '#6B7280', 'icon': 'more_horiz'},
{'name': '음악', 'color': '#E91E63', 'icon': 'music_note'},
{'name': 'OTT(동영상)', 'color': '#9C27B0', 'icon': 'movie_filter'},
{'name': '저장/클라우드', 'color': '#2196F3', 'icon': 'cloud'},
{'name': '통신 · 인터넷 · TV', 'color': '#00BCD4', 'icon': 'wifi'},
{'name': '생활/라이프스타일', 'color': '#4CAF50', 'icon': 'home'},
{'name': '쇼핑/이커머', 'color': '#FF9800', 'icon': 'shopping_cart'},
{'name': '프로그래밍', 'color': '#795548', 'icon': 'code'},
{'name': '협업/오피스', 'color': '#607D8B', 'icon': 'business_center'},
{'name': 'AI 서비스', 'color': '#673AB7', 'icon': 'smart_toy'},
{'name': '기타', 'color': '#9E9E9E', 'icon': 'category'},
];
for (final category in defaultCategories) {