import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/category_provider.dart'; import '../models/category_model.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: const Text('카테고리 관리'), backgroundColor: const Color(0xFF1976D2), ), 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: const InputDecoration( labelText: '카테고리 이름', ), validator: (value) { if (value == null || value.isEmpty) { return '카테고리 이름을 입력하세요'; } return null; }, ), const SizedBox(height: 16), DropdownButtonFormField( value: _selectedColor, decoration: const InputDecoration( labelText: '색상 선택', ), items: const [ DropdownMenuItem( value: '#1976D2', child: Text('파란색')), DropdownMenuItem( value: '#4CAF50', child: Text('초록색')), DropdownMenuItem( value: '#FF9800', child: Text('주황색')), DropdownMenuItem( value: '#F44336', child: Text('빨간색')), DropdownMenuItem( value: '#9C27B0', child: Text('보라색')), ], onChanged: (value) { setState(() { _selectedColor = value!; }); }, ), const SizedBox(height: 16), DropdownButtonFormField( value: _selectedIcon, decoration: const InputDecoration( labelText: '아이콘 선택', ), items: const [ DropdownMenuItem( value: 'subscriptions', child: Text('구독')), DropdownMenuItem(value: 'movie', child: Text('영화')), DropdownMenuItem( value: 'music_note', child: Text('음악')), DropdownMenuItem( value: 'fitness_center', child: Text('운동')), DropdownMenuItem( value: 'shopping_cart', child: Text('쇼핑')), ], onChanged: (value) { setState(() { _selectedIcon = value!; }); }, ), const SizedBox(height: 16), ElevatedButton( onPressed: _addCategory, child: const Text('카테고리 추가'), ), ], ), ), ), ), // 카테고리 목록 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), 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; } } }