Skip to content

Commit

Permalink
provide option to pass headers to networkimage (#327)
Browse files Browse the repository at this point in the history
* provide option to pass headers to networkimage

* pass header also to imageMessageBuilder

* Fix headers

Co-authored-by: Marinko Babic <marinko.babic@crealogix.com>
Co-authored-by: Alex Demchenko <alexdemchenko@yahoo.com>
  • Loading branch information
3 people authored Oct 2, 2022
1 parent 1e2a209 commit cc6536a
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 9 deletions.
4 changes: 2 additions & 2 deletions lib/src/conditional/browser_conditional.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ class BrowserConditional extends BaseConditional {
/// Returns [NetworkImage] if URI starts with http
/// otherwise returns transparent image
@override
ImageProvider getProvider(String uri) {
ImageProvider getProvider(String uri, {Map<String, String>? headers}) {
if (uri.startsWith('http') || uri.startsWith('blob')) {
return NetworkImage(uri);
return NetworkImage(uri, headers: headers);
} else {
return MemoryImage(kTransparentImage);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/src/conditional/conditional.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ abstract class Conditional {
factory Conditional() => createConditional();

/// Returns an appropriate platform ImageProvider for specified URI.
ImageProvider getProvider(String uri);
ImageProvider getProvider(String uri, {Map<String, String>? headers});
}
4 changes: 2 additions & 2 deletions lib/src/conditional/io_conditional.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ class IOConditional extends BaseConditional {
/// Returns [NetworkImage] if URI starts with http
/// otherwise uses IO to create File
@override
ImageProvider getProvider(String uri) {
ImageProvider getProvider(String uri, {Map<String, String>? headers}) {
if (uri.startsWith('http')) {
return NetworkImage(uri);
return NetworkImage(uri, headers: headers);
} else {
return FileImage(File(uri));
}
Expand Down
6 changes: 6 additions & 0 deletions lib/src/widgets/chat.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class Chat extends StatefulWidget {
maxScale: PhotoViewComputedScale.covered,
minScale: PhotoViewComputedScale.contained,
),
this.imageHeaders,
this.imageMessageBuilder,
this.inputOptions = const InputOptions(),
this.isAttachmentUploading,
Expand Down Expand Up @@ -168,6 +169,9 @@ class Chat extends StatefulWidget {
/// See [ImageGallery.options].
final ImageGalleryOptions imageGalleryOptions;

/// Headers passed to all network images used in the chat.
final Map<String, String>? imageHeaders;

/// See [Message.imageMessageBuilder].
final Widget Function(types.ImageMessage, {required int messageWidth})?
imageMessageBuilder;
Expand Down Expand Up @@ -418,6 +422,7 @@ class ChatState extends State<Chat> {
),
if (_isImageViewVisible)
ImageGallery(
imageHeaders: widget.imageHeaders,
images: _gallery,
pageController: _galleryPageController!,
onClosePressed: _onCloseGalleryPressed,
Expand Down Expand Up @@ -511,6 +516,7 @@ class ChatState extends State<Chat> {
emojiEnlargementBehavior: widget.emojiEnlargementBehavior,
fileMessageBuilder: widget.fileMessageBuilder,
hideBackgroundOnEmojiMessages: widget.hideBackgroundOnEmojiMessages,
imageHeaders: widget.imageHeaders,
imageMessageBuilder: widget.imageMessageBuilder,
message: message,
messageWidth: messageWidth,
Expand Down
9 changes: 8 additions & 1 deletion lib/src/widgets/image_gallery.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@ import '../models/preview_image.dart';
class ImageGallery extends StatelessWidget {
const ImageGallery({
super.key,
this.imageHeaders,
required this.images,
required this.onClosePressed,
this.options = const ImageGalleryOptions(),
required this.pageController,
});

/// See [Chat.imageHeaders].
final Map<String, String>? imageHeaders;

/// Images to show in the gallery.
final List<PreviewImage> images;

Expand Down Expand Up @@ -40,7 +44,10 @@ class ImageGallery extends StatelessWidget {
PhotoViewGallery.builder(
builder: (BuildContext context, int index) =>
PhotoViewGalleryPageOptions(
imageProvider: Conditional().getProvider(images[index].uri),
imageProvider: Conditional().getProvider(
images[index].uri,
headers: imageHeaders,
),
minScale: options.minScale,
maxScale: options.maxScale,
),
Expand Down
9 changes: 8 additions & 1 deletion lib/src/widgets/message/image_message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,14 @@ class ImageMessage extends StatefulWidget {
/// Creates an image message widget based on [types.ImageMessage].
const ImageMessage({
super.key,
this.imageHeaders,
required this.message,
required this.messageWidth,
});

/// See [Chat.imageHeaders].
final Map<String, String>? imageHeaders;

/// [types.ImageMessage].
final types.ImageMessage message;

Expand All @@ -37,7 +41,10 @@ class _ImageMessageState extends State<ImageMessage> {
@override
void initState() {
super.initState();
_image = Conditional().getProvider(widget.message.uri);
_image = Conditional().getProvider(
widget.message.uri,
headers: widget.imageHeaders,
);
_size = Size(widget.message.width ?? 0, widget.message.height ?? 0);
}

Expand Down
11 changes: 10 additions & 1 deletion lib/src/widgets/message/message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class Message extends StatelessWidget {
required this.emojiEnlargementBehavior,
this.fileMessageBuilder,
required this.hideBackgroundOnEmojiMessages,
this.imageHeaders,
this.imageMessageBuilder,
required this.message,
required this.messageWidth,
Expand Down Expand Up @@ -91,6 +92,9 @@ class Message extends StatelessWidget {
/// Hide background for messages containing only emojis.
final bool hideBackgroundOnEmojiMessages;

/// See [Chat.imageHeaders].
final Map<String, String>? imageHeaders;

/// Build an image message inside predefined bubble.
final Widget Function(types.ImageMessage, {required int messageWidth})?
imageMessageBuilder;
Expand Down Expand Up @@ -283,6 +287,7 @@ class Message extends StatelessWidget {
? avatarBuilder?.call(message.author.id) ??
UserAvatar(
author: message.author,
imageHeaders: imageHeaders,
bubbleRtlAlignment: bubbleRtlAlignment,
onAvatarTap: onAvatarTap,
)
Expand Down Expand Up @@ -332,7 +337,11 @@ class Message extends StatelessWidget {
final imageMessage = message as types.ImageMessage;
return imageMessageBuilder != null
? imageMessageBuilder!(imageMessage, messageWidth: messageWidth)
: ImageMessage(message: imageMessage, messageWidth: messageWidth);
: ImageMessage(
imageHeaders: imageHeaders,
message: imageMessage,
messageWidth: messageWidth,
);
case types.MessageType.text:
final textMessage = message as types.TextMessage;
return textMessageBuilder != null
Expand Down
8 changes: 7 additions & 1 deletion lib/src/widgets/message/user_avatar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class UserAvatar extends StatelessWidget {
super.key,
required this.author,
this.bubbleRtlAlignment,
this.imageHeaders,
this.onAvatarTap,
});

Expand All @@ -21,6 +22,9 @@ class UserAvatar extends StatelessWidget {
/// See [Message.bubbleRtlAlignment].
final BubbleRtlAlignment? bubbleRtlAlignment;

/// See [Chat.imageHeaders].
final Map<String, String>? imageHeaders;

/// Called when user taps on an avatar.
final void Function(types.User)? onAvatarTap;

Expand All @@ -45,7 +49,9 @@ class UserAvatar extends StatelessWidget {
.theme
.userAvatarImageBackgroundColor
: color,
backgroundImage: hasImage ? NetworkImage(author.imageUrl!) : null,
backgroundImage: hasImage
? NetworkImage(author.imageUrl!, headers: imageHeaders)
: null,
radius: 16,
child: !hasImage
? Text(
Expand Down

0 comments on commit cc6536a

Please sign in to comment.