diff --git a/lib/src/utils/parse_live_list.dart b/lib/src/utils/parse_live_list.dart index 115935ae3..1734e87d7 100644 --- a/lib/src/utils/parse_live_list.dart +++ b/lib/src/utils/parse_live_list.dart @@ -444,6 +444,70 @@ class ParseLiveList { } } +class ParseLiveElement extends ParseLiveListElement { + ParseLiveElement(T object, {bool loaded = false, List includeObject}) + : super(object, + loaded: loaded, + updatedSubItems: + ParseLiveList._toIncludeMap(includeObject ?? [])) { + _includes = ParseLiveList._toIncludeMap(includeObject ?? []); + queryBuilder = QueryBuilder(object.clone(null)) + ..includeObject(includeObject) + ..whereEqualTo(keyVarObjectId, object.objectId); + _init(object, loaded: loaded, includeObject: includeObject); + } + + Subscription _subscription; + Map _includes; + QueryBuilder queryBuilder; + + Future _init(T object, + {bool loaded = false, List includeObject}) async { + if (!loaded) { + final ParseResponse parseResponse = await queryBuilder.query(); + if (parseResponse.success) { + super.object = parseResponse.result.first; + } + } + + _subscription = await LiveQuery().client.subscribe( + QueryBuilder.copy(queryBuilder), + copyObject: object.clone(null)); + + _subscription.on(LiveQueryEvent.update, (T newObject) async { + await ParseLiveList._loadIncludes(newObject, + oldObject: super.object, paths: _includes); + super.object = newObject; + }); + + LiveQuery() + .client + .getClientEventStream + .listen((LiveQueryClientEvent event) { + _subscriptionQueue.whenComplete(() async { + // ignore: missing_enum_constant_in_switch + switch (event) { + case LiveQueryClientEvent.CONNECTED: + final ParseResponse parseResponse = await queryBuilder.query(); + if (parseResponse.success) { + super.object = parseResponse.result.first; + } + break; + } + }); + }); + } + + @override + void dispose() { + if (_subscription != null) { + LiveQuery().client.unSubscribe(_subscription); + _subscription = null; + } + super.dispose(); + } +} + class ParseLiveListElement { ParseLiveListElement(this._object, {bool loaded = false, Map updatedSubItems}) {