@@ -5,6 +5,9 @@ import 'package:flutter/services.dart';
55import 'package:keevault/logging/logger.dart' ;
66import 'package:keevault/payment_service.dart' ;
77import 'package:keevault/widgets/dialog_utils.dart' ;
8+ import 'package:app_links/app_links.dart' ;
9+ import 'package:keevault/utils/deep_link_utils.dart' ;
10+ import 'package:keevault/config/routes.dart' ;
811import 'package:logger/logger.dart' ;
912import 'package:matomo_tracker/matomo_tracker.dart' hide Level;
1013import 'package:public_suffix/public_suffix.dart' ;
@@ -38,6 +41,26 @@ void main() async {
3841 DefaultSuffixRules .initFromString (suffixList);
3942 l.i ('Initialized PSL' );
4043 runApp (KeeVaultApp (navigatorKey: navigatorKey));
44+
45+ // Deep link handling
46+ final appLinks = AppLinks ();
47+ appLinks.uriLinkStream.listen ((Uri uri) {
48+ final fragment = uri.fragment;
49+ final host = uri.host;
50+ final validHosts = ['keevault.pm' , 'app-beta.kee.pm' , 'app-dev.kee.pm' ];
51+ if (validHosts.contains (host) && fragment.isNotEmpty) {
52+ final params = parseKeeVaultFragment (fragment);
53+ if (params != null ) {
54+ navigatorKey.currentState? .pushNamed (
55+ Routes .deepLinkEcho,
56+ arguments: {'params' : params, 'rawUrl' : uri.toString ()},
57+ );
58+ return ;
59+ }
60+ }
61+ // If not valid, do nothing (let browser handle)
62+ //TODO: above is bullshit?
63+ });
4164 },
4265 (dynamic error, StackTrace stackTrace) {
4366 if (error is KeeLoginFailedMITMException ) {
0 commit comments