TF-3278 Handle open tmail app deep link but it was installed but not signed in

This commit is contained in:
dab246
2024-11-18 16:39:12 +07:00
committed by Dat H. Pham
parent bebefb4463
commit cdfd2b7ee7
9 changed files with 209 additions and 3 deletions
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart'
import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/deep_links/deep_links_manager.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart';
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
@@ -75,6 +76,9 @@ class CoreBindings extends Bindings {
if (PlatformInfo.isIOS) {
Get.put(IOSNotificationManager());
}
if (PlatformInfo.isMobile) {
Get.put(DeepLinksManager());
}
Get.put(PreviewEmlFileUtils());
}
+45
View File
@@ -0,0 +1,45 @@
import 'package:equatable/equatable.dart';
import 'package:model/model.dart';
class DeepLinkData with EquatableMixin {
final String path;
final String? accessToken;
final String? refreshToken;
final String? idToken;
final int? expiresIn;
final String? username;
DeepLinkData({
required this.path,
this.accessToken,
this.refreshToken,
this.idToken,
this.expiresIn,
this.username,
});
bool isValidToken() => accessToken?.isNotEmpty == true && username?.isNotEmpty == true;
TokenOIDC getTokenOIDC() {
final expiredTime = expiresIn == null
? null
: DateTime.now().add(Duration(seconds: expiresIn!));
return TokenOIDC(
accessToken!,
TokenId(idToken ?? ''),
refreshToken ?? '',
expiredTime: expiredTime,
);
}
@override
List<Object?> get props => [
path,
accessToken,
refreshToken,
idToken,
expiresIn,
username,
];
}
@@ -0,0 +1,42 @@
import 'dart:async';
import 'package:app_links/app_links.dart';
import 'package:core/utils/app_logger.dart';
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
import 'package:tmail_ui_user/main/deep_links/deep_link_data.dart';
class DeepLinksManager {
Future<DeepLinkData?> getDeepLinkData() async {
final uriLink = await AppLinks().getInitialLink();
if (uriLink == null) return null;
final deepLinkData = parseDeepLink(uriLink.toString());
return deepLinkData;
}
DeepLinkData? parseDeepLink(String url) {
try {
final uri = Uri.parse(url.replaceFirst(OIDCConstant.twakeWorkplaceUrlScheme, 'https'));
final accessToken = uri.queryParameters['access_token'] ?? '';
final refreshToken = uri.queryParameters['refresh_token'] ?? '';
final idToken = uri.queryParameters['id_token'] ?? '';
final expiresInStr = uri.queryParameters['expires_in'] ?? '';
final username = uri.queryParameters['username'] ?? '';
final expiresIn = int.tryParse(expiresInStr);
return DeepLinkData(
path: uri.path,
accessToken: accessToken,
refreshToken: refreshToken,
idToken: idToken,
expiresIn: expiresIn,
username: username,
);
} catch (e) {
logError('DeepLinksManager::parseDeepLink:Exception = $e');
return null;
}
}
}
+1
View File
@@ -19,6 +19,7 @@ class AppConfig {
static const String linagoraPrivacyUrl = 'https://www.linagora.com/en/legal/privacy';
static const String saasRegistrationUrl = 'https://sign-up.twake.app';
static const String saasJmapServerUrl = 'https://jmap.twake.app';
static const String openAppHostDeepLink = 'openApp';
static String get baseUrl => dotenv.get('SERVER_URL', fallback: '');
static String get domainRedirectUrl => dotenv.get('DOMAIN_REDIRECT_URL', fallback: '');