Skip to content

Commit bfbbb69

Browse files
committed
Add song filter
1 parent a449f75 commit bfbbb69

File tree

6 files changed

+176
-1
lines changed

6 files changed

+176
-1
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
import 'package:vocadb_app/src/features/songs/presentation/songs_list_screen/songs_list_params_state.dart';
4+
import 'package:vocadb_app/src/features/songs/presentation/widgets/dropdown_song_sort.dart';
5+
import 'package:vocadb_app/src/features/songs/presentation/widgets/dropdown_song_types.dart';
6+
import 'package:vocadb_app/src/features/tags/presentation/tag_widgets/tag_input.dart';
7+
8+
class SongsFilterScreen extends StatelessWidget {
9+
const SongsFilterScreen(
10+
{super.key, this.onSortChanged, this.onSongTypesChanged});
11+
12+
final Function(String?)? onSongTypesChanged;
13+
14+
final Function(String?)? onSortChanged;
15+
16+
@override
17+
Widget build(BuildContext context) {
18+
return Scaffold(
19+
appBar: AppBar(
20+
title: const Text('Filter'),
21+
),
22+
body: Consumer(
23+
builder: (context, ref, child) {
24+
final state = ref.watch(songsListParamsStateProvider);
25+
26+
return ListView(
27+
children: [
28+
DropdownSongTypes(
29+
value: state.songTypes ?? '',
30+
onChanged: (value) =>
31+
onSongTypesChanged?.call(value) ??
32+
ref
33+
.read(songsListParamsStateProvider.notifier)
34+
.updateSongTypes(value!),
35+
),
36+
DropdownSongSort(
37+
value: 'Name',
38+
onChanged: (value) =>
39+
onSortChanged?.call(value) ??
40+
ref
41+
.read(songsListParamsStateProvider.notifier)
42+
.updateSort(value!),
43+
),
44+
const Divider(),
45+
const TagInput(),
46+
],
47+
);
48+
},
49+
),
50+
);
51+
}
52+
}

lib/src/features/songs/presentation/songs_list_screen/songs_list_screen.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:vocadb_app/src/features/songs/data/song_repository.dart';
77
import 'package:vocadb_app/src/features/songs/domain/song.dart';
88
import 'package:vocadb_app/src/features/songs/presentation/songs_list/songs_list_view.dart';
99
import 'package:vocadb_app/src/features/songs/presentation/songs_list_screen/songs_list_params_state.dart';
10+
import 'package:vocadb_app/src/routing/app_route_context.dart';
1011

