Bug Fixes

aamir_dev
Faiz Hashmi 1 year ago
parent d0e733ffd3
commit 4c7b289d7e

@ -705,5 +705,6 @@
"companyLocation": "موقع الشركة", "companyLocation": "موقع الشركة",
"customerLocation": "موقع العميل", "customerLocation": "موقع العميل",
"deliveryAvailable": "التوصيل متاح", "deliveryAvailable": "التوصيل متاح",
"viewed": "تم المشاهدة" "viewed": "تم المشاهدة",
"itemNoLongerAvailable": "لم يعد هذا العنصر متاحًا."
} }

@ -242,7 +242,7 @@
"payLater": "Pay Later", "payLater": "Pay Later",
"complete": "Complete", "complete": "Complete",
"makeAnOffer": "Make an offer", "makeAnOffer": "Make an offer",
"provideOffer": "Provider Offer", "provideOffer": "Provide Offer",
"enterAmount": "Enter amount", "enterAmount": "Enter amount",
"submit": "Submit", "submit": "Submit",
"viewChat": "View Chat", "viewChat": "View Chat",
@ -702,6 +702,7 @@
"companyLocation": "Company Location", "companyLocation": "Company Location",
"customerLocation": "Customer Location", "customerLocation": "Customer Location",
"deliveryAvailable": "Delivery Available", "deliveryAvailable": "Delivery Available",
"viewed": "Viewed" "viewed": "Viewed",
"itemNoLongerAvailable": "This item is no longer available."
} }

@ -721,7 +721,8 @@ class CodegenLoader extends AssetLoader{
"companyLocation": "موقع الشركة", "companyLocation": "موقع الشركة",
"customerLocation": "موقع العميل", "customerLocation": "موقع العميل",
"deliveryAvailable": "التوصيل متاح", "deliveryAvailable": "التوصيل متاح",
"viewed": "تم المشاهدة" "viewed": "تم المشاهدة",
"itemNoLongerAvailable": "لم يعد هذا العنصر متاحًا."
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
@ -967,7 +968,7 @@ static const Map<String,dynamic> en_US = {
"payLater": "Pay Later", "payLater": "Pay Later",
"complete": "Complete", "complete": "Complete",
"makeAnOffer": "Make an offer", "makeAnOffer": "Make an offer",
"provideOffer": "Provider Offer", "provideOffer": "Provide Offer",
"enterAmount": "Enter amount", "enterAmount": "Enter amount",
"submit": "Submit", "submit": "Submit",
"viewChat": "View Chat", "viewChat": "View Chat",
@ -1427,7 +1428,8 @@ static const Map<String,dynamic> en_US = {
"companyLocation": "Company Location", "companyLocation": "Company Location",
"customerLocation": "Customer Location", "customerLocation": "Customer Location",
"deliveryAvailable": "Delivery Available", "deliveryAvailable": "Delivery Available",
"viewed": "Viewed" "viewed": "Viewed",
"itemNoLongerAvailable": "This item is no longer available."
}; };
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};
} }

@ -685,5 +685,6 @@ abstract class LocaleKeys {
static const customerLocation = 'customerLocation'; static const customerLocation = 'customerLocation';
static const deliveryAvailable = 'deliveryAvailable'; static const deliveryAvailable = 'deliveryAvailable';
static const viewed = 'viewed'; static const viewed = 'viewed';
static const itemNoLongerAvailable = 'itemNoLongerAvailable';
} }

