fix: deeplink service

This commit is contained in:
J. A. Messias 2024-11-18 13:27:20 -03:00
parent bf5b2a8215
commit 1606622826
5 changed files with 80 additions and 57 deletions

View File

@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:app_links/app_links.dart';
import 'package:app_tracking_transparency/app_tracking_transparency.dart'; import 'package:app_tracking_transparency/app_tracking_transparency.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.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/flutter_flow_util.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/flutter_flow/nav/nav.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/base_storage.dart';
import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/helpers/storage_helper.dart';
import 'package:hub/shared/services/localization/localization_service.dart'; import 'package:hub/shared/services/localization/localization_service.dart';
import 'package:logging/logging.dart';
import 'package:responsive_framework/responsive_framework.dart'; import 'package:responsive_framework/responsive_framework.dart';
import 'backend/notifications/firebase_messaging_service.dart'; import 'backend/notifications/firebase_messaging_service.dart';
@ -118,8 +115,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
late AppStateNotifier _appStateNotifier; late AppStateNotifier _appStateNotifier;
late GoRouter _router; late GoRouter _router;
bool displaySplashImage = true; bool displaySplashImage = true;
late AppLinks _appLinks;
StreamSubscription<Uri>? _linkSubscription;
final ThemeData _darkTheme = ThemeData( final ThemeData _darkTheme = ThemeData(
brightness: Brightness.dark, brightness: Brightness.dark,
@ -181,54 +176,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
); );
}; };
Future<void> 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<void> 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 { void _setupFirebaseMessaging() async {
FirebaseMessaging messaging = FirebaseMessaging.instance; FirebaseMessaging messaging = FirebaseMessaging.instance;
RemoteMessage? initialMessage = await messaging.getInitialMessage(); RemoteMessage? initialMessage = await messaging.getInitialMessage();
@ -282,13 +229,11 @@ class _AppState extends State<App> with WidgetsBindingObserver {
); );
_setupFirebaseMessaging(); _setupFirebaseMessaging();
initDeepLinks();
} }
@override @override
void dispose() { void dispose() {
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
_linkSubscription?.cancel();
super.dispose(); super.dispose();
} }

View File

@ -1,5 +1,6 @@
import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/helpers/storage_helper.dart';
import 'package:hub/shared/mixins/switcher_mixin.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 '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
@ -24,12 +25,12 @@ class _SignInPageWidgetState extends State<SignInPageWidget> {
void initState() { void initState() {
super.initState(); super.initState();
_model = createModel(context, () => SignInPageModel()); _model = createModel(context, () => SignInPageModel());
DeepLinkService().initDeepLinks();
} }
@override @override
void dispose() { void dispose() {
_model.dispose(); _model.dispose();
super.dispose(); super.dispose();
} }

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/helpers/storage_helper.dart';
import 'package:hub/shared/mixins/switcher_mixin.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 '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
@ -25,6 +26,7 @@ class _SignUpPageWidgetState extends State<SignUpPageWidget> {
void initState() { void initState() {
super.initState(); super.initState();
_model = createModel(context, () => SignUpPageModel()); _model = createModel(context, () => SignUpPageModel());
DeepLinkService().initDeepLinks();
} }
@override @override

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:hub/shared/helpers/base_storage.dart'; import 'package:hub/shared/helpers/base_storage.dart';
import 'package:hub/shared/helpers/storage_helper.dart'; import 'package:hub/shared/helpers/storage_helper.dart';
import 'package:hub/shared/mixins/switcher_mixin.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 '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
@ -41,12 +43,12 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
setState(() {}); setState(() {});
} }
}); });
DeepLinkService().initDeepLinks();
} }
@override @override
void dispose() { void dispose() {
_model.dispose(); _model.dispose();
super.dispose(); super.dispose();
} }

View File

@ -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<Uri>? _linkSubscription;
Future<void> 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<void> _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<void> _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();
}
}