Skip to content

Commit a8cf4bc

Browse files
k12onossmateusz-bak
authored andcommitted
fix: Dynamically change sorting options for each status, properly handle each option
1 parent e2f630c commit a8cf4bc

File tree

5 files changed

+203
-86
lines changed

5 files changed

+203
-86
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import 'package:flutter_bloc/flutter_bloc.dart';
2+
3+
class BooksTabIndexCubit extends Cubit<int> {
4+
BooksTabIndexCubit() : super(0);
5+
6+
void setTabIndex(int index) => emit(index);
7+
}

lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import 'package:openreads/logic/bloc/theme_bloc/theme_bloc.dart';
2424
import 'package:openreads/logic/bloc/welcome_bloc/welcome_bloc.dart';
2525
import 'package:openreads/logic/cubit/book_cubit.dart';
2626
import 'package:openreads/logic/cubit/book_lists_order_cubit.dart';
27+
import 'package:openreads/logic/cubit/books_tab_index_cubit.dart';
2728
import 'package:openreads/logic/cubit/current_book_cubit.dart';
2829
import 'package:openreads/logic/cubit/default_book_status_cubit.dart';
2930
import 'package:openreads/logic/cubit/default_book_tags_cubit.dart';
@@ -91,6 +92,7 @@ class App extends StatelessWidget {
9192
BlocProvider(create: (_) => ThemeBloc()),
9293
BlocProvider(create: (_) => DisplayBloc()),
9394
BlocProvider(create: (_) => SortBloc()),
95+
BlocProvider(create: (_) => BooksTabIndexCubit()),
9496
BlocProvider(create: (_) => WelcomeBloc()),
9597
BlocProvider(create: (_) => RatingTypeBloc()),
9698
BlocProvider(create: (_) => MigrationV1ToV2Bloc()),

lib/ui/books_screen/books_screen.dart

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ class BooksScreen extends StatefulWidget {
2323

2424
class _BooksScreenState extends State<BooksScreen>
2525
with AutomaticKeepAliveClientMixin, TickerProviderStateMixin {
26-
int _booksTabIndex = 0;
27-
2826
late TabController _tabController;
2927
late ScrollController _chipScrollController;
3028

@@ -114,6 +112,15 @@ class _BooksScreenState extends State<BooksScreen>
114112
case SortType.byStartDate:
115113
list = _sortByStartDate(list: list, isAsc: state.isAsc);
116114
break;
115+
case SortType.byPublicationYear:
116+
list = _sortByPublicationYear(list: list, isAsc: state.isAsc);
117+
break;
118+
case SortType.byDateAdded:
119+
list = _sortByDateAdded(list: list, isAsc: state.isAsc);
120+
break;
121+
case SortType.byDateModified:
122+
list = _sortByDateModified(list: list, isAsc: state.isAsc);
123+
break;
117124
default:
118125
list = _sortByTitle(list: list, isAsc: state.isAsc);
119126
}
@@ -142,10 +149,62 @@ class _BooksScreenState extends State<BooksScreen>
142149
case SortType.byAuthor:
143150
list = _sortByAuthor(list: list, isAsc: state.isAsc);
144151
break;
152+
case SortType.byPages:
153+
list = _sortByPages(list: list, isAsc: state.isAsc);
154+
break;
155+
case SortType.byPublicationYear:
156+
list = _sortByPublicationYear(list: list, isAsc: state.isAsc);
157+
break;
158+
case SortType.byDateAdded:
159+
list = _sortByDateAdded(list: list, isAsc: state.isAsc);
160+
break;
161+
case SortType.byDateModified:
162+
list = _sortByDateModified(list: list, isAsc: state.isAsc);
163+
break;
164+
165+
default:
166+
list = _sortByTitle(list: list, isAsc: state.isAsc);
167+
}
168+
169+
return list;
170+
}
145171

172+
List<Book> _sortUnfinishedList({
173+
required SetSortState state,
174+
required List<Book> list,
175+
}) {
176+
if (state.tags != null) {
177+
list = _filterTags(
178+
list: list,
179+
tags: state.tags!,
180+
filterTagsAsAnd: state.filterTagsAsAnd,
181+
filterOutSelectedTags: state.filterOutTags,
182+
);
183+
}
184+
185+
if (state.bookType != null) {
186+
list = _filterOutBookTypes(list, state.bookType!);
187+
}
188+
189+
switch (state.sortType) {
190+
case SortType.byAuthor:
191+
list = _sortByAuthor(list: list, isAsc: state.isAsc);
192+
break;
146193
case SortType.byPages:
147194
list = _sortByPages(list: list, isAsc: state.isAsc);
148195
break;
196+
case SortType.byStartDate:
197+
list = _sortByStartDate(list: list, isAsc: state.isAsc);
198+
break;
199+
case SortType.byPublicationYear:
200+
list = _sortByPublicationYear(list: list, isAsc: state.isAsc);
201+
break;
202+
case SortType.byDateAdded:
203+
list = _sortByDateAdded(list: list, isAsc: state.isAsc);
204+
break;
205+
case SortType.byDateModified:
206+
list = _sortByDateModified(list: list, isAsc: state.isAsc);
207+
break;
149208
default:
150209
list = _sortByTitle(list: list, isAsc: state.isAsc);
151210
}
@@ -669,14 +728,6 @@ class _BooksScreenState extends State<BooksScreen>
669728
return booksWithPublicationDate + booksWithoutPublicationDate;
670729
}
671730

