diff --git a/ios/LibNovel/LibNovel/Views/Player/PlayerViews.swift b/ios/LibNovel/LibNovel/Views/Player/PlayerViews.swift index 8735e7e..03e41d1 100644 --- a/ios/LibNovel/LibNovel/Views/Player/PlayerViews.swift +++ b/ios/LibNovel/LibNovel/Views/Player/PlayerViews.swift @@ -78,11 +78,28 @@ struct MiniPlayerView: View { ) } } label: { - Image(systemName: "forward.end.fill") - .font(.system(size: 24, weight: .semibold)) - .foregroundStyle(.white) - .frame(width: 44, height: 44) - .contentShape(Rectangle()) + ZStack { + Image(systemName: "forward.end.fill") + .font(.system(size: 24, weight: .semibold)) + .foregroundStyle(.white) + + // 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) .disabled(audioPlayer.nextChapter == nil) @@ -395,6 +412,7 @@ struct FullPlayerView: View { // ← previous chapter Button { if let prev = audioPlayer.prevChapter { + onDismiss() NotificationCenter.default.post( name: .skipToPrevChapter, object: nil, @@ -433,6 +451,7 @@ struct FullPlayerView: View { // → next chapter Button { if let next = audioPlayer.nextChapter { + onDismiss() NotificationCenter.default.post( name: .skipToNextChapter, object: nil, @@ -440,10 +459,27 @@ struct FullPlayerView: View { ) } } label: { - Image(systemName: "forward.end.fill") - .font(.system(size: 32, weight: .regular)) - .foregroundStyle(.white.opacity(0.9)) - .frame(maxWidth: .infinity) + ZStack { + Image(systemName: "forward.end.fill") + .font(.system(size: 32, weight: .regular)) + .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) .disabled(audioPlayer.nextChapter == nil)