From f8893ec3dbff06e5dbd593eb99e8fcf18fde34e4 Mon Sep 17 00:00:00 2001 From: Chris Bobbe Date: Tue, 1 Aug 2023 17:25:38 -0700 Subject: [PATCH] RealmContentNetworkImage [nfc]: Take a Uri object instead of a String --- lib/widgets/content.dart | 14 +++++--------- lib/widgets/lightbox.dart | 2 +- lib/widgets/message_list.dart | 5 +---- test/widgets/content_test.dart | 8 ++++---- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/widgets/content.dart b/lib/widgets/content.dart index fceb8bd8a41..f8df9339679 100644 --- a/lib/widgets/content.dart +++ b/lib/widgets/content.dart @@ -243,7 +243,7 @@ class MessageImage extends StatelessWidget { message: message, src: resolvedSrc, child: RealmContentNetworkImage( - resolvedSrc.toString(), + resolvedSrc, filterQuality: FilterQuality.medium)))))); } } @@ -648,7 +648,7 @@ class MessageImageEmoji extends StatelessWidget { // too low. top: -1.5, child: RealmContentNetworkImage( - resolvedSrc.toString(), + resolvedSrc, filterQuality: FilterQuality.medium, width: size, height: size, @@ -749,9 +749,7 @@ class RealmContentNetworkImage extends StatelessWidget { this.cacheHeight, }); - /// An absolute URL string for the image. - // TODO: Take a [Uri] object, not a String - final String src; + final Uri src; final double scale; final ImageFrameBuilder? frameBuilder; @@ -780,10 +778,8 @@ class RealmContentNetworkImage extends StatelessWidget { Widget build(BuildContext context) { final account = PerAccountStoreWidget.of(context).account; - final Uri parsedSrc = Uri.parse(src); - return Image.network( - parsedSrc.toString(), + src.toString(), scale: scale, frameBuilder: frameBuilder, @@ -806,7 +802,7 @@ class RealmContentNetworkImage extends StatelessWidget { isAntiAlias: isAntiAlias, // Only send the auth header to the server `auth` belongs to. - headers: parsedSrc.origin == account.realmUrl.origin + headers: src.origin == account.realmUrl.origin ? authHeader(email: account.email, apiKey: account.apiKey) : null, diff --git a/lib/widgets/lightbox.dart b/lib/widgets/lightbox.dart index 2bed58e9e90..829b7ab5270 100644 --- a/lib/widgets/lightbox.dart +++ b/lib/widgets/lightbox.dart @@ -197,7 +197,7 @@ class _LightboxPageState extends State<_LightboxPage> { child: LightboxHero( message: widget.message, src: widget.src, - child: RealmContentNetworkImage(widget.src.toString(), filterQuality: FilterQuality.medium))))))), + child: RealmContentNetworkImage(widget.src, filterQuality: FilterQuality.medium))))))), bottomNavigationBar: bottomAppBar)); } } diff --git a/lib/widgets/message_list.dart b/lib/widgets/message_list.dart index f1b5879cb31..d34641c1489 100644 --- a/lib/widgets/message_list.dart +++ b/lib/widgets/message_list.dart @@ -481,10 +481,7 @@ class MessageWithSender extends StatelessWidget { : resolveUrl(message.avatarUrl!, store.account); final avatar = (avatarUrl == null) ? const SizedBox.shrink() - : RealmContentNetworkImage( - avatarUrl.toString(), - filterQuality: FilterQuality.medium, - ); + : RealmContentNetworkImage(avatarUrl, filterQuality: FilterQuality.medium); final time = _kMessageTimestampFormat .format(DateTime.fromMillisecondsSinceEpoch(1000 * message.timestamp)); diff --git a/test/widgets/content_test.dart b/test/widgets/content_test.dart index 6485f4d31e2..d574cb7e81a 100644 --- a/test/widgets/content_test.dart +++ b/test/widgets/content_test.dart @@ -121,7 +121,7 @@ void main() { group('RealmContentNetworkImage', () { final authHeaders = authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey); - Future actualAuthHeader(WidgetTester tester, String src) async { + Future actualAuthHeader(WidgetTester tester, Uri src) async { final globalStore = TestZulipBinding.instance.globalStore; addTearDown(TestZulipBinding.instance.reset); await globalStore.add(eg.selfAccount, eg.initialSnapshot()); @@ -144,20 +144,20 @@ void main() { } testWidgets('includes auth header if `src` on-realm', (tester) async { - check(await actualAuthHeader(tester, 'https://chat.example/image.png')) + check(await actualAuthHeader(tester, Uri.parse('https://chat.example/image.png'))) .isNotNull().equals(authHeaders['Authorization']!); debugNetworkImageHttpClientProvider = null; }); testWidgets('excludes auth header if `src` off-realm', (tester) async { - check(await actualAuthHeader(tester, 'https://other.example/image.png')) + check(await actualAuthHeader(tester, Uri.parse('https://other.example/image.png'))) .isNull(); debugNetworkImageHttpClientProvider = null; }); testWidgets('throws if no `PerAccountStoreWidget` ancestor', (WidgetTester tester) async { await tester.pumpWidget( - const RealmContentNetworkImage('https://zulip.invalid/path/to/image.png', filterQuality: FilterQuality.medium)); + RealmContentNetworkImage(Uri.parse('https://zulip.invalid/path/to/image.png'), filterQuality: FilterQuality.medium)); check(tester.takeException()).isA(); }); });