|
|
|
|
@ -106,7 +106,15 @@ class _ChatViewState extends State<ChatView> {
|
|
|
|
|
final requestVM = context.read<RequestsVM>();
|
|
|
|
|
if (chatTypeEnum == ChatTypeEnum.requestOffer &&
|
|
|
|
|
requestVM.currentSelectedRequest != null &&
|
|
|
|
|
(requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.shipping || requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.delivery)) {
|
|
|
|
|
((requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.shipping || requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.delivery) ||
|
|
|
|
|
requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.selfPickup)) {
|
|
|
|
|
var name = '';
|
|
|
|
|
|
|
|
|
|
if (requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.shipping || requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.delivery) {
|
|
|
|
|
name = Utils.getNameByShippingRequestStatusEnum(requestVM.currentSelectedRequest?.shippingStatusEnum ?? ShippingRequestStatusEnum.pending);
|
|
|
|
|
} else {
|
|
|
|
|
name = Utils.getNameBySelfPickupRequestStatusEnum(requestVM.currentSelectedRequest?.selfPickupRequestStatusEnum ?? SelfPickupRequestStatusEnum.preparingToCollect);
|
|
|
|
|
}
|
|
|
|
|
appBarHeadlines = Container(
|
|
|
|
|
width: double.infinity,
|
|
|
|
|
color: MyColors.darkIconColor,
|
|
|
|
|
@ -120,8 +128,7 @@ class _ChatViewState extends State<ChatView> {
|
|
|
|
|
child: Row(
|
|
|
|
|
children: [
|
|
|
|
|
Flexible(
|
|
|
|
|
child: "${LocaleKeys.deliveryStatus.tr()} ${Utils.getNameByShippingRequestStatusEnum(requestVM.currentSelectedRequest?.shippingStatusEnum ?? ShippingRequestStatusEnum.pending)}"
|
|
|
|
|
.toText(
|
|
|
|
|
child: "${LocaleKeys.deliveryStatus.tr()} $name".toText(
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
color: Colors.white,
|
|
|
|
|
decorationColor: MyColors.white,
|
|
|
|
|
@ -131,7 +138,8 @@ class _ChatViewState extends State<ChatView> {
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
10.width,
|
|
|
|
|
if ((requestVM.currentSelectedRequest?.shippingStatusEnum ?? ShippingRequestStatusEnum.pending) == ShippingRequestStatusEnum.delivered) ...[
|
|
|
|
|
if ((requestVM.currentSelectedRequest?.shippingStatusEnum == ShippingRequestStatusEnum.delivered) ||
|
|
|
|
|
(requestVM.currentSelectedRequest?.selfPickupRequestStatusEnum == SelfPickupRequestStatusEnum.collected)) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 2,
|
|
|
|
|
child: "${LocaleKeys.markAsCompleted.tr()} ".toText(isUnderLine: true, fontSize: 12, color: Colors.white, decorationColor: MyColors.white).onPress(() {
|
|
|
|
|
@ -176,30 +184,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 (
|
|
|
|
|
AppState().currentAppType == AppType.customer && 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 ) ...[
|
|
|
|
|
requestVM.currentSelectedOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
|
@ -209,6 +217,7 @@ class _ChatViewState extends State<ChatView> {
|
|
|
|
|
isBold: false,
|
|
|
|
|
onPressed: () {
|
|
|
|
|
context.read<PaymentVM>().updateRequestId(id: requestVM.currentSelectedRequest!.id);
|
|
|
|
|
requestVM.selectedDeliveryOptionEnum = null;
|
|
|
|
|
navigateWithName(context, AppRoutes.reviewRequestOffer, arguments: PaymentTypes.request);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
@ -234,93 +243,91 @@ 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!,
|
|
|
|
|
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
|
|
|
|
|
);
|
|
|
|
|
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(),
|
|
|
|
|
),
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
] 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),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
if (chatVM.pickedImagesForMessage.isNotEmpty) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 8,
|
|
|
|
|
child: PickedFilesContainer(
|
|
|
|
|
pickedFiles: chatVM.pickedImagesForMessage,
|
|
|
|
|
onCrossPressedPrimary: chatVM.removeImageFromList,
|
|
|
|
|
onAddFilePressed: () => chatVM.pickMultipleImages(),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
] else if (chatTypeEnum == ChatTypeEnum.requestOffer) ...[
|
|
|
|
|
Expanded(
|
|
|
|
|
flex: 1,
|
|
|
|
|
child: const Icon(Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30).onPress(
|
|
|
|
|
() async {
|
|
|
|
|
ChatMessageTypeEnum chatMessageTypeEnum = ChatMessageTypeEnum.freeText;
|
|
|
|
|
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.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)
|
|
|
|
|
],
|
|
|
|
|
|