Skip to content

Commit 78ef95d

Browse files
committed
actions [nfc]: Move open-link logic here, from lib/widgets/content
We'll use when we add a "Learn more"-button param to showErrorDialog, coming up.
1 parent 2f62e7d commit 78ef95d

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

lib/widgets/actions.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import '../api/route/messages.dart';
1010
import '../generated/l10n/zulip_localizations.dart';
1111
import '../model/binding.dart';
1212
import '../model/narrow.dart';
13+
import '../model/settings.dart';
1314
import 'dialog.dart';
1415
import 'store.dart';
1516

@@ -281,4 +282,30 @@ abstract final class PlatformActions {
281282
SnackBar(behavior: SnackBarBehavior.floating, content: successContent));
282283
}
283284
}
285+
286+
/// Opens a URL with [ZulipBinding.launchUrl], with an error dialog on failure.
287+
// TODO widget tests
288+
static Future<void> launchUrl(BuildContext context, Uri url) async {
289+
final globalSettings = GlobalStoreWidget.of(context).globalSettings;
290+
291+
bool launched = false;
292+
String? errorMessage;
293+
try {
294+
launched = await ZulipBinding.instance.launchUrl(url,
295+
mode: globalSettings.getUrlLaunchMode(url));
296+
} on PlatformException catch (e) {
297+
errorMessage = e.message;
298+
}
299+
if (!launched) { // TODO(log)
300+
if (!context.mounted) return;
301+
302+
final zulipLocalizations = ZulipLocalizations.of(context);
303+
showErrorDialog(context: context,
304+
title: zulipLocalizations.errorCouldNotOpenLinkTitle,
305+
message: [
306+
zulipLocalizations.errorCouldNotOpenLink(url.toString()),
307+
if (errorMessage != null) errorMessage,
308+
].join("\n\n"));
309+
}
310+
}
284311
}

lib/widgets/content.dart

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,16 @@ import 'package:flutter/cupertino.dart';
44
import 'package:flutter/gestures.dart';
55
import 'package:flutter/material.dart';
66
import 'package:flutter/rendering.dart';
7-
import 'package:flutter/services.dart';
87
import 'package:html/dom.dart' as dom;
98
import 'package:intl/intl.dart';
109

1110
import '../api/core.dart';
1211
import '../api/model/model.dart';
1312
import '../generated/l10n/zulip_localizations.dart';
1413
import '../model/avatar_url.dart';
15-
import '../model/binding.dart';
1614
import '../model/content.dart';
1715
import '../model/internal_link.dart';
18-
import '../model/settings.dart';
16+
import 'actions.dart';
1917
import 'code_block.dart';
2018
import 'dialog.dart';
2119
import 'icons.dart';
@@ -1432,26 +1430,7 @@ void _launchUrl(BuildContext context, String urlString) async {
14321430
return;
14331431
}
14341432

1435-
final globalSettings = GlobalStoreWidget.of(context).globalSettings;
1436-
bool launched = false;
1437-
String? errorMessage;
1438-
try {
1439-
launched = await ZulipBinding.instance.launchUrl(url,
1440-
mode: globalSettings.getUrlLaunchMode(url));
1441-
} on PlatformException catch (e) {
1442-
errorMessage = e.message;
1443-
}
1444-
if (!launched) { // TODO(log)
1445-
if (!context.mounted) return;
1446-
1447-
final zulipLocalizations = ZulipLocalizations.of(context);
1448-
showErrorDialog(context: context,
1449-
title: zulipLocalizations.errorCouldNotOpenLinkTitle,
1450-
message: [
1451-
zulipLocalizations.errorCouldNotOpenLink(url.toString()),
1452-
if (errorMessage != null) errorMessage,
1453-
].join("\n\n"));
1454-
}
1433+
await PlatformActions.launchUrl(context, url);
14551434
}
14561435

14571436
/// Like [Image.network], but includes [authHeader] if [src] is on-realm.

lib/widgets/login.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ class _LoginPageState extends State<LoginPage> {
343343
// Could set [_inProgress]… but we'd need to unset it if the web-auth
344344
// attempt is aborted (by the user closing the browser, for example),
345345
// and I don't think we can reliably know when that happens.
346+
347+
// Not using [PlatformActions.launchUrl] because web auth needs special
348+
// error handling.
346349
await ZulipBinding.instance.launchUrl(url, mode: LaunchMode.inAppBrowserView);
347350
} catch (e) {
348351
assert(debugLog(e.toString()));

0 commit comments

Comments
 (0)