From 5068eb900f768223413d5b28ad6a05214d622e26 Mon Sep 17 00:00:00 2001 From: shilangyu Date: Sat, 30 Apr 2022 16:23:36 +0200 Subject: [PATCH] Update link launcher --- lib/pages/community/community_more_menu.dart | 10 +++---- lib/pages/instance/instance_more_menu.dart | 14 ++------- lib/pages/manage_account.dart | 13 ++++---- lib/pages/settings/add_account_page.dart | 9 ++++-- lib/resources/links.dart | 4 ++- lib/url_launcher.dart | 30 ++++++++++++++----- lib/widgets/about_tile.dart | 15 ++++++---- .../comment/comment_more_menu_button.dart | 10 ++----- lib/widgets/post/post_more_menu.dart | 7 ++--- 9 files changed, 59 insertions(+), 53 deletions(-) diff --git a/lib/pages/community/community_more_menu.dart b/lib/pages/community/community_more_menu.dart index a9b464e..eb241b3 100644 --- a/lib/pages/community/community_more_menu.dart +++ b/lib/pages/community/community_more_menu.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:lemmy_api_client/v3.dart'; -import 'package:url_launcher/url_launcher.dart' as ul; import '../../hooks/logged_in_action.dart'; +import '../../url_launcher.dart'; import '../../util/extensions/api.dart'; import '../../util/mobx_provider.dart'; import '../../util/observer_consumers.dart'; @@ -28,10 +28,10 @@ class CommunityMoreMenu extends HookWidget { ListTile( leading: const Icon(Icons.open_in_browser), title: const Text('Open in browser'), - onTap: () async => await ul.canLaunch(communityView.community.actorId) - ? ul.launch(communityView.community.actorId) - : ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("can't open in browser"))), + onTap: () => launchLink( + link: communityView.community.actorId, + context: context, + ), ), ObserverBuilder(builder: (context, store) { return ListTile( diff --git a/lib/pages/instance/instance_more_menu.dart b/lib/pages/instance/instance_more_menu.dart index c1bb877..eee6fda 100644 --- a/lib/pages/instance/instance_more_menu.dart +++ b/lib/pages/instance/instance_more_menu.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:lemmy_api_client/v3.dart'; -import 'package:url_launcher/url_launcher.dart' as ul; import '../../l10n/l10n.dart'; import '../../stores/accounts_store.dart'; +import '../../url_launcher.dart'; import '../../util/observer_consumers.dart'; import '../../widgets/bottom_modal.dart'; import '../../widgets/info_table_popup.dart'; @@ -37,17 +37,7 @@ class InstanceMoreMenu extends StatelessWidget { ListTile( leading: const Icon(Icons.open_in_browser), title: Text(L10n.of(context).open_in_browser), - onTap: () async { - if (await ul.canLaunch(instanceUrl)) { - await ul.launch(instanceUrl); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context).cannot_open_in_browser), - ), - ); - } - }, + onTap: () => launchLink(link: instanceUrl, context: context), ), ListTile( leading: const Icon(Icons.info_outline), diff --git a/lib/pages/manage_account.dart b/lib/pages/manage_account.dart index 2a0ba71..05459a2 100644 --- a/lib/pages/manage_account.dart +++ b/lib/pages/manage_account.dart @@ -3,12 +3,12 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:image_picker/image_picker.dart'; import 'package:lemmy_api_client/pictrs.dart'; import 'package:lemmy_api_client/v3.dart'; -import 'package:url_launcher/url_launcher.dart' as ul; import '../hooks/delayed_loading.dart'; import '../hooks/image_picker.dart'; import '../hooks/stores.dart'; import '../l10n/l10n.dart'; +import '../url_launcher.dart'; import '../util/icons.dart'; import '../util/pictrs.dart'; import '../widgets/bottom_modal.dart'; @@ -48,13 +48,12 @@ class ManageAccountPage extends HookWidget { final userProfileUrl = await userFuture.then((e) => e.person.actorId); - if (await ul.canLaunch(userProfileUrl)) { - await ul.launch(userProfileUrl); + final didLaunch = await launchLink( + link: userProfileUrl, + context: context, + ); + if (didLaunch) { Navigator.of(context).pop(); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("can't open in browser")), - ); } }, ), diff --git a/lib/pages/settings/add_account_page.dart b/lib/pages/settings/add_account_page.dart index aeccfd7..636fadc 100644 --- a/lib/pages/settings/add_account_page.dart +++ b/lib/pages/settings/add_account_page.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:lemmy_api_client/v3.dart'; import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart' as ul; import '../../hooks/delayed_loading.dart'; import '../../hooks/stores.dart'; import '../../l10n/l10n.dart'; import '../../stores/accounts_store.dart'; import '../../stores/config_store.dart'; +import '../../url_launcher.dart'; import '../../widgets/cached_network_image.dart'; import '../../widgets/fullscreenable_image.dart'; import '../../widgets/radio_picker.dart'; @@ -173,8 +173,11 @@ class AddAccountPage extends HookWidget { ), TextButton( onPressed: () { - // TODO: extract to LemmyUrls or something - ul.launch('https://${selectedInstance.value}/login'); + launchLink( + // TODO: extract to LemmyUrls or something + link: 'https://${selectedInstance.value}/login', + context: context, + ); }, child: const Text('Register'), ), diff --git a/lib/resources/links.dart b/lib/resources/links.dart index 9ee9233..ed26356 100644 --- a/lib/resources/links.dart +++ b/lib/resources/links.dart @@ -1 +1,3 @@ -const lemmurRepositoryLink = 'https://github.com/LemmurOrg/lemmur'; +const lemmurRepositoryUrl = 'https://github.com/LemmurOrg/lemmur'; +const patreonUrl = 'https://patreon.com/lemmur'; +const buyMeACoffeeUrl = 'https://buymeacoff.ee/lemmur'; diff --git a/lib/url_launcher.dart b/lib/url_launcher.dart index 8882b78..be3c268 100644 --- a/lib/url_launcher.dart +++ b/lib/url_launcher.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart' as ul; +import 'l10n/l10n.dart'; import 'pages/community/community.dart'; import 'pages/instance/instance.dart'; import 'pages/media_view.dart'; @@ -23,7 +25,10 @@ Future linkLauncher({ final instances = context.read().instances; final chonks = url.split('/'); - if (chonks.length == 1) return openInBrowser(url); + if (chonks.length == 1) { + await launchLink(link: url, context: context); + return; + } // CHECK IF LINK TO USER if (url.startsWith('/u/')) { @@ -97,14 +102,25 @@ Future linkLauncher({ // FALLBACK TO REGULAR LINK STUFF - return openInBrowser(url); + await launchLink(link: url, context: context); } -Future openInBrowser(String url) async { - if (await ul.canLaunch(url)) { - await ul.launch(url); +final _logger = Logger('launchLink'); + +/// Returns whether launching was successful. +Future launchLink({ + required String link, + required BuildContext context, +}) async { + final uri = Uri.tryParse(link); + if (uri != null && await ul.canLaunchUrl(uri)) { + await ul.launchUrl(uri); + return true; } else { - throw Exception(); - // TODO: handle opening links to stuff in app + _logger.warning('Failed to launch a link: $link'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).cannot_open_in_browser)), + ); + return false; } } diff --git a/lib/widgets/about_tile.dart b/lib/widgets/about_tile.dart index 1ca37c4..021a6c0 100644 --- a/lib/widgets/about_tile.dart +++ b/lib/widgets/about_tile.dart @@ -43,7 +43,8 @@ class AboutTile extends HookWidget { TextButton.icon( icon: const Icon(Icons.code), label: const Text('source code'), - onPressed: () => openInBrowser(lemmurRepositoryLink), + onPressed: () => + launchLink(link: lemmurRepositoryUrl, context: context), ), TextButton.icon( icon: const Icon(Icons.monetization_on), @@ -56,13 +57,17 @@ class AboutTile extends HookWidget { mainAxisSize: MainAxisSize.min, children: [ TextButton( - onPressed: () => - openInBrowser('https://patreon.com/lemmur'), + onPressed: () => launchLink( + link: patreonUrl, + context: context, + ), child: const Text('Patreon'), ), TextButton( - onPressed: () => - openInBrowser('https://buymeacoff.ee/lemmur'), + onPressed: () => launchLink( + link: buyMeACoffeeUrl, + context: context, + ), child: const Text('Buy Me a Coffee'), ), ], diff --git a/lib/widgets/comment/comment_more_menu_button.dart b/lib/widgets/comment/comment_more_menu_button.dart index ab0fc7b..9d51139 100644 --- a/lib/widgets/comment/comment_more_menu_button.dart +++ b/lib/widgets/comment/comment_more_menu_button.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:lemmy_api_client/v3.dart'; -import 'package:url_launcher/url_launcher.dart' as ul; import '../../hooks/logged_in_action.dart'; import '../../l10n/l10n.dart'; +import '../../url_launcher.dart'; import '../../util/extensions/api.dart'; import '../../util/icons.dart'; import '../../util/observer_consumers.dart'; @@ -83,13 +83,7 @@ class _CommentMoreMenuPopup extends HookWidget { leading: const Icon(Icons.open_in_browser), title: const Text('Open in browser'), onTap: () async { - if (await ul.canLaunch(comment.link)) { - await ul.launch(comment.link); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("can't open in browser")), - ); - } + await launchLink(link: comment.link, context: context); Navigator.of(context).pop(); }, diff --git a/lib/widgets/post/post_more_menu.dart b/lib/widgets/post/post_more_menu.dart index 5a3720a..5cc7138 100644 --- a/lib/widgets/post/post_more_menu.dart +++ b/lib/widgets/post/post_more_menu.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:url_launcher/url_launcher.dart' as ul; import '../../hooks/logged_in_action.dart'; import '../../pages/create_post.dart'; import '../../pages/full_post/full_post_store.dart'; import '../../stores/accounts_store.dart'; +import '../../url_launcher.dart'; import '../../util/icons.dart'; import '../../util/observer_consumers.dart'; import '../bottom_modal.dart'; @@ -72,10 +72,7 @@ class PostMoreMenu extends HookWidget { ListTile( leading: const Icon(Icons.open_in_browser), title: const Text('Open in browser'), - onTap: () async => await ul.canLaunch(post.post.apId) - ? ul.launch(post.post.apId) - : ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("can't open in browser"))), + onTap: () => launchLink(link: post.post.apId, context: context), ), if (isMine) ListTile(