chore: fix alternative track sources not showing up

This commit is contained in:
Kingkor Roy Tirtho 2024-06-24 21:43:09 +06:00
parent 75173e5096
commit a621a45f0b
3 changed files with 44 additions and 29 deletions

View File

@ -11,6 +11,7 @@ import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/duration.dart'; import 'package:spotube/extensions/duration.dart';
import 'package:spotube/modules/player/use_progress.dart'; import 'package:spotube/modules/player/use_progress.dart';
import 'package:spotube/models/logger.dart'; import 'package:spotube/models/logger.dart';
import 'package:spotube/provider/audio_player/audio_player.dart';
import 'package:spotube/provider/audio_player/querying_track_info.dart'; import 'package:spotube/provider/audio_player/querying_track_info.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
@ -232,32 +233,38 @@ class PlayerControls extends HookConsumerWidget {
onPressed: onPressed:
isFetchingActiveTrack ? null : audioPlayer.skipToNext, isFetchingActiveTrack ? null : audioPlayer.skipToNext,
), ),
StreamBuilder<PlaylistMode>( Consumer(builder: (context, ref, _) {
stream: audioPlayer.loopModeStream, final loopMode = ref
builder: (context, snapshot) { .watch(audioPlayerProvider.select((s) => s.loopMode));
final loopMode = snapshot.data ?? PlaylistMode.none;
return IconButton( return IconButton(
tooltip: loopMode == PlaylistMode.single tooltip: loopMode == PlaylistMode.single
? context.l10n.loop_track ? context.l10n.loop_track
: loopMode == PlaylistMode.loop : loopMode == PlaylistMode.loop
? context.l10n.repeat_playlist ? context.l10n.repeat_playlist
: null, : null,
icon: Icon( icon: Icon(
loopMode == PlaylistMode.single loopMode == PlaylistMode.single
? SpotubeIcons.repeatOne ? SpotubeIcons.repeatOne
: SpotubeIcons.repeat, : SpotubeIcons.repeat,
), ),
style: loopMode == PlaylistMode.single || style: loopMode == PlaylistMode.single ||
loopMode == PlaylistMode.loop loopMode == PlaylistMode.loop
? activeButtonStyle ? activeButtonStyle
: buttonStyle, : buttonStyle,
onPressed: isFetchingActiveTrack onPressed: isFetchingActiveTrack
? null ? null
: () async { : () async {
await audioPlayer.setLoopMode(loopMode); await audioPlayer.setLoopMode(
switch (loopMode) {
PlaylistMode.loop => PlaylistMode.single,
PlaylistMode.single => PlaylistMode.none,
PlaylistMode.none => PlaylistMode.loop,
}, },
); );
}), },
);
}),
], ],
), ),
const SizedBox(height: 5) const SizedBox(height: 5)

View File

@ -131,13 +131,13 @@ class SiblingTracksSheet extends HookConsumerWidget {
]); ]);
final siblings = useMemoized( final siblings = useMemoized(
() => isFetchingActiveTrack () => !isFetchingActiveTrack
? [ ? [
(activeTrack as SourcedTrack).sourceInfo, (activeTrack as SourcedTrack).sourceInfo,
...activeTrack.siblings, ...activeTrack.siblings,
] ]
: <SourceInfo>[], : <SourceInfo>[],
[activeTrack], [activeTrack, isFetchingActiveTrack],
); );
final borderRadius = floating final borderRadius = floating

View File

@ -1,12 +1,20 @@
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/audio_player.dart';
import 'package:spotube/provider/server/sourced_track.dart'; import 'package:spotube/provider/server/sourced_track.dart';
import 'package:spotube/services/audio_player/audio_player.dart';
final queryingTrackInfoProvider = Provider<bool>((ref) { final queryingTrackInfoProvider = Provider<bool>((ref) {
final media = audioPlayer.playlist.index == -1
? null
: audioPlayer.playlist.medias.elementAtOrNull(audioPlayer.playlist.index);
final audioPlayerActiveTrack =
media == null ? null : SpotubeMedia.fromMedia(media).track;
final activeTrack = final activeTrack =
ref.watch(audioPlayerProvider.select((s) => s.activeTrack)); ref.watch(audioPlayerProvider.select((s) => s.activeTrack)) ??
audioPlayerActiveTrack;
if (activeTrack == null) return false; if (activeTrack == null) return false;
return ref.read(sourcedTrackProvider(activeTrack)).isLoading; return ref.watch(sourcedTrackProvider(activeTrack)).isLoading;
}); });