@ -1,6 +1,7 @@
import ' dart:developer ' ;
import ' package:cached_network_image/cached_network_image.dart ' ;
import ' package:easy_localization/easy_localization.dart ' as lcl ;
import ' package:flutter/material.dart ' ;
import ' package:mc_common_app/classes/app_state.dart ' ;
import ' package:mc_common_app/classes/consts.dart ' ;
@ -9,34 +10,265 @@ import 'package:mc_common_app/extensions/int_extensions.dart';
import ' package:mc_common_app/extensions/string_extensions.dart ' ;
import ' package:mc_common_app/generated/locale_keys.g.dart ' ;
import ' package:mc_common_app/models/chat_models/chat_message_model.dart ' ;
import ' package:mc_common_app/models/requests_models/request_model.dart ' ;
import ' package:mc_common_app/theme/colors.dart ' ;
import ' package:mc_common_app/utils/dialogs_and_bottomsheets.dart ' ;
import ' package:mc_common_app/utils/enums.dart ' ;
import ' package:mc_common_app/utils/navigator.dart ' ;
import ' package:mc_common_app/utils/utils.dart ' ;
import ' package:mc_common_app/view_models/ad_view_model.dart ' ;
import ' package:mc_common_app/view_models/chat_view_model.dart ' ;
import ' package:mc_common_app/view_models/requests_view_model.dart ' ;
import ' package:mc_common_app/views/chat/widgets/chat_bottom_sheets.dart ' ;
import ' package:mc_common_app/views/requests/request_bottomsheets.dart ' ;
import ' package:mc_common_app/widgets/button/show_fill_button.dart ' ;
import ' package:mc_common_app/widgets/checkbox_with_title_desc.dart ' ;
import ' package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart ' ;
import ' package:mc_common_app/widgets/extensions/extensions_widget.dart ' ;
import ' package:mc_common_app/widgets/txt_field.dart ' ;
import ' package:provider/provider.dart ' ;
import ' package:easy_localization/easy_localization.dart ' as lcl ;
class ChatMessageCustomWidget extends StatefulWidget {
final ChatMessageModel chatMessageModel ;
final RequestStatusEnum ? requestStatusEnum ;
final ChatTypeEnum chatTypeEnum ;
final RequestsTypeEnum requestsTypeEnum ;
final RequestModel ? requestModel ;
const ChatMessageCustomWidget ( { super . key , required this . chatMessageModel , required this . requestStatusEnum , required this . chatTypeEnum , this . requestsTypeEnum = RequestsTypeEnum . specialCarRequest } ) ;
const ChatMessageCustomWidget ( {
super . key ,
required this . chatMessageModel ,
required this . requestStatusEnum ,
required this . chatTypeEnum ,
this . requestModel ,
this . requestsTypeEnum = RequestsTypeEnum . specialCarRequest ,
} ) ;
@ override
State < ChatMessageCustomWidget > createState ( ) = > _ChatMessageCustomWidgetState ( ) ;
}
class _ChatMessageCustomWidgetState extends State < ChatMessageCustomWidget > {
Future buildDealNotCompletedBottomSheetOptions ( { required ChatMessageModel chatMessageModel } ) {
return showModalBottomSheet (
context: context ,
isScrollControlled: true ,
enableDrag: true ,
builder: ( BuildContext context ) {
return Consumer ( builder: ( BuildContext context , ChatVM chatVM , Widget ? child ) {
return InfoBottomSheet (
title: LocaleKeys . pleaseSpecify . tr ( ) . toText ( fontSize: 28 , isBold: true , letterSpacing: - 1.44 ) ,
description: Padding (
padding: EdgeInsets . only ( bottom: MediaQuery . of ( context ) . viewInsets . bottom ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
12. height ,
ListView . separated (
shrinkWrap: true ,
itemCount: chatVM . offerRejectModelList . length ,
separatorBuilder: ( BuildContext context , int index ) {
bool indexContains = chatVM . indexesForDealNotCompleted . indexWhere ( ( i ) = > i = = index ) ! = - 1 ;
if ( ( ! indexContains ) ) {
return const SizedBox ( ) ;
}
return const Divider ( thickness: 0.5 ) ;
} ,
itemBuilder: ( BuildContext context , int index ) {
bool indexContains = chatVM . indexesForDealNotCompleted . indexWhere ( ( i ) = > i = = index ) ! = - 1 ;
if ( ! indexContains ) {
return const SizedBox ( ) ;
}
OfferRequestCommentModel offerRequestCommentModel = chatVM . offerRejectModelList [ index ] ;
return CircleCheckBoxWithTitle (
isChecked: offerRequestCommentModel . isSelected ? ? false ,
title: ' ${ offerRequestCommentModel . title } ' ,
onSelected: ( ) {
chatVM . updateSelectionInOfferRejectModelList ( index ) ;
} ,
selectedColor: MyColors . darkPrimaryColor ,
) ;
} ,
) ,
if ( chatVM . offerRejectModelList . last . isSelected ? ? false ) . . . [
/ / comparing if the " other " is selected
12. height ,
TxtField (
maxLines: 5 ,
value: chatVM . rejectOfferDescription ,
errorValue: chatVM . rejectOfferDescriptionError ,
keyboardType: TextInputType . text ,
hint: LocaleKeys . description . tr ( ) ,
onChanged: ( v ) = > chatVM . updateRejectOfferDescription ( v ) ,
) ,
] ,
25. height ,
ShowFillButton (
title: LocaleKeys . submit . tr ( ) ,
onPressed: ( ) async {
String comments = " " ;
if ( chatVM . offerRejectModelList . last . isSelected ? ? false ) {
comments = chatVM . rejectOfferDescription ;
} else {
comments = chatVM . offerRejectModelList . firstWhere ( ( element ) = > element . isSelected ! ) . title ? ? " " ;
}
if ( ! chatVM . isRejectOfferButtonValidated ( ) ) {
return ;
}
Navigator . pop ( context ) ;
bool status = await chatVM . onSendMessageForActionOnRequestOffer (
receiverId: ( chatMessageModel . isMyMessage ? ? false ) ? chatMessageModel . receiverUserID ? ? " " : chatMessageModel . senderUserID ? ? " " ,
chatMessageType: ChatMessageTypeEnum . offer ,
comments: comments ,
requestId: chatMessageModel . reqOffer ! . requestID ? ? - 1 ,
serviceProviderID: chatMessageModel . serviceProviderID ? ? 0 ,
requestOfferID: chatMessageModel . reqOffer ! . id ? ? - 1 ,
offerPrice: chatMessageModel . reqOffer ! . price . toString ( ) ,
serviceItemName: chatMessageModel . reqOffer ! . serviceItemName ? ? " " ,
manufacturedOn: chatMessageModel . reqOffer ! . manufacturedOn ? ? " " ,
manufacturedById: chatMessageModel . reqOffer ! . manufacturedById ? ? 0 ,
requestOfferStatusEnum: RequestOfferStatusEnum . rejected ,
context: context ,
) ;
if ( status ) {
final requestVM = context . read < RequestsVM > ( ) ;
chatMessageModel . reqOffer ! . requestOfferStatusEnum = RequestOfferStatusEnum . rejected ;
int index = chatVM . serviceProviderOffersList
. indexWhere ( ( element ) = > ( element . providerId = = requestVM . currentSelectedOffer ! . providerId ) & & ( element . requestId = = requestVM . currentSelectedOffer ! . requestId ) ) ;
if ( index ! = - 1 ) {
chatVM . serviceProviderOffersList [ index ] . requestOfferStatusEnum = chatMessageModel . reqOffer ! . requestOfferStatusEnum ;
}
setState ( ( ) { } ) ;
chatVM . updateRejectOfferDescription ( ' ' ) ;
Utils . showToast ( LocaleKeys . offerRejected . tr ( ) ) ;
/ / navigateReplaceWithName ( context , AppRoutes . dashboard ) ;
}
} ,
maxWidth: double . infinity ,
) ,
19. height ,
] ,
) ,
) ) ;
} ) ;
} ,
) ;
}
Future buildDealBottomSheetOptionsForSpecialCar ( { required ChatMessageModel chatMessageModel , required RequestOfferStatusEnum requestOfferStatusEnum , required bool fromCancelOffer } ) {
return showModalBottomSheet (
context: context ,
isScrollControlled: true ,
enableDrag: true ,
builder: ( BuildContext sheetContext ) {
return Consumer ( builder: ( BuildContext context , ChatVM chatVM , Widget ? child ) {
return InfoBottomSheet (
title: LocaleKeys . pleaseSpecify . tr ( ) . toText ( fontSize: 28 , isBold: true , letterSpacing: - 1.44 ) ,
description: Padding (
padding: EdgeInsets . only ( bottom: MediaQuery . of ( context ) . viewInsets . bottom ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
12. height ,
CheckBoxWithTitleDescription (
isSelected: chatVM . dealOptionsModelList [ 0 ] . isSelected ! ,
title: ' ${ chatVM . dealOptionsModelList [ 0 ] . title } ' ,
description: ' ' ,
onSelection: ( bool value ) {
chatVM . updateIsSelectedInDealOptionsModelList ( 0 , value ) ;
} ,
) ,
CheckBoxWithTitleDescription (
isSelected: chatVM . dealOptionsModelList [ 1 ] . isSelected ? ? false ,
title: ' ${ chatVM . dealOptionsModelList [ 1 ] . title } ' ,
description: ' ' ,
onSelection: ( bool value ) {
chatVM . updateIsSelectedInDealOptionsModelList ( 1 , value ) ;
} ,
) ,
] ,
) ,
25. height ,
ShowFillButton (
title: LocaleKeys . continu . tr ( ) ,
onPressed: ( ) async {
pop ( sheetContext ) ;
if ( chatVM . dealOptionsModelList [ 0 ] . isSelected ? ? false ) {
if ( fromCancelOffer ) {
final requestVM = context . read < RequestsVM > ( ) ;
return dealCompletedConsentBottomSheet (
mainContext: context ,
requestStatusEnum: RequestStatusEnum . completed ,
requestId: requestVM . currentSelectedRequest ! . id ,
) ;
} else {
final requestVM = context . read < RequestsVM > ( ) ;
return dealCompletedConsentBottomSheet (
mainContext: context ,
requestStatusEnum: RequestStatusEnum . completed ,
requestId: requestVM . currentSelectedRequest ! . id ,
acceptRequestOffer: ( ) async {
bool status = await chatVM . onSendMessageForActionOnRequestOffer (
receiverId: chatMessageModel . senderUserID ? ? " " ,
chatMessageType: ChatMessageTypeEnum . offer ,
comments: GlobalConsts . acceptingThisOffer ,
requestId: chatMessageModel . reqOffer ! . requestID ? ? - 1 ,
serviceProviderID: chatMessageModel . serviceProviderID ? ? 0 ,
requestOfferID: chatMessageModel . reqOffer ! . id ? ? - 1 ,
offerPrice: chatMessageModel . reqOffer ! . price . toString ( ) ,
serviceItemName: chatMessageModel . reqOffer ! . serviceItemName ? ? " " ,
manufacturedOn: chatMessageModel . reqOffer ! . manufacturedOn ? ? " " ,
manufacturedById: chatMessageModel . reqOffer ! . manufacturedById ? ? 0 ,
requestOfferStatusEnum: RequestOfferStatusEnum . accepted ,
context: context ,
) ;
if ( status ) {
chatMessageModel . reqOffer ! . requestOfferStatusEnum = RequestOfferStatusEnum . accepted ;
requestVM . currentSelectedRequest ! . requestStatus = RequestStatusEnum . inProgress ;
requestVM . updateAcceptedReqOffer ( chatMessageModel . reqOffer ! ) ;
requestVM . updateAcceptedRequestOfferProviderName ( chatMessageModel . senderName ? ? " " ) ;
int index = chatVM . serviceProviderOffersList . indexWhere (
( element ) = > ( element . providerId = = requestVM . currentSelectedOffer ! . providerId ) & & ( element . requestId = = requestVM . currentSelectedOffer ! . requestId ) ) ;
if ( index ! = - 1 ) {
chatVM . serviceProviderOffersList [ index ] . requestOfferStatusEnum = chatMessageModel . reqOffer ! . requestOfferStatusEnum ;
}
setState ( ( ) { } ) ;
Utils . showToast ( LocaleKeys . offerAccepted . tr ( ) ) ;
return true ;
} else {
return false ;
}
} ) ;
}
} else {
if ( fromCancelOffer ) {
buildRejectOrCancelOfferBottomSheet ( chatMessageModel: chatMessageModel , requestOfferStatusEnum: RequestOfferStatusEnum . cancel ) ;
} else {
buildDealNotCompletedBottomSheetOptions ( chatMessageModel: chatMessageModel ) ;
}
}
} ,
maxWidth: double . infinity ,
) ,
19. height ,
] ,
) ,
) ) ;
} ) ;
} ,
) ;
}
Future buildRejectOrCancelOfferBottomSheet ( { required ChatMessageModel chatMessageModel , required RequestOfferStatusEnum requestOfferStatusEnum } ) {
return showModalBottomSheet (
context: context ,
@ -149,7 +381,8 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
if ( status ) {
final requestVM = context . read < RequestsVM > ( ) ;
chatMessageModel . reqOffer ! . requestOfferStatusEnum = requestOfferStatusEnum ;
int index = chatVM . serviceProviderOffersList . indexWhere ( ( element ) = > ( element . providerId = = requestVM . currentSelectedOffer ! . providerId ) & & ( element . requestId = = requestVM . currentSelectedOffer ! . requestId ) ) ;
int index = chatVM . serviceProviderOffersList
. indexWhere ( ( element ) = > ( element . providerId = = requestVM . currentSelectedOffer ! . providerId ) & & ( element . requestId = = requestVM . currentSelectedOffer ! . requestId ) ) ;
if ( index ! = - 1 ) {
chatVM . serviceProviderOffersList [ index ] . requestOfferStatusEnum = chatMessageModel . reqOffer ! . requestOfferStatusEnum ;
@ -207,14 +440,15 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
requestVM . currentSelectedRequest ! . requestStatus = RequestStatusEnum . inProgress ;
requestVM . updateAcceptedReqOffer ( chatMessageModel . reqOffer ! ) ;
requestVM . updateAcceptedRequestOfferProviderName ( chatMessageModel . senderName ? ? " " ) ;
int index = chatVM . serviceProviderOffersList . indexWhere ( ( element ) = > ( element . providerId = = requestVM . currentSelectedOffer ! . providerId ) & & ( element . requestId = = requestVM . currentSelectedOffer ! . requestId ) ) ;
int index = chatVM . serviceProviderOffersList
. indexWhere ( ( element ) = > ( element . providerId = = requestVM . currentSelectedOffer ! . providerId ) & & ( element . requestId = = requestVM . currentSelectedOffer ! . requestId ) ) ;
if ( index ! = - 1 ) {
chatVM . serviceProviderOffersList [ index ] . requestOfferStatusEnum = chatMessageModel . reqOffer ! . requestOfferStatusEnum ;
}
setState ( ( ) { } ) ;
/ / Navigator . pop ( context ) ;
Utils . showToast ( " Offer Accepted " ) ;
Utils . showToast ( LocaleKeys . offerAccepted . tr ( ) ) ;
/ / navigateReplaceWithName ( context , AppRoutes . dashboard ) ;
}
} ,
@ -281,7 +515,8 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
fontSize: 12 ,
isItalic: true ,
) ,
) . toContainer ( borderRadius: 40 , width: double . infinity , backgroundColor: chatMessageModel . isMyMessage ! ? MyColors . adPendingStatusColor . withOpacity ( 0.16 ) : MyColors . grey98Color . withOpacity ( 0.1 ) ) ,
) . toContainer (
borderRadius: 40 , width: double . infinity , backgroundColor: chatMessageModel . isMyMessage ! ? MyColors . adPendingStatusColor . withOpacity ( 0.16 ) : MyColors . grey98Color . withOpacity ( 0.1 ) ) ,
] ,
) ;
}
@ -294,7 +529,8 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
Row (
crossAxisAlignment: CrossAxisAlignment . end ,
children: [
" ${ ( chatMessageModel . reqOffer ! . price ? ? 0.0 ) . toInt ( ) } " . toText ( fontSize: 19 , isBold: true , color: AppState ( ) . currentAppType = = AppType . provider ? MyColors . white : MyColors . darkTextColor ) ,
" ${ ( chatMessageModel . reqOffer ! . price ? ? 0.0 ) . toInt ( ) } "
. toText ( fontSize: 19 , isBold: true , color: AppState ( ) . currentAppType = = AppType . provider ? MyColors . white : MyColors . darkTextColor ) ,
5. width ,
LocaleKeys . sar . tr ( ) . toText ( color: MyColors . lightTextColor , height: 2.2 , fontSize: 10 , isBold: true ) ,
] ,
@ -311,7 +547,11 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
borderColor: MyColors . greenColor ,
isFilled: false ,
onPressed: ( ) {
offerAcceptConfirmationBottomSheet ( chatMessageModel: chatMessageModel ) ;
if ( widget . requestsTypeEnum = = RequestsTypeEnum . specialCarRequest ) {
buildDealBottomSheetOptionsForSpecialCar ( chatMessageModel: chatMessageModel , requestOfferStatusEnum: requestOfferStatusEnum , fromCancelOffer: false ) ;
} else {
offerAcceptConfirmationBottomSheet ( chatMessageModel: chatMessageModel ) ;
}
} ,
backgroundColor: MyColors . white ,
txtColor: MyColors . greenColor ,
@ -338,6 +578,23 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
10. height ,
Row (
children: [
if ( widget . requestsTypeEnum = = RequestsTypeEnum . specialCarRequest ) . . . [
Expanded (
child: ShowFillButton (
maxHeight: 27 ,
title: LocaleKeys . more . tr ( ) ,
fontSize: 9 ,
borderColor: MyColors . lightTextColor ,
isFilled: false ,
onPressed: ( ) {
buildDealBottomSheetOptionsForSpecialCar ( chatMessageModel: chatMessageModel , requestOfferStatusEnum: requestOfferStatusEnum , fromCancelOffer: true ) ;
} ,
backgroundColor: MyColors . white ,
txtColor: MyColors . lightTextColor ,
) ,
) ,
20. width ,
] ,
Expanded (
child: ShowFillButton (
maxHeight: 27 ,
@ -468,11 +725,42 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
return widget . toCircle ( borderRadius: 100 ) ;
}
Future < void > onOfferEditIconPressed ( ) async {
int index = context . read < RequestsVM > ( ) . myFilteredRequests . indexWhere ( ( request ) = > request . id = = widget . requestModel ! . id ) ;
RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments (
requestIndex: index , / / Not getting used in case of update offer
requestModel: widget . requestModel ! ,
) ;
RequestsVM requestVM = context . read < RequestsVM > ( ) ;
requestVM . resetSendOfferBottomSheet ( ) ;
ReqOffer offer = widget . chatMessageModel . reqOffer ! ;
requestVM . updateOfferPrice ( ( offer . price ? ? " " ) . toString ( ) ) ;
requestVM . updateServiceItem ( ( offer . serviceItemName ? ? " " ) . toString ( ) ) ;
requestVM . updateItemManufacturer ( ( offer . manufacturedById ? ? " " ) . toString ( ) ) ;
requestVM . updateServiceItemCreatedOn ( ( offer . manufacturedOn ? ? " " ) . toString ( ) ) ;
requestVM . updateOfferDescription ( ( widget . chatMessageModel . chatText ? ? " " ) . toString ( ) ) ;
requestVM . updateIsDeliveryAvailableStatus ( ( offer . isDeliveryAvailable ? ? false ) ) ;
if ( offer . reqOfferImages ! = null & & offer . reqOfferImages ! . isNotEmpty ) {
for ( var element in offer . reqOfferImages ! ) {
if ( element . imageUrl ! = null | | element . imageStr ! = null ) {
ImageModel imageModel = ImageModel (
id: element . id ,
filePath: element . imageStr ! = null & & element . imageStr ! . isNotEmpty ? element . imageStr : element . imageUrl ,
isFromNetwork: element . imageStr ! = null & & element . imageStr ! . isNotEmpty ? false : true ) ;
log ( " imageModelimageModel: ${ imageModel . toString ( ) } " ) ;
requestVM . addImageToPickedVehicleImages ( imageModel ) ;
}
}
}
buildSendOfferBottomSheet ( context: context , requestDetailPageArguments: requestDetailArguments , isFromChatScreen: true , offerId: offer . id ) ;
}
Widget buildFreeTextDetailsInMessage ( { required ChatMessageTypeEnum chatMessageTypeEnum } ) {
return Row (
/ / crossAxisAlignment: CrossAxisAlignment . start ,
children: [
if ( chatMessageTypeEnum = = ChatMessageTypeEnum . offer & & ( widget . chatMessageModel . isMyMessage = = true ) & & widget . chatMessageModel . isRead = = true ) . . . [
if ( chatMessageTypeEnum = = ChatMessageTypeEnum . offer & & ( widget . chatMessageModel . isMyMessage = = true ) & & ( widget . chatMessageModel . isRead ?? false ) ) . . . [
Row (
children: [
const Icon ( Icons . remove_red_eye_outlined , size: 12 , color: MyColors . lightTextColor ) ,
@ -480,14 +768,18 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
LocaleKeys . viewed . tr ( ) . toText ( fontSize: 10 , color: MyColors . lightTextColor , fontWeight: MyFonts . Medium ) ,
] ,
) ,
] else if ( AppState ( ) . currentAppType = = AppType . provider & &
chatMessageTypeEnum = = ChatMessageTypeEnum . offer & &
widget . chatMessageModel . reqOffer ! . requestOfferStatusEnum = = RequestOfferStatusEnum . offer & &
( widget . chatMessageModel . isMyMessage = = true ) ) . . . [
MyAssets . icEdit . buildSvg ( color: MyColors . white , height: 15 ) . onPress ( ( ) = > onOfferEditIconPressed ( ) ) ,
] ,
Expanded (
child: Directionality (
textDirection: ( widget . chatMessageModel . isMyMessage ? ? false ) ? TextDirection . ltr : TextDirection . rtl ,
textDirection: TextDirection . ltr ,
child: ( widget . chatMessageModel . chatText ? ? " " ) . toText (
color: ( widget . chatMessageModel . isMyMessage ? ? false ) ? MyColors . white : MyColors . lightTextColor ,
fontSize: 12 ,
/ / isBold: true ,
) ,
) ,
) ,
@ -518,12 +810,12 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
} ) ;
}
return SizedBox (
/ / height: ( gridItemSize * 2 ) + ( spacing * 2 ) , / / Fixed height for 2 rows including spacing
/ / height: ( gridItemSize * 2 ) + ( spacing * 2 ) , / / Fixed height for 2 rows including spacing
child: GridView . builder (
physics: const NeverScrollableScrollPhysics ( ) ,
/ / Prevent scrolling inside grid
/ / Prevent scrolling inside grid
shrinkWrap: true ,
/ / Shrink size to fit the content
/ / Shrink size to fit the content
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount (
crossAxisCount: 2 , / / Show 2 images per row
crossAxisSpacing: spacing ,
@ -609,19 +901,18 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
case ChatMessageTypeEnum . file:
case ChatMessageTypeEnum . offer:
messageTypeWidget = Column (
crossAxisAlignment: ( widget . chatMessageModel . isMyMessage ? ? false ) ? CrossAxisAlignment . end : CrossAxisAlignment . start ,
children: [
buildFreeTextDetailsInMessage ( chatMessageTypeEnum: chatMessageTypeEnum ) ,
if ( widget . requestsTypeEnum = = RequestsTypeEnum . serviceRequest ) . . . [
2. height ,
Row (
mainAxisAlignment: MainAxisAlignment . end ,
children: [
" ${ LocaleKeys . deliveryAvailable . tr ( ) } : ${ ( widget . chatMessageModel . reqOffer ! . isDeliveryAvailable ? ? false ) ? LocaleKeys . yes . tr ( ) : LocaleKeys . no . tr ( ) } " . toText (
fontSize: 10 ,
color: ( widget . chatMessageModel . isMyMessage ? ? false ) ? MyColors . white : MyColors . lightTextColor ,
fontWeight: MyFonts . Medium ,
) ,
] ,
Directionality (
textDirection: TextDirection . ltr ,
child: " ${ LocaleKeys . deliveryAvailable . tr ( ) } : ${ ( widget . chatMessageModel . reqOffer ! . isDeliveryAvailable ? ? false ) ? LocaleKeys . yes . tr ( ) : LocaleKeys . no . tr ( ) } " . toText (
fontSize: 10 ,
color: ( widget . chatMessageModel . isMyMessage ? ? false ) ? MyColors . white : MyColors . lightTextColor ,
fontWeight: MyFonts . Medium ,
) ,
) ,
] ,
if ( widget . chatMessageModel . reqOffer ! . reqOfferImages ! = null & & widget . chatMessageModel . reqOffer ! . reqOfferImages ! . isNotEmpty ) . . . [
@ -671,7 +962,10 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
mainAxisAlignment: MainAxisAlignment . spaceBetween ,
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
( ( widget . chatMessageModel . isMyMessage ? ? false ) ? " You " : widget . chatMessageModel . senderName ? ? " " ) . toText ( fontSize: 16 , isBold: true ) ,
( ( widget . chatMessageModel . isMyMessage ? ? false ) ? LocaleKeys . you . tr ( ) : widget . chatMessageModel . senderName ? ? " " ) . toText (
fontSize: 16 ,
isBold: true ,
) ,
] ,
) ,
5. height ,