import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../api/endpoints/likes.dart'; import '../likes/like_button.dart'; import '../models/album.dart'; import '../player/player_provider.dart'; import '../theme/theme_extension.dart'; import 'library_providers.dart'; import 'widgets/album_card.dart'; class ArtistDetailScreen extends ConsumerWidget { const ArtistDetailScreen({required this.id, super.key}); final String id; @override Widget build(BuildContext context, WidgetRef ref) { final fs = Theme.of(context).extension()!; final artist = ref.watch(artistProvider(id)); final albums = ref.watch(artistAlbumsProvider(id)); return Scaffold( appBar: AppBar(), backgroundColor: fs.obsidian, body: artist.when( error: (e, _) => Center(child: Text('$e', style: TextStyle(color: fs.error))), loading: () => const Center(child: CircularProgressIndicator()), data: (a) => ListView(children: [ Padding( padding: const EdgeInsets.all(16), child: Row(children: [ Container( width: 96, height: 96, decoration: BoxDecoration(color: fs.slate, shape: BoxShape.circle), ), const SizedBox(width: 16), Expanded( child: Text( a.name, style: TextStyle( color: fs.parchment, fontFamily: fs.display.fontFamily, fontSize: 24, ), ), ), Container( width: 48, height: 48, decoration: BoxDecoration(color: fs.accent, shape: BoxShape.circle), child: IconButton( icon: Icon(Icons.play_arrow, color: fs.parchment), onPressed: () async { final tracks = await ref.read(artistTracksProvider(id).future); if (tracks.isEmpty) return; final shuffled = [...tracks]..shuffle(); ref.read(playerActionsProvider).playTracks(shuffled); }, ), ), LikeButton(kind: LikeKind.artist, id: a.id, size: 28), ]), ), const Padding( padding: EdgeInsets.fromLTRB(16, 16, 16, 8), child: Text('Albums', style: TextStyle(fontSize: 16)), ), albums.when( error: (e, _) => Center(child: Text('$e', style: TextStyle(color: fs.error))), loading: () => const Padding(padding: EdgeInsets.all(16), child: Center(child: CircularProgressIndicator())), data: (list) => GridView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.all(8), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 0.8, ), itemCount: list.length, itemBuilder: (_, i) { final AlbumRef album = list[i]; return AlbumCard(album: album, onTap: () => context.push('/albums/${album.id}')); }, ), ), ]), ), ); } }