ChWebsiteApp/CHDataManagement/Notifications/NotificationSender.swift
2025-02-18 22:05:19 +01:00

74 lines
2.1 KiB
Swift

import Foundation
final class NotificationSender: ObservableObject {
@Published
var isTransmittingToRemote = false
@Published
var lastPushWasSuccessful = true
init() {
}
func failedToCreateNotificationDueToMissingSettings() {
guard !isTransmittingToRemote else { return }
DispatchQueue.main.async {
self.lastPushWasSuccessful = false
}
}
func send(url: String, request: NotificationRequest) {
guard !isTransmittingToRemote else { return }
DispatchQueue.main.async {
self.isTransmittingToRemote = true
}
guard let url = URL(string: url) else {
print("Invalid notification url: \(url)")
didFinish(success: false)
return
}
let body: Data
do {
body = try JSONEncoder().encode(request)
} catch {
print("Failed to encode notification: \(error)")
didFinish(success: false)
return
}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = body
Task {
do {
let (_ , result) = try await URLSession.shared.data(for: request)
guard let response = result as? HTTPURLResponse else {
print("Invalid response \(result)")
didFinish(success: false)
return
}
guard response.statusCode == 200 else {
print("Failed to send notification: \(response.statusCode)")
didFinish(success: false)
return
}
didFinish(success: true)
} catch {
print("Failed to send notification request: \(error)")
didFinish(success: false)
return
}
}
}
private func didFinish(success: Bool) {
DispatchQueue.main.async {
self.isTransmittingToRemote = false
self.lastPushWasSuccessful = success
}
}
}