From b97c32f80b8ea5e0d04478e966243a6eb1cb1640 Mon Sep 17 00:00:00 2001 From: jantunesmessias Date: Tue, 19 Nov 2024 15:31:22 -0300 Subject: [PATCH] =?UTF-8?q?=CB=9Cmilestone=CB=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner/Info.plist | 2 +- lib/flutter_flow/nav/nav.dart | 78 +++++++++++++------ lib/main.dart | 23 ++++-- .../sign_in_page/sign_in_page_widget.dart | 3 - .../sign_up_page/sign_up_page_widget.dart | 3 - .../welcome_page/welcome_page_widget.dart | 12 +-- .../services/deeplink/deep_link_service.dart | 36 +++++---- 7 files changed, 96 insertions(+), 61 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 3858867a..64b07808 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -3,7 +3,7 @@ FlutterDeepLinkingEnabled - + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index f891b962..3982df52 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -28,6 +28,8 @@ export 'serialization_util.dart'; const kTransitionInfoKey = '__transition_info__'; +final GlobalKey key = GlobalKey(); + class AppStateNotifier extends ChangeNotifier { AppStateNotifier._(); @@ -44,6 +46,7 @@ class AppStateNotifier extends ChangeNotifier { GoRouter createRouter(AppStateNotifier appStateNotifier) { return GoRouter( + navigatorKey: key, initialLocation: '/', debugLogDiagnostics: true, refreshListenable: appStateNotifier, @@ -80,19 +83,28 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) { builder: (context, _) { return FutureBuilder( future: () async { - final bool isLogged = - await StorageHelper().get(SecureStorageKey.isLogged.value, Storage.SecureStorage) == 'true'; - final bool haveLocal = - await StorageHelper().get(SecureStorageKey.haveLocal.value, Storage.SecureStorage) == 'true'; - final bool haveUserUUID = - (await StorageHelper().get(SQLiteStorageKey.userUUID.value, Storage.SQLiteStorage))?.isNotEmpty ?? - false; - final bool haveDevUUID = - (await StorageHelper().get(SQLiteStorageKey.devUUID.value, Storage.SQLiteStorage))?.isNotEmpty ?? - false; + final bool isLogged = await StorageHelper().get( + SecureStorageKey.isLogged.value, Storage.SecureStorage) == + 'true'; + final bool haveLocal = await StorageHelper().get( + SecureStorageKey.haveLocal.value, + Storage.SecureStorage) == + 'true'; + final bool haveUserUUID = (await StorageHelper().get( + SQLiteStorageKey.userUUID.value, + Storage.SQLiteStorage)) + ?.isNotEmpty ?? + false; + final bool haveDevUUID = (await StorageHelper().get( + SQLiteStorageKey.devUUID.value, + Storage.SQLiteStorage)) + ?.isNotEmpty ?? + false; if (isLogged && haveDevUUID && haveUserUUID) { - return haveLocal ? const HomePageWidget() : const ReceptionPageWidget(); + return haveLocal + ? const HomePageWidget() + : const ReceptionPageWidget(); } else { return const WelcomePageWidget(); } @@ -114,8 +126,10 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) { name: 'forgotPassword', path: '/forgotPassword', builder: (context, params) { - late final String email = params.getParam('email', ParamType.String); - late final String token = params.getParam('token', ParamType.String); + late final String email = + params.getParam('email', ParamType.String); + late final String token = + params.getParam('token', ParamType.String); return ForgotPasswordScreen( key: UniqueKey(), @@ -128,7 +142,10 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) { path: '/homePage', builder: (context, params) => HomePageWidget(key: UniqueKey()), ), - FFRoute(name: 'receptionPage', path: '/receptionPage', builder: (context, params) => const ReceptionPageWidget()), + FFRoute( + name: 'receptionPage', + path: '/receptionPage', + builder: (context, params) => const ReceptionPageWidget()), FFRoute( name: 'messageHistoryPage', path: '/messageHistoryPage', @@ -243,7 +260,9 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) { extension NavParamExtensions on Map { Map get withoutNulls => Map.fromEntries( - entries.where((e) => e.value != null).map((e) => MapEntry(e.key, e.value!)), + entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, e.value!)), ); } @@ -260,7 +279,8 @@ extension NavigationExtensions on BuildContext { } extension _GoRouterStateExtensions on GoRouterState { - Map get extraMap => extra != null ? extra as Map : {}; + Map get extraMap => + extra != null ? extra as Map : {}; Map get allParams => {} ..addAll(pathParameters) ..addAll(uri.queryParameters) @@ -273,8 +293,9 @@ extension _GoRouterStateExtensions on GoRouterState { extension GoRouterLocationExtension on GoRouter { String getCurrentLocation() { final RouteMatch lastMatch = routerDelegate.currentConfiguration.last; - final RouteMatchList matchList = - lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration; + final RouteMatchList matchList = lastMatch is ImperativeRouteMatch + ? lastMatch.matches + : routerDelegate.currentConfiguration; return matchList.uri.toString(); } } @@ -290,13 +311,17 @@ class FFParameters { // Parameters are empty if the params map is empty or if the only parameter // present is the special extra parameter reserved for the transition info. bool get isEmpty => - state.allParams.isEmpty || (state.allParams.length == 1 && state.extraMap.containsKey(kTransitionInfoKey)); - bool isAsyncParam(MapEntry param) => asyncParams.containsKey(param.key) && param.value is String; + state.allParams.isEmpty || + (state.allParams.length == 1 && + state.extraMap.containsKey(kTransitionInfoKey)); + bool isAsyncParam(MapEntry param) => + asyncParams.containsKey(param.key) && param.value is String; bool get hasFutures => state.allParams.entries.any(isAsyncParam); Future completeFutures() => Future.wait( state.allParams.entries.where(isAsyncParam).map( (param) async { - final doc = await asyncParams[param.key]!(param.value).onError((_, __) => null); + final doc = await asyncParams[param.key]!(param.value) + .onError((_, __) => null); if (doc != null) { futureParamValues[param.key] = doc; return true; @@ -370,7 +395,9 @@ class FFRoute { key: state.pageKey, child: child, transitionDuration: transitionInfo.duration, - transitionsBuilder: (context, animation, secondaryAnimation, child) => PageTransition( + transitionsBuilder: + (context, animation, secondaryAnimation, child) => + PageTransition( type: transitionInfo.transitionType, duration: transitionInfo.duration, reverseDuration: transitionInfo.duration, @@ -402,7 +429,8 @@ class TransitionInfo { final Duration duration; final Alignment? alignment; - static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false); + static TransitionInfo appDefault() => + const TransitionInfo(hasTransition: false); } class RootPageContext { @@ -414,7 +442,9 @@ class RootPageContext { final rootPageContext = context.read(); final isRootPage = rootPageContext?.isRootPage ?? false; final location = GoRouterState.of(context).uri.toString(); - return isRootPage && location != '/' && location != rootPageContext?.errorRoute; + return isRootPage && + location != '/' && + location != rootPageContext?.errorRoute; } static Widget wrap(Widget child, {String? errorRoute}) => Provider.value( diff --git a/lib/main.dart b/lib/main.dart index de20064f..44f93c98 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,6 +18,7 @@ import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/shared/helpers/base_storage.dart'; import 'package:hub/shared/helpers/storage_helper.dart'; +import 'package:hub/shared/services/deeplink/deep_link_service.dart'; import 'package:hub/shared/services/localization/localization_service.dart'; import 'package:responsive_framework/responsive_framework.dart'; @@ -81,7 +82,8 @@ Future _initializeFlutterFlow() async { Future _foregroundHandlerMessage(RemoteMessage message) async { if (message.data['click_action'] == 'enroll_cond') { - await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); + await StorageHelper() + .set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); StorageHelper().context?.go('/homePage'); } @@ -95,7 +97,8 @@ Future _foregroundHandlerMessage(RemoteMessage message) async { Future _backgroundHandlerMessage(RemoteMessage message) async { if (message.data['click_action'] == 'enroll_cond') { - await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); + await StorageHelper() + .set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); StorageHelper().context?.go('/homePage'); } } @@ -106,7 +109,8 @@ class App extends StatefulWidget { @override State createState() => _AppState(); - static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!; + static _AppState of(BuildContext context) => + context.findAncestorStateOfType<_AppState>()!; } class _AppState extends State with WidgetsBindingObserver { @@ -148,7 +152,8 @@ class _AppState extends State with WidgetsBindingObserver { }), ), ); - final Iterable>? localizationsDelegates = const [ + final Iterable>? localizationsDelegates = + const [ FFLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, @@ -187,16 +192,19 @@ class _AppState extends State with WidgetsBindingObserver { FirebaseMessaging.onMessage.listen(_foregroundHandlerMessage); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async { if (message.data['click_action'] == 'enroll_cond') { - await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); + await StorageHelper().set( + SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); log('onMessageOpenedApp'); } else { - onMessageReceived(message.data, message.notification!.body, message.data['click_action']); + onMessageReceived(message.data, message.notification!.body, + message.data['click_action']); } }); FirebaseMessaging.instance.getInitialMessage().then((message) async { if (message != null) { if (message.data['click_action'] == 'enroll_cond') { - await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); + await StorageHelper().set( + SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage); log('getInitialMessage'); } } @@ -229,6 +237,7 @@ class _AppState extends State with WidgetsBindingObserver { ); _setupFirebaseMessaging(); + DeepLinkService().ensureInitialization(); } @override 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 0e2d6cf1..0e79d9e1 100644 --- a/lib/pages/sign_in_page/sign_in_page_widget.dart +++ b/lib/pages/sign_in_page/sign_in_page_widget.dart @@ -25,9 +25,6 @@ class _SignInPageWidgetState extends State { void initState() { super.initState(); _model = createModel(context, () => SignInPageModel()); - WidgetsBinding.instance.addPostFrameCallback((_) async { - await DeepLinkService().ensureInitialization(); - }); } @override 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 acf0c74e..05146e41 100644 --- a/lib/pages/sign_up_page/sign_up_page_widget.dart +++ b/lib/pages/sign_up_page/sign_up_page_widget.dart @@ -26,9 +26,6 @@ class _SignUpPageWidgetState extends State { void initState() { super.initState(); _model = createModel(context, () => SignUpPageModel()); - WidgetsBinding.instance.addPostFrameCallback((_) async { - await DeepLinkService().ensureInitialization(); - }); } @override diff --git a/lib/pages/welcome_page/welcome_page_widget.dart b/lib/pages/welcome_page/welcome_page_widget.dart index c7dac14d..e8399f32 100644 --- a/lib/pages/welcome_page/welcome_page_widget.dart +++ b/lib/pages/welcome_page/welcome_page_widget.dart @@ -32,19 +32,19 @@ class _WelcomePageWidgetState extends State { // On page load action. SchedulerBinding.instance.addPostFrameCallback((_) async { if (isAndroid == true) { - await StorageHelper().set(SecureStorageKey.deviceType.value, 'Android', Storage.SecureStorage); + await StorageHelper().set(SecureStorageKey.deviceType.value, 'Android', + Storage.SecureStorage); setState(() {}); } else if (isiOS == true) { - await StorageHelper().set(SecureStorageKey.deviceType.value, 'iOS', Storage.SecureStorage); + await StorageHelper().set( + SecureStorageKey.deviceType.value, 'iOS', Storage.SecureStorage); setState(() {}); } else { - await StorageHelper().set(SecureStorageKey.deviceType.value, 'Web', Storage.SecureStorage); + await StorageHelper().set( + SecureStorageKey.deviceType.value, 'Web', Storage.SecureStorage); setState(() {}); } }); - WidgetsBinding.instance.addPostFrameCallback((_) async { - await DeepLinkService().ensureInitialization(); - }); } @override diff --git a/lib/shared/services/deeplink/deep_link_service.dart b/lib/shared/services/deeplink/deep_link_service.dart index 58eda9a6..76715219 100644 --- a/lib/shared/services/deeplink/deep_link_service.dart +++ b/lib/shared/services/deeplink/deep_link_service.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:app_links/app_links.dart'; import 'package:flutter/material.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.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/storage_helper.dart'; @@ -17,7 +18,7 @@ class DeepLinkService { StreamSubscription? _linkSubscription; bool _isInitialized = false; - Future ensureInitialization() async { + void ensureInitialization() async { if (_isInitialized) return; try { _appLinks = AppLinks(); @@ -54,22 +55,23 @@ class DeepLinkService { Future _showForgotPasswordScreen(String email, String token) async { try { - final FlutterFlowTheme theme = FlutterFlowTheme.of(StorageHelper().context!); - final ForgotPasswordScreen screen = ForgotPasswordScreen(email: email, token: token); - 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'); + WidgetsBinding.instance.addPostFrameCallback((_) async { + await showModalBottomSheet( + context: key.currentContext!, + builder: (context) => Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ForgotPasswordScreen(email: email, token: token), + ), + isScrollControlled: true, + backgroundColor: + FlutterFlowTheme.of(key.currentContext!).primaryBackground, + showDragHandle: true, + useSafeArea: true, + enableDrag: true, + ).whenComplete(() { + StorageHelper().isRecovered = false; + print('showModalBottomSheet completed'); + }); }); } catch (e, s) { print('Error showing forgot password screen: $e, $s');