54 lines
2.2 KiB
Swift
54 lines
2.2 KiB
Swift
//
|
|||
// ReplyNotification.swift
|
|||
// RocketChatRN
|
|||
//
|
|||
// Created by Djorkaeff Alexandre Vilela Pereira on 9/17/20.
|
|||
// Copyright © 2020 Rocket.Chat. All rights reserved.
|
|||
//
|
|||
|
|||
import Foundation
|
|||
import UserNotifications
|
|||
|
|||
@objc(ReplyNotification)
|
|||
class ReplyNotification: RNNotificationEventHandler {
|
|||
private static let dispatchOnce: Void = {
|
|||
let instance: AnyClass! = object_getClass(ReplyNotification())
|
|||
let originalMethod = class_getInstanceMethod(instance, #selector(didReceive))
|
|||
let swizzledMethod = class_getInstanceMethod(instance, #selector(replyNotification_didReceiveNotificationResponse))
|
|||
if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
|
|||
method_exchangeImplementations(originalMethod, swizzledMethod)
|
|||
}
|
|||
}()
|
|||
|
|||
@objc
|
|||
public static func configure() {
|
|||
_ = self.dispatchOnce
|
|||
}
|
|||
|
|||
@objc
|
|||
func replyNotification_didReceiveNotificationResponse(_ response: UNNotificationResponse, completionHandler: @escaping(() -> Void)) {
|
|||
if response.actionIdentifier == "REPLY_ACTION" {
|
|||
if let notification = RCTConvert.unNotificationPayload(response.notification) {
|
|||
if let data = (notification["ejson"] as? String)?.data(using: .utf8) {
|
|||
if let payload = try? JSONDecoder().decode(Payload.self, from: data), let rid = payload.rid {
|
|||
if let msg = (response as? UNTextInputNotificationResponse)?.userText {
|
|||
let rocketchat = RocketChat.instanceForServer(server: payload.host.removeTrailingSlash())
|
|||
let backgroundTask = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
|
|||
rocketchat.sendMessage(rid: rid, message: msg) { response in
|
|||
guard let response = response, response.success else {
|
|||
let content = UNMutableNotificationContent()
|
|||
content.body = "Failed to reply message."
|
|||
let request = UNNotificationRequest(identifier: "replyFailure", content: content, trigger: nil)
|
|||
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
|
|||
return
|
|||
}
|
|||
UIApplication.shared.endBackgroundTask(backgroundTask)
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|