import 'dart:async'; import 'package:paperless_api/paperless_api.dart'; import 'package:rxdart/subjects.dart'; typedef DocumentChangedCallback = void Function(DocumentModel document); class DocumentChangedNotifier { final Subject _updated = PublishSubject(); final Subject _deleted = PublishSubject(); final Map> _subscribers = {}; Stream get $updated => _updated.asBroadcastStream(); Stream get $deleted => _deleted.asBroadcastStream(); void notifyUpdated(DocumentModel updated) { _updated.add(updated); } void notifyDeleted(DocumentModel deleted) { _deleted.add(deleted); } void addListener( Object subscriber, { DocumentChangedCallback? onUpdated, DocumentChangedCallback? onDeleted, Iterable? ids, }) { _subscribers.putIfAbsent( subscriber, () => [ _updated.where((doc) => ids?.contains(doc.id) ?? true).listen((value) { onUpdated?.call(value); }), _deleted.where((doc) => ids?.contains(doc.id) ?? true).listen((value) { onDeleted?.call(value); }), ], ); } void removeListener(Object subscriber) { _subscribers[subscriber]?.forEach((element) { element.cancel(); }); } void close() { _updated.close(); _deleted.close(); } }