mergeImportedPlaces static method

Future<bool> mergeImportedPlaces(
  1. List<Place> imported,
  2. BuildContext context,
  3. Widget returnWidget, {
  4. void onProgress(
    1. int,
    2. int
    )?,
})

Implementation

static Future<bool> mergeImportedPlaces(
  List<Place> imported,
  BuildContext context,
  Widget returnWidget, {
  void Function(int, int)? onProgress,
}) async {
  try {
    if (!authStateNotifier.value) return false;
    final existing = await fetchPodPlaces();
    final ids = existing.map((p) => p.id).toSet();
    final newPlaces = imported.where((p) => !ids.contains(p.id)).toList();
    if (newPlaces.isEmpty && imported.isNotEmpty) return true;
    final withAddr = <Place>[];
    for (int i = 0; i < newPlaces.length; i++) {
      final p = newPlaces[i];
      onProgress?.call(i + 1, newPlaces.length);
      final addr = await GeocodingService.getAddress(p.lat, p.lng);
      withAddr.add(
        Place(
          id: p.id,
          lat: p.lat,
          lng: p.lng,
          note: p.note,
          timestamp: p.timestamp,
          address: addr,
          isLocal: false,
        ),
      );
    }
    final merged = [...withAddr, ...existing];

    // Write main file first.
    final success = await writePlacesJsonFile(
      jsonEncode(merged.map((p) => p.toJson()).toList()),
    );

    if (success) {
      // Write individual files for new places in parallel.
      await Future.wait(withAddr.map((p) => writeIndividualPlaceFile(p)));
      await clearCache();
      placesChangeNotifier.value++;

      // Invalidate directory cache and notify file browser.

      PodDirectoryService.invalidateCache('data/places');
      PodDirectoryService.notifyChange();
    }
    return success;
  } catch (_) {
    return false;
  }
}