replace method

Future<void> replace(
  1. DynamicMap replaceData
)

Implementation

Future<void> replace(DynamicMap replaceData) async {
  await initialize();
  final cache = <String, DynamicMap>{};
  for (final tmp in _documentListeners.entries) {
    final trimPath = tmp.key.trimQuery().trimString("/");
    if (cache.containsKey(trimPath)) {
      continue;
    }
    final paths = trimPath.split("/");
    if (paths.isEmpty) {
      continue;
    }
    final value = _data._readFromPath(paths, 0);
    if (value is! Map) {
      continue;
    }
    cache[trimPath] = value.cast<String, dynamic>();
  }
  for (final tmp in _collectionListeners.entries) {
    final trimPath = tmp.key.trimQuery().trimString("/");
    final paths = trimPath.split("/");
    if (paths.isEmpty) {
      continue;
    }
    final value = _data._readFromPath(paths, 0);
    if (value is! DynamicMap) {
      continue;
    }
    final entries = value.toList(
      (key, value) {
        if (value is! Map) {
          return null;
        }
        return MapEntry(
          key,
          Map<String, dynamic>.from(value),
        );
      },
    ).removeEmpty();
    for (final e in entries) {
      final path = "$trimPath/${e.key}";
      if (cache.containsKey(path)) {
        continue;
      }
      cache[path] = value.cast<String, dynamic>();
    }
  }
  _data = replaceData;
  for (final tmp in cache.entries) {
    final trimPath = tmp.key;
    final paths = trimPath.split("/");
    final value = _data._readFromPath(paths, 0);
    if (value is! Map) {
      // Deleted.
      notifyDocuments(
        trimPath,
        paths.last,
        {},
        LocalStoreDocumentUpdateStatus.deleted,
        LocalStoreDocumentQuery(path: trimPath),
      );
    } else {
      // Add or Modified.
      notifyDocuments(
        trimPath,
        paths.last,
        value.cast<String, dynamic>(),
        LocalStoreDocumentUpdateStatus.addOrModified,
        LocalStoreDocumentQuery(path: trimPath),
      );
    }
  }
  await onSaved?.call();
}