diff --git a/Assets/downloaded-view-2.jpeg b/Assets/downloaded-view-2.jpeg
new file mode 100644
index 0000000..3d4a5ba
Binary files /dev/null and b/Assets/downloaded-view-2.jpeg differ
diff --git a/AudioFetchGPT/AudioModels/DownloadedAudioStore.swift b/AudioFetchGPT/AudioModels/DownloadedAudioStore.swift
index d62b4dc..0fe6a67 100644
--- a/AudioFetchGPT/AudioModels/DownloadedAudioStore.swift
+++ b/AudioFetchGPT/AudioModels/DownloadedAudioStore.swift
@@ -170,4 +170,20 @@ class DownloadedAudioStore: ObservableObject {
.filter { $0.conversationId == conversationId }
.map { $0.messageId }
}
+
+ func deleteConversation(conversationId: UUID) {
+ // Filter audio files that do not belong to the specified conversation
+ let audiosToDelete = items.filter { UUID(uuidString: $0.conversationId) == conversationId }
+
+ // Delete files from the file system
+ for audio in audiosToDelete {
+ deleteAudio(audio)
+ }
+
+ // Remove audio files from the list
+ items.removeAll { UUID(uuidString: $0.conversationId) == conversationId }
+
+ // Save changes
+ saveDownloadedAudios()
+ }
}
diff --git a/AudioFetchGPT/Views/DownloadedAudios/DownloadedAudiosListView.swift b/AudioFetchGPT/Views/DownloadedAudios/DownloadedAudiosListView.swift
index 5700c50..55fe791 100644
--- a/AudioFetchGPT/Views/DownloadedAudios/DownloadedAudiosListView.swift
+++ b/AudioFetchGPT/Views/DownloadedAudios/DownloadedAudiosListView.swift
@@ -31,10 +31,10 @@ struct DownloadedAudiosListView: View {
List {
ForEach(groupedAudios.keys.sorted(), id: \.self) { conversationId in
Section(header: SectionHeaderView(conversationId: conversationId,
- conversationName: downloadedAudios.getConversationName(by: conversationId),
- onEdit: { startEditing(conversationId) },
- onToggle: { downloadedAudios.toggleSection(conversationId) },
- isCollapsed: downloadedAudios.collapsedSections.contains(conversationId))
+ conversationName: downloadedAudios.getConversationName(by: conversationId),
+ onEdit: { startEditing(conversationId) },
+ onToggle: { downloadedAudios.toggleSection(conversationId) },
+ isCollapsed: downloadedAudios.collapsedSections.contains(conversationId))
) {
if !downloadedAudios.collapsedSections.contains(conversationId) {
AudioListView(audios: groupedAudios[conversationId] ?? [],
@@ -60,12 +60,21 @@ struct DownloadedAudiosListView: View {
)) {
if let conversationId = editingConversationId {
// Extracted view for editing conversation name
- EditConversationView(conversationId: conversationId, newConversationName: $newConversationName, onCancel: {
- editingConversationId = nil
- }, onSave: {
- saveNewConversationName(conversationId: conversationId, newName: newConversationName)
- editingConversationId = nil
- })
+ EditConversationView(
+ conversationId: conversationId,
+ newConversationName: $newConversationName,
+ onCancel: {
+ editingConversationId = nil
+ },
+ onSave: {
+ saveNewConversationName(conversationId: conversationId, newName: newConversationName)
+ editingConversationId = nil
+ },
+ onDelete: {
+ deleteConversation(conversationId)
+ editingConversationId = nil
+ }
+ )
}
}
.alert(isPresented: $showErrorAlert) {
@@ -110,4 +119,8 @@ struct DownloadedAudiosListView: View {
private func moveAudio(conversationId: UUID, indices: IndexSet, newOffset: Int) {
downloadedAudios.moveAudio(conversationId: conversationId, indices: indices, newOffset: newOffset)
}
+
+ private func deleteConversation(_ conversationId: UUID) {
+ downloadedAudios.deleteConversation(conversationId: conversationId)
+ }
}
diff --git a/AudioFetchGPT/Views/DownloadedAudios/EditConversationView.swift b/AudioFetchGPT/Views/DownloadedAudios/EditConversationView.swift
index 081b973..de61d6f 100644
--- a/AudioFetchGPT/Views/DownloadedAudios/EditConversationView.swift
+++ b/AudioFetchGPT/Views/DownloadedAudios/EditConversationView.swift
@@ -10,6 +10,9 @@ struct EditConversationView: View {
@Binding var newConversationName: String
var onCancel: () -> Void
var onSave: () -> Void
+ var onDelete: () -> Void // Параметр для удаления
+
+ @State private var showDeleteConfirmation = false // Состояние для показа алерта
var body: some View {
VStack {
@@ -29,7 +32,7 @@ struct EditConversationView: View {
Image(systemName: "doc.on.clipboard")
.foregroundColor(.blue)
}
- .buttonStyle(BorderlessButtonStyle()) // Чтобы избежать лишнего фона
+ .buttonStyle(BorderlessButtonStyle())
.padding(.leading, 8)
}
.padding()
@@ -37,6 +40,19 @@ struct EditConversationView: View {
HStack {
Button("Cancel", action: onCancel)
Spacer()
+ Button("Delete", action: {
+ showDeleteConfirmation = true // Показываем алерт
+ })
+ .foregroundColor(.red)
+ .alert(isPresented: $showDeleteConfirmation) { // Настраиваем алерт
+ Alert(
+ title: Text("Confirm Deletion"),
+ message: Text("Are you sure you want to delete this conversation and all related audio files?"),
+ primaryButton: .destructive(Text("Delete"), action: onDelete), // Подтверждение удаления
+ secondaryButton: .cancel() // Кнопка отмены
+ )
+ }
+ Spacer()
Button("Save", action: onSave)
.disabled(newConversationName.isEmpty)
}
@@ -47,3 +63,4 @@ struct EditConversationView: View {
}
}
+
diff --git a/README.md b/README.md
index 5b4f389..20833f1 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
+