chore: track view play not working properly

This commit is contained in:
Kingkor Roy Tirtho 2023-11-27 19:34:18 +06:00
parent 64080ef273
commit 722dd86810
5 changed files with 296 additions and 269 deletions

View File

@ -25,8 +25,6 @@ class TrackViewBodySection extends HookConsumerWidget {
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
final props = InheritedTrackView.of(context);
final trackViewState = ref.watch(trackViewProvider(props.tracks));
final searchController = useTextEditingController();
final searchFocus = useFocusNode();
@ -35,12 +33,19 @@ class TrackViewBodySection extends HookConsumerWidget {
final isFiltering = useState(false);
final uniqTracks = useMemoized(() {
final trackIds = props.tracks.map((e) => e.id).toSet();
return props.tracks.where((e) => trackIds.remove(e.id)).toList();
}, [props.tracks]);
final trackViewState = ref.watch(trackViewProvider(uniqTracks));
final tracks = useMemoized(() {
List<Track> filteredTracks;
if (searchQuery.isEmpty) {
filteredTracks = props.tracks;
filteredTracks = uniqTracks;
} else {
filteredTracks = props.tracks
filteredTracks = uniqTracks
.map((e) => (weightedRatio(e.name!, searchQuery), e))
.sorted((a, b) => b.$1.compareTo(a.$1))
.where((e) => e.$1 > 50)
@ -48,7 +53,7 @@ class TrackViewBodySection extends HookConsumerWidget {
.toList();
}
return ServiceUtils.sortTracks(filteredTracks, trackViewState.sortBy);
}, [trackViewState.sortBy, searchQuery, props.tracks]);
}, [trackViewState.sortBy, searchQuery, uniqTracks]);
final isUserPlaylist = useIsUserPlaylist(ref, props.collectionId);
@ -106,8 +111,9 @@ class TrackViewBodySection extends HookConsumerWidget {
if (isActive || playlist.tracks.contains(track)) {
await playlistNotifier.jumpToTrack(track);
} else {
final tracks = await props.pagination.onFetchAll();
await playlistNotifier.load(
props.tracks,
tracks,
initialIndex: index,
autoPlay: true,
);

View File

@ -9,17 +9,21 @@ extension FetchAllTracks on InfiniteQuery<List<Track>, dynamic, int> {
return pages.expand((page) => page).toList();
}
final tracks = await getAllTracks();
final pagedTracks = tracks.fold(
<int, List<Track>>{},
(acc, element) {
final index = acc.length;
final groupIndex = index ~/ 20;
final group = acc[groupIndex] ?? [];
group.add(element);
acc[groupIndex] = group;
return acc;
},
);
final numOfPages = (tracks.length / 20).round();
final Map<int, List<Track>> pagedTracks = {};
for (var i = 0; i < numOfPages; i++) {
if (i == numOfPages - 1) {
final pageTracks = tracks.sublist(i * 20);
pagedTracks[i] = pageTracks;
break;
}
final pageTracks = tracks.sublist(i * 20, (i + 1) * 20);
pagedTracks[i] = pageTracks;
}
for (final group in pagedTracks.entries) {
setPageData(group.key, group.value);

View File

@ -38,9 +38,9 @@ class ArtistPageFooter extends HookConsumerWidget {
BlendMode.darken,
),
image: UniversalImage.imageProvider(
summary.data!.originalimage?.source_ ?? artistImage,
height: summary.data!.originalimage?.height.toDouble(),
width: summary.data!.originalimage?.width.toDouble(),
summary.data!.thumbnail?.source_ ?? artistImage,
height: summary.data!.thumbnail?.height.toDouble(),
width: summary.data!.thumbnail?.width.toDouble(),
),
fit: BoxFit.cover,
alignment: Alignment.center,

View File

@ -242,13 +242,17 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
},
);
final controller = useScrollController();
return Scaffold(
appBar: PageWindowTitleBar(
leading: const BackButton(),
title: Text(context.l10n.generate_playlist),
centerTitle: true,
),
body: Center(
body: Scrollbar(
controller: controller,
child: Center(
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: Breakpoints.lg),
child: SliderTheme(
@ -257,7 +261,11 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
),
child: SafeArea(
child: LayoutBuilder(builder: (context, constrains) {
return ListView(
return ScrollConfiguration(
behavior: ScrollConfiguration.of(context)
.copyWith(scrollbars: false),
child: ListView(
controller: controller,
padding: const EdgeInsets.all(16),
children: [
ValueListenableBuilder(
@ -283,7 +291,8 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
child: Text(
value.round().toString(),
style: textTheme.bodyLarge?.copyWith(
color: theme.colorScheme.primaryContainer,
color: theme
.colorScheme.primaryContainer,
),
),
),
@ -432,7 +441,11 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
},
presets: {
context.l10n.short: (min: 50, target: 90, max: 120),
context.l10n.medium: (min: 120, target: 180, max: 200),
context.l10n.medium: (
min: 120,
target: 180,
max: 200
),
context.l10n.long: (min: 480, target: 560, max: 640)
},
),
@ -469,10 +482,12 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
final PlaylistGenerateResultRouteState
routeState = (
seeds: (
artists:
artists.value.map((a) => a.id!).toList(),
tracks:
tracks.value.map((t) => t.id!).toList(),
artists: artists.value
.map((a) => a.id!)
.toList(),
tracks: tracks.value
.map((t) => t.id!)
.toList(),
genres: genres.value
),
market: market.value,
@ -501,12 +516,14 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
},
),
],
),
);
}),
),
),
),
),
),
);
}
}

View File

@ -53,7 +53,7 @@ class PlaylistPage extends HookConsumerWidget {
),
pagination: PaginationProps.fromQuery(
tracksQuery,
onFetchAll: () async {
onFetchAll: () {
return tracksQuery.fetchAllTracks(
getAllTracks: () async {
final res = await spotify.playlists