57 lines
2.4 KiB
Swift
57 lines
2.4 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)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
let body = RNNotificationParser.parseNotificationResponse(response)
|
|
RNEventEmitter.sendEvent(RNNotificationOpened, body: body)
|
|
}
|
|
}
|
|
}
|