Skip to content

Commit 9311f09

Browse files
committed
Implement optimistic stop live location sharing
1 parent 001e2af commit 9311f09

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

Sources/StreamChat/Controllers/MessageController/MessageController.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -969,12 +969,6 @@ public class ChatMessageController: DataController, DelegateCallable, DataStoreP
969969
return
970970
}
971971

972-
// Optimistic update
973-
client.databaseContainer.write { session in
974-
let messageDTO = try session.messageEditableByCurrentUser(self.messageId)
975-
messageDTO.location?.endAt = Date().bridgeDate
976-
}
977-
978972
messageUpdater.stopLiveLocationSharing(messageId: messageId) { result in
979973
self.callback {
980974
completion?(result)

Sources/StreamChat/Database/DTOs/MessageDTO.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ class MessageDTO: NSManagedObject {
633633
ascending: true
634634
)]
635635
var predicates: [NSPredicate] = [
636-
.init(format: "location.endAt < %@", Date().bridgeDate),
636+
.init(format: "location.endAt > %@", Date().bridgeDate),
637637
.init(format: "user.id == %@", currentUserId)
638638
]
639639
if let channelId {

Sources/StreamChat/Workers/MessageUpdater.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,14 @@ class MessageUpdater: Worker {
334334
messageId: MessageId,
335335
completion: @escaping ((Result<SharedLocation, Error>) -> Void)
336336
) {
337+
// Optimistic update
338+
var previousEndAt: DBDate?
339+
database.write { session in
340+
let messageDTO = try session.messageEditableByCurrentUser(messageId)
341+
previousEndAt = messageDTO.location?.endAt
342+
messageDTO.location?.endAt = Date().bridgeDate
343+
}
344+
337345
database.backgroundReadOnlyContext.perform { [weak self] in
338346
guard let currentUser = self?.database.backgroundReadOnlyContext.currentUser,
339347
let currentDeviceId = currentUser.currentDevice?.id else {
@@ -357,6 +365,11 @@ class MessageUpdater: Worker {
357365
completion(result)
358366
}
359367
case let .failure(error):
368+
self?.database.write { session in
369+
// If the request fails, we revert the optimistic update.
370+
guard let messageDTO = session.message(id: messageId) else { return }
371+
messageDTO.location?.endAt = previousEndAt
372+
}
360373
completion(.failure(error))
361374
}
362375
}

0 commit comments

Comments
 (0)