diff --git a/flutter_app/lib/data/dtos/thrones_character_dto.dart b/flutter_app/lib/data/dtos/thrones_character_dto.dart index 942ee60..a7d825f 100644 --- a/flutter_app/lib/data/dtos/thrones_character_dto.dart +++ b/flutter_app/lib/data/dtos/thrones_character_dto.dart @@ -2,6 +2,16 @@ import 'package:json_annotation/json_annotation.dart'; part 'thrones_character_dto.g.dart'; +@JsonSerializable(createToJson: false) +class ThronesCharacterListDto { + final List characters; + + ThronesCharacterListDto({required this.characters}); + + factory ThronesCharacterListDto.fromJson(Map json) => + _$ThronesCharacterListDtoFromJson(json); +} + @JsonSerializable(createToJson: false) class ThronesCharacterDto { final int id; diff --git a/flutter_app/lib/data/dtos/thrones_character_dto.g.dart b/flutter_app/lib/data/dtos/thrones_character_dto.g.dart index c0e5cfb..b96b07b 100644 --- a/flutter_app/lib/data/dtos/thrones_character_dto.g.dart +++ b/flutter_app/lib/data/dtos/thrones_character_dto.g.dart @@ -6,6 +6,14 @@ part of 'thrones_character_dto.dart'; // JsonSerializableGenerator // ************************************************************************** +ThronesCharacterListDto _$ThronesCharacterListDtoFromJson( + Map json) => + ThronesCharacterListDto( + characters: (json['characters'] as List) + .map((e) => ThronesCharacterDto.fromJson(e as Map)) + .toList(), + ); + ThronesCharacterDto _$ThronesCharacterDtoFromJson(Map json) => ThronesCharacterDto( id: (json['id'] as num).toInt(), diff --git a/flutter_app/lib/data/mappers/characters_mapper.dart b/flutter_app/lib/data/mappers/characters_mapper.dart index 323e95f..9ff1382 100644 --- a/flutter_app/lib/data/mappers/characters_mapper.dart +++ b/flutter_app/lib/data/mappers/characters_mapper.dart @@ -7,14 +7,14 @@ const _imagePlaceholder = extension ThronesCharacterDtoToModel on ThronesCharacterDto { CardData toDomain() => CardData( - descriptionText: _makeDescriptionText(title, family), + text: _makeDescriptionText(title, family), firstName: firstName, lastName: lastName, title: title, family: family, fullName: fullName, imageUrl: imageUrl, - text: '', + id: id.toString() ); String _makeDescriptionText(String? title, String? family) { diff --git a/flutter_app/lib/data/repositories/mock_repository.dart b/flutter_app/lib/data/repositories/mock_repository.dart deleted file mode 100644 index b4197a5..0000000 --- a/flutter_app/lib/data/repositories/mock_repository.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_app/data/repositories/api_interface.dart'; -import 'package:flutter_app/domain/models/card.dart'; - -// class MockRepository extends ApiInterface { -// @override -// Future?> loadData({OnErrorCallback? onError}) async { -// return [ -// CardData( -// fullName: 'Daenerys Targaryen', -// descriptionText: 'Mother of Dragons', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/daenerys.jpg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Samwell Tarly', -// descriptionText: 'Maester', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/sam.jpg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Jon Snow', -// descriptionText: 'King of the North', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/jon-snow.jpg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Arya Stark', -// descriptionText: 'No One', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/arya-stark.jpg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Sansa Stark', -// descriptionText: 'Lady of Winterfell', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/sansa-stark.jpeg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Brandon Stark', -// descriptionText: 'Lord of Winterfell', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/bran-stark.jpg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Ned Stark', -// descriptionText: 'Lord of Winterfell', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/ned-stark.jpg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// CardData( -// fullName: 'Robert Baratheon', -// descriptionText: 'Lord of the Seven Kingdoms', -// icon: Icons.favorite, -// imageUrl: -// 'https://thronesapi.com/assets/images/robert-baratheon.jpeg', -// text: '', firstName: '', lastName: '', title: '', family: '', -// ), -// ]; -// } -// } diff --git a/flutter_app/lib/domain/models/card.dart b/flutter_app/lib/domain/models/card.dart index 7edf65c..78626c4 100644 --- a/flutter_app/lib/domain/models/card.dart +++ b/flutter_app/lib/domain/models/card.dart @@ -1,21 +1,15 @@ -import 'package:flutter/material.dart'; - class CardData { final String text; - final String descriptionText; - final IconData icon; final String? imageUrl; final String? firstName; final String? lastName; final String? fullName; final String? title; final String? family; - final int? id; + final String? id; CardData({ required this.text, - required this.descriptionText, - this.icon = Icons.people, this.imageUrl, required this.firstName, required this.lastName, diff --git a/flutter_app/lib/presentation/details_page/details_page.dart b/flutter_app/lib/presentation/details_page/details_page.dart index a871318..9924093 100644 --- a/flutter_app/lib/presentation/details_page/details_page.dart +++ b/flutter_app/lib/presentation/details_page/details_page.dart @@ -42,7 +42,7 @@ class DetailsPage extends StatelessWidget { ), ), Text( - data.descriptionText, + data.text, style: Theme.of(context).textTheme.bodyLarge?.copyWith( fontSize: 20.0, fontFamily: 'Times New Roman', diff --git a/flutter_app/lib/presentation/home_page/card.dart b/flutter_app/lib/presentation/home_page/card.dart index 94c6f5e..5a486c0 100644 --- a/flutter_app/lib/presentation/home_page/card.dart +++ b/flutter_app/lib/presentation/home_page/card.dart @@ -4,9 +4,7 @@ typedef OnLikeCallback = void Function(String? id, String title, bool isLiked)?; class _Card extends StatelessWidget { final String text; - final String descriptionText; final String? fullName; - final IconData icon; final String? imageUrl; final OnLikeCallback onLike; final VoidCallback? onTap; @@ -15,8 +13,6 @@ class _Card extends StatelessWidget { const _Card( this.text, { - this.icon = Icons.catching_pokemon, - required this.descriptionText, required this.fullName, this.imageUrl, this.onLike, @@ -33,9 +29,7 @@ class _Card extends StatelessWidget { }) => _Card( data.text, - descriptionText: data.descriptionText, fullName: data.fullName, - icon: data.icon, imageUrl: data.imageUrl, onLike: onLike, onTap: onTap, @@ -77,7 +71,7 @@ class _Card extends StatelessWidget { ), ), Text( - descriptionText, + text, style: Theme.of(context).textTheme.bodyMedium, ), ], @@ -86,14 +80,11 @@ class _Card extends StatelessWidget { Align( alignment: Alignment.bottomRight, child: Padding( - padding: const EdgeInsets.only( - left: 8.0, - right: 16.0, - bottom: 16.0, - ), - child: GestureDetector( - onTap: () => onLike?.call(id, text, isLiked), - child: AnimatedSwitcher( + padding: + const EdgeInsets.only(left: 8, right: 16, bottom: 16), + child: GestureDetector( + onTap: () => onLike?.call(id, fullName!, isLiked), + child: AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: isLiked ? const Icon( diff --git a/flutter_app/lib/presentation/like_bloc/like_bloc.dart b/flutter_app/lib/presentation/like_bloc/like_bloc.dart index ca69b7a..b07b32f 100644 --- a/flutter_app/lib/presentation/like_bloc/like_bloc.dart +++ b/flutter_app/lib/presentation/like_bloc/like_bloc.dart @@ -14,20 +14,20 @@ class LikeBloc extends Bloc { on(_onLoadLikes); } - FutureOr _onLoadLikes(LoadLikesEvent event, Emitter emit) async { + Future _onLoadLikes(LoadLikesEvent event, Emitter emit) async { final prefs = await SharedPreferences.getInstance(); final data = prefs.getStringList(_likedPrefsKey); emit(state.copyWith(likedIds: data)); } - FutureOr _onChangeLike(ChangeLikeEvent event, Emitter emit) async{ + Future _onChangeLike(ChangeLikeEvent event, Emitter emit) async { final updatedList = List.from(state.likedIds ?? []); - if (updatedList.contains(event.id.toString())) { - updatedList.remove(event.id.toString()); + if (updatedList.contains(event.id)) { + updatedList.remove(event.id); } else { - updatedList.add(event.id.toString()); + updatedList.add(event.id); } final prefs = await SharedPreferences.getInstance();