Add push notifications
This commit is contained in:
73
CHDataManagement/Notifications/NotificationSender.swift
Normal file
73
CHDataManagement/Notifications/NotificationSender.swift
Normal file
@ -0,0 +1,73 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user