listenForEvents method
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);
}