MethodChannelFlutterselligent constructor

MethodChannelFlutterselligent()

Implementation

MethodChannelFlutterselligent() {
  log.onRecord.listen((record) {
    debugPrint('[FlutterSelligent] ${record.message}');
  });

  if (Platform.environment.containsKey('FLUTTER_TEST')) { return; }

  methodChannel.setMethodCallHandler((call) async {
    var eventType = call.arguments['broadcastEventType'];
    var data = getData(call.arguments['data']);

    if (call.method == 'broadcastEvent') {
      if (eventType == BroadcastEventType.buttonClick.value) {
        handleEvents(BroadcastEvent(
          BroadcastEventType.buttonClick,
          ButtonData(
            data['id'] as String,
            data['label'] as String,
            NotificationButtonType.getByValue(data['type'] as int),
            data['value'] as String,
            data['data']
          )
        ));
      }
      else if (eventType == BroadcastEventType.universalLink.value) {
        handleEvents(BroadcastEvent(
          BroadcastEventType.universalLink,
          UniversalLinkData(data['url'] as String)
        ));
      }
      else if (eventType == BroadcastEventType.receivedNotification.value) {
        handleEvents(BroadcastEvent(
          BroadcastEventType.receivedNotification,
          NotificationData(
            data['pushId'] as String,
            data['name'] as String
          )
        ));
      }
      else if (eventType == BroadcastEventType.receivedIAM.value) {
        var newMessages = data['messages'].map((m) {
          var message = m as Map<Object?, Object?>;
          return InAppMessageEventData(message['id'] as String, message['title'] as String);
        }).toList();

        handleEvents(BroadcastEvent(
          BroadcastEventType.receivedIAM,
          InAppMessageEventListData(
            newMessages,
          )
        ));
      }
      else if (eventType == BroadcastEventType.receiveDeviceId.value) {
        handleEvents(BroadcastEvent(
          BroadcastEventType.receiveDeviceId,
          DeviceIdData(data['deviceId'] as String)
        ));
      }
      else if (eventType == BroadcastEventType.receivedGcmToken.value) {
        handleEvents(BroadcastEvent(
          BroadcastEventType.receivedGcmToken,
          GcmTokenData(data['token'] as String)
        ));
      }
      else if (eventType == BroadcastEventType.displayingIAM.value) {
        var appContext = appNavigatorKey?.currentState?.overlay?.context;
        var messages = await getInAppMessages();
        var messageId = data['id'] as String;
        var message = messages.where((m) => m.id == messageId).firstOrNull;

        if (message != null && appContext != null && appContext.mounted && message.type == InAppMessageType.alert) {
          List<TextButton> buttons = [];

          setInAppMessageAsSeen(messageId);

          for (var button in message.buttons) {
            buttons.add(
              TextButton(
                style: TextButton.styleFrom(textStyle: Theme.of(appContext).textTheme.labelLarge),
                child: Text(button.label),
                onPressed: () {
                  executeButtonAction(button.id, message.id);
                  Navigator.of(appContext).pop();
                }
            ));
          }

          showDialog(context: appContext, builder: (x) => AlertDialog(
            title: Text(message.title),
            content: Text(message.body),
            actions: buttons
          ));
        }
        else {
          displayNotification(messageId);
        }

        handleEvents(BroadcastEvent(
          BroadcastEventType.displayingIAM,
          InAppMessageEventData(
            messageId,
            data['title'] as String
          )
        ));
      }
      else if (eventType == BroadcastEventType.displayNotification.value) {
        handleEvents(BroadcastEvent(BroadcastEventType.displayNotification, null));
      }
      else if (eventType == BroadcastEventType.dismissNotification.value) {
        handleEvents(BroadcastEvent(BroadcastEventType.dismissNotification, null));
      }
      else if (call.arguments['name'] == BroadcastEventType.customEvent.value) {
        handleEvents(BroadcastEvent(BroadcastEventType.customEvent, eventType));
      }
    }
    else {
      log.warning('Method not implemented: ${call.method}');
    }
  });
}