@@ -273,6 +273,8 @@ class AccessoryController: ObservableObject {
273273 completion ( . failure( . downloadingReportsFailed) )
274274 case . success( let devices) :
275275 let reports = devices. compactMap ( { $0. reports } ) . flatMap ( { $0 } )
276+ self ? . mergeAndSaveReports ( reports: reports)
277+
276278 if reports. isEmpty {
277279 completion ( . failure( . noReportsFound) )
278280 } else {
@@ -281,11 +283,44 @@ class AccessoryController: ObservableObject {
281283 }
282284 }
283285 }
284-
285286 }
286287 }
287288 }
289+
290+ func mergeAndSaveReports( reports: [ FindMyReport ] ) {
291+ // Get URL of the file to save reports
292+ guard let fileURL = FileManager . default. urls ( for: . documentDirectory, in: . userDomainMask) . first? . appendingPathComponent ( " location_reports.json " ) else {
293+ return
294+ }
295+ print ( fileURL)
296+
297+ var allReports : [ FindMyReport ] = [ ]
298+
299+ // Read previously saved reports from file
300+ if let data = try ? Data ( contentsOf: fileURL) ,
301+ let savedReports = try ? JSONDecoder ( ) . decode ( [ FindMyReport ] . self, from: data) {
302+ // Remove duplicates from newly downloaded reports
303+ let uniqueReports = reports. filter { newReport in
304+ !savedReports. contains { existingReport in
305+ return newReport. id == existingReport. id
306+ }
307+ }
308+ // Merge newly downloaded reports with previously saved reports
309+ allReports. append ( contentsOf: savedReports)
310+ allReports. append ( contentsOf: uniqueReports)
311+ } else {
312+ // No previously saved reports, simply add all newly downloaded reports
313+ allReports. append ( contentsOf: reports)
314+ }
288315
316+ // Write merged reports back to file
317+ do {
318+ let jsonData = try JSONEncoder ( ) . encode ( allReports)
319+ try jsonData. write ( to: fileURL)
320+ } catch {
321+ print ( " Failed to write new reports to file " )
322+ }
323+ }
289324}
290325
291326class AccessoryControllerPreview : AccessoryController {
0 commit comments