diff --git a/l10n/app_en.arb b/l10n/app_en.arb index b4719f3..f716cfb 100644 --- a/l10n/app_en.arb +++ b/l10n/app_en.arb @@ -4,5 +4,7 @@ "changeLanguage": "English", "errorMessage": "{message}", "noData": "No data", - "characterTitle": "Character: {name}" + "characterTitle": "Character: {name}", + "likeMessage": "Liked {characterName}!", + "unlikeMessage": "{characterName} unliked!" } diff --git a/l10n/app_ru.arb b/l10n/app_ru.arb index c54b315..87a5202 100644 --- a/l10n/app_ru.arb +++ b/l10n/app_ru.arb @@ -4,5 +4,7 @@ "changeLanguage": "Русский", "errorMessage": "{message}", "noData": "Нет данных", - "characterTitle": "Персонаж: {name}" + "characterTitle": "Персонаж: {name}", + "likeMessage": "Понравился {characterName}!", + "unlikeMessage": "{characterName} больше не нравится!" } diff --git a/lib/components/locale/l10n/app_locale.dart b/lib/components/locale/l10n/app_locale.dart index 46cc13b..0162f9f 100644 --- a/lib/components/locale/l10n/app_locale.dart +++ b/lib/components/locale/l10n/app_locale.dart @@ -130,6 +130,18 @@ abstract class AppLocale { /// In ru, this message translates to: /// **'Персонаж: {name}'** String characterTitle(Object name); + + /// No description provided for @likeMessage. + /// + /// In ru, this message translates to: + /// **'Понравился {characterName}!'** + String likeMessage(Object characterName); + + /// No description provided for @unlikeMessage. + /// + /// In ru, this message translates to: + /// **'{characterName} больше не нравится!'** + String unlikeMessage(Object characterName); } class _AppLocaleDelegate extends LocalizationsDelegate { diff --git a/lib/components/locale/l10n/app_locale_en.dart b/lib/components/locale/l10n/app_locale_en.dart index a83e92f..374d56b 100644 --- a/lib/components/locale/l10n/app_locale_en.dart +++ b/lib/components/locale/l10n/app_locale_en.dart @@ -27,4 +27,14 @@ class AppLocaleEn extends AppLocale { String characterTitle(Object name) { return 'Character: $name'; } + + @override + String likeMessage(Object characterName) { + return 'Liked $characterName!'; + } + + @override + String unlikeMessage(Object characterName) { + return '$characterName unliked!'; + } } diff --git a/lib/components/locale/l10n/app_locale_ru.dart b/lib/components/locale/l10n/app_locale_ru.dart index b3ad684..58cba52 100644 --- a/lib/components/locale/l10n/app_locale_ru.dart +++ b/lib/components/locale/l10n/app_locale_ru.dart @@ -27,4 +27,14 @@ class AppLocaleRu extends AppLocale { String characterTitle(Object name) { return 'Персонаж: $name'; } + + @override + String likeMessage(Object characterName) { + return 'Понравился $characterName!'; + } + + @override + String unlikeMessage(Object characterName) { + return '$characterName больше не нравится!'; + } } diff --git a/lib/main.dart b/lib/main.dart index 5dd2ebc..f6b3a7e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -102,6 +102,13 @@ class MyHomePage extends StatelessWidget { onLanguageChanged(newLocale); }, ), + IconButton( + icon: const Icon(Icons.refresh), + onPressed: () { + // Отправляем событие для обновления данных + context.read().add(HomeLoadDataEvent()); + }, + ), IconButton( icon: const Icon(Icons.search), onPressed: () { @@ -127,19 +134,45 @@ class MyHomePage extends StatelessWidget { itemCount: characters.length, itemBuilder: (context, index) { final characterDTO = characters[index]; - return ListTile( - leading: SizedBox( - width: 40, - child: Image.network(characterDTO.imageUrl, width: 50, height: 50), - ), - title: Text(characterDTO.name), - subtitle: Text(characterDTO.typeString), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CharacterDetailPage(characterDTO: characterDTO), + return StatefulBuilder( + builder: (context, setState) { + return ListTile( + leading: SizedBox( + width: 40, + child: Image.network(characterDTO.imageUrl, width: 50, height: 50), ), + title: Text(characterDTO.name), + subtitle: Text(characterDTO.typeString), + trailing: IconButton( + icon: Icon( + characterDTO.isLiked ? Icons.favorite : Icons.favorite_border, + color: characterDTO.isLiked ? Colors.red : Colors.grey, + ), + onPressed: () { + setState(() { + characterDTO.isLiked = !characterDTO.isLiked; + }); + + final message = characterDTO.isLiked + ? (AppLocale.of(context)?.likeMessage(characterDTO.name) ?? 'Понравился персонаж') + : (AppLocale.of(context)?.unlikeMessage(characterDTO.name) ?? 'Персонаж больше не понравился'); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message), + duration: const Duration(seconds: 1), + ), + ); + }, + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CharacterDetailPage(characterDTO: characterDTO), + ), + ); + }, ); }, ); diff --git a/lib/models/character.dart b/lib/models/character.dart index d8ef447..1f418b7 100644 --- a/lib/models/character.dart +++ b/lib/models/character.dart @@ -91,34 +91,39 @@ class CharacterDTO { final String characterType; final String backstory; final String imageUrl; + bool isLiked; // Добавлено поле для состояния лайка CharacterDTO({ required this.name, required this.characterType, required this.backstory, required this.imageUrl, + this.isLiked = false, // Значение по умолчанию - false }); + // Метод для преобразования в DTO (можно удалить, так как он уже возвращает текущий объект) CharacterDTO toDTO() { return CharacterDTO( name: name, characterType: typeString, backstory: backstory, imageUrl: imageUrl, + isLiked: isLiked, ); } - // Добавим метод fromJson + // Метод fromJson для создания объекта из Map factory CharacterDTO.fromJson(Map json) { return CharacterDTO( name: json['name'], characterType: json['type'], backstory: json['backstory'], imageUrl: json['image_url'], + isLiked: json['isLiked'] ?? false, // Поддержка поля isLiked ); } - // Геттер для typeString + // Геттер для типа в строковом виде String get typeString { switch (characterType) { case 'Выживший': @@ -137,16 +142,19 @@ class CharacterDTO { type: characterType == 'Выживший' ? CharacterType.Survivor : CharacterType.Hunter, backstory: backstory, imageUrl: imageUrl, + isLiked: isLiked, ); } - // Метод для преобразования в Map + // Метод для преобразования объекта в Map Map toMap() { return { 'name': name, 'type': characterType, 'backstory': backstory, 'image_url': imageUrl, + 'isLiked': isLiked, // Добавляем поле isLiked в Map }; } } +