From 16066228264b3d0418486e0c2e6a8ceade4e37d1 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Mon, 18 Nov 2024 13:27:20 -0300 Subject: [PATCH] fix: deeplink service --- lib/main.dart | 55 -------------- .../sign_in_page/sign_in_page_widget.dart | 3 +- .../sign_up_page/sign_up_page_widget.dart | 2 + .../welcome_page/welcome_page_widget.dart | 4 +- .../services/deeplink/deep_link_service.dart | 73 +++++++++++++++++++ 5 files changed, 80 insertions(+), 57 deletions(-) create mode 100644 lib/shared/services/deeplink/deep_link_service.dart diff --git a/lib/main.dart b/lib/main.dart index 4e8a6d19..de20064f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:developer'; import 'dart:io'; -import 'package:app_links/app_links.dart'; import 'package:app_tracking_transparency/app_tracking_transparency.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; @@ -17,12 +16,10 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; -import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart'; import 'package:hub/shared/helpers/base_storage.dart'; import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/services/localization/localization_service.dart'; -import 'package:logging/logging.dart'; import 'package:responsive_framework/responsive_framework.dart'; import 'backend/notifications/firebase_messaging_service.dart'; @@ -118,8 +115,6 @@ class _AppState extends State with WidgetsBindingObserver { late AppStateNotifier _appStateNotifier; late GoRouter _router; bool displaySplashImage = true; - late AppLinks _appLinks; - StreamSubscription? _linkSubscription; final ThemeData _darkTheme = ThemeData( brightness: Brightness.dark, @@ -181,54 +176,6 @@ class _AppState extends State with WidgetsBindingObserver { ); }; - Future initDeepLinks() async { - try { - _appLinks = AppLinks(); - print('initDeepLinks'); - _linkSubscription = _appLinks.uriLinkStream.listen((uri) async { - final bool isRecovered = StorageHelper().isRecovered; - print('isRecovered: $isRecovered'); - if (isRecovered == false) await openAppLink(uri); - }); - } catch (e) { - print(e); - } - } - - Future openAppLink(Uri uri) async { - print('open app link: $uri'); - final bool isRecovered = StorageHelper().isRecovered; - print('isRecovered: $isRecovered'); - if (isRecovered == true) return; - StorageHelper().isRecovered = true; - final String email = uri.queryParameters['email'] ?? ''; - final String token = uri.queryParameters['token'] ?? ''; - print('email: $email, token: $token'); - final bool isNotEmpty = email.isNotEmpty && token.isNotEmpty; - if (isNotEmpty) { - final FlutterFlowTheme theme = FlutterFlowTheme.of(context); - final Widget screen = ForgotPasswordScreen(email: email, token: token); - builder(context) => screen; - print('showModalBottomSheet'); - WidgetsBinding.instance.addPostFrameCallback((_) async { - await showModalBottomSheet( - context: StorageHelper().context!, - builder: (context) => Padding(padding: MediaQuery.viewInsetsOf(context), child: builder(context)), - isScrollControlled: true, - // barrierColor: theme.primaryBackground.withOpacity(0.2), - backgroundColor: theme.primaryBackground, - showDragHandle: true, - useSafeArea: true, - enableDrag: true, - // isDismissible: true, - ).whenComplete(() { - StorageHelper().isRecovered = false; - print('showModalBottomSheet completed'); - }); - }); - } - } - void _setupFirebaseMessaging() async { FirebaseMessaging messaging = FirebaseMessaging.instance; RemoteMessage? initialMessage = await messaging.getInitialMessage(); @@ -282,13 +229,11 @@ class _AppState extends State with WidgetsBindingObserver { ); _setupFirebaseMessaging(); - initDeepLinks(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); - _linkSubscription?.cancel(); super.dispose(); } diff --git a/lib/pages/sign_in_page/sign_in_page_widget.dart b/lib/pages/sign_in_page/sign_in_page_widget.dart index 471bbee2..7b603002 100644 --- a/lib/pages/sign_in_page/sign_in_page_widget.dart +++ b/lib/pages/sign_in_page/sign_in_page_widget.dart @@ -1,5 +1,6 @@ import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/mixins/switcher_mixin.dart'; +import 'package:hub/shared/services/deeplink/deep_link_service.dart'; import '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart'; import '/flutter_flow/flutter_flow_theme.dart'; @@ -24,12 +25,12 @@ class _SignInPageWidgetState extends State { void initState() { super.initState(); _model = createModel(context, () => SignInPageModel()); + DeepLinkService().initDeepLinks(); } @override void dispose() { _model.dispose(); - super.dispose(); } diff --git a/lib/pages/sign_up_page/sign_up_page_widget.dart b/lib/pages/sign_up_page/sign_up_page_widget.dart index 00d95f56..5b6a1909 100644 --- a/lib/pages/sign_up_page/sign_up_page_widget.dart +++ b/lib/pages/sign_up_page/sign_up_page_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/mixins/switcher_mixin.dart'; +import 'package:hub/shared/services/deeplink/deep_link_service.dart'; import '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart'; import '/flutter_flow/flutter_flow_theme.dart'; @@ -25,6 +26,7 @@ class _SignUpPageWidgetState extends State { void initState() { super.initState(); _model = createModel(context, () => SignUpPageModel()); + DeepLinkService().initDeepLinks(); } @override diff --git a/lib/pages/welcome_page/welcome_page_widget.dart b/lib/pages/welcome_page/welcome_page_widget.dart index cb24d5e1..841495d2 100644 --- a/lib/pages/welcome_page/welcome_page_widget.dart +++ b/lib/pages/welcome_page/welcome_page_widget.dart @@ -1,8 +1,10 @@ + import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:hub/shared/helpers/base_storage.dart'; import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/mixins/switcher_mixin.dart'; +import 'package:hub/shared/services/deeplink/deep_link_service.dart'; import '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart'; import '/flutter_flow/flutter_flow_theme.dart'; @@ -41,12 +43,12 @@ class _WelcomePageWidgetState extends State { setState(() {}); } }); + DeepLinkService().initDeepLinks(); } @override void dispose() { _model.dispose(); - super.dispose(); } diff --git a/lib/shared/services/deeplink/deep_link_service.dart b/lib/shared/services/deeplink/deep_link_service.dart new file mode 100644 index 00000000..b77da747 --- /dev/null +++ b/lib/shared/services/deeplink/deep_link_service.dart @@ -0,0 +1,73 @@ +import 'dart:async'; +import 'package:app_links/app_links.dart'; +import 'package:flutter/material.dart'; +import 'package:hub/flutter_flow/flutter_flow_theme.dart'; +import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart'; +import 'package:hub/shared/helpers/storage_helper.dart'; + +class DeepLinkService { + static final DeepLinkService _instance = DeepLinkService._internal(); + + factory DeepLinkService() => _instance; + + DeepLinkService._internal(); + + + late final AppLinks _appLinks; + StreamSubscription? _linkSubscription; + + Future initDeepLinks() async { + try { + _appLinks = AppLinks(); + print('initDeepLinks'); + _linkSubscription = _appLinks.uriLinkStream.listen((uri) async { + if (!StorageHelper().isRecovered) { + await _handleDeepLink(uri); + } + }); + } catch (e) { + print('Error initializing deep links: $e'); + } + } + + Future _handleDeepLink(Uri uri) async { + print('Handling deep link: $uri'); + if (StorageHelper().isRecovered) return; + + StorageHelper().isRecovered = true; + final email = uri.queryParameters['email'] ?? ''; + final token = uri.queryParameters['token'] ?? ''; + print('email: $email, token: $token'); + + if (email.isNotEmpty && token.isNotEmpty) { + await _showForgotPasswordScreen(email, token); + } + } + + Future _showForgotPasswordScreen(String email, String token) async { + final theme = FlutterFlowTheme.of(StorageHelper().context!); + final screen = ForgotPasswordScreen(email: email, token: token); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await showModalBottomSheet( + context: StorageHelper().context!, + builder: (context) => Padding( + padding: MediaQuery.viewInsetsOf(context), + child: screen, + ), + isScrollControlled: true, + backgroundColor: theme.primaryBackground, + showDragHandle: true, + useSafeArea: true, + enableDrag: true, + ).whenComplete(() { + StorageHelper().isRecovered = false; + print('showModalBottomSheet completed'); + }); + }); + } + + void dispose() { + _linkSubscription?.cancel(); + } +}