81 lines
2.6 KiB
Swift
81 lines
2.6 KiB
Swift
import Foundation
|
|
|
|
@MainActor
|
|
final class NotificationsViewModel: ObservableObject {
|
|
@Published private(set) var overview: NotificationOverview?
|
|
@Published private(set) var instances: [Instance] = []
|
|
@Published private(set) var isLoading = false
|
|
@Published var errorMessage: String?
|
|
@Published private(set) var actionMessage: String?
|
|
@Published private(set) var actionSucceeded = true
|
|
@Published private(set) var busyQueueID: String?
|
|
|
|
private let repository: any InstanceRepository
|
|
private let service: NotificationService
|
|
|
|
init(repository: any InstanceRepository, service: NotificationService) {
|
|
self.repository = repository
|
|
self.service = service
|
|
}
|
|
|
|
func refresh() async {
|
|
isLoading = true
|
|
errorMessage = nil
|
|
do {
|
|
let loaded = try await repository.list(InstanceQuery())
|
|
instances = loaded
|
|
overview = try await service.overview(loaded)
|
|
} catch {
|
|
errorMessage = "无法加载通知中心。"
|
|
}
|
|
isLoading = false
|
|
}
|
|
|
|
func retryAll() async {
|
|
let result = await service.retryAll(instances)
|
|
actionSucceeded = result.succeeded > 0
|
|
if result.succeeded > 0 {
|
|
actionMessage = "已提交全部队列重试,成功 \(result.succeeded) 个实例。"
|
|
} else if result.skipped > 0 {
|
|
actionMessage = "没有可重试的队列接口。"
|
|
} else {
|
|
actionMessage = "队列重试失败。"
|
|
}
|
|
await refresh()
|
|
}
|
|
|
|
func retryQueue(_ item: NotificationQueueEntry) async {
|
|
await queueAction(item) { instance, id in
|
|
try await self.service.retryQueue(instance, id: id)
|
|
}
|
|
}
|
|
|
|
func deleteQueue(_ item: NotificationQueueEntry) async {
|
|
await queueAction(item) { instance, id in
|
|
try await self.service.deleteQueueItem(instance, id: id)
|
|
}
|
|
await refresh()
|
|
}
|
|
|
|
private func queueAction(
|
|
_ item: NotificationQueueEntry,
|
|
action: (Instance, String) async throws -> Void
|
|
) async {
|
|
guard let instance = instances.first(where: { $0.id == item.instanceID }) else {
|
|
errorMessage = "找不到队列所属实例。"
|
|
return
|
|
}
|
|
busyQueueID = item.id
|
|
do {
|
|
try await action(instance, item.id)
|
|
actionMessage = "队列操作已完成。"
|
|
actionSucceeded = true
|
|
errorMessage = nil
|
|
} catch {
|
|
errorMessage = "队列操作失败。"
|
|
actionSucceeded = false
|
|
}
|
|
busyQueueID = nil
|
|
}
|
|
}
|