Skip to content

Commit 1dc1d3a

Browse files
committed
fix(IM): mark recall when recalling message
close #339
1 parent 739db01 commit 1dc1d3a

File tree

2 files changed

+58
-22
lines changed

2 files changed

+58
-22
lines changed

Sources/RTM/IMConversation.swift

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -925,22 +925,62 @@ extension IMConversation {
925925

926926
extension IMConversation {
927927
// MARK: Message Updating
928-
928+
929929
/// Update the content of a sent message.
930-
///
931930
/// - Parameters:
932931
/// - oldMessage: The sent message to be updated.
933932
/// - newMessage: The message which has new content.
934-
/// - progressQueue: The queue where the progress be called. default is main.
933+
/// - progressQueue: The queue where the *progress* be called, default is main.
935934
/// - progress: The file uploading progress.
936-
/// - completion: callback.
935+
/// - completion: Result callback.
937936
public func update(
938937
oldMessage: IMMessage,
939938
to newMessage: IMMessage,
940939
progressQueue: DispatchQueue = .main,
941940
progress: ((Double) -> Void)? = nil,
942941
completion: @escaping (LCBooleanResult) -> Void)
943942
throws
943+
{
944+
try self.patch(
945+
oldMessage: oldMessage,
946+
newMessage: newMessage,
947+
progressQueue: progressQueue,
948+
progress: progress,
949+
completion: completion)
950+
}
951+
952+
/// Recall a sent message.
953+
/// - Parameters:
954+
/// - message: The message has been sent.
955+
/// - completion: Result callback.
956+
public func recall(
957+
message: IMMessage,
958+
completion: @escaping (LCGenericResult<IMRecalledMessage>) -> Void)
959+
throws
960+
{
961+
let recalledMessage = IMRecalledMessage()
962+
try self.patch(
963+
oldMessage: message,
964+
newMessage: recalledMessage,
965+
isRecall: true)
966+
{ (result) in
967+
switch result {
968+
case .success:
969+
completion(.success(value: recalledMessage))
970+
case .failure(error: let error):
971+
completion(.failure(error: error))
972+
}
973+
}
974+
}
975+
976+
private func patch(
977+
oldMessage: IMMessage,
978+
newMessage: IMMessage,
979+
isRecall: Bool = false,
980+
progressQueue: DispatchQueue = .main,
981+
progress: ((Double) -> Void)? = nil,
982+
completion: @escaping (LCBooleanResult) -> Void)
983+
throws
944984
{
945985
guard let oldMessageID = oldMessage.ID,
946986
let oldMessageTimestamp = oldMessage.sentTimestamp,
@@ -977,6 +1017,9 @@ extension IMConversation {
9771017
patchItem.cid = oldMessageConvID
9781018
patchItem.mid = oldMessageID
9791019
patchItem.timestamp = oldMessageTimestamp
1020+
if isRecall {
1021+
patchItem.recall = true
1022+
}
9801023
if let content: IMMessage.Content = newMessage.content {
9811024
switch content {
9821025
case .data(let data):
@@ -1036,23 +1079,6 @@ extension IMConversation {
10361079
}
10371080
}
10381081

1039-
/// Recall a sent message.
1040-
///
1041-
/// - Parameters:
1042-
/// - message: The message has been sent.
1043-
/// - completion: callback.
1044-
public func recall(message: IMMessage, completion: @escaping (LCGenericResult<IMRecalledMessage>) -> Void) throws {
1045-
let recalledMessage = IMRecalledMessage()
1046-
try self.update(oldMessage: message, to: recalledMessage, completion: { (result) in
1047-
switch result {
1048-
case .success:
1049-
completion(.success(value: recalledMessage))
1050-
case .failure(error: let error):
1051-
completion(.failure(error: error))
1052-
}
1053-
})
1054-
}
1055-
10561082
func process(patchItem: IMPatchItem, client: IMClient) {
10571083
assert(client.specificAssertion)
10581084
guard let timestamp = (patchItem.hasTimestamp ? patchItem.timestamp : nil),
@@ -1093,7 +1119,6 @@ extension IMConversation {
10931119
event: .updated(updatedMessage: patchedMessage, reason: reason)))
10941120
}
10951121
}
1096-
10971122
}
10981123

10991124
extension IMConversation {

Sources/RTM/IMMessage.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,17 @@ open class IMRecalledMessage: IMCategorizedMessage {
829829
public override init(application: LCApplication = LCApplication.default, url: URL, format: String? = nil) {
830830
super.init(application: application, url: url, format: format)
831831
}
832+
833+
override func encodingMessageContent(application: LCApplication) throws {
834+
let rawData = [ReservedKey.type.rawValue: type(of: self).messageType]
835+
let data = try JSONSerialization.data(withJSONObject: rawData)
836+
if let rawData = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
837+
self.rawData = rawData
838+
}
839+
if let contentString = String(data: data, encoding: .utf8) {
840+
self.content = .string(contentString)
841+
}
842+
}
832843
}
833844

834845
extension IMDirectCommand {

0 commit comments

Comments
 (0)