diff --git a/lib/main.dart b/lib/main.dart index 1b3671f..3cfef0a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:zapstore/services/package_manager/package_manager.dart'; import 'package:zapstore/theme.dart'; import 'package:zapstore/services/package_manager/android_package_manager.dart'; import 'package:zapstore/services/package_manager/dummy_package_manager.dart'; -import 'package:zapstore/services/market_intent_service.dart'; +import 'package:zapstore/services/deep_link_service.dart'; import 'package:zapstore/utils/extensions.dart'; import 'package:zapstore/widgets/breathing_logo.dart'; @@ -280,7 +280,7 @@ final appInitializationProvider = FutureProvider((ref) async { final backgroundService = ref.read(backgroundUpdateServiceProvider); unawaited(backgroundService.initialize()); - unawaited(ref.read(marketIntentServiceProvider).initialize()); + unawaited(ref.read(deepLinkServiceProvider).initialize()); await _attemptAutoSignIn(ref); }); diff --git a/lib/services/market_intent_service.dart b/lib/services/deep_link_service.dart similarity index 68% rename from lib/services/market_intent_service.dart rename to lib/services/deep_link_service.dart index e802ad0..acc5f2f 100644 --- a/lib/services/market_intent_service.dart +++ b/lib/services/deep_link_service.dart @@ -6,21 +6,17 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:zapstore/router.dart'; -/// Provider that initializes market:// intent handling -/// -/// Listens for incoming market:// URIs (e.g., market://details?id=com.example.app) -/// and navigates to the app detail screen. -final marketIntentServiceProvider = Provider((ref) { - return MarketIntentService(ref); +final deepLinkServiceProvider = Provider((ref) { + return DeepLinkService(ref); }); -class MarketIntentService { +class DeepLinkService { final Ref _ref; final AppLinks _appLinks = AppLinks(); StreamSubscription? _subscription; bool _initialized = false; - MarketIntentService(this._ref); + DeepLinkService(this._ref); GoRouter get _router => _ref.read(routerProvider); @@ -38,7 +34,23 @@ class MarketIntentService { } void _handleUri(Uri? uri) { - final packageId = _extractPackageId(uri); + if (uri == null) return; + + // https://zapstore.dev/apps/ + if (uri.scheme == 'https' && + uri.host == 'zapstore.dev' && + uri.pathSegments.length == 2 && + uri.pathSegments[0] == 'apps') { + final id = uri.pathSegments[1]; + if (id.isNotEmpty) { + debugPrint('App link: app ID = $id'); + _router.go('/search/app/$id'); + return; + } + } + + // market://details?id=com.example.app (Google Play-style intents) + final packageId = _extractMarketPackageId(uri); if (packageId != null) { _router.go('/search/app/$packageId'); } @@ -49,17 +61,14 @@ class MarketIntentService { } } -/// Extract package ID from a URI -/// +/// Extract package ID from a market:// URI. +/// /// Handles: /// - market://details?id=com.example.app /// - market://search?q=search+query -String? _extractPackageId(Uri? uri) { - if (uri == null) return null; - +String? _extractMarketPackageId(Uri uri) { if (uri.scheme != 'market') return null; - - // market://details?id=com.example.app + if (uri.host == 'details' || uri.path == '/details') { final id = uri.queryParameters['id']; if (id != null && id.isNotEmpty) { @@ -67,8 +76,7 @@ String? _extractPackageId(Uri? uri) { return id; } } - - // market://search?q=query + if (uri.host == 'search' || uri.path == '/search') { final query = uri.queryParameters['q']; if (query != null && query.isNotEmpty) { @@ -76,8 +84,7 @@ String? _extractPackageId(Uri? uri) { return query; } } - + debugPrint('Market intent: unhandled URI = $uri'); return null; } -