|
|
@@ -16,6 +16,7 @@ struct SessionListView: View {
|
|
|
@State private var sessionPendingDeletion: CelestiaSession?
|
|
|
@State private var selectedSession: CelestiaSession?
|
|
|
@State private var showSessionDetail = false
|
|
|
+ @State private var deletingSessionID: UUID?
|
|
|
|
|
|
var body: some View {
|
|
|
NavigationStack {
|
|
|
@@ -53,12 +54,19 @@ struct SessionListView: View {
|
|
|
presenting: sessionPendingDeletion
|
|
|
) { session in
|
|
|
Button("取消", role: .cancel) {}
|
|
|
- Button("删除", role: .destructive) {
|
|
|
- deleteSession(session)
|
|
|
+ Button(session.cloudSessionId == nil ? "删除" : "同时删除", role: .destructive) {
|
|
|
sessionPendingDeletion = nil
|
|
|
+ Task {
|
|
|
+ await deleteSession(session)
|
|
|
+ }
|
|
|
}
|
|
|
+ .disabled(deletingSessionID != nil)
|
|
|
} message: { session in
|
|
|
- Text("删除「\(session.title)」后,相关录音和图片也会被删除,且无法恢复。")
|
|
|
+ if session.cloudSessionId != nil {
|
|
|
+ Text("删除「\(session.title)」后,本地录音、图片以及已经同步到云端的记录都会一并删除,且无法恢复。")
|
|
|
+ } else {
|
|
|
+ Text("删除「\(session.title)」后,相关录音和图片也会被删除,且无法恢复。")
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -107,13 +115,29 @@ struct SessionListView: View {
|
|
|
.contentMargins(.bottom, 18, for: .scrollContent)
|
|
|
}
|
|
|
|
|
|
- private func deleteSession(_ session: CelestiaSession) {
|
|
|
+ @MainActor
|
|
|
+ private func deleteSession(_ session: CelestiaSession) async {
|
|
|
+ guard deletingSessionID == nil else { return }
|
|
|
+ deletingSessionID = session.id
|
|
|
+ defer { deletingSessionID = nil }
|
|
|
+
|
|
|
let storedPaths =
|
|
|
[session.localAudioPath].compactMap { $0 } +
|
|
|
session.audioChunks.map(\.localFilePath) +
|
|
|
session.events.compactMap(\.localFilePath)
|
|
|
let fileURLs = Set(storedPaths.compactMap { AudioPathHelper.resolveURL(for: $0) })
|
|
|
|
|
|
+ if let cloudSessionID = session.cloudSessionId {
|
|
|
+ do {
|
|
|
+ try await RemoteNetworkService().deleteSession(sessionID: cloudSessionID)
|
|
|
+ } catch APIError.server(let code, _) where code == 404 {
|
|
|
+ // The remote record is already gone, so local cleanup can continue.
|
|
|
+ } catch {
|
|
|
+ deletionError = "云端记录删除失败,本地记录未删除:\(error.localizedDescription)"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
modelContext.delete(session)
|
|
|
|
|
|
do {
|