From 5b855e1e55857561951aa97fe92e26f29b95f872 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Mon, 24 Jan 2022 19:00:48 +0600 Subject: [PATCH] ArtistProfile top tracks section added --- lib/components/Artist/ArtistProfile.dart | 121 +++++++++++++++++++++ lib/components/Shared/TracksTableView.dart | 1 - lib/helpers/readable-number.dart | 6 +- 3 files changed, 124 insertions(+), 4 deletions(-) diff --git a/lib/components/Artist/ArtistProfile.dart b/lib/components/Artist/ArtistProfile.dart index 86f9115a..0a3751f0 100644 --- a/lib/components/Artist/ArtistProfile.dart +++ b/lib/components/Artist/ArtistProfile.dart @@ -4,10 +4,15 @@ import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/components/Album/AlbumCard.dart'; +import 'package:spotube/components/Album/AlbumView.dart'; import 'package:spotube/components/Artist/ArtistAlbumView.dart'; import 'package:spotube/components/Artist/ArtistCard.dart'; +import 'package:spotube/components/Shared/LinkText.dart'; import 'package:spotube/components/Shared/PageWindowTitleBar.dart'; +import 'package:spotube/helpers/artists-to-clickable-artists.dart'; import 'package:spotube/helpers/readable-number.dart'; +import 'package:spotube/helpers/zero-pad-num-str.dart'; +import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/SpotifyDI.dart'; class ArtistProfile extends StatefulWidget { @@ -32,6 +37,7 @@ class _ArtistProfileState extends State { if (!snapshot.hasData) { return const Center(child: CircularProgressIndicator.adaptive()); } + return SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( @@ -121,6 +127,121 @@ class _ArtistProfileState extends State { ], ), const SizedBox(height: 50), + FutureBuilder>( + future: + spotify.artists.getTopTracks(snapshot.data!.id!, "US"), + builder: (context, trackSnapshot) { + if (!trackSnapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive()); + } + Playback playback = context.watch(); + var isPlaylistPlaying = + playback.currentPlaylist?.id == snapshot.data?.id; + playPlaylist(List tracks, {Track? currentTrack}) { + currentTrack ??= tracks.first; + if (!isPlaylistPlaying) { + playback.setCurrentPlaylist = CurrentPlaylist( + tracks: tracks, + id: snapshot.data!.id!, + name: "${snapshot.data!.name!} To Tracks", + thumbnail: snapshot.data!.images!.first.url!, + ); + playback.setCurrentTrack = currentTrack; + } else if (isPlaylistPlaying && + currentTrack.id != null && + currentTrack.id != playback.currentTrack?.id) { + playback.setCurrentTrack = currentTrack; + } + } + + return Column(children: [ + Row( + children: [ + Text( + "Top Tracks", + style: Theme.of(context).textTheme.headline4, + ), + IconButton( + icon: Icon(isPlaylistPlaying + ? Icons.stop_circle_rounded + : Icons.play_circle_filled_rounded), + color: Theme.of(context).primaryColor, + onPressed: trackSnapshot.hasData + ? () => + playPlaylist(trackSnapshot.data!.toList()) + : null, + ) + ], + ), + ...trackSnapshot.data?.map((track) { + String duration = + "${track.duration?.inMinutes.remainder(60)}:${zeroPadNumStr(track.duration?.inSeconds.remainder(60) ?? 0)}"; + return Row( + children: [ + if (track.album != null && + track.album!.images!.isNotEmpty) + Padding( + padding: const EdgeInsets.all(8.0), + child: ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(5)), + child: CachedNetworkImage( + placeholder: (context, url) { + return Container( + height: 40, + width: 40, + color: Colors.green[300], + ); + }, + imageUrl: + track.album!.images!.last.url!, + maxHeightDiskCache: 40, + maxWidthDiskCache: 40, + ), + ), + ), + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + track.name ?? "", + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 17, + ), + overflow: TextOverflow.ellipsis, + ), + artistsToClickableArtists( + track.artists ?? []), + ], + ), + ), + Expanded( + child: Row( + children: [ + LinkText( + track.album!.name!, + MaterialPageRoute( + builder: (context) => + AlbumView(track.album!), + ), + ), + ], + ), + ), + const SizedBox(width: 10), + Text(duration) + ], + ); + }).toList() ?? + [], + ]); + }, + ), + const SizedBox(height: 50), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/components/Shared/TracksTableView.dart b/lib/components/Shared/TracksTableView.dart index e566461d..aab11dce 100644 --- a/lib/components/Shared/TracksTableView.dart +++ b/lib/components/Shared/TracksTableView.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/components/Album/AlbumView.dart'; -import 'package:spotube/components/Artist/ArtistProfile.dart'; import 'package:spotube/components/Shared/LinkText.dart'; import 'package:spotube/helpers/artists-to-clickable-artists.dart'; import 'package:spotube/helpers/zero-pad-num-str.dart'; diff --git a/lib/helpers/readable-number.dart b/lib/helpers/readable-number.dart index 05a169b7..9f84489c 100644 --- a/lib/helpers/readable-number.dart +++ b/lib/helpers/readable-number.dart @@ -1,12 +1,12 @@ String toReadableNumber(double num) { if (num > 999 && num < 99999) { - return "${(num / 1000).toStringAsFixed(1)}K"; + return "${(num / 1000).toStringAsFixed(0)}K"; } else if (num > 99999 && num < 999999) { return "${(num / 1000).toStringAsFixed(0)}K"; } else if (num > 999999 && num < 999999999) { - return "${(num / 1000000).toStringAsFixed(1)}M"; + return "${(num / 1000000).toStringAsFixed(0)}M"; } else if (num > 999999999) { - return "${(num / 1000000000).toStringAsFixed(1)}B"; + return "${(num / 1000000000).toStringAsFixed(0)}B"; } else { return num.toString(); }