import 'dart:async'; import 'package:app_links/app_links.dart'; import 'package:flutter/material.dart'; import 'package:hub/features/storage/index.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'; 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(); log('initDeepLinks'); _linkSubscription = _appLinks.uriLinkStream.listen((uri) async { if (!StorageHelper().isRecovered) { await _handleDeepLink(uri); } }); _isInitialized = true; } catch (e) { log('Error initializing deep links: $e'); } } Future _handleDeepLink(Uri uri) async { try { log('Handling deep link: $uri'); if (StorageHelper().isRecovered) return; StorageHelper().isRecovered = true; final email = uri.queryParameters['email'] ?? ''; final token = uri.queryParameters['token'] ?? ''; log('email: $email, token: $token'); if (email.isNotEmpty && token.isNotEmpty) { await _showForgotPasswordScreen(email, token); } } catch (e, s) { log('Error handling deep link: $e, $s'); } } Future _showForgotPasswordScreen(String email, String token) async { try { WidgetsBinding.instance.addPostFrameCallback((_) async { await showModalBottomSheet( context: navigatorKey.currentContext!, builder: (context) => Padding( padding: MediaQuery.viewInsetsOf(context), child: ForgotPasswordScreen( key: ValueKey('ForgotPasswordScreen'), email: email, token: token, ), ), isScrollControlled: true, backgroundColor: FlutterFlowTheme.of(navigatorKey.currentContext!) .primaryBackground, showDragHandle: true, useSafeArea: true, enableDrag: true, ).whenComplete(() { StorageHelper().isRecovered = false; log('showModalBottomSheet completed'); }); }); } catch (e, s) { log('Error showing forgot password screen: $e, $s'); } } void dispose() { _linkSubscription?.cancel(); } }