1112
class SongsListScreen extends ConsumerWidget {
1213
const SongsListScreen({super.key, this.onSelectSong});
@@ -24,7 +25,7 @@ class SongsListScreen extends ConsumerWidget {
2425
IconButton(
2526
key: filterKey,
2627
icon: const Icon(Icons.tune),
27-
onPressed: () => {}
28+
onPressed: () => context.goSongsListFilterScreen(),
2829
),
2930
],
3031
onSubmitted: (value) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:vocadb_app/src/common_widgets/dropdown_tile.dart';
3+
4+
class DropdownSongSort extends StatelessWidget {
5+
const DropdownSongSort({super.key, required this.value, this.onChanged});
6+
7+
static const dropdownKey = Key('dropdown-artist-sort-key');
8+
9+
final String value;
10+
11+
final Function(String?)? onChanged;
12+
13+
@override
14+
Widget build(BuildContext context) {
15+
return DropdownTile(
16+
dropdownButtonKey: dropdownKey,
17+
value: value,
18+
label: 'Sort',
19+
onChanged: onChanged,
20+
items: const [
21+
DropdownMenuItem<String>(
22+
value: 'Name',
23+
child: Text('Name'),
24+
),
25+
DropdownMenuItem<String>(
26+
value: 'AdditionDate',
27+
child: Text('Addition date'),
28+
),
29+
DropdownMenuItem<String>(
30+
value: 'PublishDate',
31+
child: Text('Publish date'),
32+
),
33+
DropdownMenuItem<String>(
34+
value: 'FavoritedTimes',
35+
child: Text('Times favorited'),
36+
),
37+
DropdownMenuItem<String>(
38+
value: 'RatingScore',
39+
child: Text('Rating score'),
40+
),
41+
],
42+
);
43+
}
44+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:vocadb_app/src/common_widgets/dropdown_tile.dart';
3+
4+
class DropdownSongTypes extends StatelessWidget {
5+
const DropdownSongTypes({super.key, required this.value, this.onChanged});
6+
7+
static const dropdownKey = Key('dropdown-song-types-key');
8+
9+
final String value;
10+
11+
final Function(String?)? onChanged;
12+
13+
@override
14+
Widget build(BuildContext context) {
15+
return DropdownTile(
16+
dropdownButtonKey: dropdownKey,
17+
value: value,
18+
label: 'Song Types',
19+
onChanged: onChanged,
20+
items: const [
21+
DropdownMenuItem<String>(
22+
value: '',
23+
child: Text('Unspecified'),
24+
),
25+
DropdownMenuItem<String>(
26+
value: 'Original',
27+
child: Text('Original song'),
28+
),
29+
DropdownMenuItem<String>(
30+
value: 'Remaster',
31+
child: Text('Remaster'),
32+
),
33+
DropdownMenuItem<String>(
34+
value: 'Remix',
35+
child: Text('Remix'),
36+
),
37+
DropdownMenuItem<String>(
38+
value: 'Cover',
39+
child: Text('Cover'),
40+
),
41+
DropdownMenuItem<String>(
42+
value: 'Instrumental',
43+
child: Text('Instrumental'),
44+
),
45+
DropdownMenuItem<String>(
46+
value: 'Mashup',
47+
child: Text('Mashup'),
48+
),
49+
DropdownMenuItem<String>(
50+
value: 'MusicPV',
51+
child: Text('Music PV'),
52+
),
53+
DropdownMenuItem<String>(
54+
value: 'DramaPV',
55+
child: Text('Drama PV'),
56+
),
57+
DropdownMenuItem<String>(
58+
value: 'Other',
59+
child: Text('Other'),
60+
),
61+
],
62+
);
63+
}
64+
}

lib/src/routing/app_route_context.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ extension AppRouteContext on BuildContext {
4141

4242
Future<void> goArtistsListFilterScreen() async {
4343
goNamed(AppRoute.artistsListFilter.name);
44+
}
4445

46+
Future<void> goSongsListFilterScreen() async {
47+
goNamed(AppRoute.songsListFilter.name);
4548
}
4649

4750
Future<void> goEntryDetail(Entry entry) async {

lib/src/routing/app_router.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
33
import 'package:go_router/go_router.dart';
44
import 'package:vocadb_app/src/features/albums/domain/album.dart';
55
import 'package:vocadb_app/src/features/albums/presentation/album_detail_screen/album_detail_screen.dart';
6+
import 'package:vocadb_app/src/features/songs/presentation/songs_list_screen/songs_list_filter_screen.dart';
67
import 'package:vocadb_app/src/features/songs/presentation/songs_list_screen/songs_list_screen.dart';
78
import 'package:vocadb_app/src/features/users/presentation/user_albums_screen/user_albums_filter_screen.dart';
89
import 'package:vocadb_app/src/features/users/presentation/user_albums_screen/user_albums_screen.dart';
@@ -37,6 +38,7 @@ enum AppRoute {
3738
account,
3839
signIn,
3940
songsList,
41+
songsListFilter,
4042
albumDetail,
4143
artistDetail,
4244
artistsList,
@@ -94,6 +96,15 @@ final goRouterProvider = Provider.autoDispose<GoRouter>(
9496
});
9597
},
9698
routes: [
99+
GoRoute(
100+
path: 'Filter',
101+
name: AppRoute.songsListFilter.name,
102+
pageBuilder: (context, state) => MaterialPage(
103+
key: state.pageKey,
104+
fullscreenDialog: true,
105+
child: const SongsFilterScreen(),
106+
),
107+
),
97108
GoRoute(
98109
path: ':id',
99110
name: AppRoute.songDetail.name,

0 commit comments

Comments
 (0)