diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f548d112..f73d395b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + + + freaccess.com.br + + \ No newline at end of file diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index a402b78e..e641ac25 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -10,4 +10,9 @@ + + \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 777455c5..2fbe354a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -217,8 +217,6 @@ PODS: - GTMSessionFetcher/Core (3.5.0) - image_picker_ios (0.0.1): - Flutter - - integration_test (0.0.1): - - Flutter - IosAwnCore (0.10.0) - local_auth_darwin (0.0.1): - Flutter @@ -292,7 +290,6 @@ DEPENDENCIES: - google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`) - google_mlkit_face_detection (from `.symlinks/plugins/google_mlkit_face_detection/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - integration_test (from `.symlinks/plugins/integration_test/ios`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) @@ -372,8 +369,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/google_mlkit_face_detection/ios" image_picker_ios: :path: ".symlinks/plugins/image_picker_ios/ios" - integration_test: - :path: ".symlinks/plugins/integration_test/ios" local_auth_darwin: :path: ".symlinks/plugins/local_auth_darwin/darwin" path_provider_foundation: @@ -396,7 +391,7 @@ SPEC CHECKSUMS: app_tracking_transparency: e169b653478da7bb15a6c61209015378ca73e375 awesome_notifications: dd5518ff1c80be03d4f1c40f04da9d9cc2a37af5 camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4 - connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db + connectivity_plus: 4c41c08fc6d7c91f63bc7aec70ffe3730b04f563 device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 @@ -428,7 +423,6 @@ SPEC CHECKSUMS: GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 IosAwnCore: 653786a911089012092ce831f2945cd339855a89 local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56 @@ -444,7 +438,7 @@ SPEC CHECKSUMS: SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index dd23187e..5d9b466c 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,6 +1,6 @@ import UIKit import app_links -import Flutter +import Flutter @main @objc class AppDelegate: FlutterAppDelegate { 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/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart b/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart index ad951ae3..9feeeed9 100644 --- a/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart +++ b/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart @@ -240,8 +240,10 @@ class _ForgotPasswordTemplateComponentWidgetState extends State - AuthenticationService.forgotPassword(context, _model.emailAddressTextController.text), + : () async => await AuthenticationService.forgotPassword( + context, + _model.emailAddressTextController.text, + ).then((v) => v == true ? context.pop() : null), text: FFLocalizations.of(context).getText( '74rnd5bu' /* Enviar */, ), diff --git a/lib/flutter_flow/flutter_flow_theme.dart b/lib/flutter_flow/flutter_flow_theme.dart index fa892eb1..d6607aea 100644 --- a/lib/flutter_flow/flutter_flow_theme.dart +++ b/lib/flutter_flow/flutter_flow_theme.dart @@ -41,7 +41,7 @@ abstract class FlutterFlowTheme { static void saveThemeMode(ThemeMode mode) => mode == ThemeMode.system ? _prefs?.remove(kThemeModeKey) : _prefs?.setBool(kThemeModeKey, mode == ThemeMode.dark); static FlutterFlowTheme of(BuildContext context) { - deviceSize = getDeviceSize(context); + // deviceSize = getDeviceSize(context); return Theme.of(context).brightness == Brightness.dark ? DarkModeTheme() : LightModeTheme(); } diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index 5200e876..07f4bbfb 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:developer'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:hub/backend/schema/util/schema_util.dart'; @@ -39,6 +40,8 @@ export 'serialization_util.dart'; const kTransitionInfoKey = '__transition_info__'; +final GlobalKey key = GlobalKey(); + class AppStateNotifier extends ChangeNotifier { AppStateNotifier._(); @@ -55,8 +58,17 @@ class AppStateNotifier extends ChangeNotifier { GoRouter createRouter(AppStateNotifier appStateNotifier) { return GoRouter( + navigatorKey: key, initialLocation: '/', debugLogDiagnostics: true, + redirect: (context, state) { + if (Platform.isIOS) { + if (state.uri.toString().contains("freaccess://changepass/")) { + throw Exception('Redirecting to forgotPassword'); + } + } + return null; + }, refreshListenable: appStateNotifier, // errorBuilder: (context, state) => appStateNotifier.showSplashImage // ? Builder( builder: (context) => Container(color: FlutterFlowTheme.of(context).primary, child: Image.asset( 'assets/images/logo.svg', fit: BoxFit.cover))) @@ -72,19 +84,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(); } @@ -183,7 +204,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!)), ); } @@ -197,7 +220,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) @@ -210,8 +234,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(); } } @@ -224,13 +249,17 @@ class FFParameters { Map futureParamValues = {}; 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; @@ -285,7 +314,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, @@ -312,7 +343,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 { @@ -324,7 +356,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}) => diff --git a/lib/main.dart b/lib/main.dart index 38828b06..44f93c98 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,10 +16,11 @@ 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/deeplink/deep_link_service.dart'; import 'package:hub/shared/services/localization/localization_service.dart'; + import 'package:responsive_framework/responsive_framework.dart'; import 'backend/notifications/firebase_messaging_service.dart'; @@ -82,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'); } @@ -96,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'); } } @@ -107,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 { @@ -116,8 +119,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, @@ -151,7 +152,8 @@ class _AppState extends State with WidgetsBindingObserver { }), ), ); - final Iterable>? localizationsDelegates = const [ + final Iterable>? localizationsDelegates = + const [ FFLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, @@ -179,41 +181,6 @@ class _AppState extends State with WidgetsBindingObserver { ); }; - Future initDeepLinks() async { - _appLinks = AppLinks(); - _linkSubscription = _appLinks.uriLinkStream.listen((uri) { - final bool isRecovered = StorageHelper().isRecovered; - if (!isRecovered) openAppLink(uri); - }); - } - - void openAppLink(Uri uri) { - final bool isRecovered = StorageHelper().isRecovered; - log('isRecovered: $isRecovered'); - if (isRecovered) return; - StorageHelper().isRecovered = true; - final String email = uri.queryParameters['email'] ?? ''; - final String token = uri.queryParameters['token'] ?? ''; - final bool isNotEmpty = email.isNotEmpty && token.isNotEmpty; - if (isNotEmpty) { - final BuildContext context = StorageHelper().context!; - final FlutterFlowTheme theme = FlutterFlowTheme.of(context); - final Widget screen = ForgotPasswordScreen(email: email, token: token); - builder(context) => screen; - showModalBottomSheet( - context: 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); - } - } - void _setupFirebaseMessaging() async { FirebaseMessaging messaging = FirebaseMessaging.instance; RemoteMessage? initialMessage = await messaging.getInitialMessage(); @@ -225,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'); } } @@ -262,16 +232,17 @@ class _AppState extends State with WidgetsBindingObserver { _appStateNotifier = AppStateNotifier.instance; _router = createRouter(_appStateNotifier); Future.delayed( - const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage())); + const Duration(milliseconds: 1000), + () => setState(() => _appStateNotifier.stopShowingSplashImage()), + ); _setupFirebaseMessaging(); - WidgetsBinding.instance.addPersistentFrameCallback((_) => initDeepLinks()); + DeepLinkService().ensureInitialization(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); - _linkSubscription?.cancel(); super.dispose(); } diff --git a/lib/pages/forgot_password_page/forgot_password_screen.dart b/lib/pages/forgot_password_page/forgot_password_screen.dart index 81aa567e..c29cad1b 100644 --- a/lib/pages/forgot_password_page/forgot_password_screen.dart +++ b/lib/pages/forgot_password_page/forgot_password_screen.dart @@ -232,7 +232,11 @@ class _ForgotPasswordScreenState extends State with Ticker ? null : () async { await AuthenticationService.changePassword( - context, widget.email, _model.passwordConfirmFormTextController!.text, widget.token); + context, + widget.email, + _model.passwordConfirmFormTextController!.text, + widget.token, + ).then((v) => v == true ? context.pop() : null); setState(() {}); }, text: FFLocalizations.of(context).getVariableText( 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..0e79d9e1 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'; @@ -29,7 +30,6 @@ class _SignInPageWidgetState extends State { @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..05146e41 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'; diff --git a/lib/pages/welcome_page/welcome_page_widget.dart b/lib/pages/welcome_page/welcome_page_widget.dart index cb24d5e1..e8399f32 100644 --- a/lib/pages/welcome_page/welcome_page_widget.dart +++ b/lib/pages/welcome_page/welcome_page_widget.dart @@ -3,6 +3,7 @@ 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'; @@ -31,13 +32,16 @@ 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(() {}); } }); @@ -46,7 +50,6 @@ class _WelcomePageWidgetState extends State { @override void dispose() { _model.dispose(); - super.dispose(); } diff --git a/lib/shared/helpers/storage_helper.dart b/lib/shared/helpers/storage_helper.dart index 582a3b4b..a7aa9e84 100644 --- a/lib/shared/helpers/storage_helper.dart +++ b/lib/shared/helpers/storage_helper.dart @@ -10,10 +10,11 @@ class StorageHelper { StorageHelper._internal(); late BuildContext? _context; - late bool _isRecovered = false; + BuildContext? get context => _context; set context(BuildContext? context) => _context = context; + late bool _isRecovered = false; bool get isRecovered => _isRecovered; set isRecovered(bool isRecovered) => _isRecovered = isRecovered; @@ -24,7 +25,7 @@ class StorageHelper { String? isFirstRun = await SharedPreferencesStorage.instance.get(SharedPreferencesKey.isFirstRun.value); - if (isFirstRun == 'true') { + if (isFirstRun != 'false') { await SharedPreferencesStorage.instance.set(SharedPreferencesKey.isFirstRun.value, 'false'); await SecureStorage.instance.set(SecureStorageKey.isLogged.value, 'false'); } diff --git a/lib/shared/services/authentication/authentication_service.dart b/lib/shared/services/authentication/authentication_service.dart index 81afd3a1..dea0c7de 100644 --- a/lib/shared/services/authentication/authentication_service.dart +++ b/lib/shared/services/authentication/authentication_service.dart @@ -142,7 +142,7 @@ class AuthenticationService { context.go('/welcomePage', extra: extra); } - static Future forgotPassword(BuildContext context, String email) async { + static Future forgotPassword(BuildContext context, String email) async { try { final ApiCallResponse? response; final ForgotPasswordCall callback = PhpGroup.forgotPasswordCall; @@ -153,16 +153,19 @@ class AuthenticationService { if (response.jsonBody['error'] == false) { await DialogUtil.success(context, message); + return true; } else { await DialogUtil.error(context, response.jsonBody['error_msg']); + return false; } } catch (e, s) { await DialogUtil.errorDefault(context); LogUtil.requestAPIFailed('forgotPassword.php', email, "Forgot Password", e, s); + return false; } } - static Future changePassword(BuildContext context, String email, String password, String token) async { + static Future changePassword(BuildContext context, String email, String password, String token) async { try { final ApiCallResponse response = await PhpGroup.changePasswordCall.call(email: email, psswd: password, token: token); @@ -173,13 +176,16 @@ class AuthenticationService { ptText: "Senha alterada com sucesso!", ); await DialogUtil.success(context, message).then((_) => context.pop); + return true; } else { final String message = response.jsonBody['error_msg']; await DialogUtil.error(context, message); + return false; } } catch (e, s) { await DialogUtil.errorDefault(context); LogUtil.requestAPIFailed('changePassword.php', email, "Change Password", e, s); + return false; } } 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..76715219 --- /dev/null +++ b/lib/shared/services/deeplink/deep_link_service.dart @@ -0,0 +1,85 @@ +import 'dart:async'; +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'; + +class DeepLinkService { + static final DeepLinkService _instance = DeepLinkService._internal(); + + factory DeepLinkService() => _instance; + + DeepLinkService._internal(); + + late final AppLinks _appLinks; + StreamSubscription? _linkSubscription; + bool _isInitialized = false; + + void ensureInitialization() async { + if (_isInitialized) return; + try { + _appLinks = AppLinks(); + print('initDeepLinks'); + _linkSubscription = _appLinks.uriLinkStream.listen((uri) async { + if (!StorageHelper().isRecovered) { + await _handleDeepLink(uri); + } + }); + _isInitialized = true; + } catch (e) { + print('Error initializing deep links: $e'); + } + } + + Future _handleDeepLink(Uri uri) async { + try { + 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); + } + } catch (e, s) { + print('Error handling deep link: $e, $s'); + log('Error handling', error: e, stackTrace: s); + } + } + + Future _showForgotPasswordScreen(String email, String token) async { + try { + 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'); + log('Error handling', error: e, stackTrace: s); + } + } + + void dispose() { + _linkSubscription?.cancel(); + } +} diff --git a/lib/shared/utils/device_util.dart b/lib/shared/utils/device_util.dart index 844a3c16..da41877e 100644 --- a/lib/shared/utils/device_util.dart +++ b/lib/shared/utils/device_util.dart @@ -1,3 +1,4 @@ +import 'dart:developer'; import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; @@ -13,7 +14,7 @@ class DeviceUtil { return androidId; } on PlatformException catch (e) { - print("Failed to get Android ID: '${e.message}'."); + log("Failed to get Android ID: '${e.message}'."); return null; } diff --git a/lib/shared/utils/log_util.dart b/lib/shared/utils/log_util.dart index 5b9e2dc2..99dfab8e 100644 --- a/lib/shared/utils/log_util.dart +++ b/lib/shared/utils/log_util.dart @@ -5,13 +5,14 @@ import 'package:hub/backend/api_requests/api_calls.dart'; class LogUtil { static void requestAPIFailed(String url, String body, String reason, dynamic error, StackTrace stack) async { - log("URL: ${PhpGroup.getBaseUrl()}/$url"); + final fullUrl = "${PhpGroup.getBaseUrl()}/$url"; + log("URL: $fullUrl"); log("Body: $body"); - log("Motivo: $reason"); + log("Reason: $reason"); log("Error: ${error.toString()}"); log("Stack: ${stack.toString()}"); - FirebaseCrashlytics.instance.setCustomKey('URL', "${PhpGroup.getBaseUrl()}/$url"); + FirebaseCrashlytics.instance.setCustomKey('URL', fullUrl); FirebaseCrashlytics.instance.setCustomKey('Body', body); await FirebaseCrashlytics.instance.recordError(error, stack, reason: reason); diff --git a/pubspec.lock b/pubspec.lock index dfdc8cb0..b0e34950 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: camera_avfoundation - sha256: "0d04cec8715b59fb6dc60eefb47e69024f51233c570e475b886dc9290568bca7" + sha256: "2e4c568f70e406ccb87376bc06b53d2f5bebaab71e2fbcc1a950e31449381bcf" url: "https://pub.dev" source: hosted - version: "0.9.17+4" + version: "0.9.17+5" camera_platform_interface: dependency: transitive description: @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.4.2" clock: dependency: transitive description: @@ -229,10 +229,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0" + sha256: "876849631b0c7dc20f8b471a2a03142841b482438e3b707955464f5ffca3e4c3" url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.0" connectivity_plus_platform_interface: dependency: transitive description: @@ -261,10 +261,10 @@ packages: dependency: "direct main" description: name: crypto - sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" csv: dependency: "direct main" description: @@ -341,10 +341,10 @@ packages: dependency: "direct main" description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: b35578f687b79243d39008c44d638474d93e9091e578c970efef41ce0c3fa000 url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.6" fake_async: dependency: transitive description: @@ -365,10 +365,10 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" file_picker: dependency: "direct main" description: @@ -381,10 +381,10 @@ packages: dependency: transitive description: name: file_selector_linux - sha256: "712ce7fab537ba532c8febdb1a8f167b32441e74acd68c3ccb2e36dcb52c4ab2" + sha256: b2b91daf8a68ecfa4a01b778a6f52edef9b14ecd506e771488ea0f2e0784198b url: "https://pub.dev" source: hosted - version: "0.9.3" + version: "0.9.3+1" file_selector_macos: dependency: transitive description: @@ -501,10 +501,10 @@ packages: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -534,11 +534,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.4.1" - flutter_driver: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" flutter_expandable_fab: dependency: "direct main" description: @@ -636,10 +631,10 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: "711d916456563f715bde1e139d7cfdca009f8264befab3ac9f8ded8b6ec26405" + sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.6.1" flutter_secure_storage: dependency: "direct main" description: @@ -716,10 +711,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + sha256: "936d9c1c010d3e234d1672574636f3352b4941ca3decaddd3cafaeb9ad49c471" url: "https://pub.dev" source: hosted - version: "2.0.10+1" + version: "2.0.15" flutter_test: dependency: "direct dev" description: flutter @@ -742,10 +737,10 @@ packages: dependency: "direct main" description: name: font_awesome_flutter - sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f" + sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a url: "https://pub.dev" source: hosted - version: "10.7.0" + version: "10.8.0" from_css_color: dependency: "direct main" description: @@ -754,19 +749,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - fuchsia_remote_debug_protocol: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" go_router: dependency: "direct main" description: name: go_router - sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc" + sha256: "8ae664a70174163b9f65ea68dd8673e29db8f9095de7b5cd00e167c621f4fef5" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.6.0" google_fonts: dependency: "direct main" description: @@ -819,10 +809,10 @@ packages: dependency: "direct dev" description: name: image - sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.3.0" image_picker: dependency: "direct main" description: @@ -835,18 +825,18 @@ packages: dependency: "direct main" description: name: image_picker_android - sha256: d34e0d9e024e81321b2aeed7b202ec6181cc282e6a1c0c0b4e6ad07ef1065d82 + sha256: "8faba09ba361d4b246dc0a17cb4289b3324c2b9f6db7b3d457ee69106a86bd32" url: "https://pub.dev" source: hosted - version: "0.8.12+16" + version: "0.8.12+17" image_picker_for_web: dependency: "direct main" description: name: image_picker_for_web - sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" image_picker_ios: dependency: "direct main" description: @@ -887,11 +877,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1+1" - integration_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" intl: dependency: "direct main" description: @@ -1008,10 +993,10 @@ packages: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" matcher: dependency: transitive description: @@ -1032,10 +1017,10 @@ packages: dependency: "direct main" description: name: material_symbols_icons - sha256: fa19f3a99f280c81fe23d7f7ef1c4000511fa40ee52df43e0a3a4c91184ddb15 + sha256: "1dea2aef1c83434f832f14341a5ffa1254e76b68e4d90333f95f8a2643bf1024" url: "https://pub.dev" source: hosted - version: "4.2788.0" + version: "4.2799.0" maybe_just_nothing: dependency: transitive description: @@ -1112,18 +1097,18 @@ packages: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" path_provider: dependency: "direct main" description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: "direct main" description: @@ -1184,10 +1169,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" url: "https://pub.dev" source: hosted - version: "12.0.12" + version: "12.0.13" permission_handler_apple: dependency: transitive description: @@ -1200,10 +1185,10 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+2" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: @@ -1240,10 +1225,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" plugin_platform_interface: dependency: "direct main" description: @@ -1252,14 +1237,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - process: - dependency: transitive - description: - name: process - sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" - url: "https://pub.dev" - source: hosted - version: "5.0.2" provider: dependency: "direct main" description: @@ -1304,10 +1281,10 @@ packages: dependency: transitive description: name: riverpod - sha256: c86fedfb45dd1da98ee6493dd9374325cdf494e7d523ebfb0c387eecc5f7b5c9 + sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.6.1" rxdart: dependency: "direct main" description: @@ -1336,10 +1313,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.3" shared_preferences_android: dependency: "direct main" description: @@ -1413,10 +1390,10 @@ packages: dependency: "direct main" description: name: sqflite - sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62" + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" sqflite_android: dependency: transitive description: @@ -1429,18 +1406,18 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490" + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" url: "https://pub.dev" source: hosted - version: "2.5.4+5" + version: "2.5.4+6" sqflite_darwin: dependency: transitive description: name: sqflite_darwin - sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027" + sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474" url: "https://pub.dev" source: hosted - version: "2.4.1-1" + version: "2.4.1" sqflite_platform_interface: dependency: transitive description: @@ -1489,14 +1466,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - sync_http: - dependency: transitive - description: - name: sync_http - sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" - url: "https://pub.dev" - source: hosted - version: "0.3.1" synchronized: dependency: "direct main" description: @@ -1533,10 +1502,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" url_launcher: dependency: "direct main" description: @@ -1549,10 +1518,10 @@ packages: dependency: "direct main" description: name: url_launcher_android - sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" url: "https://pub.dev" source: hosted - version: "6.3.12" + version: "6.3.14" url_launcher_ios: dependency: "direct main" description: @@ -1565,10 +1534,10 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_macos: dependency: transitive description: @@ -1597,10 +1566,10 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" uuid: dependency: "direct overridden" description: @@ -1613,26 +1582,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.15" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.12" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + sha256: ab9ff38fc771e9ee1139320adbe3d18a60327370c218c60752068ebee4b49ab1 url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.15" vector_math: dependency: transitive description: @@ -1657,14 +1626,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" - webdriver: - dependency: transitive - description: - name: webdriver - sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e" - url: "https://pub.dev" - source: hosted - version: "3.0.3" webview_flutter: dependency: "direct main" description: @@ -1677,10 +1638,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "74693a212d990b32e0b7055d27db973a18abf31c53942063948cdfaaef9787ba" + sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" webview_flutter_platform_interface: dependency: transitive description: @@ -1693,10 +1654,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251 + sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30" url: "https://pub.dev" source: hosted - version: "3.16.0" + version: "3.16.2" win32: dependency: "direct overridden" description: diff --git a/pubspec.yaml b/pubspec.yaml index 19780be7..37258a93 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. publish_to: "none" -version: 1.2.0+14 +version: 1.2.1+17 environment: sdk: ">=3.0.0 <4.0.0" @@ -28,7 +28,7 @@ dependencies: firebase_messaging: ^15.1.0 dropdown_button2: 2.3.9 easy_debounce: 2.0.3 - equatable: 2.0.5 + equatable: ^2.0.6 file_picker: ^8.0.7 flutter_expandable_fab: ^2.1.0 firebase_analytics: ^11.3.0 @@ -45,8 +45,8 @@ dependencies: flutter_secure_storage_windows: 3.1.2 flutter_spinkit: 5.2.1 flutter_staggered_grid_view: 0.7.0 - flutter_svg: 2.0.10+1 - font_awesome_flutter: 10.7.0 + flutter_svg: ^2.0.15 + font_awesome_flutter: ^10.8.0 from_css_color: 2.0.0 go_router: ^14.3.0 google_fonts: 6.2.1 @@ -110,18 +110,16 @@ dependency_overrides: dev_dependencies: flutter_launcher_icons: ^0.14.1 flutter_lints: ^5.0.0 - image: 4.2.0 + image: ^4.3.0 lints: ^5.0.0 -# build_runner: ^2.4.13 -# mockito: ^5.4.4 - integration_test: - sdk: flutter + # build_runner: ^2.4.13 + # mockito: ^5.4.4 + # integration_test: + # sdk: flutter + flutter_test: sdk: flutter - - - flutter_launcher_icons: android: "launcher_icon" ios: true @@ -131,8 +129,6 @@ flutter_launcher_icons: adaptive_icon_background: "assets/images/adaptive_background_icon.svg" adaptive_icon_foreground: "assets/images/adaptive_foreground_icon.svg" - - flutter: uses-material-design: true @@ -155,4 +151,4 @@ fonts: - asset: assets/fonts/icons.ttf - family: Menu fonts: - - asset: assets/fonts/menu.ttf \ No newline at end of file + - asset: assets/fonts/menu.ttf diff --git a/integration_test/app_test.dart b/test/integration_test/app_test.dart similarity index 100% rename from integration_test/app_test.dart rename to test/integration_test/app_test.dart