1
1
//
2
- // Copyright © 2024 Stream.io Inc. All rights reserved.
2
+ // Copyright © 2025 Stream.io Inc. All rights reserved.
3
3
//
4
4
5
5
import CoreData
@@ -37,6 +37,9 @@ public class CurrentChatUserController: DataController, DelegateCallable, DataSt
37
37
return _basePublishers as? BasePublishers ?? . init( controller: self )
38
38
}
39
39
40
+ /// The observer for the active live location messages.
41
+ private var activeLiveLocationMessagesObserver : BackgroundListDatabaseObserver < ChatMessage , MessageDTO > ?
42
+
40
43
/// Used for observing the current user changes in a database.
41
44
private lazy var currentUserObserver = createUserObserver ( )
42
45
. onChange { [ weak self] change in
@@ -47,6 +50,22 @@ public class CurrentChatUserController: DataController, DelegateCallable, DataSt
47
50
}
48
51
$0. currentUserController ( self , didChangeCurrentUser: change)
49
52
}
53
+
54
+ /// Only when we have access to the currentUserId is when we should
55
+ /// create the observer for the active live location messages.
56
+ if self ? . activeLiveLocationMessagesObserver == nil {
57
+ let observer = self ? . createActiveLiveLocationMessagesObserver ( )
58
+ self ? . activeLiveLocationMessagesObserver = observer
59
+ try ? observer? . startObserving ( )
60
+ observer? . onDidChange = { [ weak self] _ in
61
+ self ? . delegateCallback { [ weak self] in
62
+ guard let self = self else { return }
63
+ let messages = Array ( observer? . items ?? [ ] )
64
+ self . isSharingLiveLocation = !messages. isEmpty
65
+ $0. currentUserController ( self , didChangeActiveLiveLocationMessages: messages)
66
+ }
67
+ }
68
+ }
50
69
}
51
70
. onFieldChange ( \. unreadCount) { [ weak self] change in
52
71
self ? . delegateCallback { [ weak self] in
@@ -58,20 +77,6 @@ public class CurrentChatUserController: DataController, DelegateCallable, DataSt
58
77
}
59
78
}
60
79
61
- /// The observer for the active live location messages.
62
- private lazy var activeLiveLocationMessagesObserver : BackgroundListDatabaseObserver < ChatMessage , MessageDTO > = {
63
- let observer = createActiveLiveLocationMessagesObserver ( )
64
- observer. onDidChange = { [ weak self] _ in
65
- self ? . delegateCallback { [ weak self] in
66
- guard let self = self else { return }
67
- let messages = Array ( observer. items)
68
- self . isSharingLiveLocation = !messages. isEmpty
69
- $0. currentUserController ( self , didChangeActiveLiveLocationMessages: messages)
70
- }
71
- }
72
- return observer
73
- } ( )
74
-
75
80
/// A flag to indicate whether the current user is sharing his live location.
76
81
private var isSharingLiveLocation = false {
77
82
didSet {
@@ -160,7 +165,6 @@ public class CurrentChatUserController: DataController, DelegateCallable, DataSt
160
165
161
166
do {
162
167
try currentUserObserver. startObserving ( )
163
- try activeLiveLocationMessagesObserver. startObserving ( )
164
168
state = . localDataFetched
165
169
} catch {
166
170
log. error ( """
@@ -268,8 +272,11 @@ public extension CurrentChatUserController {
268
272
///
269
273
/// - Parameter location: The new location to be updated.
270
274
func updateLiveLocation( _ location: LocationAttachmentInfo ) {
275
+ guard let messages = activeLiveLocationMessagesObserver? . items, !messages. isEmpty else {
276
+ return
277
+ }
278
+
271
279
locationUpdatesThrottler. execute { [ weak self] in
272
- let messages = self ? . activeLiveLocationMessagesObserver. items ?? [ ]
273
280
for message in messages {
274
281
guard let cid = message. cid else { continue }
275
282
let messageController = self ? . client. messageController ( cid: cid, messageId: message. id)
@@ -442,12 +449,15 @@ private extension CurrentChatUserController {
442
449
)
443
450
}
444
451
445
- func createActiveLiveLocationMessagesObserver( ) -> BackgroundListDatabaseObserver < ChatMessage , MessageDTO > {
446
- environment. currentUserActiveLiveLocationMessagesObserverBuilder (
452
+ func createActiveLiveLocationMessagesObserver( ) -> BackgroundListDatabaseObserver < ChatMessage , MessageDTO > ? {
453
+ guard let currentUserId = client. currentUserId else {
454
+ return nil
455
+ }
456
+ return environment. currentUserActiveLiveLocationMessagesObserverBuilder (
447
457
client. databaseContainer,
448
458
MessageDTO . activeLiveLocationMessagesFetchRequest (
449
- channelId : nil ,
450
- currentUserId : client . currentUserId
459
+ currentUserId : currentUserId ,
460
+ channelId : nil
451
461
) ,
452
462
{ try $0. asModel ( ) } ,
453
463
NSFetchedResultsController< MessageDTO> . self
0 commit comments