refactor!: initial attachments refactor.

Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
Sahil Kumar
2023-07-28 21:07:02 +05:30
committed by xsahil03x
parent eb6f0852e8
commit f246de55a1
61 changed files with 3628 additions and 1712 deletions
@@ -1,44 +1,36 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart';
import 'package:stream_chat_flutter/src/attachment/attachment_widget.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 StreamAttachmentWidget {
class StreamImageAttachment extends StatelessWidget {
/// {@macro streamImageAttachment}
const StreamImageAttachment({
super.key,
required super.message,
required super.attachment,
required this.messageTheme,
super.constraints,
this.showTitle = false,
this.onShowMessage,
this.onReplyMessage,
this.onAttachmentTap,
required this.message,
required this.image,
this.shape,
this.constraints = const BoxConstraints(),
this.imageThumbnailSize = const Size(400, 400),
this.imageThumbnailResizeType = 'clip',
this.imageThumbnailCropType = 'center',
this.attachmentActionsModalBuilder,
});
/// The [StreamMessageThemeData] to use for the image title
final StreamMessageThemeData messageTheme;
/// The [Message] that the image is attached to.
final Message message;
/// Flag for whether the title should be shown or not
final bool showTitle;
/// The [Attachment] object containing the image information.
final Attachment image;
/// {@macro showMessageCallback}
final ShowMessageCallback? onShowMessage;
/// The shape of the attachment.
///
/// Defaults to [RoundedRectangleBorder] with a radius of 14.
final ShapeBorder? shape;
/// {@macro replyMessageCallback}
final ReplyMessageCallback? onReplyMessage;
/// {@macro onAttachmentTap}
final OnAttachmentTap? onAttachmentTap;
/// The constraints to use when displaying the image.
final BoxConstraints constraints;
/// Size of the attachment image thumbnail.
final Size imageThumbnailSize;
@@ -53,149 +45,89 @@ class StreamImageAttachment extends StreamAttachmentWidget {
/// Defaults to [center]
final String /*center|top|bottom|left|right*/ imageThumbnailCropType;
/// {@macro attachmentActionsBuilder}
final AttachmentActionsBuilder? attachmentActionsModalBuilder;
@override
Widget build(BuildContext context) {
return source.when(
local: () {
if (attachment.file?.bytes != null) {
return _buildImageAttachment(
context,
Image.memory(
attachment.file!.bytes!,
height: constraints?.maxHeight,
width: constraints?.maxWidth,
fit: BoxFit.cover,
errorBuilder: _imageErrorBuilder,
),
);
} else if (attachment.localUri != null) {
return _buildImageAttachment(
context,
Image.asset(
attachment.localUri!.path,
height: constraints?.maxHeight,
width: constraints?.maxWidth,
fit: BoxFit.cover,
errorBuilder: _imageErrorBuilder,
),
);
} else {
return AttachmentError(
constraints: constraints,
);
}
},
network: () {
var imageUrl =
attachment.thumbUrl ?? attachment.imageUrl ?? attachment.assetUrl;
BoxFit? fit;
final imageSize = image.originalSize;
if (imageUrl == null) {
return AttachmentError(constraints: constraints);
}
// 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;
}
imageUrl = imageUrl.getResizedImageUrl(
width: imageThumbnailSize.width,
height: imageThumbnailSize.height,
resize: imageThumbnailResizeType,
crop: imageThumbnailCropType,
);
return _buildImageAttachment(
context,
CachedNetworkImage(
imageUrl: imageUrl,
height: constraints?.maxHeight,
width: constraints?.maxWidth,
fit: BoxFit.cover,
placeholder: (context, __) {
final image = Image.asset(
'images/placeholder.png',
fit: BoxFit.cover,
package: 'stream_chat_flutter',
);
final colorTheme = StreamChatTheme.of(context).colorTheme;
return Shimmer.fromColors(
baseColor: colorTheme.disabled,
highlightColor: colorTheme.inputBg,
child: image,
);
},
errorWidget: (context, url, error) =>
AttachmentError(constraints: constraints),
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),
);
},
);
}
Widget _imageErrorBuilder(BuildContext _, Object __, StackTrace? ___) =>
Image.asset(
'images/placeholder.png',
package: 'stream_chat_flutter',
);
Widget _buildImageAttachment(BuildContext context, Widget imageWidget) {
return Container(
constraints: constraints,
child: Column(
children: <Widget>[
Expanded(
child: Stack(
children: [
MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: onAttachmentTap ??
() {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) {
final channel =
StreamChannel.of(context).channel;
return StreamChannel(
channel: channel,
child: StreamFullScreenMediaBuilder(
mediaAttachmentPackages:
message.getAttachmentPackageList(),
startIndex:
message.attachments.indexOf(attachment),
userName: message.user!.name,
onShowMessage: onShowMessage,
onReplyMessage: onReplyMessage,
attachmentActionsModalBuilder:
attachmentActionsModalBuilder,
),
);
},
),
);
},
child: imageWidget,
),
),
Padding(
padding: const EdgeInsets.all(8),
child: StreamAttachmentUploadStateBuilder(
message: message,
attachment: attachment,
),
),
],
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,
),
),
if (showTitle && attachment.title != null)
Material(
color: messageTheme.messageBackgroundColor,
child: StreamAttachmentTitle(
messageTheme: messageTheme,
attachment: attachment,
Padding(
padding: const EdgeInsets.all(8),
child: StreamAttachmentUploadStateBuilder(
message: message,
attachment: image,
),
),
],
],
),
),
);
}
}
// Future<void> _onTap(
// BuildContext context,
// int index,
// ) async {
// if (onAttachmentTap != null) {
// return onAttachmentTap!();
// }
//
// final channel = StreamChannel.of(context).channel;
//
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) => StreamChannel(
// channel: channel,
// child: StreamFullScreenMediaBuilder(
// mediaAttachmentPackages: message.getAttachmentPackageList(),
// startIndex: index,
// userName: message.user!.name,
// onShowMessage: onShowMessage,
// onReplyMessage: onReplyMessage,
// attachmentActionsModalBuilder: attachmentActionsModalBuilder,
// ),
// ),
// ),
// );
// }
// }