Bug Fixes

aamir_dev
Faiz Hashmi 12 months ago
parent d0e733ffd3
commit 4c7b289d7e

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

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

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

@ -685,5 +685,6 @@ abstract class LocaleKeys {
static const customerLocation = 'customerLocation';
static const deliveryAvailable = 'deliveryAvailable';
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}';
}
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();
id = json['id'];
senderUserID = json['senderUserID'];
@ -59,7 +59,7 @@ class ChatMessageModel {
reqOfferID = json['reqOfferID'];
serviceProviderID = json['serviceProviderID'];
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) {
messageImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
@ -83,8 +83,10 @@ class ReqOffer {
int? manufacturedById;
String? manufacturedOn;
double? price;
bool? isDeliveryAvailable;
RequestsTypeEnum? requestsTypeEnum;
RequestOfferStatusEnum? requestOfferStatusEnum;
List<MessageImageModel>? reqOfferImages;
ReqOffer({
this.id,
@ -97,11 +99,13 @@ class ReqOffer {
this.manufacturedById,
this.manufacturedOn,
this.price,
this.isDeliveryAvailable,
this.requestOfferStatusEnum,
this.requestsTypeEnum,
this.reqOfferImages,
});
ReqOffer.fromJson(Map<String, dynamic> json) {
ReqOffer.fromJson(Map<String, dynamic> json, bool isFromNetwork, bool isForReqOfferImagesURLs) {
id = json['id'];
requestID = json['requestID'];
serviceProviderID = json['serviceProviderID'];
@ -112,8 +116,24 @@ class ReqOffer {
manufacturedById = json['offeredItemCreatedBy'];
manufacturedOn = json['offeredItemCreatedOn'];
price = json['price'];
isDeliveryAvailable = json['isDeliveryAvailable'];
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();
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

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

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

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

@ -3,7 +3,6 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -112,14 +111,6 @@ class RequestsVM extends BaseVM {
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 {
myFilteredRequests = await requestRepo.getRequestsBasedOnFilters(
requestTypeId: requestTypeIdApi,
@ -724,7 +715,7 @@ class RequestsVM extends BaseVM {
Utils.showToast(LocaleKeys.requestSuccessfullyCreated.tr());
Navigator.pop(context);
resetRequestCreationForm();
await getRequests();
await applyFilterOnRequestsVM(requestsTypeEnum: requestTypeId.selectedId == 1 ? RequestsTypeEnum.specialCarRequest : RequestsTypeEnum.serviceRequest);
} else {
Utils.showToast(respModel.message.toString());
}
@ -892,10 +883,27 @@ class RequestsVM extends BaseVM {
serviceItem = "";
serviceItemCreatedOn = "";
itemManufacturer = "";
isDeliveryAvailableStatus = false;
pickedVehicleImages.clear();
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({
required BuildContext context,
required String receiverId,
@ -906,32 +914,31 @@ class RequestsVM extends BaseVM {
required int manufacturedById,
required String manufacturedOn,
required RequestModel requestModel,
required bool isDeliveryAvailable,
required int requestIndex,
required bool isFromChatScreen,
}) async {
if (isSendOfferValidated()) {
final chatVM = context.read<ChatVM>();
Utils.showLoading(context);
List<RequestPostingImages> vehicleImages = await getVehiclePostingImageList();
List<MessageImageModel> images = getMessagesImageList(latestOfferId: context.read<ChatVM>().latestOfferId);
List offerImages = [];
vehicleImages.forEach((element) {
images.forEach((element) {
offerImages.add(element.toJson());
});
bool status = await chatVM.onOfferSendForRequest(
receiverId: receiverId,
chatMessageType: ChatMessageTypeEnum.offer,
message: message,
requestId: requestId,
offerPrice: offerPrice,
isDeliveryAvailable: isDeliveryAvailable,
manufacturedById: manufacturedById,
manufacturedOn: manufacturedOn,
serviceItemName: serviceItemName,
offerImages: offerImages,
context: context,
);
Utils.hideLoading(context);
log("status from onOfferSendForRequest: $status");
if (!status) {
@ -957,12 +964,14 @@ class RequestsVM extends BaseVM {
offerStatus: RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(),
requestID: requestModel.id,
price: double.parse(offerPrice),
isDeliveryAvailable: isDeliveryAvailable,
manufacturedById: manufacturedById,
manufacturedOn: manufacturedOn,
serviceItemName: serviceItemName,
requestOfferStatusEnum: RequestOfferStatusEnum.offer,
comment: message,
offerStatusText: "",
reqOfferImages: images,
),
);
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:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart' as lcl;
import 'package:sizer/sizer.dart';
class ChatMessageCustomWidget extends StatefulWidget {
final ChatMessageModel chatMessageModel;
@ -59,13 +58,26 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
shrinkWrap: true,
itemCount: chatVM.offerRejectModelList.length,
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 Divider(thickness: 0.5);
},
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();
}
OfferRequestCommentModel offerRequestCommentModel = chatVM.offerRejectModelList[index];
@ -108,7 +120,6 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
return;
}
Navigator.pop(context);
bool status = await chatVM.onSendMessageForActionOnRequestOffer(
receiverId: (chatMessageModel.isMyMessage ?? false) ? chatMessageModel.receiverUserID ?? "" : chatMessageModel.senderUserID ?? "",
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}) {
final requestOfferStatusEnum = chatMessageModel.reqOffer!.requestOfferStatusEnum ?? RequestOfferStatusEnum.offer;
if (requestStatusEnum != RequestStatusEnum.submitted && requestOfferStatusEnum != RequestOfferStatusEnum.accepted) {
@ -406,16 +442,14 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
fadeInDuration: const Duration(milliseconds: 1000),
useOldImageOnUrlChange: false);
}
return widget.toCircle(borderRadius: 100);
}
Widget buildFreeTextDetailsInMessage({required ChatMessageTypeEnum chatMessageTypeEnum}) {
log(": ${widget.chatMessageModel.isMyMessage}");
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (chatMessageTypeEnum == ChatMessageTypeEnum.offer && (widget.chatMessageModel.isMyMessage == true)) ...[
if (chatMessageTypeEnum == ChatMessageTypeEnum.offer && (widget.chatMessageModel.isMyMessage == true) && widget.chatMessageModel.isRead == true) ...[
Row(
children: [
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(
borderRadius: BorderRadius.circular(8), // Apply same radius to image
child: messagesImages[index].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
child: (messagesImages[index].isFromNetwork ?? false)
? messagesImages[index].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
)
: messagesImages[index].imagePath.buildFileImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
),
).onPress(() {
navigateWithName(context, AppRoutes.mediaViewerScreen, arguments: messagesImages);
@ -549,6 +588,10 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
messageTypeWidget = Column(
children: [
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,
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum!, chatMessageModel: widget.chatMessageModel, context: context),
],

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

@ -72,7 +72,11 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
);
}
return GestureDetector(
onTap: () => FocusScope.of(context).focusedChild!.unfocus(),
onTap: () =>
FocusScope
.of(context)
.focusedChild!
.unfocus(),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -143,75 +147,79 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
}
Widget buildContent(ServiceVM serviceVM) {
if (serviceVM.document == null) {
return Center(child: CircularProgressIndicator());
}
return serviceVM.document!.data!.isEmpty
? Text(LocaleKeys.somethingWrong.tr())
: ListView.separated(
separatorBuilder: (context, index) {
return 20.height;
},
itemCount: serviceVM.document!.data!.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: const EdgeInsets.symmetric(horizontal: 20),
itemBuilder: (context, index) {
DocumentData? document = serviceVM.document?.data![index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
10.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
(document!.documentName!).toText(fontSize: 16, letterSpacing: -0.56, fontWeight: MyFonts.SemiBold),
if (document.statusText != null && document.statusText!.isNotEmpty) ...[
10.width,
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(),
),
],
separatorBuilder: (context, index) {
return 20.height;
},
itemCount: serviceVM.document!.data!.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: const EdgeInsets.symmetric(horizontal: 20),
itemBuilder: (context, index) {
DocumentData? document = serviceVM.document?.data![index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
10.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
(document!.documentName!).toText(fontSize: 16, letterSpacing: -0.56, fontWeight: MyFonts.SemiBold),
if (document.statusText != null && document.statusText!.isNotEmpty) ...[
10.width,
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(),
),
],
],
);
},
);
}
List<ImageModel> isLocalOrNetworkFiles({required ServiceVM model, required DocumentData document}) {

Loading…
Cancel
Save