| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import SwiftUI
- /// Download button for playlist headers — visible only when playlist has cloud tracks.
- /// Shows downloaded/total count (e.g., "↓ 2/4").
- struct PlaylistDownloadButton: View {
- let playlist: Playlist
- @State private var downloadManager = DownloadManager.shared
- private var cloudTracks: [Track] {
- playlist.sortedEntries.compactMap(\.track).filter(\.isCloud)
- }
- private var downloadedCount: Int {
- cloudTracks.filter { $0.downloadState == .downloaded }.count
- }
- private var downloadingCount: Int {
- cloudTracks.filter { $0.downloadState == .downloading }.count
- }
- var body: some View {
- let cloud = cloudTracks
- if !cloud.isEmpty {
- Button {
- handleTap(cloud)
- } label: {
- Label(buttonLabel(cloud), systemImage: "arrow.down.circle")
- }
- .help(helpText(cloud))
- }
- }
- private func buttonLabel(_ cloud: [Track]) -> String {
- let total = cloud.count
- if downloadedCount == total {
- return "↓ \(total)/\(total)"
- }
- return "↓ \(downloadedCount)/\(total)"
- }
- private func helpText(_ cloud: [Track]) -> String {
- let total = cloud.count
- if downloadedCount == total {
- return "All cloud tracks downloaded"
- }
- if downloadingCount > 0 {
- return "Downloading... tap to cancel"
- }
- return "Download \(total - downloadedCount) cloud tracks for offline playback"
- }
- private func handleTap(_ cloud: [Track]) {
- if downloadingCount > 0 {
- downloadManager.cancelBatch(tracks: cloud)
- } else if downloadedCount < cloud.count {
- downloadManager.downloadBatch(tracks: cloud, apiClient: ChadMusicAPIClient.shared)
- }
- }
- }
|