|
|
|
|
@ -11,6 +11,7 @@ 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/chat_view_model.dart';
|
|
|
|
|
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
|
|
|
|
|
import 'package:mc_common_app/view_models/payment_view_model.dart';
|
|
|
|
|
import 'package:mc_common_app/view_models/requests_view_model.dart';
|
|
|
|
|
import 'package:mc_common_app/views/advertisement/ads_buyer_chats_view.dart';
|
|
|
|
|
@ -175,30 +176,30 @@ class _ChatViewState extends State<ChatView> {
|
|
|
|
|
child: chatMessages.isEmpty
|
|
|
|
|
? Center(child: LocaleKeys.noChatMessage.tr().toText(fontSize: 16, color: MyColors.lightTextColor, textAlign: TextAlign.center)).paddingAll(22)
|
|
|
|
|
: ListView.separated(
|
|
|
|
|
controller: chatVM.scrollController,
|
|
|
|
|
itemCount: chatMessages.length,
|
|
|
|
|
separatorBuilder: (BuildContext context, int index) => 20.height,
|
|
|
|
|
itemBuilder: (BuildContext context, int index) {
|
|
|
|
|
ChatMessageModel chatMessageModel = chatMessages[index];
|
|
|
|
|
return ChatMessageCustomWidget(
|
|
|
|
|
chatMessageModel: chatMessageModel,
|
|
|
|
|
requestModel: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel! : null,
|
|
|
|
|
requestStatusEnum: requestVM.currentSelectedRequest?.requestStatus,
|
|
|
|
|
chatTypeEnum: chatTypeEnum,
|
|
|
|
|
requestsTypeEnum: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel!.requestType.toRequestTypeEnum() : RequestsTypeEnum.specialCarRequest,
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
).horPaddingMain(),
|
|
|
|
|
controller: chatVM.scrollController,
|
|
|
|
|
itemCount: chatMessages.length,
|
|
|
|
|
separatorBuilder: (BuildContext context, int index) => 20.height,
|
|
|
|
|
itemBuilder: (BuildContext context, int index) {
|
|
|
|
|
ChatMessageModel chatMessageModel = chatMessages[index];
|
|
|
|
|
return ChatMessageCustomWidget(
|
|
|
|
|
chatMessageModel: chatMessageModel,
|
|
|
|
|
requestModel: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel! : null,
|
|
|
|
|
requestStatusEnum: requestVM.currentSelectedRequest?.requestStatus,
|
|
|
|
|
chatTypeEnum: chatTypeEnum,
|
|
|
|
|
requestsTypeEnum: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel!.requestType.toRequestTypeEnum() : RequestsTypeEnum.specialCarRequest,
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
).horPaddingMain(),
|
|
|
|
|
),
|
|
|
|
|
10.height,
|
|
|
|
|
Row(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
if (chatTypeEnum == ChatTypeEnum.requestOffer &&
|
|
|
|
|
if (
|
|
|
|
|
AppState().currentAppType == AppType.customer && chatTypeEnum == ChatTypeEnum.requestOffer &&
|
|
|
|
|
requestVM.currentSelectedRequest!.requestType.toRequestTypeEnum() == RequestsTypeEnum.serviceRequest &&
|
|
|
|
|
requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.inProgress &&
|
|
|
|
|
requestVM.currentSelectedOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted &&
|
|
|
|
|
AppState().currentAppType == AppType.customer) ...[
|
|
|
|
|
requestVM.currentSelectedOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted ) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
|
@ -233,88 +234,93 @@ class _ChatViewState extends State<ChatView> {
|
|
|
|
|
// ),
|
|
|
|
|
// ]
|
|
|
|
|
//
|
|
|
|
|
else ...[
|
|
|
|
|
if (AppState().currentAppType == AppType.provider &&
|
|
|
|
|
chatTypeEnum == ChatTypeEnum.requestOffer &&
|
|
|
|
|
requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted &&
|
|
|
|
|
chatVM.pickedImagesForMessage.isEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 1,
|
|
|
|
|
child: const Icon(
|
|
|
|
|
Icons.local_offer_rounded,
|
|
|
|
|
color: MyColors.darkPrimaryColor,
|
|
|
|
|
size: 30,
|
|
|
|
|
).onPress(
|
|
|
|
|
() {
|
|
|
|
|
requestVM.resetSendOfferBottomSheet();
|
|
|
|
|
RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments(
|
|
|
|
|
requestIndex: chatViewArgumentsForRequest!.requestIndex,
|
|
|
|
|
requestModel: chatViewArgumentsForRequest!.requestModel!,
|
|
|
|
|
);
|
|
|
|
|
buildSendOfferBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
requestDetailPageArguments: requestDetailArguments,
|
|
|
|
|
isFromChatScreen: true,
|
|
|
|
|
offerId: null, // null means creating new offer
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
else
|
|
|
|
|
...[
|
|
|
|
|
if (AppState().currentAppType == AppType.provider &&
|
|
|
|
|
chatTypeEnum == ChatTypeEnum.requestOffer &&
|
|
|
|
|
requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted &&
|
|
|
|
|
chatVM.pickedImagesForMessage.isEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 1,
|
|
|
|
|
child: const Icon(
|
|
|
|
|
Icons.local_offer_rounded,
|
|
|
|
|
color: MyColors.darkPrimaryColor,
|
|
|
|
|
size: 30,
|
|
|
|
|
).onPress(
|
|
|
|
|
() {
|
|
|
|
|
requestVM.resetSendOfferBottomSheet();
|
|
|
|
|
RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments(
|
|
|
|
|
requestIndex: chatViewArgumentsForRequest!.requestIndex,
|
|
|
|
|
requestModel: chatViewArgumentsForRequest!.requestModel!,
|
|
|
|
|
);
|
|
|
|
|
context.read<DashboardVMProvider>().checkUserSubscription(SubscriptionActionTypeEnum.subscription, context, callback: () {
|
|
|
|
|
buildSendOfferBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
requestDetailPageArguments: requestDetailArguments,
|
|
|
|
|
isFromChatScreen: true,
|
|
|
|
|
offerId: null, // null means creating new offer
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isNotEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 8,
|
|
|
|
|
child: PickedFilesContainer(
|
|
|
|
|
pickedFiles: chatVM.pickedImagesForMessage,
|
|
|
|
|
onCrossPressedPrimary: chatVM.removeImageFromList,
|
|
|
|
|
onAddFilePressed: () => chatVM.pickMultipleImages(),
|
|
|
|
|
],
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isNotEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 8,
|
|
|
|
|
child: PickedFilesContainer(
|
|
|
|
|
pickedFiles: chatVM.pickedImagesForMessage,
|
|
|
|
|
onCrossPressedPrimary: chatVM.removeImageFromList,
|
|
|
|
|
onAddFilePressed: () => chatVM.pickMultipleImages(),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
] else if (chatTypeEnum == ChatTypeEnum.requestOffer) ...[
|
|
|
|
|
] else
|
|
|
|
|
if (chatTypeEnum == ChatTypeEnum.requestOffer) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 1,
|
|
|
|
|
child: const Icon(
|
|
|
|
|
Icons.photo_library_rounded,
|
|
|
|
|
color: MyColors.darkPrimaryColor,
|
|
|
|
|
size: 30,
|
|
|
|
|
).onPress(() => chatVM.pickMultipleImages()),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 8,
|
|
|
|
|
child: TxtField(
|
|
|
|
|
isNeedLabelOnTop: false,
|
|
|
|
|
value: chatVM.chatMessageText,
|
|
|
|
|
hint: LocaleKeys.typeMessageHere.tr(),
|
|
|
|
|
keyboardType: TextInputType.text,
|
|
|
|
|
isNeedBorder: false,
|
|
|
|
|
onChanged: (v) => chatVM.updateChatMessageText(v),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 1,
|
|
|
|
|
child: const Icon(
|
|
|
|
|
Icons.photo_library_rounded,
|
|
|
|
|
color: MyColors.darkPrimaryColor,
|
|
|
|
|
size: 30,
|
|
|
|
|
).onPress(() => chatVM.pickMultipleImages()),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 8,
|
|
|
|
|
child: TxtField(
|
|
|
|
|
value: chatVM.chatMessageText,
|
|
|
|
|
hint: LocaleKeys.typeMessageHere.tr(),
|
|
|
|
|
keyboardType: TextInputType.text,
|
|
|
|
|
isNeedBorder: false,
|
|
|
|
|
onChanged: (v) => chatVM.updateChatMessageText(v),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 1,
|
|
|
|
|
child: const Icon(Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30).onPress(
|
|
|
|
|
() async {
|
|
|
|
|
ChatMessageTypeEnum chatMessageTypeEnum = ChatMessageTypeEnum.freeText;
|
|
|
|
|
child: const Icon(Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30).onPress(
|
|
|
|
|
() async {
|
|
|
|
|
ChatMessageTypeEnum chatMessageTypeEnum = ChatMessageTypeEnum.freeText;
|
|
|
|
|
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isNotEmpty) {
|
|
|
|
|
chatMessageTypeEnum = ChatMessageTypeEnum.image;
|
|
|
|
|
}
|
|
|
|
|
final status = await onMessageSend(chatMessageType: chatMessageTypeEnum);
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isNotEmpty) {
|
|
|
|
|
chatMessageTypeEnum = ChatMessageTypeEnum.image;
|
|
|
|
|
}
|
|
|
|
|
final status = await onMessageSend(chatMessageType: chatMessageTypeEnum);
|
|
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
|
chatVM.scrollChatDown();
|
|
|
|
|
if (chatMessageTypeEnum == ChatMessageTypeEnum.freeText) {
|
|
|
|
|
chatVM.clearChatMessageText();
|
|
|
|
|
} else if (chatMessageTypeEnum == ChatMessageTypeEnum.image) {
|
|
|
|
|
chatVM.clearPickedImagesForMessage();
|
|
|
|
|
if (status) {
|
|
|
|
|
chatVM.scrollChatDown();
|
|
|
|
|
if (chatMessageTypeEnum == ChatMessageTypeEnum.freeText) {
|
|
|
|
|
chatVM.clearChatMessageText();
|
|
|
|
|
} else if (chatMessageTypeEnum == ChatMessageTypeEnum.image) {
|
|
|
|
|
chatVM.clearPickedImagesForMessage();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
).toContainer(isShadowEnabled: true)
|
|
|
|
|
],
|
|
|
|
|
|