From 113f1580798019a149b7471060a2a0837e81e787 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Wed, 5 Mar 2025 14:20:47 +0300 Subject: [PATCH] 05 March,2025 --- lib/classes/consts.dart | 3 +- .../offers_unread_chat_model.dart | 35 +++++-- .../provider_offers_model.dart | 8 +- lib/view_models/requests_view_model.dart | 29 ++++++ .../requests/providers_chat_list_page.dart | 9 +- lib/views/requests/review_request_offer.dart | 95 +++++++++++++++---- 6 files changed, 145 insertions(+), 34 deletions(-) diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 041388d..d1c391f 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -179,6 +179,7 @@ class ApiConsts { static String requestOffersSpsGet = "${baseUrlServices}api/RequestManagement/Request_OfferSPs_Get"; static String getServiceRequestsForProvider = "${baseUrlServices}api/RequestManagement/Request_ServiceProvider"; + //Shipping static String shippingRequestStatusUpdate = "${baseUrlServices}api/RequestManagement/ShippingRequestStatus_Update"; static String shippingRequestStatusGet = "${baseUrlServices}api/RequestManagement/ShippingRequestStatus_Get"; @@ -192,7 +193,7 @@ class ApiConsts { static String getChatMessagesForRequests = "${baseUrlServices}api/RequestManagement/ReqOfferChat_Get"; static String getChatMessagesForAds = "${baseUrlServices}api/Advertisement/AdsChat_Get"; static String getChatBuyersForAds = "${baseUrlServices}api/Advertisement/AdsChatBuyer_Get"; - static String reqChatUnreadGet = "${baseUrlServices}api/RequestManagement/Req_ChatUnread_Get"; + static String reqChatUnreadGet = "${baseUrlServices}api/RequestManagement/Req_ChatCount_Get"; //Settings Options static String getAllFAQs = "${baseUrlServices}api/Common/FAQ_Get"; diff --git a/lib/models/requests_models/offers_unread_chat_model.dart b/lib/models/requests_models/offers_unread_chat_model.dart index 9cb2223..1809be1 100644 --- a/lib/models/requests_models/offers_unread_chat_model.dart +++ b/lib/models/requests_models/offers_unread_chat_model.dart @@ -9,24 +9,28 @@ class OffersUnreadChatModel { factory OffersUnreadChatModel.fromJson(Map json) { return OffersUnreadChatModel( - reqTotal: json['reqTotal'], - reqChatUnread: (json['reqChatUnread'] as List).map((e) => OffersUnreadChatDataModel.fromJson(e)).toList(), + reqTotal: json['total'], + reqChatUnread: (json['reqChatCountData'] as List).map((e) => OffersUnreadChatDataModel.fromJson(e)).toList(), ); } } class OffersUnreadChatDataModel { - final String senderUserID; - final int unreadMessagesCount; - final int requestId; - final String lastChatTime; - final String lastChatText; - final String customerName; + String reqTitle; + int reqTotal; + int requestID; + String senderUserID; + int unreadMessagesCount; + String lastChatTime; + String lastChatText; + String customerName; OffersUnreadChatDataModel({ + required this.reqTitle, + required this.reqTotal, + required this.requestID, required this.senderUserID, required this.unreadMessagesCount, - required this.requestId, required this.lastChatTime, required this.lastChatText, required this.customerName, @@ -34,12 +38,23 @@ class OffersUnreadChatDataModel { factory OffersUnreadChatDataModel.fromJson(Map json) { return OffersUnreadChatDataModel( + reqTitle: json['reqTitle'], + reqTotal: json['reqTotal'], + requestID: json['requestID'], senderUserID: json['senderUserID'], unreadMessagesCount: json['unreadMessagesCount'], - requestId: json['requestId'] ?? 0, lastChatTime: json['lastChatTime'], lastChatText: json['lastChatText'], customerName: json['customerName'], ); } } + +// "reqTitle": "Spare_Parts / Ford / Edge / 2016", +// I/flutter (16941): │ "reqTotal": 1, +// I/flutter (16941): │ "requestID": 145, +// I/flutter (16941): │ "senderUserID": "b56bc6bd-e45c-4644-b7c4-08dd02460895", +// I/flutter (16941): │ "unreadMessagesCount": 0, +// I/flutter (16941): │ "lastChatTime": "2025-02-12T10:33:42.1433333", +// I/flutter (16941): │ "lastChatText": "I am accepting this offer.", +// I/flutter (16941): │ "customerName": "Faiz 100" diff --git a/lib/models/requests_models/provider_offers_model.dart b/lib/models/requests_models/provider_offers_model.dart index 00bc433..28d8a8e 100644 --- a/lib/models/requests_models/provider_offers_model.dart +++ b/lib/models/requests_models/provider_offers_model.dart @@ -67,6 +67,8 @@ class ServiceProvidersOffers { int? offerCount; int? requestId; String? providerAddress; + String? providerLatitude; + String? providerLongitude; List? chatMessages; ServiceProvidersOffers({ @@ -82,6 +84,8 @@ class ServiceProvidersOffers { this.createdOn, this.requestOfferStatusEnum, this.providerAddress, + this.providerLatitude, + this.providerLongitude, }); ServiceProvidersOffers.fromJson(Map json, int? reqId) { @@ -95,7 +99,9 @@ class ServiceProvidersOffers { requestId = reqId; createdOn = json['createdOn']; requestOfferStatusEnum = ((json['offerStatusLast']) as int).toRequestOfferStatusEnum(); - providerAddress = "Will be in API in case of self pickup"; + providerAddress = json['address'] ?? ""; + providerLatitude = json['latititude'] ?? "0.0"; + providerLongitude = json['langitude'] ?? "0.0"; chatMessages = []; } diff --git a/lib/view_models/requests_view_model.dart b/lib/view_models/requests_view_model.dart index 24e7bed..b522d69 100644 --- a/lib/view_models/requests_view_model.dart +++ b/lib/view_models/requests_view_model.dart @@ -86,6 +86,27 @@ class RequestsVM extends BaseVM { notifyListeners(); } + RequestDeliveryOptionEnum? selectedDeliveryOptionEnum; + + void updateSelectedDeliveryOptionEnum(RequestDeliveryOptionEnum value) { + for (var value in deliveryOptionsForReviewRequest) { + value.isSelected = false; + } + + int index = deliveryOptionsForReviewRequest.indexWhere((element) => element.id.toRequestDeliveryOptionEnum() == value); + deliveryOptionsForReviewRequest[index].isSelected = true; + selectedDeliveryOptionEnum = value; + selectedDeliveryOptionEnumError = ""; + notifyListeners(); + } + + String selectedDeliveryOptionEnumError = ""; + + void updateSelectedDeliveryOptionEnumError(var value) { + selectedDeliveryOptionEnumError = value; + notifyListeners(); + } + Future getRequests({bool isNeedToRebuild = false}) async { if (isNeedToRebuild) setState(ViewState.busy); applyFilterOnRequestsVM(requestsTypeEnum: RequestsTypeEnum.specialCarRequest); @@ -949,6 +970,14 @@ class RequestsVM extends BaseVM { } } + List deliveryOptionsForReviewRequest = []; + + void populateRequestDeliveryOptions() { + deliveryOptionsForReviewRequest.clear(); + deliveryOptionsForReviewRequest.addAll(myDeliveryOptionsFilterOptions.where((element) => element.id != RequestDeliveryOptionEnum.both.getIdRequestDeliveryOptionEnum()).toList()); + notifyListeners(); + } + Future applyFilterOnDeliveryOption({required RequestDeliveryOptionEnum requestDeliveryOptionEnum}) async { if (myDeliveryOptionsFilterOptions.isEmpty) return; for (var value in myDeliveryOptionsFilterOptions) { diff --git a/lib/views/requests/providers_chat_list_page.dart b/lib/views/requests/providers_chat_list_page.dart index f215de0..34c0134 100644 --- a/lib/views/requests/providers_chat_list_page.dart +++ b/lib/views/requests/providers_chat_list_page.dart @@ -63,6 +63,8 @@ class _ProvidersChatListPageState extends State { requestIndex = requestsVM.myFilteredRequests.indexWhere((request) => request.id == requestID); } + log("requestIndex2: $requestIndex"); + if (requestIndex != -1) { RequestModel request = requestsVM.myFilteredRequests[requestIndex]; requestsVM.updateCurrentSelectedRequest(request); @@ -86,8 +88,6 @@ class _ProvidersChatListPageState extends State { chatViewArgumentsForRequest: chatViewArgumentsForRequest, ); - log("requestIndex2: $requestIndex"); - await chatVM .getRequestsChatMessagesForProvider( customerId: requestDetailPageArguments.requestModel.customerId, @@ -178,7 +178,10 @@ class _ProvidersChatListPageState extends State { ], ), ], - ).onPress(() async => await onChatTapped(context: context, requestID: offersUnreadChatDataModel.requestId ?? 0)).toContainer(isShadowEnabled: true); + ).onPress(() async { + requestsVM.offersUnreadChatModel!.reqChatUnread[index].unreadMessagesCount = 0; + await onChatTapped(context: context, requestID: offersUnreadChatDataModel.requestID ?? 0); + }).toContainer(isShadowEnabled: true); }, separatorBuilder: (context, index) => 16.height, ), diff --git a/lib/views/requests/review_request_offer.dart b/lib/views/requests/review_request_offer.dart index a2b9cf8..7d5c5b4 100644 --- a/lib/views/requests/review_request_offer.dart +++ b/lib/views/requests/review_request_offer.dart @@ -1,3 +1,6 @@ +import 'dart:async'; +import 'dart:developer'; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state.dart'; @@ -9,17 +12,15 @@ import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/user_models/user.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/date_helper.dart'; -import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/utils.dart'; -import 'package:mc_common_app/view_models/chat_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/views/advertisement/ad_creation_steps/ad_review_containers.dart'; import 'package:mc_common_app/views/location_views/pick_location_page.dart'; -import 'package:mc_common_app/views/setting_options/widgets/custom_setting_options_tile.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/filters_list.dart'; import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; @@ -36,6 +37,9 @@ class _ReviewRequestOfferState extends State { @override void initState() { final requestVM = context.read(); + if (requestVM.acceptedRequestOffer != null && requestVM.acceptedRequestOffer!.requestDeliveryOption == RequestDeliveryOptionEnum.both) { + populateRequestDeliveryOptions(); + } if (requestVM.currentSelectedRequest != null && requestVM.currentSelectedRequest!.address.isEmpty) { requestVM.addressSparePartRequestDelivery = ""; @@ -44,6 +48,18 @@ class _ReviewRequestOfferState extends State { super.initState(); } + @override + void dispose() { + super.dispose(); + } + + populateRequestDeliveryOptions() { + scheduleMicrotask(() { + final requestVM = context.read(); + requestVM.populateRequestDeliveryOptions(); + }); + } + Widget buildPersonalInformation() { UserInfo userInfo = AppState().getUser.data!.userInfo!; return Column( @@ -91,10 +107,19 @@ class _ReviewRequestOfferState extends State { Widget buildLocationInformation(BuildContext context) { final requestVM = context.watch(); String address = ""; + if (requestVM.acceptedRequestOffer != null && requestVM.acceptedRequestOffer!.requestDeliveryOption == RequestDeliveryOptionEnum.delivery) { address = requestVM.currentSelectedRequest!.address; - } else { + } else if (requestVM.acceptedRequestOffer != null && requestVM.acceptedRequestOffer!.requestDeliveryOption == RequestDeliveryOptionEnum.selfPickup) { address = requestVM.currentSelectedOffer!.providerAddress ?? ""; + } else { + if (requestVM.selectedDeliveryOptionEnum == RequestDeliveryOptionEnum.delivery) { + address = requestVM.currentSelectedRequest!.address; + } else if (requestVM.selectedDeliveryOptionEnum == RequestDeliveryOptionEnum.selfPickup) { + address = requestVM.currentSelectedOffer!.providerAddress ?? ""; + } else { + address = ""; + } } return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -109,21 +134,48 @@ class _ReviewRequestOfferState extends State { // ], // ), 8.height, - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - SingleDetailWidget(text: address, type: LocaleKeys.location.tr()), + FiltersList( + filterList: requestVM.deliveryOptionsForReviewRequest, + onFilterTapped: (index, selectedFilterId) { + requestVM.updateSelectedDeliveryOptionEnum(selectedFilterId.toRequestDeliveryOptionEnum()); + }, + needLeftPadding: false, + ).paddingOnly(bottom: 8), + if (requestVM.selectedDeliveryOptionEnumError.isNotEmpty) ...[ + requestVM.selectedDeliveryOptionEnumError.toText(fontSize: 12, color: Colors.red), + ], + if (requestVM.selectedDeliveryOptionEnum != null) ...[ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SingleDetailWidget(text: address, type: LocaleKeys.location.tr()), + if (requestVM.selectedDeliveryOptionEnum == RequestDeliveryOptionEnum.selfPickup) ...[ + Row( + children: [ + LocaleKeys.openMapLocation.tr().toText( + fontSize: 12, + isBold: true, + color: MyColors.primaryColor, + isUnderLine: true, + ), + 4.width, + Image.asset( + MyAssets.icRightUpPng, + height: 6, + width: 6, + color: MyColors.primaryColor, + ), + ], + ).onPress(() async { + double latitude, longitude = 0.0; + latitude = double.parse(requestVM.currentSelectedOffer!.providerLatitude ?? "0.0"); + longitude = double.parse(requestVM.currentSelectedOffer!.providerLongitude ?? "0.0"); + await Utils.openLocationInMaps(latitude: latitude, longitude: longitude); + }) ], - ), - // 16.height, - // SingleDetailWidget( - // text: requestVM.additionalAddressSparePartRequestDelivery.isNotEmpty ? requestVM.additionalAddressSparePartRequestDelivery : "N/A", - // type: LocaleKeys.additionalAddressDetails.tr(), - // ), - ], - ), + ], + ), + ], ], ); } @@ -327,8 +379,13 @@ class _ReviewRequestOfferState extends State { title: LocaleKeys.payNow.tr(), isBold: false, onPressed: () { + final requestVM = context.read(); // context.read().updateRequestId(id: requestVM.currentSelectedRequest!.id); - navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypes.request); + if (requestVM.acceptedRequestOffer!.requestDeliveryOption == RequestDeliveryOptionEnum.both && requestVM.selectedDeliveryOptionEnum == null) { + requestVM.updateSelectedDeliveryOptionEnumError(GlobalConsts.deliveryOptionSelectionError); + } else { + navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypes.request); + } }, ), ],