Merge remote-tracking branch 'origin/faiz_development_common' into faiz_development_common

aamir_dev
faizatflutter 11 months ago
commit 3b02159f3c

@ -746,5 +746,7 @@
"cancelRequest": "أريد إلغاء الطلب.", "cancelRequest": "أريد إلغاء الطلب.",
"highPrice": "سعر مرتفع", "highPrice": "سعر مرتفع",
"offerNotMatched": "العرض لم يتطابق مع الطلب.", "offerNotMatched": "العرض لم يتطابق مع الطلب.",
"offerRejected": "تم رفض العرض." "offerRejected": "تم رفض العرض.",
"offerAccepted": "تم قبول العرض.",
"you": "أنتم"
} }

@ -744,6 +744,7 @@
"cancelRequest": "I want to cancel the request.", "cancelRequest": "I want to cancel the request.",
"highPrice": "High Price", "highPrice": "High Price",
"offerNotMatched": "The offer did not match the request.", "offerNotMatched": "The offer did not match the request.",
"offerRejected": "Offer has been Rejected." "offerRejected": "Offer has been Rejected.",
"offerAccepted": "Offer has been Accepted.",
"you": "You"
} }

@ -164,7 +164,7 @@ class ApiConsts {
static String getRequest = "${baseUrlServices}api/RequestManagement/Request_Get"; static String getRequest = "${baseUrlServices}api/RequestManagement/Request_Get";
static String getRequestOffers = "${baseUrlServices}api/RequestManagement/ReqOffer_Get"; static String getRequestOffers = "${baseUrlServices}api/RequestManagement/ReqOffer_Get";
static String updateRequestOfferStatus = "${baseUrlServices}api/RequestManagement/RequestOffer_UpdateStatus"; static String updateRequestOfferStatus = "${baseUrlServices}api/RequestManagement/RequestOffer_UpdateStatus";
static String updateRequestOffer = "${baseUrlServices}api/RequestManagement/ReqOffer_Upadte"; static String updateRequestOffer = "${baseUrlServices}api/RequestManagement/ReqOffer_Update";
static String updateRequestCustomer = "${baseUrlServices}api/RequestManagement/Request_StatusUpdate_Customer"; static String updateRequestCustomer = "${baseUrlServices}api/RequestManagement/Request_StatusUpdate_Customer";
static String updateRequestProvider = "${baseUrlServices}api/RequestManagement/Request_StatusUpdate_Provider"; static String updateRequestProvider = "${baseUrlServices}api/RequestManagement/Request_StatusUpdate_Provider";
static String requestOffersSpsGet = "${baseUrlServices}api/RequestManagement/Request_OfferSPs_Get"; static String requestOffersSpsGet = "${baseUrlServices}api/RequestManagement/Request_OfferSPs_Get";

@ -796,7 +796,7 @@ extension FormatMonthByNumber on String {
extension NameExtensions on String { extension NameExtensions on String {
String getInitials() { String getInitials() {
final name = trim(); final name = trim();
String initials = "U"; String initials = "";
if (name.isEmpty) { if (name.isEmpty) {
return initials; return initials;
} }

@ -762,7 +762,9 @@ class CodegenLoader extends AssetLoader{
"cancelRequest": "أريد إلغاء الطلب.", "cancelRequest": "أريد إلغاء الطلب.",
"highPrice": "سعر مرتفع", "highPrice": "سعر مرتفع",
"offerNotMatched": "العرض لم يتطابق مع الطلب.", "offerNotMatched": "العرض لم يتطابق مع الطلب.",
"offerRejected": "تم رفض العرض." "offerRejected": "تم رفض العرض.",
"offerAccepted": "تم قبول العرض.",
"you": "أنتم"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
@ -1510,7 +1512,9 @@ static const Map<String,dynamic> en_US = {
"cancelRequest": "I want to cancel the request.", "cancelRequest": "I want to cancel the request.",
"highPrice": "High Price", "highPrice": "High Price",
"offerNotMatched": "The offer did not match the request.", "offerNotMatched": "The offer did not match the request.",
"offerRejected": "Offer has been Rejected." "offerRejected": "Offer has been Rejected.",
"offerAccepted": "Offer has been Accepted.",
"you": "You"
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
} }

@ -726,5 +726,7 @@ abstract class LocaleKeys {
static const highPrice = 'highPrice'; static const highPrice = 'highPrice';
static const offerNotMatched = 'offerNotMatched'; static const offerNotMatched = 'offerNotMatched';
static const offerRejected = 'offerRejected'; static const offerRejected = 'offerRejected';
static const offerAccepted = 'offerAccepted';
static const you = 'you';
} }

@ -7,6 +7,10 @@ class AdsDurationModel {
bool? isActive; bool? isActive;
String? countryName; String? countryName;
String? currency; String? currency;
double? discountValue;
double? discountPercent;
double? priceAfterDiscount;
int? roleID;
bool? isSelected; bool? isSelected;
AdsDurationModel({ AdsDurationModel({
@ -18,6 +22,10 @@ class AdsDurationModel {
this.isActive, this.isActive,
this.countryName, this.countryName,
this.currency, this.currency,
this.discountValue,
this.discountPercent,
this.priceAfterDiscount,
this.roleID,
this.isSelected, this.isSelected,
}); });
@ -30,6 +38,10 @@ class AdsDurationModel {
isActive = json['isActive']; isActive = json['isActive'];
countryName = json['countryName']; countryName = json['countryName'];
currency = json['currency']; currency = json['currency'];
discountValue = json['discountValue'];
discountPercent = json['discountPercent'];
priceAfterDiscount = json['priceAfterDiscount'];
roleID = json['roleID'];
isSelected = false; isSelected = false;
} }
@ -43,6 +55,10 @@ class AdsDurationModel {
data['isActive'] = isActive; data['isActive'] = isActive;
data['countryName'] = countryName; data['countryName'] = countryName;
data['currency'] = currency; data['currency'] = currency;
data['discountValue'] = discountValue;
data['discountPercent'] = discountPercent;
data['priceAfterDiscount'] = priceAfterDiscount;
data['roleID'] = roleID;
return data; return data;
} }
} }

@ -62,8 +62,10 @@ class AdsRepoImp implements AdsRepo {
@override @override
Future<List<AdsDurationModel>> getAdsDuration({required int? countryId}) async { Future<List<AdsDurationModel>> getAdsDuration({required int? countryId}) async {
int roleID = appState.getUser!.data!.userInfo!.roleId ?? 0;
var param = { var param = {
"CountryID": countryId.toString() ?? "0", "CountryID": countryId.toString() ?? "0",
"roleID": roleID.toString() ?? "0",
}; };
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,

@ -894,17 +894,23 @@ class RequestsVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
Future<bool> onActionRequestTapped({required BuildContext context, required RequestStatusEnum requestStatusEnum, required int requestId}) async { Future<bool> onActionRequestTapped({required BuildContext context, required RequestStatusEnum requestStatusEnum, required int requestId, bool needLoading = true}) async {
Utils.showLoading(context); if (needLoading) {
Utils.showLoading(context);
}
try { try {
GenericRespModel genericRespModel = await requestRepo.updateRequestStatus(requestStatusEnum: requestStatusEnum, requestId: requestId); GenericRespModel genericRespModel = await requestRepo.updateRequestStatus(requestStatusEnum: requestStatusEnum, requestId: requestId);
Utils.showToast(genericRespModel.message.toString()); Utils.showToast(genericRespModel.message.toString());
Utils.hideLoading(context); if (needLoading) {
Utils.hideLoading(context);
}
return genericRespModel.messageStatus == 1; return genericRespModel.messageStatus == 1;
} catch (e) { } catch (e) {
logger.i(e.toString()); logger.i(e.toString());
Utils.showToast(e.toString()); // Utils.showToast(e.toString());
Utils.hideLoading(context); if (needLoading) {
Utils.hideLoading(context);
}
return false; return false;
} }
} }
@ -1030,7 +1036,8 @@ class RequestsVM extends BaseVM {
await chatVM.getRequestsChatMessagesForProvider( await chatVM.getRequestsChatMessagesForProvider(
context: context, context: context,
customerId: receiverId, customerId: receiverId,
requestOfferId: offerId, requestOfferId: 0,
// to get all the messages
requestId: requestId, requestId: requestId,
customerRequestIndex: customerRequestIndex, customerRequestIndex: customerRequestIndex,
); );

@ -66,17 +66,51 @@ class AdDurationSelectionSheet extends StatelessWidget {
), ),
12.height, 12.height,
LocaleKeys.adCharges.tr().toText(fontSize: 14, color: MyColors.lightTextColor, isBold: true), LocaleKeys.adCharges.tr().toText(fontSize: 14, color: MyColors.lightTextColor, isBold: true),
Row( if (adDuration.discountPercent != null && adDuration.discountPercent! > 0.0) ...[
crossAxisAlignment: CrossAxisAlignment.end, Row(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
"${adDuration.price}".toText(fontSize: 22, isBold: true), children: [
2.width, Row(
Padding( crossAxisAlignment: CrossAxisAlignment.end,
padding: const EdgeInsets.only(bottom: 4), children: [
child: (adDuration.currency ?? LocaleKeys.sar.tr()).toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), CustomPaint(
), painter: DiagonalLinePainter(),
], child: "${adDuration.price}".toText(
), fontSize: 16,
isBold: true,
)),
2.width,
(adDuration.currency ?? LocaleKeys.sar.tr()).toText(fontSize: 8, color: MyColors.lightTextColor, isBold: true),
10.width,
"${adDuration.priceAfterDiscount}".toText(fontSize: 20, isBold: true),
2.width,
Padding(
padding: const EdgeInsets.only(bottom: 4),
child: (adDuration.currency ?? LocaleKeys.sar.tr()).toText(fontSize: 10, color: MyColors.lightTextColor, isBold: true),
),
],
),
"${adDuration.discountPercent} % OFF".toText(color: MyColors.white, fontSize: 10).toContainer(
marginAll: 5,
paddingAll: 5,
borderRadius: 4,
backgroundColor: MyColors.greenColor,
),
],
),
] else ...[
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
"${adDuration.price}".toText(fontSize: 22, isBold: true),
2.width,
Padding(
padding: const EdgeInsets.only(bottom: 4),
child: (adDuration.currency ?? LocaleKeys.sar.tr()).toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
),
],
),
]
], ],
), ),
), ),
@ -160,3 +194,20 @@ class AdDurationSelectionSheet extends StatelessWidget {
); );
} }
} }
class DiagonalLinePainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final Paint paint = Paint()
..color = MyColors.redColor
..strokeWidth = 3;
// Draw the diagonal line from top-left to bottom-right
canvas.drawLine(const Offset(0, 0), Offset(size.width, size.height), paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}

