|
|
|
|
@ -1,3 +1,5 @@
|
|
|
|
|
import 'dart:developer';
|
|
|
|
|
|
|
|
|
|
import 'package:cached_network_image/cached_network_image.dart';
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:mc_common_app/classes/app_state.dart';
|
|
|
|
|
@ -221,7 +223,6 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//offerNoLongerAvailable
|
|
|
|
|
switch (requestOfferStatusEnum) {
|
|
|
|
|
case RequestOfferStatusEnum.offer:
|
|
|
|
|
return Column(
|
|
|
|
|
@ -405,6 +406,148 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
|
|
|
|
|
return widget.toCircle(borderRadius: 100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget buildFreeTextDetailsInMessage() {
|
|
|
|
|
return Row(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: Directionality(
|
|
|
|
|
textDirection: TextDirection.ltr,
|
|
|
|
|
child: (widget.chatMessageModel.chatText ?? "").toText(
|
|
|
|
|
color: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.white : MyColors.lightTextColor,
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
// isBold: true,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget buildImageGridWidget(
|
|
|
|
|
{required List<MessageImageModel> messagesImages,
|
|
|
|
|
double gridItemSize = 50.0, // Default fixed size for each grid item
|
|
|
|
|
double spacing = 8.0,
|
|
|
|
|
double borderWidth = 1,
|
|
|
|
|
Color borderColor = MyColors.textColor}) {
|
|
|
|
|
int imageCount = messagesImages.length;
|
|
|
|
|
if (imageCount == 1) {
|
|
|
|
|
return Container(
|
|
|
|
|
width: double.infinity,
|
|
|
|
|
height: (gridItemSize * 4),
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
border: Border.all(width: borderWidth, color: borderColor),
|
|
|
|
|
borderRadius: BorderRadius.circular(8),
|
|
|
|
|
),
|
|
|
|
|
child: ClipRRect(
|
|
|
|
|
borderRadius: BorderRadius.circular(8),
|
|
|
|
|
child: (messagesImages[0].isFromNetwork ?? false)
|
|
|
|
|
? messagesImages[0].imageUrl.buildNetworkImage(
|
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
|
)
|
|
|
|
|
: messagesImages[0].imagePath.buildFileImage(fit: BoxFit.cover),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return SizedBox(
|
|
|
|
|
// height: (gridItemSize * 2) + (spacing * 2), // Fixed height for 2 rows including spacing
|
|
|
|
|
child: GridView.builder(
|
|
|
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
|
|
|
// Prevent scrolling inside grid
|
|
|
|
|
shrinkWrap: true,
|
|
|
|
|
// Shrink size to fit the content
|
|
|
|
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
|
|
|
|
crossAxisCount: 2, // Show 2 images per row
|
|
|
|
|
crossAxisSpacing: spacing,
|
|
|
|
|
mainAxisSpacing: spacing,
|
|
|
|
|
childAspectRatio: 1, // Keep items square
|
|
|
|
|
),
|
|
|
|
|
itemCount: imageCount > 4 ? 4 : imageCount,
|
|
|
|
|
itemBuilder: (context, index) {
|
|
|
|
|
if (index == 3 && imageCount > 4) {
|
|
|
|
|
return Stack(
|
|
|
|
|
fit: StackFit.expand,
|
|
|
|
|
children: [
|
|
|
|
|
(messagesImages[0].isFromNetwork ?? false)
|
|
|
|
|
? messagesImages[index].imageUrl.buildNetworkImage(
|
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
|
width: gridItemSize,
|
|
|
|
|
height: gridItemSize,
|
|
|
|
|
)
|
|
|
|
|
: messagesImages[index].imagePath.buildFileImage(
|
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
|
width: gridItemSize,
|
|
|
|
|
height: gridItemSize,
|
|
|
|
|
),
|
|
|
|
|
Container(
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
color: Colors.black.withOpacity(0.5),
|
|
|
|
|
border: Border.all(width: borderWidth, color: borderColor),
|
|
|
|
|
borderRadius: BorderRadius.circular(8), // Optional: Rounded corners
|
|
|
|
|
),
|
|
|
|
|
child: Center(
|
|
|
|
|
child: '+${imageCount - 4}'.toText(fontSize: 30, color: MyColors.white, fontWeight: MyFonts.Medium),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
return Container(
|
|
|
|
|
width: gridItemSize,
|
|
|
|
|
height: gridItemSize,
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
border: Border.all(width: borderWidth, color: borderColor),
|
|
|
|
|
borderRadius: BorderRadius.circular(8), // Optional: Rounded corners
|
|
|
|
|
),
|
|
|
|
|
child: ClipRRect(
|
|
|
|
|
borderRadius: BorderRadius.circular(8), // Apply same radius to image
|
|
|
|
|
child: messagesImages[index].imageUrl.buildNetworkImage(
|
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
|
width: gridItemSize,
|
|
|
|
|
height: gridItemSize,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget messageWidgetBasedOnType({required ChatMessageTypeEnum? chatMessageTypeEnum}) {
|
|
|
|
|
Widget messageTypeWidget = const SizedBox();
|
|
|
|
|
if (chatMessageTypeEnum == null) {
|
|
|
|
|
return const SizedBox();
|
|
|
|
|
}
|
|
|
|
|
switch (chatMessageTypeEnum) {
|
|
|
|
|
case ChatMessageTypeEnum.freeText:
|
|
|
|
|
messageTypeWidget = Column(children: [buildFreeTextDetailsInMessage(), 10.height]);
|
|
|
|
|
break;
|
|
|
|
|
case ChatMessageTypeEnum.image:
|
|
|
|
|
messageTypeWidget = buildImageGridWidget(messagesImages: widget.chatMessageModel.messageImages ?? []);
|
|
|
|
|
break;
|
|
|
|
|
case ChatMessageTypeEnum.audio:
|
|
|
|
|
case ChatMessageTypeEnum.video:
|
|
|
|
|
case ChatMessageTypeEnum.file:
|
|
|
|
|
case ChatMessageTypeEnum.offer:
|
|
|
|
|
messageTypeWidget = Column(
|
|
|
|
|
children: [
|
|
|
|
|
buildFreeTextDetailsInMessage(),
|
|
|
|
|
10.height,
|
|
|
|
|
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum, chatMessageModel: widget.chatMessageModel, context: context),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return messageTypeWidget.toContainer(
|
|
|
|
|
isShadowEnabled: !(widget.chatMessageModel.isMyMessage ?? false),
|
|
|
|
|
backgroundColor: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.darkIconColor : MyColors.white,
|
|
|
|
|
borderRadius: 0,
|
|
|
|
|
margin: EdgeInsets.fromLTRB((widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0, !(widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Directionality(
|
|
|
|
|
@ -437,34 +580,7 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
5.height,
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
Row(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: Directionality(
|
|
|
|
|
textDirection: TextDirection.ltr,
|
|
|
|
|
child: (widget.chatMessageModel.chatText ?? "").toText(
|
|
|
|
|
color: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.white : MyColors.lightTextColor,
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
// isBold: true,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
10.height,
|
|
|
|
|
if (widget.chatMessageModel.chatMessageTypeEnum == ChatMessageTypeEnum.offer) ...[
|
|
|
|
|
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum, chatMessageModel: widget.chatMessageModel, context: context),
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
).toContainer(
|
|
|
|
|
isShadowEnabled: !(widget.chatMessageModel.isMyMessage ?? false),
|
|
|
|
|
backgroundColor: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.darkIconColor : MyColors.white,
|
|
|
|
|
borderRadius: 0,
|
|
|
|
|
margin: EdgeInsets.fromLTRB((widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0, !(widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0),
|
|
|
|
|
),
|
|
|
|
|
messageWidgetBasedOnType(chatMessageTypeEnum: widget.chatMessageModel.chatMessageTypeEnum),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|