chore: add not found for empty lists

This commit is contained in:
Kingkor Roy Tirtho 2023-12-08 13:58:12 +06:00
parent 24a2294512
commit 581b241f99
5 changed files with 62 additions and 36 deletions

View File

@ -9,6 +9,7 @@ import 'package:spotube/collections/fake.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/album/album_card.dart'; import 'package:spotube/components/album/album_card.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart'; import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
import 'package:spotube/components/shared/waypoint.dart'; import 'package:spotube/components/shared/waypoint.dart';
@ -84,30 +85,37 @@ class UserAlbums extends HookConsumerWidget {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
controller: controller, controller: controller,
child: Skeletonizer( child: Skeletonizer(
enabled: albums.isEmpty, enabled: albums.isEmpty && albumsQuery.isLoadingNextPage,
child: Wrap( child: Center(
runSpacing: 20, child: Wrap(
alignment: WrapAlignment.center, runSpacing: 20,
runAlignment: WrapAlignment.center, alignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center, runAlignment: WrapAlignment.center,
children: [ crossAxisAlignment: WrapCrossAlignment.center,
if (albums.isEmpty) children: [
...List.generate( if (albums.isEmpty && albumsQuery.isLoadingNextPage)
10, ...List.generate(
(index) => AlbumCard(FakeData.album), 10,
), (index) => AlbumCard(FakeData.album),
for (final album in albums) )
AlbumCard( else if (albums.isEmpty)
TypeConversionUtils.simpleAlbum_X_Album(album), const Row(
), mainAxisAlignment: MainAxisAlignment.center,
if (albums.isNotEmpty && albumsQuery.hasNextPage) children: [NotFound()],
Waypoint( ),
controller: controller, for (final album in albums)
isGrid: true, AlbumCard(
onTouchEdge: albumsQuery.fetchNext, TypeConversionUtils.simpleAlbum_X_Album(album),
child: AlbumCard(FakeData.album), ),
) if (albums.isNotEmpty && albumsQuery.hasNextPage)
], Waypoint(
controller: controller,
isGrid: true,
onTouchEdge: albumsQuery.fetchNext,
child: AlbumCard(FakeData.album),
)
],
),
), ),
), ),
), ),

View File

@ -9,6 +9,7 @@ import 'package:spotube/collections/fake.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart'; import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
import 'package:spotube/components/artist/artist_card.dart'; import 'package:spotube/components/artist/artist_card.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/provider/authentication_provider.dart';
@ -97,10 +98,20 @@ class UserArtists extends HookConsumerWidget {
children: artistQuery.isLoading children: artistQuery.isLoading
? List.generate( ? List.generate(
10, (index) => ArtistCard(FakeData.artist)) 10, (index) => ArtistCard(FakeData.artist))
: filteredArtists : filteredArtists.isEmpty
.mapIndexed( ? [
(index, artist) => ArtistCard(artist)) const Row(
.toList(), mainAxisAlignment:
MainAxisAlignment.center,
children: [
NotFound(),
],
)
]
: filteredArtists
.mapIndexed((index, artist) =>
ArtistCard(artist))
.toList(),
), ),
), ),
), ),

View File

@ -17,6 +17,7 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/collections/fake.dart'; import 'package:spotube/collections/fake.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/expandable_search/expandable_search.dart'; import 'package:spotube/components/shared/expandable_search/expandable_search.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/components/shared/sort_tracks_dropdown.dart'; import 'package:spotube/components/shared/sort_tracks_dropdown.dart';
import 'package:spotube/components/shared/track_tile/track_tile.dart'; import 'package:spotube/components/shared/track_tile/track_tile.dart';
@ -255,6 +256,15 @@ class UserLocalTracks extends HookConsumerWidget {
.toList(); .toList();
}, [searchController.text, sortedTracks]); }, [searchController.text, sortedTracks]);
if (!trackSnapshot.isLoading && filteredTracks.isEmpty) {
return const Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [NotFound()],
),
);
}
return Expanded( return Expanded(
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: () async { onRefresh: () async {

View File

@ -8,6 +8,7 @@ import 'package:skeletonizer/skeletonizer.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/fake.dart'; import 'package:spotube/collections/fake.dart';
import 'package:spotube/components/shared/expandable_search/expandable_search.dart'; import 'package:spotube/components/shared/expandable_search/expandable_search.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart';
import 'package:spotube/components/shared/track_tile/track_tile.dart'; import 'package:spotube/components/shared/track_tile/track_tile.dart';
import 'package:spotube/components/shared/tracks_view/sections/body/track_view_body_headers.dart'; import 'package:spotube/components/shared/tracks_view/sections/body/track_view_body_headers.dart';
import 'package:spotube/components/shared/tracks_view/sections/body/use_is_user_playlist.dart'; import 'package:spotube/components/shared/tracks_view/sections/body/use_is_user_playlist.dart';
@ -92,14 +93,9 @@ class TrackViewBodySection extends HookConsumerWidget {
index: 0, index: 0,
), ),
), ),
emptyBuilder: (context) => Skeletonizer( emptyBuilder: (context) => const Row(
enabled: true, mainAxisAlignment: MainAxisAlignment.center,
child: Column( children: [NotFound()],
children: List.generate(
10,
(index) => TrackTile(track: FakeData.track, index: index),
),
),
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final track = tracks[index]; final track = tracks[index];

View File

@ -52,6 +52,7 @@ ThemeData theme(Color seed, Brightness brightness, bool isAmoled) {
), ),
sliderTheme: SliderThemeData(overlayShape: SliderComponentShape.noOverlay), sliderTheme: SliderThemeData(overlayShape: SliderComponentShape.noOverlay),
searchBarTheme: SearchBarThemeData( searchBarTheme: SearchBarThemeData(
textStyle: const MaterialStatePropertyAll(TextStyle(fontSize: 15)),
constraints: const BoxConstraints(maxWidth: double.infinity), constraints: const BoxConstraints(maxWidth: double.infinity),
padding: const MaterialStatePropertyAll(EdgeInsets.all(8)), padding: const MaterialStatePropertyAll(EdgeInsets.all(8)),
backgroundColor: MaterialStatePropertyAll( backgroundColor: MaterialStatePropertyAll(