Skip to content

Commit 6c030a3

Browse files
authored
feat: add sorting for Artists screen (#125)
1 parent e586b3d commit 6c030a3

2 files changed

Lines changed: 45 additions & 3 deletions

File tree

lib/providers/artist_provider.dart

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:app/enums.dart';
12
import 'package:app/mixins/stream_subscriber.dart';
23
import 'package:app/models/models.dart';
34
import 'package:app/providers/providers.dart';
@@ -8,6 +9,22 @@ class ArtistProvider with ChangeNotifier, StreamSubscriber {
89
var artists = <Artist>[];
910
final _vault = <dynamic, Artist>{};
1011
var _page = 1;
12+
var _sortField = 'name';
13+
var _sortOrder = SortOrder.asc;
14+
15+
String get sortField => _sortField;
16+
SortOrder get sortOrder => _sortOrder;
17+
18+
set sortField(String field) {
19+
if (field != _sortField) {
20+
_sortOrder = SortOrder.asc;
21+
}
22+
_sortField = field;
23+
}
24+
25+
set sortOrder(SortOrder order) {
26+
_sortOrder = order;
27+
}
1128

1229
ArtistProvider() {
1330
subscribe(AuthProvider.userLoggedOutStream.listen((_) {
@@ -68,7 +85,9 @@ class ArtistProvider with ChangeNotifier, StreamSubscriber {
6885
}
6986

7087
Future<void> paginate() async {
71-
final res = await get('artists?page=$_page');
88+
final res = await get(
89+
'artists?page=$_page&sort=$_sortField&order=${_sortOrder.value}',
90+
);
7291

7392
final _artists = (res['data'] as List)
7493
.map<Artist>((artist) => Artist.fromJson(artist))

lib/ui/screens/artists.dart

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:app/providers/providers.dart';
55
import 'package:app/router.dart';
66
import 'package:app/ui/placeholders/artists_screen_placeholder.dart';
77
import 'package:app/ui/widgets/widgets.dart';
8+
import 'package:app/values/values.dart';
89
import 'package:flutter/cupertino.dart';
910
import 'package:flutter/material.dart';
1011
import 'package:provider/provider.dart';
@@ -101,9 +102,31 @@ class _ArtistsScreenState extends State<ArtistsScreen> {
101102
child: CustomScrollView(
102103
controller: _scrollController,
103104
slivers: [
104-
const CupertinoSliverNavigationBar(
105+
CupertinoSliverNavigationBar(
105106
backgroundColor: AppColors.staticScreenHeaderBackground,
106-
largeTitle: LargeTitle(text: 'Artists'),
107+
largeTitle: const LargeTitle(text: 'Artists'),
108+
trailing: Transform.scale(
109+
scale: 0.8,
110+
alignment: Alignment.centerRight,
111+
child: SortButton(
112+
fields: const ['name', 'created_at'],
113+
currentField: _artistProvider.sortField,
114+
currentOrder: _artistProvider.sortOrder,
115+
onMenuItemSelected: (sortConfig) {
116+
setState(() {
117+
_artistProvider.sortField = sortConfig.field;
118+
_artistProvider.sortOrder = sortConfig.order;
119+
});
120+
121+
_artistProvider.artists.clear();
122+
_artistProvider.refresh().then((_) {
123+
if (_scrollController.hasClients) {
124+
_scrollController.jumpTo(0);
125+
}
126+
});
127+
},
128+
),
129+
),
107130
),
108131
SliverList(
109132
delegate: SliverChildBuilderDelegate((

0 commit comments

Comments
 (0)