pendingOfflineTypesProvider top-level property

StateNotifierProvider<DelayedStateNotifier<Set<String>>, Set<String>?> pendingOfflineTypesProvider
final

Every time there is an offline operation added to/ removed from the queue, this will notify clients with all pending types (could be none) such that they can implement their own retry strategy.

Implementation

final pendingOfflineTypesProvider =
    StateNotifierProvider<DelayedStateNotifier<Set<String>>, Set<String>?>(
        (ref) {
  final _graph = ref.read(graphNotifierProvider);

  Set<String> _pendingTypes() {
    final node = _graph._getNode(_offlineAdapterKey)!;
    // obtain types from metadata e.g. _offline:users#4:findOne
    return node.keys.map((m) => m.split(':')[1].split('#')[0]).toSet();
  }

  final notifier = DelayedStateNotifier<Set<String>>();
  // emit initial value
  Timer.run(() {
    if (notifier.mounted) {
      notifier.state = _pendingTypes();
    }
  });

  final _dispose = _graph.where((event) {
    // filter the right events
    return [DataGraphEventType.addEdge, DataGraphEventType.removeEdge]
            .contains(event.type) &&
        event.keys.length == 2 &&
        event.keys.containsFirst(_offlineAdapterKey);
  }).addListener((_) {
    if (notifier.mounted) {
      // recalculate all pending types
      notifier.state = _pendingTypes();
    }
  });

  notifier.onDispose = _dispose;

  return notifier;
});