@ -1,3 +1,4 @@
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -18,7 +19,7 @@ class PickedFilesContainer extends StatelessWidget {
final bool allowAdButton; final bool allowAdButton;
const PickedFilesContainer({ const PickedFilesContainer({
Key? key, super.key,
required this.pickedFiles, required this.pickedFiles,
this.onCrossPressedPrimary, this.onCrossPressedPrimary,
this.onCrossPressedSecondary, this.onCrossPressedSecondary,
@ -28,10 +29,13 @@ class PickedFilesContainer extends StatelessWidget {
this.isPdf = false, this.isPdf = false,
this.isFromNetwork = false, this.isFromNetwork = false,
this.allowAdButton = true, this.allowAdButton = true,
}) : super(key: key); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
pickedFiles.forEach((i) {
log("isFromNetwork: ${i.isFromNetwork}");
});
return GridView.count( return GridView.count(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
@ -82,14 +86,14 @@ class BuildFilesContainer extends StatelessWidget {
final bool isPdf; final bool isPdf;
const BuildFilesContainer({ const BuildFilesContainer({
Key? key, super.key,
required this.image, required this.image,
this.onCrossPressedPrimary, this.onCrossPressedPrimary,
this.onCrossPressedSecondary, this.onCrossPressedSecondary,
this.index, this.index,
this.isReview = false, this.isReview = false,
this.isPdf = false, this.isPdf = false,
}) : super(key: key); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -158,7 +158,7 @@ class _ChatViewState extends State<ChatView> {
ChatMessageModel chatMessageModel = chatMessages[index]; ChatMessageModel chatMessageModel = chatMessages[index];
return ChatMessageCustomWidget( return ChatMessageCustomWidget(
chatMessageModel: chatMessageModel, chatMessageModel: chatMessageModel,
requestModel: chatViewArgumentsForRequest!.requestModel!, requestModel: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel! : null,
requestStatusEnum: requestVM.currentSelectedRequest?.requestStatus, requestStatusEnum: requestVM.currentSelectedRequest?.requestStatus,
chatTypeEnum: chatTypeEnum, chatTypeEnum: chatTypeEnum,
requestsTypeEnum: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel!.requestType.toRequestTypeEnum() : RequestsTypeEnum.specialCarRequest, requestsTypeEnum: chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArgumentsForRequest!.requestModel!.requestType.toRequestTypeEnum() : RequestsTypeEnum.specialCarRequest,
@ -187,31 +187,28 @@ class _ChatViewState extends State<ChatView> {
}, },
), ),
), ),
// Center( ]
// child: LocaleKeys.requestAlreadyInProgress.tr().toText(
// textAlign: TextAlign.center, // else if (chatTypeEnum == ChatTypeEnum.requestOffer &&
// color: MyColors.lightTextColor, // requestVM.currentSelectedRequest!.requestType.toRequestTypeEnum() == RequestsTypeEnum.specialCarRequest &&
// fontSize: 14, // requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.inProgress &&
// ), // requestVM.currentSelectedOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted &&
// ).paddingAll(15) // AppState().currentAppType == AppType.customer) ...[
] else if (chatTypeEnum == ChatTypeEnum.requestOffer && // Expanded(
requestVM.currentSelectedRequest!.requestType.toRequestTypeEnum() == RequestsTypeEnum.specialCarRequest && // child: ShowFillButton(
requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.inProgress && // maxWidth: double.infinity,
requestVM.currentSelectedOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted && // margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
AppState().currentAppType == AppType.customer) ...[ // maxHeight: 55,
Expanded( // title: LocaleKeys.completeDeal.tr(),
child: ShowFillButton( // isBold: false,
maxWidth: double.infinity, // onPressed: () {
margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), // return dealCompletedConfirmationBottomSheet(mainContext: context, requestStatusEnum: RequestStatusEnum.completed, requestId: requestVM.currentSelectedRequest!.id);
maxHeight: 55, // },
title: LocaleKeys.completeDeal.tr(), // ),
isBold: false, // ),
onPressed: () { // ]
return dealCompletedConfirmationBottomSheet(mainContext: context, requestStatusEnum: RequestStatusEnum.completed, requestId: requestVM.currentSelectedRequest!.id); //
}, else ...[
),
),
] else ...[
if (AppState().currentAppType == AppType.provider && if (AppState().currentAppType == AppType.provider &&
chatTypeEnum == ChatTypeEnum.requestOffer && chatTypeEnum == ChatTypeEnum.requestOffer &&
requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted &&

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -16,43 +18,79 @@ 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/checkbox_with_title_desc.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
void dealCompletedConfirmationBottomSheet({required BuildContext mainContext, required RequestStatusEnum requestStatusEnum, required int requestId}) { void dealCompletedConsentBottomSheet({required BuildContext mainContext, required RequestStatusEnum requestStatusEnum, required int requestId, Function()? acceptRequestOffer}) {
final requestVM = mainContext.read<RequestsVM>(); final requestVM = mainContext.read<RequestsVM>();
return actionConfirmationBottomSheet( return actionConfirmationBottomSheet(
isOnlyOneButton: true, isOnlyOneButton: AppState().currentAppType == AppType.customer,
context: mainContext, context: mainContext,
title: LocaleKeys.doYouWantToCompleteThisDeal.tr().toText(fontSize: 26, isBold: true, letterSpacing: -1.44), title: LocaleKeys.doYouWantToCompleteThisDeal.tr().toText(fontSize: 26, isBold: true, letterSpacing: -1.44),
subtitle: AppState().currentAppType == AppType.provider ? LocaleKeys.providerCompletingDealMeansThat.tr() : LocaleKeys.customerCompletingDealMeansThat.tr(), subtitle: AppState().currentAppType == AppType.provider ? LocaleKeys.providerCompletingDealMeansThat.tr() : LocaleKeys.customerCompletingDealMeansThat.tr(),
checkBoxConfirmationWidget: Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) { checkBoxConfirmationWidget: AppState().currentAppType == AppType.customer
return Row( ? Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) {
children: [ return Row(
Expanded( children: [
child: CircleCheckBoxWithTitle( Expanded(
isChecked: chatVM.acknowledgePaymentToMowaterStatus, child: CircleCheckBoxWithTitle(
title: LocaleKeys.acknowledgePaymentToMowater.tr(), isChecked: chatVM.acknowledgePaymentToMowaterStatus,
onSelected: () { title: LocaleKeys.acknowledgePaymentToMowater.tr(),
chatVM.updateAcknowledgePaymentToMowaterStatus(!chatVM.acknowledgePaymentToMowaterStatus); onSelected: () {
}, chatVM.updateAcknowledgePaymentToMowaterStatus(!chatVM.acknowledgePaymentToMowaterStatus);
selectedColor: MyColors.darkPrimaryColor, },
), selectedColor: MyColors.darkPrimaryColor,
), ),
], ),
); ],
}), );
})
: null,
actionButtonYes: Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) { actionButtonYes: Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) {
return Expanded( return Expanded(
child: ShowFillButton( child: ShowFillButton(
maxHeight: 55, maxHeight: 55,
isDisabled: !chatVM.acknowledgePaymentToMowaterStatus, isDisabled: !chatVM.acknowledgePaymentToMowaterStatus,
title: LocaleKeys.submit.tr(), title: AppState().currentAppType == AppType.customer ? LocaleKeys.submit.tr() : LocaleKeys.yes.tr(),
fontSize: 15, fontSize: 15,
onPressed: () async { onPressed: () async {
Navigator.pop(context); pop(context);
bool status = await requestVM.onActionRequestTapped(context: mainContext, requestStatusEnum: requestStatusEnum, requestId: requestId); bool statusForReqAccept = false;
if (status) {
chatVM.updateAcknowledgePaymentToMowaterStatus(false); if (acceptRequestOffer != null) {
mainContext.read<DashboardVmCustomer>().onNavbarTapped(4); statusForReqAccept = await acceptRequestOffer();
navigateReplaceWithNameUntilRoute(mainContext, AppRoutes.dashboard); if (statusForReqAccept) {
bool status = await requestVM.onActionRequestTapped(
context: mainContext,
requestStatusEnum: requestStatusEnum,
requestId: requestId,
needLoading: false,
);
log("status: $status");
if (status) {
int index = requestVM.myFilteredRequests.indexWhere((element) => element.id == requestId);
if (index != -1) {
requestVM.myFilteredRequests[index].requestStatus = requestStatusEnum;
}
chatVM.updateAcknowledgePaymentToMowaterStatus(false);
mainContext.read<DashboardVmCustomer>().onNavbarTapped(4);
navigateReplaceWithNameUntilRoute(mainContext, AppRoutes.dashboard);
}
}
} else {
bool status = await requestVM.onActionRequestTapped(
context: mainContext,
requestStatusEnum: requestStatusEnum,
requestId: requestId,
needLoading: false,
);
log("status: $status");
if (status) {
int index = requestVM.myFilteredRequests.indexWhere((element) => element.id == requestId);
if (index != -1) {
requestVM.myFilteredRequests[index].requestStatus = requestStatusEnum;
}
chatVM.updateAcknowledgePaymentToMowaterStatus(false);
mainContext.read<DashboardVmCustomer>().onNavbarTapped(4);
navigateReplaceWithNameUntilRoute(mainContext, AppRoutes.dashboard);
}
} }
}, },
), ),

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_localization/easy_localization.dart' as lcl; import 'package:easy_localization/easy_localization.dart' as lcl;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -31,14 +33,14 @@ class ChatMessageCustomWidget extends StatefulWidget {
final RequestStatusEnum? requestStatusEnum; final RequestStatusEnum? requestStatusEnum;
final ChatTypeEnum chatTypeEnum; final ChatTypeEnum chatTypeEnum;
final RequestsTypeEnum requestsTypeEnum; final RequestsTypeEnum requestsTypeEnum;
final RequestModel requestModel; final RequestModel? requestModel;
const ChatMessageCustomWidget({ const ChatMessageCustomWidget({
super.key, super.key,
required this.chatMessageModel, required this.chatMessageModel,
required this.requestStatusEnum, required this.requestStatusEnum,
required this.chatTypeEnum, required this.chatTypeEnum,
required this.requestModel, this.requestModel,
this.requestsTypeEnum = RequestsTypeEnum.specialCarRequest, this.requestsTypeEnum = RequestsTypeEnum.specialCarRequest,
}); });
@ -158,12 +160,12 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
); );
} }
Future buildDealBottomSheetOptionsForSpecialCar({required ChatMessageModel chatMessageModel, required RequestOfferStatusEnum requestOfferStatusEnum}) { Future buildDealBottomSheetOptionsForSpecialCar({required ChatMessageModel chatMessageModel, required RequestOfferStatusEnum requestOfferStatusEnum, required bool fromCancelOffer}) {
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
enableDrag: true, enableDrag: true,
builder: (BuildContext context) { builder: (BuildContext sheetContext) {
return Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) { return Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) {
return InfoBottomSheet( return InfoBottomSheet(
title: LocaleKeys.pleaseSpecify.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44), title: LocaleKeys.pleaseSpecify.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
@ -198,15 +200,62 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
ShowFillButton( ShowFillButton(
title: LocaleKeys.continu.tr(), title: LocaleKeys.continu.tr(),
onPressed: () async { onPressed: () async {
pop(sheetContext);
if (chatVM.dealOptionsModelList[0].isSelected ?? false) { if (chatVM.dealOptionsModelList[0].isSelected ?? false) {
final requestVM = context.read<RequestsVM>(); if (fromCancelOffer) {
return dealCompletedConfirmationBottomSheet( final requestVM = context.read<RequestsVM>();
mainContext: context, return dealCompletedConsentBottomSheet(
requestStatusEnum: RequestStatusEnum.completed, mainContext: context,
requestId: requestVM.currentSelectedRequest!.id, 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 { } else {
buildDealNotCompletedBottomSheetOptions(chatMessageModel: chatMessageModel); if (fromCancelOffer) {
buildRejectOrCancelOfferBottomSheet(chatMessageModel: chatMessageModel, requestOfferStatusEnum: RequestOfferStatusEnum.cancel);
} else {
buildDealNotCompletedBottomSheetOptions(chatMessageModel: chatMessageModel);
}
} }
}, },
maxWidth: double.infinity, maxWidth: double.infinity,
@ -399,7 +448,7 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
} }
setState(() {}); setState(() {});
// Navigator.pop(context); // Navigator.pop(context);
Utils.showToast("Offer Accepted"); Utils.showToast(LocaleKeys.offerAccepted.tr());
// navigateReplaceWithName(context, AppRoutes.dashboard); // navigateReplaceWithName(context, AppRoutes.dashboard);
} }
}, },
@ -499,7 +548,7 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
isFilled: false, isFilled: false,
onPressed: () { onPressed: () {
if (widget.requestsTypeEnum == RequestsTypeEnum.specialCarRequest) { if (widget.requestsTypeEnum == RequestsTypeEnum.specialCarRequest) {
buildDealBottomSheetOptionsForSpecialCar(chatMessageModel: chatMessageModel, requestOfferStatusEnum: requestOfferStatusEnum); buildDealBottomSheetOptionsForSpecialCar(chatMessageModel: chatMessageModel, requestOfferStatusEnum: requestOfferStatusEnum, fromCancelOffer: false);
} else { } else {
offerAcceptConfirmationBottomSheet(chatMessageModel: chatMessageModel); offerAcceptConfirmationBottomSheet(chatMessageModel: chatMessageModel);
} }
@ -529,6 +578,23 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
10.height, 10.height,
Row( Row(
children: [ 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( Expanded(
child: ShowFillButton( child: ShowFillButton(
maxHeight: 27, maxHeight: 27,
@ -660,10 +726,10 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
} }
Future<void> onOfferEditIconPressed() async { Future<void> onOfferEditIconPressed() async {
int index = context.read<RequestsVM>().myFilteredRequests.indexWhere((request) => request.id == widget.requestModel.id); int index = context.read<RequestsVM>().myFilteredRequests.indexWhere((request) => request.id == widget.requestModel!.id);
RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments( RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments(
requestIndex: index, // Not getting used in case of update offer requestIndex: index, // Not getting used in case of update offer
requestModel: widget.requestModel, requestModel: widget.requestModel!,
); );
RequestsVM requestVM = context.read<RequestsVM>(); RequestsVM requestVM = context.read<RequestsVM>();
requestVM.resetSendOfferBottomSheet(); requestVM.resetSendOfferBottomSheet();
@ -676,8 +742,13 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
requestVM.updateIsDeliveryAvailableStatus((offer.isDeliveryAvailable ?? false)); requestVM.updateIsDeliveryAvailableStatus((offer.isDeliveryAvailable ?? false));
if (offer.reqOfferImages != null && offer.reqOfferImages!.isNotEmpty) { if (offer.reqOfferImages != null && offer.reqOfferImages!.isNotEmpty) {
for (var element in offer.reqOfferImages!) { for (var element in offer.reqOfferImages!) {
if (element.imageUrl != null) { log("element: ${element.imageStr != null && element.imageStr!.isNotEmpty}");
ImageModel imageModel = ImageModel(id: element.id, filePath: element.imageUrl, isFromNetwork: true);
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);
requestVM.addImageToPickedVehicleImages(imageModel); requestVM.addImageToPickedVehicleImages(imageModel);
} }
} }
@ -697,7 +768,10 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
LocaleKeys.viewed.tr().toText(fontSize: 10, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium), LocaleKeys.viewed.tr().toText(fontSize: 10, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium),
], ],
), ),
] else if (AppState().currentAppType == AppType.provider && chatMessageTypeEnum == ChatMessageTypeEnum.offer && (widget.chatMessageModel.isMyMessage == true)) ...[ ] else if (AppState().currentAppType == AppType.provider &&
widget.chatMessageModel.reqOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.offer &&
chatMessageTypeEnum == ChatMessageTypeEnum.offer &&
(widget.chatMessageModel.isMyMessage == true)) ...[
MyAssets.icEdit.buildSvg(color: MyColors.white, height: 15).onPress(() => onOfferEditIconPressed()), MyAssets.icEdit.buildSvg(color: MyColors.white, height: 15).onPress(() => onOfferEditIconPressed()),
], ],
Expanded( Expanded(
@ -889,7 +963,10 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ 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, 5.height,

@ -143,6 +143,7 @@ class AdsFragment extends StatelessWidget {
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () async { onPressed: () async {
adVM.getVehicleAdsDuration();
if (AppState().userType != UserType.providerDealer) { if (AppState().userType != UserType.providerDealer) {
if (adVM.vehicleAdDurationId.selectedId == -1 && adVM.vehicleAdsDurations.isNotEmpty) { if (adVM.vehicleAdDurationId.selectedId == -1 && adVM.vehicleAdsDurations.isNotEmpty) {
SelectionModel selection = SelectionModel( SelectionModel selection = SelectionModel(

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
@ -188,8 +190,6 @@ Future buildSendOfferBottomSheet({
); );
} }
Future buildRequestStatusUpdateSheetForProvider({required BuildContext mainContext, required int requestId}) { Future buildRequestStatusUpdateSheetForProvider({required BuildContext mainContext, required int requestId}) {
return showModalBottomSheet( return showModalBottomSheet(
context: mainContext, context: mainContext,

@ -77,7 +77,12 @@ class RequestDetailPage extends StatelessWidget {
maxHeight: 55, maxHeight: 55,
title: LocaleKeys.completeDeal.tr(), title: LocaleKeys.completeDeal.tr(),
onPressed: () { onPressed: () {
return dealCompletedConfirmationBottomSheet(mainContext: context, requestStatusEnum: RequestStatusEnum.completed, requestId: requestId); return dealCompletedConsentBottomSheet(
mainContext: context,
requestStatusEnum: RequestStatusEnum.completed,
requestId: requestId,
acceptRequestOffer: () {},
);
}, },
); );
} }

Loading…
Cancel
Save