From 7fa532e077c14f8dc16e3941dd115f2e65382e5d Mon Sep 17 00:00:00 2001
From: Victor <victor@chatbotmaker.io>
Date: Thu, 6 Apr 2023 14:26:03 -0300
Subject: [PATCH] overrideUrlLoading param added to chatbox

---
 lib/src/chatbox.dart | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/lib/src/chatbox.dart b/lib/src/chatbox.dart
index 19b9da7..eb8669b 100644
--- a/lib/src/chatbox.dart
+++ b/lib/src/chatbox.dart
@@ -89,6 +89,7 @@ class ChatBox extends StatefulWidget {
   final TranslationToggledHandler? onTranslationToggled;
   final LoadingStateHandler? onLoadingStateChanged;
   final Map<String, MessageActionHandler>? onCustomMessageAction;
+  final Future<bool> Function(Uri uri)? overrideUrlLoading;
 
   const ChatBox({
     Key? key,
@@ -107,6 +108,7 @@ class ChatBox extends StatefulWidget {
     this.onTranslationToggled,
     this.onLoadingStateChanged,
     this.onCustomMessageAction,
+    this.overrideUrlLoading,
   }) : super(key: key);
 
   @override
@@ -236,16 +238,20 @@ class ChatBoxState extends State<ChatBox> {
         return PermissionResponse(resources: permissionRequest.resources, action: granted ? PermissionResponseAction.GRANT : PermissionResponseAction.DENY);
       },
       shouldOverrideUrlLoading: (InAppWebViewController controller, NavigationAction navigationAction) async {
-        if (navigationAction.navigationType == NavigationType.LINK_ACTIVATED) {
-          if (await launchUrl(navigationAction.request.url!)) {
-            // We launched the browser, so we don't navigate to the URL in the WebView
-            return NavigationActionPolicy.CANCEL;
-          } else {
-            // We couldn't launch the external browser, so as a fallback we're using the default action
-            return NavigationActionPolicy.ALLOW;
+        final overridden = widget.overrideUrlLoading == null ? false : await widget.overrideUrlLoading!(navigationAction.request.url!);
+        if (!overridden) {
+          if (navigationAction.navigationType == NavigationType.LINK_ACTIVATED) {
+            if (await launchUrl(navigationAction.request.url!)) {
+              // We launched the browser, so we don't navigate to the URL in the WebView
+              return NavigationActionPolicy.CANCEL;
+            } else {
+              // We couldn't launch the external browser, so as a fallback we're using the default action
+              return NavigationActionPolicy.ALLOW;
+            }
           }
+          return NavigationActionPolicy.ALLOW;
         }
-        return NavigationActionPolicy.ALLOW;
+        return NavigationActionPolicy.CANCEL;
       },
     );
   }