diff --git a/lib/models/auth.dart b/lib/models/auth.dart index 7a55c9f..258e86f 100644 --- a/lib/models/auth.dart +++ b/lib/models/auth.dart @@ -237,7 +237,7 @@ class AuthModel with ChangeNotifier { void redirectToGithubOauth() { _oauthState = nanoid(); var scope = Uri.encodeComponent('user,repo,read:org'); - launch( + launchUrl( 'https://github.com/login/oauth/authorize?client_id=$clientId&redirect_uri=gittouch://login&scope=$scope&state=$_oauthState', ); } diff --git a/lib/screens/issue.dart b/lib/screens/issue.dart index b6861aa..422c7d0 100644 --- a/lib/screens/issue.dart +++ b/lib/screens/issue.dart @@ -4,7 +4,6 @@ import 'package:git_touch/models/auth.dart'; import 'package:primer/primer.dart'; import 'package:provider/provider.dart'; import 'package:share/share.dart'; -import 'package:url_launcher/url_launcher.dart'; import '../utils/utils.dart'; import '../scaffolds/long_list.dart'; import '../widgets/timeline_item.dart'; @@ -354,7 +353,7 @@ mutation { MyAction( text: 'Open in Browser', onPress: () { - launch(payload['url']); + launchUrl(payload['url']); }, ), ], diff --git a/lib/screens/organization.dart b/lib/screens/organization.dart index c0b59bf..07816d7 100644 --- a/lib/screens/organization.dart +++ b/lib/screens/organization.dart @@ -8,7 +8,6 @@ import 'package:git_touch/widgets/entry_item.dart'; import 'package:git_touch/widgets/repository_item.dart'; import 'package:git_touch/widgets/table_view.dart'; import 'package:git_touch/widgets/user_item.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:share/share.dart'; import 'package:git_touch/models/auth.dart'; import 'package:provider/provider.dart'; @@ -107,7 +106,7 @@ class OrganizationScreen extends StatelessWidget { text: 'Open in Browser', onPress: () { if (payload != null) { - launch(payload['url']); + launchUrl(payload['url']); } }, ), @@ -147,7 +146,7 @@ class OrganizationScreen extends StatelessWidget { leftIconData: Octicons.location, text: Text(payload['location']), onTap: () { - launch('https://www.google.com/maps/place/' + + launchUrl('https://www.google.com/maps/place/' + (payload['location'] as String) .replaceAll(RegExp(r'\s+'), '')); }, @@ -157,7 +156,7 @@ class OrganizationScreen extends StatelessWidget { leftIconData: Octicons.mail, text: Text(payload['email']), onTap: () { - launch('mailto:' + payload['email']); + launchUrl('mailto:' + payload['email']); }, ), if (isNotNullOrEmpty(payload['websiteUrl'])) @@ -169,7 +168,7 @@ class OrganizationScreen extends StatelessWidget { if (!url.startsWith('http')) { url = 'http://$url'; } - launch(url); + launchUrl(url); }, ), ], diff --git a/lib/screens/repository.dart b/lib/screens/repository.dart index 6509fd7..8d0e2e4 100644 --- a/lib/screens/repository.dart +++ b/lib/screens/repository.dart @@ -14,7 +14,6 @@ import 'package:git_touch/models/theme.dart'; import 'package:git_touch/screens/commits.dart'; import 'package:git_touch/screens/object.dart'; import 'package:share/share.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:git_touch/widgets/repository_item.dart'; import '../widgets/entry_item.dart'; import '../screens/issues.dart'; @@ -213,7 +212,7 @@ class RepositoryScreen extends StatelessWidget { text: 'Open in Browser', onPress: () { if (data != null) { - launch(data[0]['url']); + launchUrl(data[0]['url']); } }, ), diff --git a/lib/screens/user.dart b/lib/screens/user.dart index 3b182de..5edeeb0 100644 --- a/lib/screens/user.dart +++ b/lib/screens/user.dart @@ -9,14 +9,12 @@ import 'package:git_touch/widgets/table_view.dart'; import 'package:git_touch/widgets/text_contains_organization.dart'; import 'package:git_touch/widgets/user_item.dart'; import 'package:primer/primer.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:share/share.dart'; import 'package:github_contributions/github_contributions.dart'; import 'package:git_touch/models/auth.dart'; import 'package:provider/provider.dart'; import '../widgets/entry_item.dart'; import 'package:git_touch/widgets/repository_item.dart'; -import '../widgets/link.dart'; import '../widgets/action.dart'; import '../screens/users.dart'; import '../screens/settings.dart'; @@ -191,7 +189,7 @@ class UserScreen extends StatelessWidget { text: 'Open in Browser', onPress: () { if (data[0] != null) { - launch(data[0]['url']); + launchUrl(data[0]['url']); } }, ), @@ -252,7 +250,7 @@ class UserScreen extends StatelessWidget { leftIconData: Octicons.location, text: Text(payload['location']), onTap: () { - launch('https://www.google.com/maps/place/' + + launchUrl('https://www.google.com/maps/place/' + (payload['location'] as String) .replaceAll(RegExp(r'\s+'), '')); }, @@ -262,7 +260,7 @@ class UserScreen extends StatelessWidget { leftIconData: Octicons.mail, text: Text(payload['email']), onTap: () { - launch('mailto:' + payload['email']); + launchUrl('mailto:' + payload['email']); }, ), if (isNotNullOrEmpty(payload['websiteUrl'])) @@ -274,7 +272,7 @@ class UserScreen extends StatelessWidget { if (!url.startsWith('http')) { url = 'http://$url'; } - launch(url); + launchUrl(url); }, ), ], diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index ee739a8..a1b45ff 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -184,3 +184,13 @@ class PrimerBranchName extends StatelessWidget { ); } } + +launchUrl(String url) async { + if (url == null) return; + + if (await canLaunch(url)) { + await launch(url); + } else { + // TODO: fallback + } +} diff --git a/lib/widgets/link.dart b/lib/widgets/link.dart index c4189d3..35b2917 100644 --- a/lib/widgets/link.dart +++ b/lib/widgets/link.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:git_touch/models/theme.dart'; class Link extends StatelessWidget { @@ -27,7 +27,7 @@ class Link extends StatelessWidget { return Provider.of(context).pushRoute(context, screenBuilder); } if (url != null) { - launch(url); + launchUrl(url); } } diff --git a/lib/widgets/notification_item.dart b/lib/widgets/notification_item.dart index fcd95db..dc114a0 100644 --- a/lib/widgets/notification_item.dart +++ b/lib/widgets/notification_item.dart @@ -3,10 +3,8 @@ import 'package:flutter/cupertino.dart'; import 'package:git_touch/models/notification.dart'; import 'package:git_touch/models/theme.dart'; import 'package:primer/primer.dart'; -import 'package:url_launcher/url_launcher.dart'; import '../utils/utils.dart'; import '../screens/issue.dart'; -// import '../screens/not_found.dart'; import 'package:git_touch/models/auth.dart'; import 'package:provider/provider.dart'; import 'link.dart'; @@ -115,7 +113,7 @@ class _NotificationItemState extends State { break; case 'Release': - launch( + launchUrl( 'https://github.com/${payload.owner}/${payload.name}/releases/tag/${payload.title}'); break; case 'Commit':