Skip to content

Commit c685a9d

Browse files
authored
Merge pull request #23 from CodandoTV/issue-21
[Issue-21]: Display List of Favorite Books
2 parents 229c7c5 + a1da29e commit c685a9d

File tree

14 files changed

+267
-5
lines changed

14 files changed

+267
-5
lines changed

lib/core/routes/app_router.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ class AppRouter extends RootStackRouter {
1010
page: DashboardRoute.page,
1111
initial: true,
1212
children: [
13+
AutoRoute(
14+
page: FavoriteRoute.page,
15+
children: [
16+
AutoRoute(page: FavoriteListRoute.page),
17+
AutoRoute(page: BookDetailsRoute.page),
18+
],
19+
),
1320
AutoRoute(
1421
page: HomeRoute.page,
1522
children: [AutoRoute(page: ReadingListRoute.page)],

lib/core/utils/strings.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const home = 'Home';
22
const search = 'Search';
33
const objectives = 'Objectives';
4+
const favorite = 'Favorite';
5+
const favoriteList = 'Favorite List';
46
const searchBooks = 'Search Books';
57
const startReading = 'Start Reading';
68
const percent = '%';

lib/layers/data/api/storage_client.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:convert';
22
import 'dart:io';
33

4+
import 'package:flutter/foundation.dart';
45
import 'package:injectable/injectable.dart';
56
import 'package:mibook/layers/data/api/custom_errors.dart';
67
import 'package:mibook/layers/data/models/book_list_data.dart';
@@ -99,8 +100,10 @@ class StorageClient implements IStorageClient {
99100
final file = await _getLocalFile(_favoriteBooks);
100101
List<BookItem> currentList = await getFavoriteBooks();
101102

102-
currentList.add(book);
103+
currentList.removeWhere((e) => e.id == book.id);
104+
if (isFavorite) currentList.add(book);
103105
final jsonString = jsonEncode(currentList.map((e) => e.toJson()).toList());
106+
debugPrint('Favorite books JSON: $jsonString');
104107
await file.writeAsString(jsonString);
105108

106109
// 2. update favorite status map

lib/layers/data/models/book_list_data.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ class BookItem {
8181
title: domain.title,
8282
authors: domain.authors,
8383
pageCount: domain.pageCount,
84+
imageLinks: ImageLinks(
85+
thumbnail: domain.thumbnail,
86+
),
8487
),
8588
);
8689
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
enum Feature { readingList, search, objectives }
1+
enum Feature { readingList, search, favorite, objectives }

lib/layers/presentation/navigation/dashboard/dashboard_page.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ class DashboardPage extends StatelessWidget {
1111
@override
1212
Widget build(BuildContext context) {
1313
return AutoTabsRouter(
14-
routes: [ReadingListRoute(), BookSearchRoute(), CurrentObjectiveRoute()],
14+
routes: [
15+
ReadingListRoute(),
16+
BookSearchRoute(),
17+
FavoriteListRoute(),
18+
CurrentObjectiveRoute(),
19+
],
1520
transitionBuilder: (context, child, animation) =>
1621
FadeTransition(opacity: animation, child: child),
1722
builder: (context, child) {
@@ -26,6 +31,7 @@ class DashboardPage extends StatelessWidget {
2631
featureList: [
2732
Feature.readingList,
2833
Feature.search,
34+
Feature.favorite,
2935
Feature.objectives,
3036
],
3137
onSelectIndex: router.setActiveIndex,

lib/layers/presentation/navigation/dashboard/feature.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ extension FeatureUtils on Feature {
1111
return strings.search;
1212
case Feature.objectives:
1313
return strings.objectives;
14+
case Feature.favorite:
15+
return strings.favorite;
1416
}
1517
}
1618

@@ -22,6 +24,8 @@ extension FeatureUtils on Feature {
2224
return Icons.search_outlined;
2325
case Feature.objectives:
2426
return Icons.book;
27+
case Feature.favorite:
28+
return Icons.favorite;
2529
}
2630
}
2731
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'package:auto_route/auto_route.dart';
2+
import 'package:flutter/widgets.dart';
3+
4+
@RoutePage()
5+
class FavoriteTab extends StatelessWidget {
6+
const FavoriteTab({super.key});
7+
8+
@override
9+
Widget build(BuildContext context) {
10+
return const AutoRouter();
11+
}
12+
}

lib/layers/presentation/screens/favoritelist/favorite_item_ui.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/foundation.dart';
22
import 'package:freezed_annotation/freezed_annotation.dart';
3+
import 'package:mibook/layers/domain/models/book_list_domain.dart';
34
part 'favorite_item_ui.freezed.dart';
45

56
@freezed
@@ -14,4 +15,13 @@ class FavoriteItemUI with _$FavoriteItemUI {
1415
@Default('') description,
1516
thumbnail,
1617
}) = _FavoriteItemUI;
18+
19+
BookDomain get toDomain => BookDomain(
20+
id: id,
21+
kind: kind,
22+
title: title,
23+
authors: authors.isNotEmpty ? authors.split(', ') : [],
24+
description: description,
25+
thumbnail: thumbnail,
26+
);
1727
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
class FavoriteListEvent {}
22

33
class DidAppearEvent extends FavoriteListEvent {}
4+
5+
class DidTapUnfavoriteEvent extends FavoriteListEvent {
6+
final String bookId;
7+
8+
DidTapUnfavoriteEvent(this.bookId);
9+
}
10+
11+
class DidRefreshEvent extends FavoriteListEvent {}

0 commit comments

Comments
 (0)