mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 16:05:18 +00:00
chore: track view play not working properly
This commit is contained in:
parent
64080ef273
commit
722dd86810
@ -25,8 +25,6 @@ class TrackViewBodySection extends HookConsumerWidget {
|
|||||||
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
|
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
|
||||||
final props = InheritedTrackView.of(context);
|
final props = InheritedTrackView.of(context);
|
||||||
|
|
||||||
final trackViewState = ref.watch(trackViewProvider(props.tracks));
|
|
||||||
|
|
||||||
final searchController = useTextEditingController();
|
final searchController = useTextEditingController();
|
||||||
final searchFocus = useFocusNode();
|
final searchFocus = useFocusNode();
|
||||||
|
|
||||||
@ -35,12 +33,19 @@ class TrackViewBodySection extends HookConsumerWidget {
|
|||||||
|
|
||||||
final isFiltering = useState(false);
|
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(() {
|
final tracks = useMemoized(() {
|
||||||
List<Track> filteredTracks;
|
List<Track> filteredTracks;
|
||||||
if (searchQuery.isEmpty) {
|
if (searchQuery.isEmpty) {
|
||||||
filteredTracks = props.tracks;
|
filteredTracks = uniqTracks;
|
||||||
} else {
|
} else {
|
||||||
filteredTracks = props.tracks
|
filteredTracks = uniqTracks
|
||||||
.map((e) => (weightedRatio(e.name!, searchQuery), e))
|
.map((e) => (weightedRatio(e.name!, searchQuery), e))
|
||||||
.sorted((a, b) => b.$1.compareTo(a.$1))
|
.sorted((a, b) => b.$1.compareTo(a.$1))
|
||||||
.where((e) => e.$1 > 50)
|
.where((e) => e.$1 > 50)
|
||||||
@ -48,7 +53,7 @@ class TrackViewBodySection extends HookConsumerWidget {
|
|||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
return ServiceUtils.sortTracks(filteredTracks, trackViewState.sortBy);
|
return ServiceUtils.sortTracks(filteredTracks, trackViewState.sortBy);
|
||||||
}, [trackViewState.sortBy, searchQuery, props.tracks]);
|
}, [trackViewState.sortBy, searchQuery, uniqTracks]);
|
||||||
|
|
||||||
final isUserPlaylist = useIsUserPlaylist(ref, props.collectionId);
|
final isUserPlaylist = useIsUserPlaylist(ref, props.collectionId);
|
||||||
|
|
||||||
@ -106,8 +111,9 @@ class TrackViewBodySection extends HookConsumerWidget {
|
|||||||
if (isActive || playlist.tracks.contains(track)) {
|
if (isActive || playlist.tracks.contains(track)) {
|
||||||
await playlistNotifier.jumpToTrack(track);
|
await playlistNotifier.jumpToTrack(track);
|
||||||
} else {
|
} else {
|
||||||
|
final tracks = await props.pagination.onFetchAll();
|
||||||
await playlistNotifier.load(
|
await playlistNotifier.load(
|
||||||
props.tracks,
|
tracks,
|
||||||
initialIndex: index,
|
initialIndex: index,
|
||||||
autoPlay: true,
|
autoPlay: true,
|
||||||
);
|
);
|
||||||
|
@ -9,17 +9,21 @@ extension FetchAllTracks on InfiniteQuery<List<Track>, dynamic, int> {
|
|||||||
return pages.expand((page) => page).toList();
|
return pages.expand((page) => page).toList();
|
||||||
}
|
}
|
||||||
final tracks = await getAllTracks();
|
final tracks = await getAllTracks();
|
||||||
final pagedTracks = tracks.fold(
|
|
||||||
<int, List<Track>>{},
|
final numOfPages = (tracks.length / 20).round();
|
||||||
(acc, element) {
|
|
||||||
final index = acc.length;
|
final Map<int, List<Track>> pagedTracks = {};
|
||||||
final groupIndex = index ~/ 20;
|
|
||||||
final group = acc[groupIndex] ?? [];
|
for (var i = 0; i < numOfPages; i++) {
|
||||||
group.add(element);
|
if (i == numOfPages - 1) {
|
||||||
acc[groupIndex] = group;
|
final pageTracks = tracks.sublist(i * 20);
|
||||||
return acc;
|
pagedTracks[i] = pageTracks;
|
||||||
},
|
break;
|
||||||
);
|
}
|
||||||
|
|
||||||
|
final pageTracks = tracks.sublist(i * 20, (i + 1) * 20);
|
||||||
|
pagedTracks[i] = pageTracks;
|
||||||
|
}
|
||||||
|
|
||||||
for (final group in pagedTracks.entries) {
|
for (final group in pagedTracks.entries) {
|
||||||
setPageData(group.key, group.value);
|
setPageData(group.key, group.value);
|
||||||
|
@ -38,9 +38,9 @@ class ArtistPageFooter extends HookConsumerWidget {
|
|||||||
BlendMode.darken,
|
BlendMode.darken,
|
||||||
),
|
),
|
||||||
image: UniversalImage.imageProvider(
|
image: UniversalImage.imageProvider(
|
||||||
summary.data!.originalimage?.source_ ?? artistImage,
|
summary.data!.thumbnail?.source_ ?? artistImage,
|
||||||
height: summary.data!.originalimage?.height.toDouble(),
|
height: summary.data!.thumbnail?.height.toDouble(),
|
||||||
width: summary.data!.originalimage?.width.toDouble(),
|
width: summary.data!.thumbnail?.width.toDouble(),
|
||||||
),
|
),
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
|
@ -242,13 +242,17 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
final controller = useScrollController();
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: PageWindowTitleBar(
|
appBar: PageWindowTitleBar(
|
||||||
leading: const BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(context.l10n.generate_playlist),
|
title: Text(context.l10n.generate_playlist),
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
),
|
),
|
||||||
body: Center(
|
body: Scrollbar(
|
||||||
|
controller: controller,
|
||||||
|
child: Center(
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: BoxConstraints(maxWidth: Breakpoints.lg),
|
constraints: BoxConstraints(maxWidth: Breakpoints.lg),
|
||||||
child: SliderTheme(
|
child: SliderTheme(
|
||||||
@ -257,7 +261,11 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
child: LayoutBuilder(builder: (context, constrains) {
|
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),
|
padding: const EdgeInsets.all(16),
|
||||||
children: [
|
children: [
|
||||||
ValueListenableBuilder(
|
ValueListenableBuilder(
|
||||||
@ -283,7 +291,8 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
|
|||||||
child: Text(
|
child: Text(
|
||||||
value.round().toString(),
|
value.round().toString(),
|
||||||
style: textTheme.bodyLarge?.copyWith(
|
style: textTheme.bodyLarge?.copyWith(
|
||||||
color: theme.colorScheme.primaryContainer,
|
color: theme
|
||||||
|
.colorScheme.primaryContainer,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -432,7 +441,11 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
|
|||||||
},
|
},
|
||||||
presets: {
|
presets: {
|
||||||
context.l10n.short: (min: 50, target: 90, max: 120),
|
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)
|
context.l10n.long: (min: 480, target: 560, max: 640)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -469,10 +482,12 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
|
|||||||
final PlaylistGenerateResultRouteState
|
final PlaylistGenerateResultRouteState
|
||||||
routeState = (
|
routeState = (
|
||||||
seeds: (
|
seeds: (
|
||||||
artists:
|
artists: artists.value
|
||||||
artists.value.map((a) => a.id!).toList(),
|
.map((a) => a.id!)
|
||||||
tracks:
|
.toList(),
|
||||||
tracks.value.map((t) => t.id!).toList(),
|
tracks: tracks.value
|
||||||
|
.map((t) => t.id!)
|
||||||
|
.toList(),
|
||||||
genres: genres.value
|
genres: genres.value
|
||||||
),
|
),
|
||||||
market: market.value,
|
market: market.value,
|
||||||
@ -501,12 +516,14 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ class PlaylistPage extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
pagination: PaginationProps.fromQuery(
|
pagination: PaginationProps.fromQuery(
|
||||||
tracksQuery,
|
tracksQuery,
|
||||||
onFetchAll: () async {
|
onFetchAll: () {
|
||||||
return tracksQuery.fetchAllTracks(
|
return tracksQuery.fetchAllTracks(
|
||||||
getAllTracks: () async {
|
getAllTracks: () async {
|
||||||
final res = await spotify.playlists
|
final res = await spotify.playlists
|
||||||
|
Loading…
Reference in New Issue
Block a user