diff --git a/core/lib/utils/html/html_utils.dart b/core/lib/utils/html/html_utils.dart index b156ed862..23e206ff2 100644 --- a/core/lib/utils/html/html_utils.dart +++ b/core/lib/utils/html/html_utils.dart @@ -554,4 +554,25 @@ class HtmlUtils { .replaceAll('\n', '') .replaceAll('\t', ''); } + + + /// Returns true if the browser is Safari and its major version is less than 17. + static bool isSafariBelow17() { + try { + final userAgent = html.window.navigator.userAgent; + log('HtmlUtils::isOldSafari:UserAgent = $userAgent'); + final isSafari = userAgent.contains('Safari') && !userAgent.contains('Chrome'); + if (!isSafari) return false; + + final match = RegExp(r'Version/(\d+)\.').firstMatch(userAgent); + if (match == null) return false; + + final version = int.tryParse(match.group(1)!); + log('HtmlUtils::isOldSafari:Version = $version'); + return version != null && version < 17; + } catch (e) { + logError('HtmlUtils::isOldSafari:Exception = $e'); + return false; + } + } } diff --git a/lib/main/utils/app_utils.dart b/lib/main/utils/app_utils.dart index 2afe30ba9..771c43d3f 100644 --- a/lib/main/utils/app_utils.dart +++ b/lib/main/utils/app_utils.dart @@ -1,4 +1,5 @@ -import 'package:core/utils/app_logger.dart'; +import 'package:core/core.dart'; +import 'package:core/utils/html/html_utils.dart'; import 'package:date_format/date_format.dart' as date_format; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -9,6 +10,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/language_code_constants.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html; class AppUtils { const AppUtils._(); @@ -31,12 +33,16 @@ class AppUtils { ); } - static Future launchLink(String url, {bool isNewTab = true}) async { - return await launchUrl( - Uri.parse(url), - webOnlyWindowName: isNewTab ? '_blank' : '_self', - mode: LaunchMode.externalApplication - ); + static void launchLink(String url, {bool isNewTab = true}) { + if (PlatformInfo.isWeb && HtmlUtils.isSafariBelow17()) { + html.window.open(url, isNewTab ? '_blank' : '_self'); + } else { + launchUrl( + Uri.parse(url), + webOnlyWindowName: isNewTab ? '_blank' : '_self', + mode: LaunchMode.externalApplication, + ); + } } static bool isDirectionRTL(BuildContext context) {