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 @@ +