diff --git a/Marks/Views/PodcastPlayerView.swift b/Marks/Views/PodcastPlayerView.swift index 303d5cb..bca94d0 100644 --- a/Marks/Views/PodcastPlayerView.swift +++ b/Marks/Views/PodcastPlayerView.swift @@ -589,30 +589,42 @@ struct PodcastLibraryView: View { description: Text("Podcasts you generate will appear here.") ) } else { - List(entries) { entry in - HStack(spacing: 12) { - VStack(alignment: .leading, spacing: 4) { - Text(entry.title ?? entry.articleUrl) - .font(.system(size: 15, weight: .medium)) - .lineLimit(2) - Text(entry.createdAt.formatted(date: .abbreviated, time: .omitted)) - .font(.system(size: 12)) - .foregroundStyle(.secondary) + List { + ForEach(entries) { entry in + HStack(spacing: 12) { + VStack(alignment: .leading, spacing: 4) { + Text(entry.title ?? entry.articleUrl) + .font(.system(size: 15, weight: .medium)) + .lineLimit(2) + Text(entry.createdAt.formatted(date: .abbreviated, time: .omitted)) + .font(.system(size: 12)) + .foregroundStyle(.secondary) + } + Spacer() + Button { + vm.start(articleUrl: entry.articleUrl, + articleTitle: entry.title ?? "", + claude: claude) + dismiss() + } label: { + Image(systemName: "play.circle.fill") + .font(.system(size: 36)) + .foregroundStyle(.blue) + } + .buttonStyle(.plain) } - Spacer() - Button { - vm.start(articleUrl: entry.articleUrl, - articleTitle: entry.title ?? "", - claude: claude) - dismiss() - } label: { - Image(systemName: "play.circle.fill") - .font(.system(size: 36)) - .foregroundStyle(.blue) + .padding(.vertical, 6) + .swipeActions(edge: .trailing, allowsFullSwipe: true) { + Button(role: .destructive) { + deleteEntry(entry) + } label: { + Label("Delete", systemImage: "trash") + } } - .buttonStyle(.plain) } - .padding(.vertical, 6) + .onDelete { indexSet in + indexSet.forEach { deleteEntry(entries[$0]) } + } } .listStyle(.plain) } @@ -627,4 +639,10 @@ struct PodcastLibraryView: View { } .onAppear { entries = PodcastIndex.all() } } + + private func deleteEntry(_ entry: PodcastEntry) { + PodcastIndex.remove(articleUrl: entry.articleUrl) + entries.removeAll { $0.articleUrl == entry.articleUrl } + if vm.currentArticleUrl == entry.articleUrl { vm.stop() } + } }