import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/category_provider.dart'; import '../theme/app_colors.dart'; class CategoryManagementScreen extends StatefulWidget { const CategoryManagementScreen({super.key}); @override State createState() => _CategoryManagementScreenState(); } class _CategoryManagementScreenState extends State { final _formKey = GlobalKey(); final _nameController = TextEditingController(); String _selectedColor = '#1976D2'; String _selectedIcon = 'subscriptions'; @override void dispose() { _nameController.dispose(); super.dispose(); } Future _addCategory() async { if (_formKey.currentState!.validate()) { await Provider.of(context, listen: false).addCategory( name: _nameController.text, color: _selectedColor, icon: _selectedIcon, ); _nameController.clear(); setState(() { _selectedColor = '#1976D2'; _selectedIcon = 'subscriptions'; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text( '카테고리 관리', style: TextStyle( color: AppColors.pureWhite, ), ), backgroundColor: AppColors.primaryColor, ), body: Consumer( builder: (context, provider, child) { return Column( children: [ // 카테고리 추가 폼 Card( margin: const EdgeInsets.all(16), child: Padding( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: Column( children: [ TextFormField( controller: _nameController, decoration: InputDecoration( labelText: '카테고리 이름', labelStyle: TextStyle( color: AppColors.navyGray, ), ), validator: (value) { if (value == null || value.isEmpty) { return '카테고리 이름을 입력하세요'; } return null; }, ), const SizedBox(height: 16), DropdownButtonFormField( value: _selectedColor, decoration: InputDecoration( labelText: '색상 선택', labelStyle: TextStyle( color: AppColors.navyGray, ), ), items: [ DropdownMenuItem( value: '#1976D2', child: Text('파란색', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: '#4CAF50', child: Text('초록색', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: '#FF9800', child: Text('주황색', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: '#F44336', child: Text('빨간색', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: '#9C27B0', child: Text('보라색', style: TextStyle(color: AppColors.darkNavy))), ], onChanged: (value) { setState(() { _selectedColor = value!; }); }, ), const SizedBox(height: 16), DropdownButtonFormField( value: _selectedIcon, decoration: InputDecoration( labelText: '아이콘 선택', labelStyle: TextStyle( color: AppColors.navyGray, ), ), items: [ DropdownMenuItem( value: 'subscriptions', child: Text('구독', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem(value: 'movie', child: Text('영화', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: 'music_note', child: Text('음악', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: 'fitness_center', child: Text('운동', style: TextStyle(color: AppColors.darkNavy))), DropdownMenuItem( value: 'shopping_cart', child: Text('쇼핑', style: TextStyle(color: AppColors.darkNavy))), ], onChanged: (value) { setState(() { _selectedIcon = value!; }); }, ), const SizedBox(height: 16), ElevatedButton( onPressed: _addCategory, child: Text( '카테고리 추가', style: TextStyle( color: AppColors.pureWhite, ), ), ), ], ), ), ), ), // 카테고리 목록 Expanded( child: ListView.builder( itemCount: provider.categories.length, itemBuilder: (context, index) { final category = provider.categories[index]; return ListTile( leading: Icon( IconData( _getIconCode(category.icon), fontFamily: 'MaterialIcons', ), color: Color( int.parse(category.color.replaceAll('#', '0xFF'))), ), title: Text( category.name, style: TextStyle( color: AppColors.darkNavy, ), ), trailing: IconButton( icon: const Icon(Icons.delete), onPressed: () async { await provider.deleteCategory(category.id); }, ), ); }, ), ), ], ); }, ), ); } int _getIconCode(String iconName) { switch (iconName) { case 'subscriptions': return 0xe8c1; case 'movie': return 0xe8c2; case 'music_note': return 0xe405; case 'fitness_center': return 0xeb43; case 'shopping_cart': return 0xe8cc; default: return 0xe8c1; } } }