AddGroupToPlaylistSheet.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import SwiftData
  2. import SwiftUI
  3. /// Sheet for adding multiple tracks (e.g. an album, artist, folder) to a playlist.
  4. struct AddGroupToPlaylistSheet: View {
  5. let tracks: [Track]
  6. @Environment(PlaylistViewModel.self) private var playlistVM
  7. @EnvironmentObject private var theme: AppTheme
  8. @Environment(\.modelContext) private var modelContext
  9. @Environment(\.dismiss) private var dismiss
  10. @Query(sort: \Playlist.dateModified, order: .reverse) private var playlists: [Playlist]
  11. @State private var showNewPlaylist = false
  12. @State private var newPlaylistName = ""
  13. var body: some View {
  14. NavigationStack {
  15. List {
  16. Section {
  17. Text("Adding \(tracks.count) tracks")
  18. .foregroundStyle(theme.secondaryText)
  19. }
  20. Section {
  21. Button {
  22. showNewPlaylist = true
  23. } label: {
  24. Label("New Playlist", systemImage: "plus.circle")
  25. .foregroundStyle(theme.accent)
  26. }
  27. }
  28. Section("Existing Playlists") {
  29. ForEach(playlists) { playlist in
  30. Button {
  31. playlistVM.addTracks(tracks, to: playlist, context: modelContext)
  32. playlistVM.showStatus("Added \(tracks.count) tracks to \(playlist.name)")
  33. dismiss()
  34. } label: {
  35. HStack {
  36. Circle()
  37. .fill(Color(hex: playlist.color) ?? theme.accent)
  38. .frame(width: 10, height: 10)
  39. Text(playlist.name)
  40. .foregroundStyle(theme.primaryText)
  41. Spacer()
  42. Text("\(playlist.trackCount)")
  43. .font(.caption)
  44. .foregroundStyle(theme.tertiaryText)
  45. }
  46. }
  47. }
  48. }
  49. }
  50. .navigationTitle("Add to Playlist")
  51. .navigationBarTitleDisplayMode(.inline)
  52. .toolbar {
  53. ToolbarItem(placement: .cancellationAction) {
  54. Button("Cancel") { dismiss() }
  55. }
  56. }
  57. .alert("New Playlist", isPresented: $showNewPlaylist) {
  58. TextField("Playlist name", text: $newPlaylistName)
  59. Button("Cancel", role: .cancel) { newPlaylistName = "" }
  60. Button("Create & Add") {
  61. guard !newPlaylistName.isEmpty else { return }
  62. let pl = playlistVM.createPlaylist(name: newPlaylistName, context: modelContext)
  63. playlistVM.addTracks(tracks, to: pl, context: modelContext)
  64. playlistVM.showStatus("Created \(newPlaylistName) with \(tracks.count) tracks")
  65. dismiss()
  66. }
  67. }
  68. }
  69. }
  70. }