Files
stream-chat-flutter/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart
T
2023-07-28 21:07:02 +05:30

106 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/src/attachment/thumbnail/image_attachment_thumbnail.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
/// {@template streamImageAttachment}
/// Shows an image attachment in a [StreamMessageWidget].
/// {@endtemplate}
class StreamImageAttachment extends StatelessWidget {
/// {@macro streamImageAttachment}
const StreamImageAttachment({
super.key,
required this.message,
required this.image,
this.shape,
this.constraints = const BoxConstraints(),
this.imageThumbnailSize = const Size(400, 400),
this.imageThumbnailResizeType = 'clip',
this.imageThumbnailCropType = 'center',
});
/// The [Message] that the image is attached to.
final Message message;
/// The [Attachment] object containing the image information.
final Attachment image;
/// The shape of the attachment.
///
/// Defaults to [RoundedRectangleBorder] with a radius of 14.
final ShapeBorder? shape;
/// The constraints to use when displaying the image.
final BoxConstraints constraints;
/// Size of the attachment image thumbnail.
final Size imageThumbnailSize;
/// Resize type of the image attachment thumbnail.
///
/// Defaults to [crop]
final String /*clip|crop|scale|fill*/ imageThumbnailResizeType;
/// Crop type of the image attachment thumbnail.
///
/// Defaults to [center]
final String /*center|top|bottom|left|right*/ imageThumbnailCropType;
@override
Widget build(BuildContext context) {
BoxFit? fit;
final imageSize = image.originalSize;
// If attachment size is available, we will tighten the constraints max
// size to the attachment size.
var constraints = this.constraints;
if (imageSize != null) {
constraints = constraints.tightenMaxSize(imageSize);
} else {
// For backward compatibility, we will fill the available space if the
// attachment size is not available.
fit = BoxFit.cover;
}
final chatTheme = StreamChatTheme.of(context);
final colorTheme = chatTheme.colorTheme;
final shape = this.shape ??
RoundedRectangleBorder(
side: BorderSide(
color: colorTheme.borders,
strokeAlign: BorderSide.strokeAlignOutside,
),
borderRadius: BorderRadius.circular(14),
);
return Container(
constraints: constraints,
clipBehavior: Clip.hardEdge,
decoration: ShapeDecoration(shape: shape),
child: AspectRatio(
aspectRatio: imageSize?.aspectRatio ?? 1,
child: Stack(
alignment: Alignment.center,
children: [
StreamImageAttachmentThumbnail(
image: image,
fit: fit,
width: double.infinity,
height: double.infinity,
thumbnailSize: imageThumbnailSize,
thumbnailResizeType: imageThumbnailResizeType,
thumbnailCropType: imageThumbnailCropType,
),
Padding(
padding: const EdgeInsets.all(8),
child: StreamAttachmentUploadStateBuilder(
message: message,
attachment: image,
),
),
],
),
),
);
}
}