listenForEvents method

  1. @override
void listenForEvents()
override

Connects to chatwoot websocket and starts listening for updates

Received events/messages are pushed through ChatwootClient.callbacks

Implementation

@override
void listenForEvents() {
  final token = localStorage.contactDao.getContact()?.pubsubToken;
  if (token == null) {
    return;
  }
  clientService.startWebSocketConnection(
      localStorage.contactDao.getContact()!.pubsubToken ?? "");

  final newSubscription = clientService.connection!.stream.listen((event) {
    ChatwootEvent chatwootEvent = ChatwootEvent.fromJson(jsonDecode(event));
    if (chatwootEvent.type == ChatwootEventType.welcome) {
      callbacks.onWelcome?.call();
    } else if (chatwootEvent.type == ChatwootEventType.ping) {
      callbacks.onPing?.call();
    } else if (chatwootEvent.type == ChatwootEventType.confirm_subscription) {
      if (!_isListeningForEvents) {
        _isListeningForEvents = true;
      }
      _publishPresenceUpdates();
      callbacks.onConfirmedSubscription?.call();
    } else if (chatwootEvent.message?.event ==
        ChatwootEventMessageType.message_created) {
      print("here comes message: $event");
      final message = chatwootEvent.message!.data!.getMessage();
      localStorage.messagesDao.saveMessage(message);
      if (message.isMine) {
        callbacks.onMessageDelivered
            ?.call(message, chatwootEvent.message!.data!.echoId!);
      } else {
        callbacks.onMessageReceived?.call(message);
      }
    } else if (chatwootEvent.message?.event ==
        ChatwootEventMessageType.message_updated) {
      print("here comes the updated message: $event");

      final message = chatwootEvent.message!.data!.getMessage();
      localStorage.messagesDao.saveMessage(message);

      callbacks.onMessageUpdated?.call(message);
    } else if (chatwootEvent.message?.event ==
        ChatwootEventMessageType.conversation_typing_off) {
      callbacks.onConversationStoppedTyping?.call();
    } else if (chatwootEvent.message?.event ==
        ChatwootEventMessageType.conversation_typing_on) {
      callbacks.onConversationStartedTyping?.call();
    } else if (chatwootEvent.message?.event ==
            ChatwootEventMessageType.conversation_status_changed &&
        chatwootEvent.message?.data?.status == "resolved" &&
        chatwootEvent.message?.data?.id ==
            (localStorage.conversationDao.getConversation()?.id ?? 0)) {
      //delete conversation result
      localStorage.conversationDao.deleteConversation();
      localStorage.messagesDao.clear();
      callbacks.onConversationResolved?.call();
    } else if (chatwootEvent.message?.event ==
        ChatwootEventMessageType.presence_update) {
      final presenceStatuses =
          (chatwootEvent.message!.data!.users as Map<dynamic, dynamic>)
              .values;
      final isOnline = presenceStatuses.contains("online");
      if (isOnline) {
        callbacks.onConversationIsOnline?.call();
        _presenceResetTimer?.cancel();
        _startPresenceResetTimer();
      } else {
        callbacks.onConversationIsOffline?.call();
      }
    } else {
      print("chatwoot unknown event: $event");
    }
  });
  _subscriptions.add(newSubscription);
}