iOS: wire prev/next chapter buttons and add prefetch indicator
- Full player prev/next buttons now dismiss the player before navigating (allows user to see chapter change) - Added amber loading indicator on next chapter button when prefetching audio (both mini and full player) - Indicator appears as small ProgressView in bottom-right corner of forward button
This commit is contained in:
@@ -78,11 +78,28 @@ struct MiniPlayerView: View {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "forward.end.fill")
|
ZStack {
|
||||||
.font(.system(size: 24, weight: .semibold))
|
Image(systemName: "forward.end.fill")
|
||||||
.foregroundStyle(.white)
|
.font(.system(size: 24, weight: .semibold))
|
||||||
.frame(width: 44, height: 44)
|
.foregroundStyle(.white)
|
||||||
.contentShape(Rectangle())
|
|
||||||
|
// Show small loading indicator if next chapter is being prefetched
|
||||||
|
if audioPlayer.nextPrefetchStatus == .prefetching {
|
||||||
|
VStack {
|
||||||
|
Spacer()
|
||||||
|
HStack {
|
||||||
|
Spacer()
|
||||||
|
ProgressView()
|
||||||
|
.scaleEffect(0.5)
|
||||||
|
.tint(.amber)
|
||||||
|
.padding(2)
|
||||||
|
.background(Circle().fill(.black.opacity(0.6)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(width: 44, height: 44)
|
||||||
|
.contentShape(Rectangle())
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
.disabled(audioPlayer.nextChapter == nil)
|
.disabled(audioPlayer.nextChapter == nil)
|
||||||
@@ -395,6 +412,7 @@ struct FullPlayerView: View {
|
|||||||
// ← previous chapter
|
// ← previous chapter
|
||||||
Button {
|
Button {
|
||||||
if let prev = audioPlayer.prevChapter {
|
if let prev = audioPlayer.prevChapter {
|
||||||
|
onDismiss()
|
||||||
NotificationCenter.default.post(
|
NotificationCenter.default.post(
|
||||||
name: .skipToPrevChapter,
|
name: .skipToPrevChapter,
|
||||||
object: nil,
|
object: nil,
|
||||||
@@ -433,6 +451,7 @@ struct FullPlayerView: View {
|
|||||||
// → next chapter
|
// → next chapter
|
||||||
Button {
|
Button {
|
||||||
if let next = audioPlayer.nextChapter {
|
if let next = audioPlayer.nextChapter {
|
||||||
|
onDismiss()
|
||||||
NotificationCenter.default.post(
|
NotificationCenter.default.post(
|
||||||
name: .skipToNextChapter,
|
name: .skipToNextChapter,
|
||||||
object: nil,
|
object: nil,
|
||||||
@@ -440,10 +459,27 @@ struct FullPlayerView: View {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "forward.end.fill")
|
ZStack {
|
||||||
.font(.system(size: 32, weight: .regular))
|
Image(systemName: "forward.end.fill")
|
||||||
.foregroundStyle(.white.opacity(0.9))
|
.font(.system(size: 32, weight: .regular))
|
||||||
.frame(maxWidth: .infinity)
|
.foregroundStyle(.white.opacity(0.9))
|
||||||
|
|
||||||
|
// Show small loading indicator if next chapter is being prefetched
|
||||||
|
if audioPlayer.nextPrefetchStatus == .prefetching {
|
||||||
|
VStack {
|
||||||
|
Spacer()
|
||||||
|
HStack {
|
||||||
|
Spacer()
|
||||||
|
ProgressView()
|
||||||
|
.scaleEffect(0.6)
|
||||||
|
.tint(.amber)
|
||||||
|
.padding(4)
|
||||||
|
.background(Circle().fill(.black.opacity(0.6)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
.disabled(audioPlayer.nextChapter == nil)
|
.disabled(audioPlayer.nextChapter == nil)
|
||||||
|
|||||||
Reference in New Issue
Block a user