@@ -57,81 +57,143 @@ class CblReactnative: RCTEventEmitter {
5757 }
5858
5959 // MARK: - Collection Functions
60- @objc ( collection_AddChangeListener: fromCollectionWithName: fromDatabaseWithName: fromScopeWithName: withResolver: withRejecter: )
61- func collection_AddChangeListener(
62- changeListenerToken: NSString ,
63- collectionName: NSString ,
64- name: NSString ,
65- scopeName: NSString ,
66- resolve: @escaping RCTPromiseResolveBlock ,
67- reject: @escaping RCTPromiseRejectBlock
68- ) -> Void {
69- let ( isError, args) = DataAdapter . shared. adaptCollectionArgs ( name: name, collectionName: collectionName, scopeName: scopeName, reject: reject)
70- let ( isTokenError, token) = DataAdapter . shared. adaptNonEmptyString ( value: changeListenerToken, propertyName: " changeListenerToken " , reject: reject)
60+ @objc ( collection_AddChangeListener: fromCollectionWithName: fromDatabaseWithName: fromScopeWithName: withResolver: withRejecter: )
61+ func collection_AddChangeListener(
62+ changeListenerToken: NSString ,
63+ collectionName: NSString ,
64+ name: NSString ,
65+ scopeName: NSString ,
66+ resolve: @escaping RCTPromiseResolveBlock ,
67+ reject: @escaping RCTPromiseRejectBlock
68+ ) -> Void {
69+ let ( isError, args) = DataAdapter . shared. adaptCollectionArgs ( name: name, collectionName: collectionName, scopeName: scopeName, reject: reject)
70+ let ( isTokenError, token) = DataAdapter . shared. adaptNonEmptyString ( value: changeListenerToken, propertyName: " changeListenerToken " , reject: reject)
7171
72- if isError || isTokenError {
73- return
74- }
72+ if isError || isTokenError {
73+ return
74+ }
7575
76- backgroundQueue. async {
77- do {
78- guard let collection = try CollectionManager . shared. getCollection (
79- args. collectionName,
80- scopeName: args. scopeName,
81- databaseName: args. databaseName
82- ) else {
83- reject ( " DATABASE_ERROR " , " Could not find collection " , nil )
84- return
85- }
86-
87- let listener = collection. addChangeListener ( queue: self . backgroundQueue) { [ weak self] ( change) in
88- guard let self = self else {
89- // Log.log(domain: .database, level: .warning, message: "Unable to notify changes as the handler object was released")
76+ backgroundQueue. async {
77+ do {
78+ guard let collection = try CollectionManager . shared. getCollection (
79+ args. collectionName,
80+ scopeName: args. scopeName,
81+ databaseName: args. databaseName
82+ ) else {
83+ reject ( " DATABASE_ERROR " , " Could not find collection " , nil )
9084 return
9185 }
86+
87+ let listener = collection. addChangeListener ( queue: self . backgroundQueue) { [ weak self] ( change) in
88+ guard let self = self else { return }
9289
93- // Format the data to match the CollectionChange interface
94- let resultData = NSMutableDictionary ( )
95- resultData. setValue ( token, forKey: " token " )
96- resultData. setValue ( change. documentIDs, forKey: " documentIDs " )
90+ // Format the data to match the CollectionChange interface
91+ let resultData = NSMutableDictionary ( )
92+ resultData. setValue ( token, forKey: " token " )
93+ resultData. setValue ( change. documentIDs, forKey: " documentIDs " )
9794
98- // Use DataAdapter to convert the Collection to a consistent dictionary format
99- let collectionDict = DataAdapter . shared. adaptCollectionToNSDictionary ( collection, databaseName: args. databaseName)
100- resultData. setValue ( collectionDict, forKey: " collection " )
95+ // Use DataAdapter to convert the Collection to a consistent dictionary format
96+ let collectionDict = DataAdapter . shared. adaptCollectionToNSDictionary ( collection, databaseName: args. databaseName)
97+ resultData. setValue ( collectionDict, forKey: " collection " )
10198
102- self . sendEvent ( withName: self . kCollectionChange, body: resultData)
103- }
99+ self . sendEvent ( withName: self . kCollectionChange, body: resultData)
100+ }
104101
105- self . collectionChangeListeners [ token] = listener
106- resolve ( nil )
107- } catch let error as NSError {
108- reject ( " DATABASE_ERROR " , error. localizedDescription, nil )
109- } catch {
110- reject ( " DATABASE_ERROR " , error. localizedDescription, nil )
102+ self . collectionChangeListeners [ token] = listener
103+ resolve ( nil )
104+ } catch let error as NSError {
105+ reject ( " DATABASE_ERROR " , error. localizedDescription, nil )
106+ } catch {
107+ reject ( " DATABASE_ERROR " , error. localizedDescription, nil )
108+ }
111109 }
112110 }
113- }
114111
115- @objc ( collection_RemoveChangeListener : fromCollectionWithName: fromDatabaseWithName: fromScopeWithName: withResolver: withRejecter: )
116- func collection_RemoveChangeListener (
112+ @objc ( collection_AddDocumentChangeListener : forDocumentWithId : fromCollectionWithName: fromDatabaseWithName: fromScopeWithName: withResolver: withRejecter: )
113+ func collection_AddDocumentChangeListener (
117114 changeListenerToken: NSString ,
115+ documentId: NSString ,
118116 collectionName: NSString ,
119117 name: NSString ,
120118 scopeName: NSString ,
121119 resolve: @escaping RCTPromiseResolveBlock ,
122120 reject: @escaping RCTPromiseRejectBlock
121+ ) -> Void {
122+ let ( isError, args) = DataAdapter . shared. adaptCollectionArgs ( name: name, collectionName: collectionName, scopeName: scopeName, reject: reject)
123+ let ( isTokenError, token) = DataAdapter . shared. adaptNonEmptyString ( value: changeListenerToken, propertyName: " changeListenerToken " , reject: reject)
124+ let ( isDocIdError, docId) = DataAdapter . shared. adaptNonEmptyString ( value: documentId, propertyName: " documentId " , reject: reject)
125+
126+ if isError || isTokenError || isDocIdError {
127+ return
128+ }
129+
130+ backgroundQueue. async {
131+ do {
132+ guard let collection = try CollectionManager . shared. getCollection (
133+ args. collectionName,
134+ scopeName: args. scopeName,
135+ databaseName: args. databaseName
136+ ) else {
137+ reject ( " DATABASE_ERROR " , " Could not find collection " , nil )
138+ return
139+ }
140+
141+ let listener = collection. addDocumentChangeListener ( id: docId, queue: self . backgroundQueue) { [ weak self] ( change) in
142+ guard let self = self else { return }
143+
144+ let resultData = NSMutableDictionary ( )
145+ resultData. setValue ( token, forKey: " token " )
146+ resultData. setValue ( change. documentID, forKey: " documentId " )
147+
148+ let collectionData = NSMutableDictionary ( )
149+ collectionData. setValue ( collection. name, forKey: " name " )
150+ collectionData. setValue ( collection. scope. name, forKey: " scopeName " )
151+ collectionData. setValue ( args. databaseName, forKey: " databaseName " )
152+ resultData. setValue ( collectionData, forKey: " collection " )
153+
154+ resultData. setValue ( change. database. name, forKey: " database " )
155+
156+ self . sendEvent ( withName: self . kCollectionDocumentChange, body: resultData)
157+ }
158+
159+ self . collectionDocumentChangeListeners [ token] = listener
160+ resolve ( nil )
161+ } catch let error as NSError {
162+ reject ( " DATABASE_ERROR " , error. localizedDescription, nil )
163+ } catch {
164+ reject ( " DATABASE_ERROR " , error. localizedDescription, nil )
165+ }
166+ }
167+ }
168+
169+
170+ @objc ( collection_RemoveChangeListener: withResolver: withRejecter: )
171+ func collection_RemoveChangeListener(
172+ changeListenerToken: NSString ,
173+ resolve: @escaping RCTPromiseResolveBlock ,
174+ reject: @escaping RCTPromiseRejectBlock
123175 ) -> Void {
124176 let token = String ( changeListenerToken)
125177
126178 backgroundQueue. async {
179+ // Check for collection change listeners
127180 if let listener = self . collectionChangeListeners [ token] as? ListenerToken {
128- // Remove the listener
129181 listener. remove ( )
130182 self . collectionChangeListeners. removeValue ( forKey: token)
131183 resolve ( nil )
132- } else {
133- reject ( " DATABASE_ERROR " , " No listener found for token \( token) " , nil )
184+ return
185+ }
186+
187+ // Check for document change listeners
188+ if let listener = self . collectionDocumentChangeListeners [ token] as? ListenerToken {
189+ listener. remove ( )
190+ self . collectionDocumentChangeListeners. removeValue ( forKey: token)
191+ resolve ( nil )
192+ return
134193 }
194+
195+ // No listener found with this token
196+ reject ( " DATABASE_ERROR " , " No listener found for token \( token) " , nil )
135197 }
136198 }
137199
0 commit comments