Move handling deep links to app root

OmarHatem committed Nov 8, 2022 at 18:12 UTC f68798dd197b3a09ac3b23f59c45fef959785562
2 files changed +38 -45
lib/main.dart
-44
@@ -5,7 +5,6 @@ import 'package:cake_wallet/buy/order.dart';
5 import 'package:cake_wallet/ionia/ionia_category.dart';
6 import 'package:cake_wallet/ionia/ionia_merchant.dart';
7 import 'package:cake_wallet/store/yat/yat_store.dart';
8 -import 'package:cake_wallet/utils/payment_request.dart';
8 import 'package:flutter/foundation.dart';
9 import 'package:flutter/material.dart';
10 import 'package:flutter/services.dart';
@@ -39,8 +38,6 @@ import 'package:cw_core/unspent_coins_info.dart';
38 import 'package:cake_wallet/monero/monero.dart';
39 import 'package:cake_wallet/wallet_type_utils.dart';
40
42 -import 'src/screens/auth/auth_page.dart';
43 -
41 final navigatorKey = GlobalKey<NavigatorState>();
42 final rootKey = GlobalKey<RootState>();
43
@@ -205,47 +202,6 @@ class AppState extends State<App> with SingleTickerProviderStateMixin {
202 super.initState();
203 //_handleIncomingLinks();
204 //_handleInitialUri();
208 -
209 - initUniLinks();
210 - }
211 -
212 - @override
213 - void dispose() {
214 - stream?.cancel();
215 - super.dispose();
216 - }
217 -
218 - /// handle app links while the app is already started
219 - /// whether its in the foreground or in the background.
220 - Future<void> initUniLinks() async {
221 - try {
222 - stream = uriLinkStream.listen((Uri? uri) {
223 - handleDeepLinking(uri);
224 - });
225 -
226 - final Uri? initialUri = await getInitialUri();
227 -
228 - handleDeepLinking(initialUri);
229 - } catch (e) {
230 - print(e);
231 - }
232 - }
233 -
234 - void handleDeepLinking(Uri? uri) {
235 - if (uri == null || !mounted) return;
236 -
237 - Navigator.of(navigatorKey.currentContext!).pushNamed(Routes.auth,
238 - arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) {
239 - if (isAuthenticatedSuccessfully) {
240 - auth.close(route: Routes.send, arguments: PaymentRequest.fromUri(uri));
241 - }
242 - });
243 -
244 - // Navigator.pushNamed(
245 - // navigatorKey.currentContext!,
246 - // Routes.send,
247 - // arguments: PaymentRequest.fromUri(uri),
248 - // );
205 }
206
207 Future<void> _handleInitialUri() async {
lib/src/screens/root/root.dart
+38 -1
@@ -1,10 +1,12 @@
1 import 'dart:async';
2 +import 'package:cake_wallet/utils/payment_request.dart';
3 import 'package:flutter/material.dart';
4 import 'package:cake_wallet/routes.dart';
5 import 'package:cake_wallet/src/screens/auth/auth_page.dart';
6 import 'package:cake_wallet/store/app_store.dart';
7 import 'package:cake_wallet/store/authentication_store.dart';
8 import 'package:cake_wallet/entities/qr_scanner.dart';
9 +import 'package:uni_links/uni_links.dart';
10
11 class Root extends StatefulWidget {
12 Root(
@@ -35,6 +37,9 @@ class RootState extends State<Root> with WidgetsBindingObserver {
37 bool _isInactive;
38 bool _postFrameCallback;
39
40 + StreamSubscription<Uri?>? stream;
41 + Uri? launchUri;
42 +
43 @override
44 void initState() {
45 _isInactiveController = StreamController<bool>.broadcast();
@@ -42,6 +47,34 @@ class RootState extends State<Root> with WidgetsBindingObserver {
47 _postFrameCallback = false;
48 WidgetsBinding.instance.addObserver(this);
49 super.initState();
50 +
51 + initUniLinks();
52 + }
53 +
54 + @override
55 + void dispose() {
56 + stream?.cancel();
57 + super.dispose();
58 + }
59 +
60 + /// handle app links while the app is already started
61 + /// whether its in the foreground or in the background.
62 + Future<void> initUniLinks() async {
63 + try {
64 + stream = uriLinkStream.listen((Uri? uri) {
65 + handleDeepLinking(uri);
66 + });
67 +
68 + handleDeepLinking(await getInitialUri());
69 + } catch (e) {
70 + print(e);
71 + }
72 + }
73 +
74 + void handleDeepLinking(Uri? uri) {
75 + if (uri == null || !mounted) return;
76 +
77 + launchUri = uri;
78 }
79
80 @override
@@ -75,7 +108,11 @@ class RootState extends State<Root> with WidgetsBindingObserver {
108 }
109
110 _reset();
78 - auth.close();
111 + auth.close(
112 + route: launchUri != null ? Routes.send : null,
113 + arguments: PaymentRequest.fromUri(launchUri),
114 + );
115 + launchUri = null;
116 });
117 });
118 }