diff --git a/lib/src/airship_automation.dart b/lib/src/airship_automation.dart index 8105b9a1..97dcfc71 100644 --- a/lib/src/airship_automation.dart +++ b/lib/src/airship_automation.dart @@ -1,38 +1,66 @@ import 'dart:async'; import 'airship_module.dart'; -import 'airship_events.dart'; + +class EmbeddedInfo { + final String embeddedId; + + EmbeddedInfo(this.embeddedId); + + @override + String toString() => "EmbeddedInfo(embeddedId=$embeddedId)"; +} + +class EmbeddedInfoUpdatedEvent { + final List embeddedInfos; + + const EmbeddedInfoUpdatedEvent(this.embeddedInfos); + + static EmbeddedInfoUpdatedEvent fromJson(dynamic json) { + List pendingList = json['pending'] as List? ?? []; + + List embeddedInfos = + pendingList.map((item) => EmbeddedInfo(item['embeddedId'])).toList(); + + return EmbeddedInfoUpdatedEvent(embeddedInfos); + } + + @override + String toString() => "EmbeddedInfoUpdatedEvent(embeddedInfos=$embeddedInfos)"; +} class AirshipAutomation { final AirshipModule _module; - final Map> _isReadyControllers = {}; - List _embeddedIds = []; + final Map> _isEmbeddedAvailableControllers = + {}; + List _embeddedInfos = []; late StreamSubscription _subscription; AirshipAutomation(this._module) { _subscription = onEmbeddedInfoUpdated.listen(_updateEmbeddedIds); } - Stream isReadyStream({required String embeddedId}) => - (_isReadyControllers[embeddedId] ??= StreamController.broadcast() - ..add(isReady(embeddedId: embeddedId))) + Stream isEmbeddedAvailableStream({required String embeddedId}) => + (_isEmbeddedAvailableControllers[embeddedId] ??= + StreamController.broadcast() + ..add(isEmbeddedAvailable(embeddedId: embeddedId))) .stream; - bool isReady({required String embeddedId}) => - _embeddedIds.contains(embeddedId); + bool isEmbeddedAvailable({required String embeddedId}) => + _embeddedInfos.any((info) => info.embeddedId == embeddedId); Stream get onEmbeddedInfoUpdated => _module .getEventStream("com.airship.flutter/event/embedded_info_updated") .map(EmbeddedInfoUpdatedEvent.fromJson); void _updateEmbeddedIds(EmbeddedInfoUpdatedEvent event) { - _embeddedIds = event.embeddedIds; - _isReadyControllers - .forEach((id, controller) => controller.add(_embeddedIds.contains(id))); + _embeddedInfos = event.embeddedInfos; + _isEmbeddedAvailableControllers.forEach((id, controller) => + controller.add(isEmbeddedAvailable(embeddedId: id))); } void dispose() { _subscription.cancel(); - for (var controller in _isReadyControllers.values) { + for (var controller in _isEmbeddedAvailableControllers.values) { controller.close(); } } diff --git a/lib/src/airship_embedded_view.dart b/lib/src/airship_embedded_view.dart index 729caa58..f5fd3a1d 100644 --- a/lib/src/airship_embedded_view.dart +++ b/lib/src/airship_embedded_view.dart @@ -41,17 +41,17 @@ class EmbeddedViewState extends State with AutomaticKeepAliveClientMixin { late MethodChannel _channel; late Stream _readyStream; - bool? _isReady; + bool? _isEmbeddedAvailable; @override void initState() { super.initState(); - _readyStream = - Airship.automation.isReadyStream(embeddedId: widget.embeddedId); - _readyStream.listen((isReady) { + _readyStream = Airship.automation + .isEmbeddedAvailableStream(embeddedId: widget.embeddedId); + _readyStream.listen((isEmbeddedAvailable) { if (mounted) { setState(() { - _isReady = isReady; + _isEmbeddedAvailable = isEmbeddedAvailable; }); } }); @@ -75,7 +75,7 @@ class EmbeddedViewState extends State transitionBuilder: (Widget child, Animation animation) { return FadeTransition(opacity: animation, child: child); }, - child: _isReady == true + child: _isEmbeddedAvailable == true ? SizedBox( key: ValueKey(true), width: widget.parentWidth ?? availableSize.width, diff --git a/lib/src/airship_events.dart b/lib/src/airship_events.dart index eb977339..57b0292f 100644 --- a/lib/src/airship_events.dart +++ b/lib/src/airship_events.dart @@ -1,3 +1,5 @@ +import 'package:airship_flutter/src/airship_automation.dart'; + import 'push_payload.dart'; import 'push_notification_status.dart'; import 'ios_push_options.dart'; @@ -66,22 +68,32 @@ class MessageCenterUpdatedEvent { } } +class EmbeddedInfo { + final String embeddedId; + + EmbeddedInfo(this.embeddedId); + + @override + String toString() => "EmbeddedInfo(embeddedId=$embeddedId)"; +} + /// Event fired when embedded view info updates. class EmbeddedInfoUpdatedEvent { - /// Embedded IDs - final List embeddedIds; + final List embeddedInfos; - const EmbeddedInfoUpdatedEvent._internal(this.embeddedIds); + const EmbeddedInfoUpdatedEvent(this.embeddedInfos); static EmbeddedInfoUpdatedEvent fromJson(dynamic json) { - List embeddedIds = List.from(json["embeddedIds"] ?? []); - return EmbeddedInfoUpdatedEvent._internal(embeddedIds); + List pendingList = json['pending'] as List? ?? []; + + List embeddedInfos = + pendingList.map((item) => EmbeddedInfo(item['embeddedId'])).toList(); + + return EmbeddedInfoUpdatedEvent(embeddedInfos); } @override - String toString() { - return "EmbeddedInfoUpdatedEvent(embeddedIds=$embeddedIds)"; - } + String toString() => "EmbeddedInfoUpdatedEvent(embeddedInfos=$embeddedInfos)"; } /// Event fired when a channel is created.