diff --git a/lib/di.dart b/lib/di.dart index 9f2256304..3e10bd7a1 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -1256,7 +1256,7 @@ Future setup({ getIt.registerFactoryParam( (Order order, _) => OrderDetailsPage(getIt.get(param1: order))); - getIt.registerFactory(() => SupportViewModel()); + getIt.registerFactory(() => SupportViewModel(getIt.get())); getIt.registerFactory(() => SupportPage(getIt.get())); @@ -1418,4 +1418,4 @@ Future setup({ getIt.registerFactory(() => SeedVerificationPage(getIt.get())); _isSetupFinished = true; -} \ No newline at end of file +} diff --git a/lib/src/screens/support_chat/support_chat_page.dart b/lib/src/screens/support_chat/support_chat_page.dart index 203b75775..b66af5a59 100644 --- a/lib/src/screens/support_chat/support_chat_page.dart +++ b/lib/src/screens/support_chat/support_chat_page.dart @@ -3,10 +3,8 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/support_chat/widgets/chatwoot_widget.dart'; import 'package:cake_wallet/view_model/support_view_model.dart'; -import 'package:cw_core/utils/print_verbose.dart'; import 'package:flutter/material.dart'; - class SupportChatPage extends BasePage { SupportChatPage(this.supportViewModel, {required this.secureStorage}); @@ -23,17 +21,16 @@ class SupportChatPage extends BasePage { Widget body(BuildContext context) => FutureBuilder( future: getCookie(), builder: (BuildContext context, AsyncSnapshot snapshot) { - printV(snapshot.data); if (snapshot.hasData) return ChatwootWidget( secureStorage, - supportUrl: supportViewModel.fetchUrl(authToken: snapshot.data!) + supportUrl: supportViewModel.fetchUrl(authToken: snapshot.data!), + appVersion: supportViewModel.appVersion, ); return Container(); }, ); - Future getCookie() async { - return await secureStorage.read(key: COOKIE_KEY) ?? ""; - } + Future getCookie() async => + await secureStorage.read(key: COOKIE_KEY) ?? ""; } diff --git a/lib/src/screens/support_chat/widgets/chatwoot_widget.dart b/lib/src/screens/support_chat/widgets/chatwoot_widget.dart index 4f5e58c97..3b9c3301a 100644 --- a/lib/src/screens/support_chat/widgets/chatwoot_widget.dart +++ b/lib/src/screens/support_chat/widgets/chatwoot_widget.dart @@ -1,46 +1,50 @@ import 'dart:convert'; import 'package:cake_wallet/core/secure_storage.dart'; -import 'package:cw_core/utils/print_verbose.dart'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; const COOKIE_KEY = 'chatwootCookie'; class ChatwootWidget extends StatefulWidget { - ChatwootWidget(this.secureStorage, {required this.supportUrl}); + const ChatwootWidget( + this.secureStorage, { + required this.supportUrl, + required this.appVersion, + }); final SecureStorage secureStorage; final String supportUrl; + final String appVersion; @override ChatwootWidgetState createState() => ChatwootWidgetState(); } class ChatwootWidgetState extends State { - final GlobalKey _webViewkey = GlobalKey(); + final GlobalKey _webViewKey = GlobalKey(); @override Widget build(BuildContext context) => InAppWebView( - key: _webViewkey, - initialSettings: InAppWebViewSettings( - transparentBackground: true, - ), + key: _webViewKey, + initialSettings: InAppWebViewSettings(transparentBackground: true), initialUrlRequest: URLRequest(url: WebUri(widget.supportUrl)), onWebViewCreated: (InAppWebViewController controller) { controller.addWebMessageListener( WebMessageListener( jsObjectName: 'ReactNativeWebView', - onPostMessage: (WebMessage? message, WebUri? sourceOrigin, bool isMainFrame, - PlatformJavaScriptReplyProxy replyProxy) { + onPostMessage: (WebMessage? message, WebUri? sourceOrigin, + bool isMainFrame, PlatformJavaScriptReplyProxy replyProxy) { final shortenedMessage = message?.data.toString().substring(16); - if (shortenedMessage != null && isJsonString(shortenedMessage)) { + if (shortenedMessage != null && + _isJsonString(shortenedMessage)) { final parsedMessage = jsonDecode(shortenedMessage); final eventType = parsedMessage["event"]; if (eventType == 'loaded') { final authToken = parsedMessage["config"]["authToken"]; - printV(authToken); - storeCookie(authToken as String); + _storeCookie(authToken as String); + _setCustomAttributes( + controller, {"app_version": widget.appVersion}); } } }, @@ -49,7 +53,7 @@ class ChatwootWidgetState extends State { }, ); - bool isJsonString(String str) { + bool _isJsonString(String str) { try { jsonDecode(str); } catch (e) { @@ -58,7 +62,24 @@ class ChatwootWidgetState extends State { return true; } - Future storeCookie(String value) async { - await widget.secureStorage.write(key: COOKIE_KEY, value: value); + /// Add additional contact attributes to the chatwoot chat. + /// IMPORTANT: You have to add the attribute key in the chatwoot settings + /// under: settings/custom-attributes + Future _setCustomAttributes( + InAppWebViewController controller, + Map customAttributes, + ) { + final attributeObject = { + "event": "set-custom-attributes", + "customAttributes": customAttributes, + }; + return controller.postWebMessage( + message: WebMessage( + data: "chatwoot-widget:${jsonEncode(attributeObject)}", + ), + ); } + + Future _storeCookie(String value) => + widget.secureStorage.write(key: COOKIE_KEY, value: value); } diff --git a/lib/view_model/support_view_model.dart b/lib/view_model/support_view_model.dart index d48b182b1..766bcc9a2 100644 --- a/lib/view_model/support_view_model.dart +++ b/lib/view_model/support_view_model.dart @@ -1,16 +1,19 @@ +import 'package:cake_wallet/.secrets.g.dart' as secrets; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/view_model/settings/link_list_item.dart'; import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:mobx/mobx.dart'; -import 'package:cake_wallet/.secrets.g.dart' as secrets; part 'support_view_model.g.dart'; class SupportViewModel = SupportViewModelBase with _$SupportViewModel; abstract class SupportViewModelBase with Store { - SupportViewModelBase() + final SettingsStore settingsStore; + + SupportViewModelBase(this.settingsStore) : items = [ LinkListItem( title: 'Email', @@ -116,5 +119,8 @@ abstract class SupportViewModelBase with Store { return supportUrl; } + String get appVersion => + "${isMoneroOnly ? "Monero.com" : "Cake Wallet"} - ${settingsStore.appVersion}"; + List items; }