672-
_changeTab(int index) {
673-
setState(() {
674-
_booksTabIndex = index;
675-
});
676-
677-
_tabController.index = index;
678-
}
679-
680731
@override
681732
bool get wantKeepAlive => true;
682733

@@ -747,11 +798,10 @@ class _BooksScreenState extends State<BooksScreen>
747798
StreamBuilder<List<Book>> _buildUnfinishedBooksTabView() {
748799
bookCubit.getUnfinishedBooks();
749800

750-
//TODO: sort unfinished book by date of modification
751801
return _buildBooksTabView(
752802
listNumber: 3,
753803
stream: bookCubit.unfinishedBooks,
754-
sorting: null,
804+
sorting: _sortUnfinishedList,
755805
);
756806
}
757807

@@ -830,36 +880,28 @@ class _BooksScreenState extends State<BooksScreen>
830880
switch (status) {
831881
case BookStatus.read:
832882
tabChips.add(BooksTabChip(
833-
selected: _booksTabIndex == index,
834883
index: index,
835-
changeTab: _changeTab,
836884
tabController: _tabController,
837885
title: LocaleKeys.books_finished.tr(),
838886
));
839887
break;
840888
case BookStatus.inProgress:
841889
tabChips.add(BooksTabChip(
842-
selected: _booksTabIndex == index,
843890
index: index,
844-
changeTab: _changeTab,
845891
tabController: _tabController,
846892
title: LocaleKeys.books_in_progress.tr(),
847893
));
848894
break;
849895
case BookStatus.forLater:
850896
tabChips.add(BooksTabChip(
851-
selected: _booksTabIndex == index,
852897
index: index,
853-
changeTab: _changeTab,
854898
tabController: _tabController,
855899
title: LocaleKeys.books_for_later.tr(),
856900
));
857901
break;
858902
case BookStatus.unfinished:
859903
tabChips.add(BooksTabChip(
860-
selected: _booksTabIndex == index,
861904
index: index,
862-
changeTab: _changeTab,
863905
tabController: _tabController,
864906
title: LocaleKeys.books_unfinished.tr(),
865907
));

lib/ui/books_screen/widgets/book_tag_chip.dart

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:openreads/logic/cubit/books_tab_index_cubit.dart';
24

35
class BooksTabChip extends StatefulWidget {
46
const BooksTabChip({
57
super.key,
6-
required this.selected,
78
required this.index,
8-
required this.changeTab,
99
required this.tabController,
1010
required this.title,
1111
});
1212

13-
final bool selected;
1413
final int index;
15-
final Function(int) changeTab;
1614
final TabController tabController;
1715
final String title;
1816

@@ -44,14 +42,20 @@ class _BookTabChipState extends State<BooksTabChip> {
4442
Widget build(BuildContext context) {
4543
return Padding(
4644
padding: const EdgeInsets.fromLTRB(8, 0, 0, 0),
47-
child: FilterChip(
48-
selected: widget.selected,
49-
label: Text(widget.title),
50-
visualDensity: VisualDensity.compact,
51-
showCheckmark: false,
52-
onSelected: (bool _) {
53-
_scrollToChip(widget.index, context);
54-
widget.changeTab(widget.index);
45+
child: BlocBuilder<BooksTabIndexCubit, int>(
46+
builder: (context, tabIndex) {
47+
return FilterChip(
48+
selected: tabIndex == widget.index,
49+
label: Text(widget.title),
50+
visualDensity: VisualDensity.compact,
51+
showCheckmark: false,
52+
onSelected: (bool _) {
53+
_scrollToChip(widget.index, context);
54+
BlocProvider.of<BooksTabIndexCubit>(context)
55+
.setTabIndex(widget.index);
56+
widget.tabController.index = widget.index;
57+
},
58+
);
5559
},
5660
),
5761
);

0 commit comments

Comments
 (0)