Skip to content

Commit

Permalink
Use EmbeddedInfo intermediate object
Browse files Browse the repository at this point in the history
  • Loading branch information
crow committed Aug 29, 2024
1 parent 09a5403 commit 9d19ab3
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 26 deletions.
52 changes: 40 additions & 12 deletions lib/src/airship_automation.dart
Original file line number Diff line number Diff line change
@@ -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<EmbeddedInfo> embeddedInfos;

const EmbeddedInfoUpdatedEvent(this.embeddedInfos);

static EmbeddedInfoUpdatedEvent fromJson(dynamic json) {
List<dynamic> pendingList = json['pending'] as List? ?? [];

List<EmbeddedInfo> embeddedInfos =
pendingList.map((item) => EmbeddedInfo(item['embeddedId'])).toList();

return EmbeddedInfoUpdatedEvent(embeddedInfos);
}

@override
String toString() => "EmbeddedInfoUpdatedEvent(embeddedInfos=$embeddedInfos)";
}

class AirshipAutomation {
final AirshipModule _module;
final Map<String, StreamController<bool>> _isReadyControllers = {};
List<String> _embeddedIds = [];
final Map<String, StreamController<bool>> _isEmbeddedAvailableControllers =
{};
List<EmbeddedInfo> _embeddedInfos = [];
late StreamSubscription<EmbeddedInfoUpdatedEvent> _subscription;

AirshipAutomation(this._module) {
_subscription = onEmbeddedInfoUpdated.listen(_updateEmbeddedIds);
}

Stream<bool> isReadyStream({required String embeddedId}) =>
(_isReadyControllers[embeddedId] ??= StreamController<bool>.broadcast()
..add(isReady(embeddedId: embeddedId)))
Stream<bool> isEmbeddedAvailableStream({required String embeddedId}) =>
(_isEmbeddedAvailableControllers[embeddedId] ??=
StreamController<bool>.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<EmbeddedInfoUpdatedEvent> 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();
}
}
Expand Down
12 changes: 6 additions & 6 deletions lib/src/airship_embedded_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,17 @@ class EmbeddedViewState extends State<EmbeddedView>
with AutomaticKeepAliveClientMixin<EmbeddedView> {
late MethodChannel _channel;
late Stream<bool> _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;
});
}
});
Expand All @@ -75,7 +75,7 @@ class EmbeddedViewState extends State<EmbeddedView>
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(opacity: animation, child: child);
},
child: _isReady == true
child: _isEmbeddedAvailable == true
? SizedBox(
key: ValueKey<bool>(true),
width: widget.parentWidth ?? availableSize.width,
Expand Down
28 changes: 20 additions & 8 deletions lib/src/airship_events.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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<String> embeddedIds;
final List<EmbeddedInfo> embeddedInfos;

const EmbeddedInfoUpdatedEvent._internal(this.embeddedIds);
const EmbeddedInfoUpdatedEvent(this.embeddedInfos);

static EmbeddedInfoUpdatedEvent fromJson(dynamic json) {
List<String> embeddedIds = List<String>.from(json["embeddedIds"] ?? []);
return EmbeddedInfoUpdatedEvent._internal(embeddedIds);
List<dynamic> pendingList = json['pending'] as List? ?? [];

List<EmbeddedInfo> 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.
Expand Down

0 comments on commit 9d19ab3

Please sign in to comment.