@ -46,7 +46,7 @@ class ChatMessageModel {
return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: ${reqOffer.toString()}, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}'; return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: ${reqOffer.toString()}, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}';
} }
ChatMessageModel.fromJson(Map<String, dynamic> json, {bool isFromNetwork = true}) { ChatMessageModel.fromJson(Map<String, dynamic> json, {bool isFromNetwork = true, bool isForReqOfferImagesURLs = false}) {
final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase(); final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase();
id = json['id']; id = json['id'];
senderUserID = json['senderUserID']; senderUserID = json['senderUserID'];
@ -59,7 +59,7 @@ class ChatMessageModel {
reqOfferID = json['reqOfferID']; reqOfferID = json['reqOfferID'];
serviceProviderID = json['serviceProviderID']; serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus']; offerStatus = json['offerStatus'];
reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer']) : null; reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer'], isFromNetwork, isForReqOfferImagesURLs) : null;
if (json['reqOfferImages'] != null) { if (json['reqOfferImages'] != null) {
messageImages = <MessageImageModel>[]; messageImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) { json['reqOfferImages'].forEach((v) {
@ -83,8 +83,10 @@ class ReqOffer {
int? manufacturedById; int? manufacturedById;
String? manufacturedOn; String? manufacturedOn;
double? price; double? price;
bool? isDeliveryAvailable;
RequestsTypeEnum? requestsTypeEnum; RequestsTypeEnum? requestsTypeEnum;
RequestOfferStatusEnum? requestOfferStatusEnum; RequestOfferStatusEnum? requestOfferStatusEnum;
List<MessageImageModel>? reqOfferImages;
ReqOffer({ ReqOffer({
this.id, this.id,
@ -97,11 +99,13 @@ class ReqOffer {
this.manufacturedById, this.manufacturedById,
this.manufacturedOn, this.manufacturedOn,
this.price, this.price,
this.isDeliveryAvailable,
this.requestOfferStatusEnum, this.requestOfferStatusEnum,
this.requestsTypeEnum, this.requestsTypeEnum,
this.reqOfferImages,
}); });
ReqOffer.fromJson(Map<String, dynamic> json) { ReqOffer.fromJson(Map<String, dynamic> json, bool isFromNetwork, bool isForReqOfferImagesURLs) {
id = json['id']; id = json['id'];
requestID = json['requestID']; requestID = json['requestID'];
serviceProviderID = json['serviceProviderID']; serviceProviderID = json['serviceProviderID'];
@ -112,8 +116,24 @@ class ReqOffer {
manufacturedById = json['offeredItemCreatedBy']; manufacturedById = json['offeredItemCreatedBy'];
manufacturedOn = json['offeredItemCreatedOn']; manufacturedOn = json['offeredItemCreatedOn'];
price = json['price']; price = json['price'];
isDeliveryAvailable = json['isDeliveryAvailable'];
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum(); requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();
requestsTypeEnum = RequestsTypeEnum.serviceRequest; requestsTypeEnum = RequestsTypeEnum.serviceRequest;
// if (isForReqOfferImagesURLs) {
// if (json['reqOfferImagesURLs'] != null) {
// reqOfferImages = <MessageImageModel>[];
// json['reqOfferImagesURLs'].forEach((v) {
// reqOfferImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
// });
// }
// } else {
if (json['reqOfferImages'] != null) {
reqOfferImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
reqOfferImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
});
}
// }
} }
@override @override

@ -79,25 +79,30 @@ class ChatVM extends ChangeNotifier {
OfferRequestCommentModel( OfferRequestCommentModel(
index: 0, index: 0,
isSelected: true, isSelected: true,
title: LocaleKeys.changedMind.tr(), title: LocaleKeys.itemNoLongerAvailable.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 1, index: 1,
isSelected: true,
title: LocaleKeys.changedMind.tr(),
),
OfferRequestCommentModel(
index: 2,
isSelected: false, isSelected: false,
title: LocaleKeys.veryHighPrice.tr(), title: LocaleKeys.veryHighPrice.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 2, index: 3,
isSelected: false, isSelected: false,
title: LocaleKeys.alreadySold.tr(), title: LocaleKeys.alreadySold.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 3, index: 4,
isSelected: false, isSelected: false,
title: LocaleKeys.customerNotResponding.tr(), title: LocaleKeys.customerNotResponding.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 4, index: 5,
isSelected: false, isSelected: false,
title: LocaleKeys.otherVar.tr(), title: LocaleKeys.otherVar.tr(),
), ),
@ -149,6 +154,7 @@ class ChatVM extends ChangeNotifier {
Future<void> onNewMessageReceivedForRequestOffer({required List<ChatMessageModel> messages, bool isMyOwnOffer = false, required RequestsVM requestsVM}) async { Future<void> onNewMessageReceivedForRequestOffer({required List<ChatMessageModel> messages, bool isMyOwnOffer = false, required RequestsVM requestsVM}) async {
if (AppState().currentAppType == AppType.customer) { if (AppState().currentAppType == AppType.customer) {
for (var currentMessage in messages) { for (var currentMessage in messages) {
log("currentMessage: ${currentMessage.reqOffer!.reqOfferImages!.first.imageUrl}");
int providerIndex = serviceProviderOffersList.indexWhere((element) => element.providerUserId == currentMessage.senderUserID); int providerIndex = serviceProviderOffersList.indexWhere((element) => element.providerUserId == currentMessage.senderUserID);
if (providerIndex != -1) { if (providerIndex != -1) {
if (currentMessage.chatMessageTypeEnum == ChatMessageTypeEnum.offer) { if (currentMessage.chatMessageTypeEnum == ChatMessageTypeEnum.offer) {
@ -196,7 +202,8 @@ class ChatVM extends ChangeNotifier {
if (arguments == null || arguments.isEmpty) return; if (arguments == null || arguments.isEmpty) return;
List<ChatMessageModel> chat = []; List<ChatMessageModel> chat = [];
for (var message in arguments) { for (var message in arguments) {
final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>); final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>, isForReqOfferImagesURLs: true);
log("chatMessagechatMessage: ${chatMessage.reqOffer!.reqOfferImages!.first.imageUrl}");
chat.add(chatMessage); chat.add(chatMessage);
} }
onNewMessageReceivedForRequestOffer(messages: chat, requestsVM: context.read<RequestsVM>()); onNewMessageReceivedForRequestOffer(messages: chat, requestsVM: context.read<RequestsVM>());
@ -239,6 +246,8 @@ class ChatVM extends ChangeNotifier {
} }
notifyListeners(); notifyListeners();
} else {
logger.i("Hub Already Connected: ${hubConnection!.connectionId.toString()}");
} }
} }
@ -248,6 +257,7 @@ class ChatVM extends ChangeNotifier {
required String message, required String message,
required int requestId, required int requestId,
required String offerPrice, required String offerPrice,
required bool isDeliveryAvailable,
required String serviceItemName, required String serviceItemName,
required int manufacturedById, required int manufacturedById,
required String manufacturedOn, required String manufacturedOn,
@ -270,6 +280,7 @@ class ChatVM extends ChangeNotifier {
"ReqOffer": <String, dynamic>{ "ReqOffer": <String, dynamic>{
"RequestID": requestId, "RequestID": requestId,
"Price": double.parse(offerPrice), "Price": double.parse(offerPrice),
"IsDeliveryAvailable": isDeliveryAvailable,
"ServiceItem": serviceItemName, "ServiceItem": serviceItemName,
"ReqOfferImages": offerImages, "ReqOfferImages": offerImages,
"OfferedItemCreatedBy": manufacturedById, // TODO: The ID should be used from the manufacturer database "OfferedItemCreatedBy": manufacturedById, // TODO: The ID should be used from the manufacturer database
@ -303,12 +314,10 @@ class ChatVM extends ChangeNotifier {
List<MessageImageModel> getMessagesImageList() { List<MessageImageModel> getMessagesImageList() {
List<MessageImageModel> requestImages = []; List<MessageImageModel> requestImages = [];
for (var image in pickedImagesForMessage) { for (var image in pickedImagesForMessage) {
var value = convertFileToMessageImageModel(file: File(image.filePath!)); var value = convertFileToMessageImageModel(file: File(image.filePath!));
requestImages.add(value); requestImages.add(value);
} }
return requestImages; return requestImages;
} }
@ -349,7 +358,6 @@ class ChatVM extends ChangeNotifier {
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) { if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
logger.i("Hub Not Connected!!"); logger.i("Hub Not Connected!!");
await buildHubConnection(context); await buildHubConnection(context);
} }
if (hubConnection!.state == HubConnectionState.connected) { if (hubConnection!.state == HubConnectionState.connected) {

@ -59,7 +59,6 @@ class DashboardVmCustomer extends BaseVM {
} }
Future<void> onRefresh(BuildContext context, {DashboardRouteEnum dashboardRouteEnum = DashboardRouteEnum.none}) async { Future<void> onRefresh(BuildContext context, {DashboardRouteEnum dashboardRouteEnum = DashboardRouteEnum.none}) async {
log("onRefresh dashboardRouteEnum: $dashboardRouteEnum");
AdVM adVM = Provider.of<AdVM>(context, listen: false); AdVM adVM = Provider.of<AdVM>(context, listen: false);
AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false); AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false);
RequestsVM requestsVM = Provider.of<RequestsVM>(context, listen: false); RequestsVM requestsVM = Provider.of<RequestsVM>(context, listen: false);

@ -70,7 +70,7 @@ class DashboardVMProvider extends BaseVM {
return await userRepo.updateUserImage(image); return await userRepo.updateUserImage(image);
} }
Future<void> onRefresh(BuildContext context, { DashboardRouteEnum dashboardRouteEnum = DashboardRouteEnum.none }) async { Future<void> onRefresh(BuildContext context, {DashboardRouteEnum dashboardRouteEnum = DashboardRouteEnum.none}) async {
final requestsVM = context.read<RequestsVM>(); final requestsVM = context.read<RequestsVM>();
final chatVM = context.read<ChatVM>(); final chatVM = context.read<ChatVM>();
final appointmentVM = context.read<AppointmentsVM>(); final appointmentVM = context.read<AppointmentsVM>();
@ -82,16 +82,9 @@ class DashboardVMProvider extends BaseVM {
appointmentVM.populateAppointmentsFilterList(); appointmentVM.populateAppointmentsFilterList();
shippingManagementVM.populateShippingRequestFilterList(); shippingManagementVM.populateShippingRequestFilterList();
await serviceVM.getBranchAndServices(); await serviceVM.getBranchAndServices();
await appointmentVM.getMyAppointmentsForProvider({"ServiceProviderID": injector await appointmentVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
.get<AppState>()
.getUser
.data
?.userInfo
?.providerId
.toString() ?? "0"});
adVM.populateAdsFilterList(); adVM.populateAdsFilterList();
await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true); await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
await chatVM.buildHubConnection(context);
if (dashboardRouteEnum != DashboardRouteEnum.fromAdsPayment && dashboardRouteEnum != DashboardRouteEnum.fromAdsSubmit) { if (dashboardRouteEnum != DashboardRouteEnum.fromAdsPayment && dashboardRouteEnum != DashboardRouteEnum.fromAdsSubmit) {
await adVM.getMyAds(); await adVM.getMyAds();
await adVM.getExploreAds(); await adVM.getExploreAds();
@ -99,6 +92,7 @@ class DashboardVMProvider extends BaseVM {
await adVM.getVehicleTypes(); await adVM.getVehicleTypes();
await adVM.getVehicleAdsDuration(); await adVM.getVehicleAdsDuration();
await requestsVM.getRequests(); await requestsVM.getRequests();
await chatVM.buildHubConnection(context);
} }
void checkUserSubscription(SubscriptionActionTypeEnum actionType, BuildContext context, {required Function() callback}) async { void checkUserSubscription(SubscriptionActionTypeEnum actionType, BuildContext context, {required Function() callback}) async {

@ -3,7 +3,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
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:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
@ -112,14 +111,6 @@ class RequestsVM extends BaseVM {
requestStatusIdApi = requestStatusId.selectedId; requestStatusIdApi = requestStatusId.selectedId;
} }
// log("requestTypeIdApi: $requestTypeIdApi");
// log("requestCityIdApi: $requestCityIdApi");
// log("requestConditionIdApi: $requestConditionIdApi");
// log("requestVehicleBrandApi: $brand");
// log("requestVehicleModelApi: $model");
// log("requestVehicleYearIdApi: $requestVehicleYearIdApi");
// log("requestStatusIdApi: $requestStatusIdApi");
// try { // try {
myFilteredRequests = await requestRepo.getRequestsBasedOnFilters( myFilteredRequests = await requestRepo.getRequestsBasedOnFilters(
requestTypeId: requestTypeIdApi, requestTypeId: requestTypeIdApi,
@ -724,7 +715,7 @@ class RequestsVM extends BaseVM {
Utils.showToast(LocaleKeys.requestSuccessfullyCreated.tr()); Utils.showToast(LocaleKeys.requestSuccessfullyCreated.tr());
Navigator.pop(context); Navigator.pop(context);
resetRequestCreationForm(); resetRequestCreationForm();
await getRequests(); await applyFilterOnRequestsVM(requestsTypeEnum: requestTypeId.selectedId == 1 ? RequestsTypeEnum.specialCarRequest : RequestsTypeEnum.serviceRequest);
} else { } else {
Utils.showToast(respModel.message.toString()); Utils.showToast(respModel.message.toString());
} }
@ -892,10 +883,27 @@ class RequestsVM extends BaseVM {
serviceItem = ""; serviceItem = "";
serviceItemCreatedOn = ""; serviceItemCreatedOn = "";
itemManufacturer = ""; itemManufacturer = "";
isDeliveryAvailableStatus = false;
pickedVehicleImages.clear(); pickedVehicleImages.clear();
notifyListeners(); notifyListeners();
} }
MessageImageModel convertFileToMessageImageModel({required File file, required int latestOfferId}) {
List<int> imageBytes = file.readAsBytesSync();
String image = base64Encode(imageBytes);
MessageImageModel vehiclePostingImages = MessageImageModel(imageStr: image, id: 0, isFromNetwork: false, reqOfferID: latestOfferId, imagePath: file.path);
return vehiclePostingImages;
}
List<MessageImageModel> getMessagesImageList({required int latestOfferId}) {
List<MessageImageModel> requestImages = [];
for (var image in pickedVehicleImages) {
var value = convertFileToMessageImageModel(file: File(image.filePath!), latestOfferId: latestOfferId);
requestImages.add(value);
}
return requestImages;
}
Future<void> onSendOfferPressed({ Future<void> onSendOfferPressed({
required BuildContext context, required BuildContext context,
required String receiverId, required String receiverId,
@ -906,32 +914,31 @@ class RequestsVM extends BaseVM {
required int manufacturedById, required int manufacturedById,
required String manufacturedOn, required String manufacturedOn,
required RequestModel requestModel, required RequestModel requestModel,
required bool isDeliveryAvailable,
required int requestIndex, required int requestIndex,
required bool isFromChatScreen, required bool isFromChatScreen,
}) async { }) async {
if (isSendOfferValidated()) { if (isSendOfferValidated()) {
final chatVM = context.read<ChatVM>(); final chatVM = context.read<ChatVM>();
List<MessageImageModel> images = getMessagesImageList(latestOfferId: context.read<ChatVM>().latestOfferId);
Utils.showLoading(context);
List<RequestPostingImages> vehicleImages = await getVehiclePostingImageList();
List offerImages = []; List offerImages = [];
vehicleImages.forEach((element) { images.forEach((element) {
offerImages.add(element.toJson()); offerImages.add(element.toJson());
}); });
bool status = await chatVM.onOfferSendForRequest( bool status = await chatVM.onOfferSendForRequest(
receiverId: receiverId, receiverId: receiverId,
chatMessageType: ChatMessageTypeEnum.offer, chatMessageType: ChatMessageTypeEnum.offer,
message: message, message: message,
requestId: requestId, requestId: requestId,
offerPrice: offerPrice, offerPrice: offerPrice,
isDeliveryAvailable: isDeliveryAvailable,
manufacturedById: manufacturedById, manufacturedById: manufacturedById,
manufacturedOn: manufacturedOn, manufacturedOn: manufacturedOn,
serviceItemName: serviceItemName, serviceItemName: serviceItemName,
offerImages: offerImages, offerImages: offerImages,
context: context, context: context,
); );
Utils.hideLoading(context);
log("status from onOfferSendForRequest: $status"); log("status from onOfferSendForRequest: $status");
if (!status) { if (!status) {
@ -957,12 +964,14 @@ class RequestsVM extends BaseVM {
offerStatus: RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(), offerStatus: RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(),
requestID: requestModel.id, requestID: requestModel.id,
price: double.parse(offerPrice), price: double.parse(offerPrice),
isDeliveryAvailable: isDeliveryAvailable,
manufacturedById: manufacturedById, manufacturedById: manufacturedById,
manufacturedOn: manufacturedOn, manufacturedOn: manufacturedOn,
serviceItemName: serviceItemName, serviceItemName: serviceItemName,
requestOfferStatusEnum: RequestOfferStatusEnum.offer, requestOfferStatusEnum: RequestOfferStatusEnum.offer,
comment: message, comment: message,
offerStatusText: "", offerStatusText: "",
reqOfferImages: images,
), ),
); );
context.read<ChatVM>().onNewMessageReceivedForRequestOffer(messages: [chatMessageModel], requestsVM: this, isMyOwnOffer: true); context.read<ChatVM>().onNewMessageReceivedForRequestOffer(messages: [chatMessageModel], requestsVM: this, isMyOwnOffer: true);

@ -23,7 +23,6 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart' as lcl; import 'package:easy_localization/easy_localization.dart' as lcl;
import 'package:sizer/sizer.dart';
class ChatMessageCustomWidget extends StatefulWidget { class ChatMessageCustomWidget extends StatefulWidget {
final ChatMessageModel chatMessageModel; final ChatMessageModel chatMessageModel;
@ -59,13 +58,26 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
shrinkWrap: true, shrinkWrap: true,
itemCount: chatVM.offerRejectModelList.length, itemCount: chatVM.offerRejectModelList.length,
separatorBuilder: (BuildContext context, int index) { separatorBuilder: (BuildContext context, int index) {
if (chatVM.offerRejectModelList[index].index == 3 && requestOfferStatusEnum == RequestOfferStatusEnum.rejected) { if ((chatVM.offerRejectModelList[index].index == 1 || chatVM.offerRejectModelList[index].index == 2 || chatVM.offerRejectModelList[index].index == 3) && requestOfferStatusEnum == RequestOfferStatusEnum.cancel) {
return const SizedBox();
}
// 0 -> itemNoLongerAvailable
// 1 -> customerNotResponding
if ((chatVM.offerRejectModelList[index].index == 4 || chatVM.offerRejectModelList[index].index == 0) && requestOfferStatusEnum == RequestOfferStatusEnum.rejected) {
return const SizedBox(); return const SizedBox();
} }
return const Divider(thickness: 0.5); return const Divider(thickness: 0.5);
}, },
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
if (chatVM.offerRejectModelList[index].index == 3 && requestOfferStatusEnum == RequestOfferStatusEnum.rejected) { if ((chatVM.offerRejectModelList[index].index == 1 || chatVM.offerRejectModelList[index].index == 2 || chatVM.offerRejectModelList[index].index == 3) && requestOfferStatusEnum == RequestOfferStatusEnum.cancel) {
return const SizedBox();
}
// 0 -> itemNoLongerAvailable
// 1 -> customerNotResponding
// 2 -> veryHighPrice
// 3 -> alreadySold
if ((chatVM.offerRejectModelList[index].index == 4 || chatVM.offerRejectModelList[index].index == 0) && requestOfferStatusEnum == RequestOfferStatusEnum.rejected) {
return const SizedBox(); return const SizedBox();
} }
OfferRequestCommentModel offerRequestCommentModel = chatVM.offerRejectModelList[index]; OfferRequestCommentModel offerRequestCommentModel = chatVM.offerRejectModelList[index];
@ -108,7 +120,6 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
return; return;
} }
Navigator.pop(context); Navigator.pop(context);
bool status = await chatVM.onSendMessageForActionOnRequestOffer( bool status = await chatVM.onSendMessageForActionOnRequestOffer(
receiverId: (chatMessageModel.isMyMessage ?? false) ? chatMessageModel.receiverUserID ?? "" : chatMessageModel.senderUserID ?? "", receiverId: (chatMessageModel.isMyMessage ?? false) ? chatMessageModel.receiverUserID ?? "" : chatMessageModel.senderUserID ?? "",
chatMessageType: ChatMessageTypeEnum.offer, chatMessageType: ChatMessageTypeEnum.offer,
@ -202,6 +213,31 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
); );
} }
Widget buildImagesInOffer(List<MessageImageModel> offerImages, bool isMyMessage) {
int imageCount = offerImages.length;
return SizedBox(
height: 50,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: imageCount,
itemBuilder: (BuildContext context, int index) {
Widget widget = const SizedBox();
if ((offerImages[index].isFromNetwork ?? false)) {
widget = offerImages[index].imageUrl.buildNetworkImage(fit: BoxFit.cover, width: 50);
} else {
widget = offerImages[index].imagePath.buildFileImage(fit: BoxFit.cover, width: 50);
}
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5), // Optional: Rounded corners
),
child: ClipRRect(borderRadius: BorderRadius.circular(5), child: widget))
.paddingOnly(left: isMyMessage ? 10 : 0, right: isMyMessage ? 0 : 10)
.onPress(() => navigateWithName(context, AppRoutes.mediaViewerScreen, arguments: offerImages));
}),
);
}
Widget buildOfferDetailsInChatMessage({required RequestStatusEnum requestStatusEnum, required ChatMessageModel chatMessageModel, required BuildContext context}) { Widget buildOfferDetailsInChatMessage({required RequestStatusEnum requestStatusEnum, required ChatMessageModel chatMessageModel, required BuildContext context}) {
final requestOfferStatusEnum = chatMessageModel.reqOffer!.requestOfferStatusEnum ?? RequestOfferStatusEnum.offer; final requestOfferStatusEnum = chatMessageModel.reqOffer!.requestOfferStatusEnum ?? RequestOfferStatusEnum.offer;
if (requestStatusEnum != RequestStatusEnum.submitted && requestOfferStatusEnum != RequestOfferStatusEnum.accepted) { if (requestStatusEnum != RequestStatusEnum.submitted && requestOfferStatusEnum != RequestOfferStatusEnum.accepted) {
@ -406,16 +442,14 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
fadeInDuration: const Duration(milliseconds: 1000), fadeInDuration: const Duration(milliseconds: 1000),
useOldImageOnUrlChange: false); useOldImageOnUrlChange: false);
} }
return widget.toCircle(borderRadius: 100); return widget.toCircle(borderRadius: 100);
} }
Widget buildFreeTextDetailsInMessage({required ChatMessageTypeEnum chatMessageTypeEnum}) { Widget buildFreeTextDetailsInMessage({required ChatMessageTypeEnum chatMessageTypeEnum}) {
log(": ${widget.chatMessageModel.isMyMessage}");
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (chatMessageTypeEnum == ChatMessageTypeEnum.offer && (widget.chatMessageModel.isMyMessage == true)) ...[ if (chatMessageTypeEnum == ChatMessageTypeEnum.offer && (widget.chatMessageModel.isMyMessage == true) && widget.chatMessageModel.isRead == true) ...[
Row( Row(
children: [ children: [
const Icon(Icons.remove_red_eye_outlined, size: 12, color: MyColors.lightTextColor), const Icon(Icons.remove_red_eye_outlined, size: 12, color: MyColors.lightTextColor),
@ -434,7 +468,6 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
), ),
), ),
), ),
], ],
); );
} }
@ -515,11 +548,17 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
), ),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(8), // Apply same radius to image borderRadius: BorderRadius.circular(8), // Apply same radius to image
child: messagesImages[index].imageUrl.buildNetworkImage( child: (messagesImages[index].isFromNetwork ?? false)
fit: BoxFit.cover, ? messagesImages[index].imageUrl.buildNetworkImage(
width: gridItemSize, fit: BoxFit.cover,
height: gridItemSize, width: gridItemSize,
), height: gridItemSize,
)
: messagesImages[index].imagePath.buildFileImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
), ),
).onPress(() { ).onPress(() {
navigateWithName(context, AppRoutes.mediaViewerScreen, arguments: messagesImages); navigateWithName(context, AppRoutes.mediaViewerScreen, arguments: messagesImages);
@ -549,6 +588,10 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
messageTypeWidget = Column( messageTypeWidget = Column(
children: [ children: [
buildFreeTextDetailsInMessage(chatMessageTypeEnum: chatMessageTypeEnum), buildFreeTextDetailsInMessage(chatMessageTypeEnum: chatMessageTypeEnum),
if (widget.chatMessageModel.reqOffer!.reqOfferImages != null && widget.chatMessageModel.reqOffer!.reqOfferImages!.isNotEmpty) ...[
5.height,
buildImagesInOffer(widget.chatMessageModel.reqOffer!.reqOfferImages!, widget.chatMessageModel.isMyMessage ?? false),
],
10.height, 10.height,
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum!, chatMessageModel: widget.chatMessageModel, context: context), buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum!, chatMessageModel: widget.chatMessageModel, context: context),
], ],

@ -138,18 +138,20 @@ Future buildSendOfferBottomSheet({required BuildContext context, required Reques
maxHeight: 55, maxHeight: 55,
onPressed: () { onPressed: () {
requestsVM.onSendOfferPressed( requestsVM.onSendOfferPressed(
context: context, context: context,
receiverId: requestDetail.customerID, receiverId: requestDetail.customerID,
message: requestsVM.offerDescription, message: requestsVM.offerDescription,
requestId: requestDetail.id, requestId: requestDetail.id,
offerPrice: requestsVM.offerPrice, offerPrice: requestsVM.offerPrice,
requestModel: requestDetail, requestModel: requestDetail,
requestIndex: requestDetailPageArguments.requestIndex, isDeliveryAvailable: requestsVM.isDeliveryAvailableStatus,
isFromChatScreen: isFromChatScreen, requestIndex: requestDetailPageArguments.requestIndex,
manufacturedById: 1, isFromChatScreen: isFromChatScreen,
// Todo: It should be the ID of the manufacturer manufacturedById: 1,
manufacturedOn: requestsVM.serviceItemCreatedOn, // Todo: It should be the ID of the manufacturer
serviceItemName: requestsVM.serviceItem); manufacturedOn: requestsVM.serviceItemCreatedOn,
serviceItemName: requestsVM.serviceItem,
);
}, },
maxWidth: double.infinity, maxWidth: double.infinity,
), ),

@ -72,7 +72,11 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
); );
} }
return GestureDetector( return GestureDetector(
onTap: () => FocusScope.of(context).focusedChild!.unfocus(), onTap: () =>
FocusScope
.of(context)
.focusedChild!
.unfocus(),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -143,75 +147,79 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
} }
Widget buildContent(ServiceVM serviceVM) { Widget buildContent(ServiceVM serviceVM) {
if (serviceVM.document == null) {
return Center(child: CircularProgressIndicator());
}
return serviceVM.document!.data!.isEmpty return serviceVM.document!.data!.isEmpty
? Text(LocaleKeys.somethingWrong.tr()) ? Text(LocaleKeys.somethingWrong.tr())
: ListView.separated( : ListView.separated(
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return 20.height; return 20.height;
}, },
itemCount: serviceVM.document!.data!.length, itemCount: serviceVM.document!.data!.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: const EdgeInsets.symmetric(horizontal: 20), padding: const EdgeInsets.symmetric(horizontal: 20),
itemBuilder: (context, index) { itemBuilder: (context, index) {
DocumentData? document = serviceVM.document?.data![index]; DocumentData? document = serviceVM.document?.data![index];
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
10.height, 10.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
(document!.documentName!).toText(fontSize: 16, letterSpacing: -0.56, fontWeight: MyFonts.SemiBold), (document!.documentName!).toText(fontSize: 16, letterSpacing: -0.56, fontWeight: MyFonts.SemiBold),
if (document.statusText != null && document.statusText!.isNotEmpty) ...[ if (document.statusText != null && document.statusText!.isNotEmpty) ...[
10.width, 10.width,
Utils.statusContainerChip(text: document.statusText!.replaceFirst('OrActive', ''), chipColor: getColorByStatus(document.status ?? 1)), Utils.statusContainerChip(text: document.statusText!.replaceFirst('OrActive', ''), chipColor: getColorByStatus(document.status ?? 1)),
],
],
),
// if (document.status != 1 && document.status != 3) ...[
// Padding(
// padding: const EdgeInsets.only(top: 4, bottom: 8),
// child: LocaleKeys.enter_licence_detail.tr().toText(fontSize: 14, color: MyColors.lightTextColor),
// ),
// TxtField(
// hint: LocaleKeys.description.tr(),
// maxLines: 3,
// isBackgroundEnabled: true,
// ),
// ],
10.height,
if (isNeedToShow(model: serviceVM, document: document)) ...[
PickedFilesContainer(
isReview: document.status != 0 && (document.status == 1 || document.status == 3),
allowAdButton: false,
pickedFiles: isLocalOrNetworkFiles(model: serviceVM, document: document),
onCrossPressedPrimary: isNetworkImage(document: document)
? serviceVM.removeNetworkImage
: document.documentId == 1
? serviceVM.commerceRemove
: document.documentId == 2
? serviceVM.commercialRemove
: serviceVM.vatRemove,
isPdf: true,
isFromNetwork: !(document.isLocalFile ?? false),
onAddFilePressed: () {
serviceVM.pickPdfReceiptFile(context, document.documentId!, index);
},
),
buildCommentContainer(document: document),
] else ...[
10.height,
DottedRectContainer(
onTap: () => serviceVM.pickPdfReceiptFile(context, document.documentId!, index) ?? "",
text: LocaleKeys.attachPDF.tr(),
icon: MyAssets.attachmentIcon.buildSvg(),
),
],
], ],
); ],
}, ),
); // if (document.status != 1 && document.status != 3) ...[
// Padding(
// padding: const EdgeInsets.only(top: 4, bottom: 8),
// child: LocaleKeys.enter_licence_detail.tr().toText(fontSize: 14, color: MyColors.lightTextColor),
// ),
// TxtField(
// hint: LocaleKeys.description.tr(),
// maxLines: 3,
// isBackgroundEnabled: true,
// ),
// ],
10.height,
if (isNeedToShow(model: serviceVM, document: document)) ...[
PickedFilesContainer(
isReview: document.status != 0 && (document.status == 1 || document.status == 3),
allowAdButton: false,
pickedFiles: isLocalOrNetworkFiles(model: serviceVM, document: document),
onCrossPressedPrimary: isNetworkImage(document: document)
? serviceVM.removeNetworkImage
: document.documentId == 1
? serviceVM.commerceRemove
: document.documentId == 2
? serviceVM.commercialRemove
: serviceVM.vatRemove,
isPdf: true,
isFromNetwork: !(document.isLocalFile ?? false),
onAddFilePressed: () {
serviceVM.pickPdfReceiptFile(context, document.documentId!, index);
},
),
buildCommentContainer(document: document),
] else
...[
10.height,
DottedRectContainer(
onTap: () => serviceVM.pickPdfReceiptFile(context, document.documentId!, index) ?? "",
text: LocaleKeys.attachPDF.tr(),
icon: MyAssets.attachmentIcon.buildSvg(),
),
],
],
);
},
);
} }
List<ImageModel> isLocalOrNetworkFiles({required ServiceVM model, required DocumentData document}) { List<ImageModel> isLocalOrNetworkFiles({required ServiceVM model, required DocumentData document}) {

Loading…
Cancel
Save