WIP Search
This commit is contained in:
parent
94eb363245
commit
a2ef7da707
5 changed files with 102 additions and 20 deletions
|
@ -1,10 +1,16 @@
|
|||
import 'package:canal/models/search_type.dart';
|
||||
import 'package:canal/widgets/select_button.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:canal/models/tab.dart';
|
||||
import 'package:canal/helpers/extension_helper.dart';
|
||||
import 'package:canal/providers/search_provider.dart';
|
||||
import 'package:canal/widgets/thumbnail.dart';
|
||||
import 'package:dart_ytmusic_api/types.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:canal/widgets/select_button.dart';
|
||||
import 'package:canal/models/search_type.dart';
|
||||
import 'package:canal/models/tab.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:yaru/yaru.dart';
|
||||
|
||||
class SearchTab extends HookWidget implements TabPage {
|
||||
class SearchTab extends HookConsumerWidget implements TabPage {
|
||||
const SearchTab({super.key});
|
||||
|
||||
@override
|
||||
|
@ -14,13 +20,65 @@ class SearchTab extends HookWidget implements TabPage {
|
|||
String get title => "Search";
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => ListView(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 4),
|
||||
children: [
|
||||
SelectButton(
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final type = useState(SearchType.any);
|
||||
final search = useState("");
|
||||
final debouncedSearch = useDebounced(search, Duration(milliseconds: 250));
|
||||
|
||||
return ListView(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 4),
|
||||
children: [
|
||||
YaruSearchField(
|
||||
hintText: "Search YouTube music...",
|
||||
fillColor: Theme.of(context).colorScheme.surface,
|
||||
onChanged: (value) => search.value = value,
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: SelectButton(
|
||||
value: type.value,
|
||||
values: SearchType.values,
|
||||
defaultValue: SearchType.any,
|
||||
)
|
||||
],
|
||||
);
|
||||
onChanged: (value) => type.value = value,
|
||||
),
|
||||
),
|
||||
Divider(),
|
||||
SizedBox(height: 8),
|
||||
ref
|
||||
.watch(searchProviderProvider(
|
||||
search: search.value, searchType: type.value))
|
||||
.betterWhen(
|
||||
data: (results) => Wrap(
|
||||
children: results
|
||||
.map((result) => SizedBox(
|
||||
height: 64,
|
||||
width: 64,
|
||||
child: switch (result) {
|
||||
SongDetailed _ => Thumbnail(
|
||||
url: result.thumbnails.first.url,
|
||||
onClick: () {},
|
||||
),
|
||||
AlbumDetailed _ => Thumbnail(
|
||||
url: result.thumbnails.first.url,
|
||||
onClick: () {},
|
||||
),
|
||||
VideoDetailed _ => Thumbnail(
|
||||
url: result.thumbnails.first.url,
|
||||
onClick: () {},
|
||||
),
|
||||
ArtistDetailed _ => Thumbnail(
|
||||
url: result.thumbnails.first.url,
|
||||
onClick: () {},
|
||||
),
|
||||
PlaylistDetailed _ => Thumbnail(
|
||||
url: result.thumbnails.first.url,
|
||||
onClick: () {},
|
||||
),
|
||||
_ => throw Exception(
|
||||
"Unknown Detailed Result: ${result.runtimeType}",
|
||||
),
|
||||
}))
|
||||
.toList())),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue