Skip to content

Commit

Permalink
fix: Fix external links (#5754)
Browse files Browse the repository at this point in the history
  • Loading branch information
g123k committed Oct 28, 2024
1 parent 105b628 commit 95b96bf
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 23 deletions.
14 changes: 9 additions & 5 deletions packages/smooth_app/lib/helpers/launch_url_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,26 @@ class LaunchUrlHelper {

if (url.startsWith(RegExp('http(s)?://[a-z]*.openfoodfacts.(net|org)'))) {
AnalyticsHelper.trackOutlink(url: url);
GoRouter.of(context).go(url);
GoRouter.of(context).push(url);
} else {
return launchURL(url);
}
}

/// Launches the url in an external browser.
static Future<void> launchURL(String url) async {
static Future<void> launchURL(
String url, {
LaunchMode? mode,
}) async {
AnalyticsHelper.trackOutlink(url: url);

try {
await launchUrl(
Uri.parse(url),
mode: Platform.isAndroid
? LaunchMode.externalApplication
: LaunchMode.platformDefault,
mode: mode ??
(Platform.isAndroid
? LaunchMode.externalApplication
: LaunchMode.platformDefault),
);
} catch (e) {
throw 'Could not launch $url,Error: $e';
Expand Down
40 changes: 24 additions & 16 deletions packages/smooth_app/lib/pages/navigator/app_navigator.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:provider/provider.dart';
Expand All @@ -15,8 +15,8 @@ import 'package:smooth_app/pages/onboarding/onboarding_flow_navigator.dart';
import 'package:smooth_app/pages/preferences/user_preferences_page.dart';
import 'package:smooth_app/pages/product/add_new_product_page.dart';
import 'package:smooth_app/pages/product/edit_product_page.dart';
import 'package:smooth_app/pages/product/new_product_page.dart';
import 'package:smooth_app/pages/product/product_loader_page.dart';
import 'package:smooth_app/pages/product/product_page/new_product_page.dart';
import 'package:smooth_app/pages/scan/carousel/scan_carousel_manager.dart';
import 'package:smooth_app/pages/search/search_page.dart';
import 'package:smooth_app/pages/search/search_product_helper.dart';
Expand All @@ -37,13 +37,12 @@ import 'package:smooth_app/query/product_query.dart';
/// /!\ [GoRouter] doesn't support [maybePop] or returning a result from a push.
class AppNavigator extends InheritedWidget {
AppNavigator({
Key? key,
super.key,
List<NavigatorObserver>? observers,
required Widget child,
}) : _router = _SmoothGoRouter(
required super.child,
}) : _router = _SmoothGoRouter(
observers: observers,
),
super(key: key, child: child);
);

// GoRouter is never accessible directly
final _SmoothGoRouter _router;
Expand Down Expand Up @@ -80,8 +79,15 @@ class AppNavigator extends InheritedWidget {
}
}

void pop([dynamic result]) {
_router.router.pop(result);
/// Returns [true] if the pop was successful
/// Returns [false] if there is nothing to pop (= no history)
bool pop([dynamic result]) {
try {
_router.router.pop(result);
return true;
} on GoError catch (_) {
return false;
}
}
}

Expand Down Expand Up @@ -236,18 +242,20 @@ class _SmoothGoRouter {
}
},
),
GoRoute(
path: _InternalAppRoutes.EXTERNAL_PAGE,
builder: (BuildContext context, GoRouterState state) {
return ExternalPage(path: state.uri.queryParameters['path']!);
},
),
GoRoute(
path: _InternalAppRoutes.SIGNUP_PAGE,
builder: (_, __) => const SignUpPage(),
)
],
),
GoRoute(
path: '/${_InternalAppRoutes.EXTERNAL_PAGE}',
builder: (BuildContext context, GoRouterState state) {
return ExternalPage(
path: Uri.decodeFull(state.uri.queryParameters['path']!),
);
},
),
],
redirect: (BuildContext context, GoRouterState state) {
final String path = state.matchedLocation;
Expand Down Expand Up @@ -469,5 +477,5 @@ class AppRoutes {

// Open an external link (where path is relative to the OFF website)
static String EXTERNAL(String path) =>
'/${_InternalAppRoutes.EXTERNAL_PAGE}/?path=$path';
'/${_InternalAppRoutes.EXTERNAL_PAGE}?path=${Uri.encodeFull(path)}';
}
16 changes: 14 additions & 2 deletions packages/smooth_app/lib/pages/navigator/external_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as tabs;
import 'package:go_router/go_router.dart';
import 'package:http/http.dart' as http;
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:path/path.dart' as path;
import 'package:smooth_app/helpers/launch_url_helper.dart';
import 'package:smooth_app/pages/navigator/app_navigator.dart';
import 'package:smooth_app/query/product_query.dart';
import 'package:smooth_app/services/smooth_services.dart';
import 'package:url_launcher/url_launcher.dart';

/// This screen is only used for deep links!
///
Expand Down Expand Up @@ -61,6 +63,7 @@ class _ExternalPageState extends State<ExternalPage> {

try {
if (Platform.isAndroid) {
/// Custom tabs
WidgetsFlutterBinding.ensureInitialized();
await tabs.launchUrl(
Uri.parse(url),
Expand All @@ -69,13 +72,22 @@ class _ExternalPageState extends State<ExternalPage> {
),
);
} else {
await LaunchUrlHelper.launchURL(url);
/// The default browser
await LaunchUrlHelper.launchURL(
url,
mode: LaunchMode.externalApplication,
);
}
} catch (e) {
Logs.e('Unable to open an external link', ex: e);
} finally {
if (mounted) {
AppNavigator.of(context).pop();
final bool success = AppNavigator.of(context).pop();
if (!success) {
/// This page was called with the go() without an history
/// (mainly for an external deep link)
GoRouter.of(context).go('/');
}
}
}
});
Expand Down

0 comments on commit 95b96bf

Please sign in to comment.