From 98b35fbc614ac8b86389ffcb26f6ac79db86cf95 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Thu, 7 Dec 2023 17:51:04 +0300 Subject: [PATCH] Chat Module almost finished! --- lib/classes/app_state.dart | 2 +- lib/config/routes.dart | 18 +- lib/extensions/string_extensions.dart | 55 +++- .../ss_car_check_schedule_model.dart | 2 +- .../ss_photo_schedule_model.dart | 2 +- .../service_schedule_model.dart | 2 +- lib/models/chat_models/cat_message_model.dart | 70 ++++- .../enums_model.dart | 0 .../generic_resp_model.dart | 0 .../m_response.dart | 0 .../post_params_model.dart | 0 .../widgets_models.dart | 0 lib/models/requests_models/request_model.dart | 71 ++--- lib/repositories/ads_repo.dart | 2 +- lib/repositories/appointment_repo.dart | 4 +- lib/repositories/common_repo.dart | 6 +- lib/repositories/payments_repo.dart | 2 +- lib/repositories/provider_repo.dart | 2 +- lib/repositories/request_repo.dart | 2 +- lib/repositories/user_repo.dart | 2 +- lib/utils/enums.dart | 6 + lib/view_models/ad_view_model.dart | 6 +- lib/view_models/appointments_view_model.dart | 6 +- lib/view_models/chat_view_model.dart | 74 ++++- lib/view_models/requests_view_model.dart | 24 +- lib/view_models/user_view_model.dart | 2 +- .../ad_duration_container.dart | 2 +- .../vehicle_details_container.dart | 2 +- .../ad_duration_selection_sheet_content.dart | 2 +- lib/views/advertisement/ads_detail_view.dart | 2 +- lib/views/advertisement/ads_filter_view.dart | 2 +- .../advertisement/bottom_sheet_content.dart | 2 +- .../advertisement/select_ad_type_view.dart | 2 +- ...appointment_service_pick_bottom_sheet.dart | 2 +- lib/views/chat/chat_view.dart | 259 +++++++++++------- lib/views/requests/create_request_page.dart | 2 +- lib/views/requests/offer_list_page.dart | 17 +- lib/views/requests/widget/request_item.dart | 9 +- .../common_widgets/categories_list.dart | 2 +- lib/widgets/common_widgets/time_slots.dart | 2 +- 40 files changed, 476 insertions(+), 191 deletions(-) rename lib/models/{general => general_models}/enums_model.dart (100%) rename lib/models/{general => general_models}/generic_resp_model.dart (100%) rename lib/models/{general => general_models}/m_response.dart (100%) rename lib/models/{general => general_models}/post_params_model.dart (100%) rename lib/models/{general => general_models}/widgets_models.dart (100%) diff --git a/lib/classes/app_state.dart b/lib/classes/app_state.dart index 02ba4b9..1379646 100644 --- a/lib/classes/app_state.dart +++ b/lib/classes/app_state.dart @@ -1,5 +1,5 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:mc_common_app/models/general/post_params_model.dart'; +import 'package:mc_common_app/models/general_models/post_params_model.dart'; import 'package:mc_common_app/models/user_models/user.dart'; import 'package:mc_common_app/utils/enums.dart'; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 0db2a2c..3da4861 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,4 +1,7 @@ +import 'package:mc_common_app/models/requests_models/offers_model.dart'; +import 'package:mc_common_app/models/requests_models/request_model.dart'; import 'package:mc_common_app/models/user_models/register_user.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/views/user/change_email_page.dart'; import 'package:mc_common_app/views/user/change_mobile_page.dart'; @@ -74,7 +77,6 @@ class AppRoutes { static const String requestsDetailPage = "/requestsDetailPage"; static const String sendOfferPage = "/sendOfferPage"; - //Setting Options static const String settingOptionsFaqs = "/settingOptionsFaqs"; static const String settingOptionsLanguages = "/settingOptionsLanguages"; @@ -106,3 +108,17 @@ class AppRoutes { editAccountPage: (context) => const EditAccountPage(), }; } + +class ChatViewArguments { + final RequestModel? requestModel; + final ChatTypeEnum chatTypeEnum; + + ChatViewArguments({required this.chatTypeEnum, this.requestModel}); +} + +class OfferListPageArguments { + final List offersList; + final RequestModel? requestModel; + + OfferListPageArguments({required this.offersList, this.requestModel}); +} diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 744d93e..d25ffd3 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -550,11 +550,22 @@ extension FormatMonthByNumber on String { } extension ChatMessageTypeEnumExt on int { + //FreeText = 1, + // Image = 2, + // Audio = 3, + // Video = 4, + // Offer = 5 ChatMessageTypeEnum toChatMessageTypeEnum() { if (this == 1) { return ChatMessageTypeEnum.freeText; } else if (this == 2) { - return ChatMessageTypeEnum.freeText; + return ChatMessageTypeEnum.image; + } else if (this == 3) { + return ChatMessageTypeEnum.audio; + } else if (this == 4) { + return ChatMessageTypeEnum.video; + } else if (this == 5) { + return ChatMessageTypeEnum.offer; } return ChatMessageTypeEnum.freeText; } @@ -565,18 +576,23 @@ extension ChatMessageTypeToInt on ChatMessageTypeEnum { switch (this) { case ChatMessageTypeEnum.freeText: return 1; - - case ChatMessageTypeEnum.offer: + case ChatMessageTypeEnum.image: return 2; + case ChatMessageTypeEnum.audio: + return 3; + case ChatMessageTypeEnum.video: + return 4; + case ChatMessageTypeEnum.offer: + return 5; default: - return 0; + return 1; } } } extension RequestOfferStatusEnumExt on int { - RequestOfferStatusEnum toChatMessageTypeEnum() { + RequestOfferStatusEnum toRequestOfferStatusEnum() { if (this == 1) { return RequestOfferStatusEnum.offer; } else if (this == 2) { @@ -611,3 +627,32 @@ extension RequestOfferStatusEnumToInt on RequestOfferStatusEnum { } } } + +extension ChatTypeEnumExt on int { + ChatTypeEnum toChatTypeEnum() { + if (this == 1) { + return ChatTypeEnum.general; + } else if (this == 2) { + return ChatTypeEnum.ads; + } else if (this == 3) { + return ChatTypeEnum.requestOffer; + } + return ChatTypeEnum.general; + } +} + +extension ChatTypeEnumToInt on ChatTypeEnum { + int getIdFromChatTypeEnum() { + switch (this) { + case ChatTypeEnum.general: + return 1; + case ChatTypeEnum.ads: + return 2; + case ChatTypeEnum.requestOffer: + return 3; + + default: + return 1; + } + } +} diff --git a/lib/models/advertisment_models/ss_car_check_schedule_model.dart b/lib/models/advertisment_models/ss_car_check_schedule_model.dart index bd15655..c8de10a 100644 --- a/lib/models/advertisment_models/ss_car_check_schedule_model.dart +++ b/lib/models/advertisment_models/ss_car_check_schedule_model.dart @@ -1,5 +1,5 @@ import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; class SSCarCheckScheduleModel { int? serviceProviderID; diff --git a/lib/models/advertisment_models/ss_photo_schedule_model.dart b/lib/models/advertisment_models/ss_photo_schedule_model.dart index 048c42b..6aa7f54 100644 --- a/lib/models/advertisment_models/ss_photo_schedule_model.dart +++ b/lib/models/advertisment_models/ss_photo_schedule_model.dart @@ -1,6 +1,6 @@ import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; class SSPhotoOfficeScheduleModel { int? photoOfficeID; diff --git a/lib/models/appointments_models/service_schedule_model.dart b/lib/models/appointments_models/service_schedule_model.dart index 8a30e93..7d9444f 100644 --- a/lib/models/appointments_models/service_schedule_model.dart +++ b/lib/models/appointments_models/service_schedule_model.dart @@ -1,6 +1,6 @@ import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/services_models/service_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; class CustomTimeDateSlotModel { TimeSlotModel? date; diff --git a/lib/models/chat_models/cat_message_model.dart b/lib/models/chat_models/cat_message_model.dart index ca8d778..09e7844 100644 --- a/lib/models/chat_models/cat_message_model.dart +++ b/lib/models/chat_models/cat_message_model.dart @@ -1,26 +1,54 @@ +import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/utils/enums.dart'; + class ChatMessageModel { String? senderUserID; String? senderName; int? messageType; + ChatMessageTypeEnum? messageTypeEnum; String? message; RequestOffer? requestOffer; int? requestID; int? requestOfferID; + bool? isMyMessage; - ChatMessageModel({this.senderUserID, this.senderName, this.messageType, this.message, this.requestOffer, this.requestID, this.requestOfferID}); + ChatMessageModel({ + this.senderUserID, + this.senderName, + this.messageType, + this.message, + this.requestOffer, + this.requestID, + this.requestOfferID, + this.isMyMessage = true, + }); ChatMessageModel.fromJson(Map json) { + final myUserId = AppState().getUser.data!.userInfo!.userId.toString(); senderUserID = json['senderUserID']; senderName = json['senderName']; messageType = json['messageType']; + messageTypeEnum = (json['messageType'] as int).toChatMessageTypeEnum(); message = json['message']; - if (json['requestOffer'] != null) { - requestOffer = RequestOffer.fromJson(json['requestOffer']); - } else { - requestOffer = null; - } + requestOffer = json['requestOffer'] != null ? RequestOffer.fromJson(json['requestOffer']) : null; requestID = json['requestID']; requestOfferID = json['requestOfferID']; + isMyMessage = (json['senderUserId']).toString() == myUserId; + } + + Map toJson() { + final Map data = {}; + data['senderUserID'] = senderUserID; + data['senderName'] = senderName; + data['messageType'] = messageType; + data['message'] = message; + if (requestOffer != null) { + data['requestOffer'] = requestOffer!.toJson(); + } + data['requestID'] = requestID; + data['requestOfferID'] = requestOfferID; + return data; } } @@ -29,21 +57,47 @@ class RequestOffer { int? requestID; int? serviceProviderID; int? offerStatus; + RequestOfferStatusEnum? requestOfferStatusEnum; String? comment; - int? price; + double? price; String? offeredItemCreatedBy; String? offeredItemCreatedOn; - RequestOffer({this.id, this.requestID, this.serviceProviderID, this.offerStatus, this.comment, this.price, this.offeredItemCreatedBy, this.offeredItemCreatedOn}); + RequestOffer({ + this.id, + this.requestID, + this.serviceProviderID, + this.offerStatus, + this.comment, + this.price, + this.offeredItemCreatedBy, + this.offeredItemCreatedOn, + this.requestOfferStatusEnum = RequestOfferStatusEnum.offer, + }); RequestOffer.fromJson(Map json) { id = json['id']; requestID = json['requestID']; serviceProviderID = json['serviceProviderID']; offerStatus = json['offerStatus']; + offerStatus = json['offerStatus']; + requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum(); comment = json['comment']; price = json['price']; offeredItemCreatedBy = json['offeredItemCreatedBy']; offeredItemCreatedOn = json['offeredItemCreatedOn']; } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['requestID'] = requestID; + data['serviceProviderID'] = serviceProviderID; + data['offerStatus'] = offerStatus; + data['comment'] = comment; + data['price'] = price; + data['offeredItemCreatedBy'] = offeredItemCreatedBy; + data['offeredItemCreatedOn'] = offeredItemCreatedOn; + return data; + } } diff --git a/lib/models/general/enums_model.dart b/lib/models/general_models/enums_model.dart similarity index 100% rename from lib/models/general/enums_model.dart rename to lib/models/general_models/enums_model.dart diff --git a/lib/models/general/generic_resp_model.dart b/lib/models/general_models/generic_resp_model.dart similarity index 100% rename from lib/models/general/generic_resp_model.dart rename to lib/models/general_models/generic_resp_model.dart diff --git a/lib/models/general/m_response.dart b/lib/models/general_models/m_response.dart similarity index 100% rename from lib/models/general/m_response.dart rename to lib/models/general_models/m_response.dart diff --git a/lib/models/general/post_params_model.dart b/lib/models/general_models/post_params_model.dart similarity index 100% rename from lib/models/general/post_params_model.dart rename to lib/models/general_models/post_params_model.dart diff --git a/lib/models/general/widgets_models.dart b/lib/models/general_models/widgets_models.dart similarity index 100% rename from lib/models/general/widgets_models.dart rename to lib/models/general_models/widgets_models.dart diff --git a/lib/models/requests_models/request_model.dart b/lib/models/requests_models/request_model.dart index 1bfa418..5ee653e 100644 --- a/lib/models/requests_models/request_model.dart +++ b/lib/models/requests_models/request_model.dart @@ -10,6 +10,7 @@ class RequestModel { String vehicleTypeName; String countryName; String customerName; + String customerID; dynamic serviceProviders; int offerCount; int id; @@ -43,6 +44,7 @@ class RequestModel { required this.vehicleTypeName, required this.countryName, required this.customerName, + required this.customerID, required this.serviceProviders, required this.offerCount, required this.id, @@ -68,39 +70,42 @@ class RequestModel { required this.modifiedOn, }); - factory RequestModel.fromJson(Map json) => RequestModel( - requestType: json["requestType"], - requestTypeName: json["requestTypeName"], - requestStatusName: json["requestStatusName"], - requestStatus: (json['requestStatus'] as int).toRequestStatusEnum(), - cityName: json["cityName"], - vehicleTypeName: json["vehicleTypeName"], - countryName: json["countryName"], - customerName: json["customerName"], - serviceProviders: json["serviceProviders"], - offerCount: json["offerCount"], - id: json["id"], - customerId: json["customerID"], - customer: json["customer"], - brand: json["brand"], - model: json["model"], - year: json["year"], - isNew: json["isNew"], - description: json["description"], - requestImages: List.from(json["requestImages"].map((x) => x)), - cityId: json["cityID"], - city: json["city"], - price: json["price"], - paymentStatus: json["paymentStatus"], - vehicleTypeId: json["vehicleTypeID"], - countryId: json["countryID"], - requestProviderItem: List.from(json["requestProviderItem"].map((x) => x)), - isActive: json["isActive"], - createdBy: json["createdBy"], - createdOn: DateTime.parse(json["createdOn"]), - modifiedBy: json["modifiedBy"], - modifiedOn: json["modifiedOn"], - ); + factory RequestModel.fromJson(Map json) { + return RequestModel( + requestType: json["requestType"], + requestTypeName: json["requestTypeName"], + requestStatusName: json["requestStatusName"], + requestStatus: (json['requestStatus'] as int).toRequestStatusEnum(), + cityName: json["cityName"], + vehicleTypeName: json["vehicleTypeName"], + countryName: json["countryName"], + customerName: json["customerName"], + customerID: json["customerUserID"], + serviceProviders: json["serviceProviders"], + offerCount: json["offerCount"], + id: json["id"], + customerId: json["customerID"], + customer: json["customer"], + brand: json["brand"], + model: json["model"], + year: json["year"], + isNew: json["isNew"], + description: json["description"], + requestImages: List.from(json["requestImages"].map((x) => x)), + cityId: json["cityID"], + city: json["city"], + price: json["price"], + paymentStatus: json["paymentStatus"], + vehicleTypeId: json["vehicleTypeID"], + countryId: json["countryID"], + requestProviderItem: List.from(json["requestProviderItem"].map((x) => x)), + isActive: json["isActive"], + createdBy: json["createdBy"], + createdOn: DateTime.parse(json["createdOn"]), + modifiedBy: json["modifiedBy"], + modifiedOn: json["modifiedOn"], + ); + } Map toJson() => { "requestType": requestType, diff --git a/lib/repositories/ads_repo.dart b/lib/repositories/ads_repo.dart index 728cfb5..0f419fa 100644 --- a/lib/repositories/ads_repo.dart +++ b/lib/repositories/ads_repo.dart @@ -11,7 +11,7 @@ import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart import 'package:mc_common_app/models/advertisment_models/reserved_ads_models.dart'; import 'package:mc_common_app/models/advertisment_models/special_service_model.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/utils/enums.dart'; abstract class AdsRepo { diff --git a/lib/repositories/appointment_repo.dart b/lib/repositories/appointment_repo.dart index 3f53f24..9bd8d14 100644 --- a/lib/repositories/appointment_repo.dart +++ b/lib/repositories/appointment_repo.dart @@ -4,8 +4,8 @@ import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; -import 'package:mc_common_app/models/general/m_response.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/services.dart'; import 'package:mc_common_app/models/appointments_models/schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; diff --git a/lib/repositories/common_repo.dart b/lib/repositories/common_repo.dart index 26cc5f5..b9d5209 100644 --- a/lib/repositories/common_repo.dart +++ b/lib/repositories/common_repo.dart @@ -4,14 +4,14 @@ import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/models/advertisment_models/ss_car_check_schedule_model.dart'; import 'package:mc_common_app/models/advertisment_models/ss_photo_schedule_model.dart'; +import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/enums_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/user_models/cities.dart'; import 'package:mc_common_app/models/user_models/country.dart'; import 'package:mc_common_app/models/user_models/role.dart'; -import '../models/advertisment_models/vehicle_details_models.dart'; -import '../models/general/enums_model.dart'; abstract class CommonRepo { Future getAllCountries(); diff --git a/lib/repositories/payments_repo.dart b/lib/repositories/payments_repo.dart index d760546..7f72e8b 100644 --- a/lib/repositories/payments_repo.dart +++ b/lib/repositories/payments_repo.dart @@ -2,7 +2,7 @@ import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/payment_models/pay_order_detail_resp_model.dart'; abstract class PaymentsRepo { diff --git a/lib/repositories/provider_repo.dart b/lib/repositories/provider_repo.dart index 36a9a39..b327a17 100644 --- a/lib/repositories/provider_repo.dart +++ b/lib/repositories/provider_repo.dart @@ -4,7 +4,7 @@ import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart'; diff --git a/lib/repositories/request_repo.dart b/lib/repositories/request_repo.dart index ffaa33d..e5b9967 100644 --- a/lib/repositories/request_repo.dart +++ b/lib/repositories/request_repo.dart @@ -2,7 +2,7 @@ import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/requests_models/offers_model.dart'; import 'package:mc_common_app/models/requests_models/request_model.dart'; diff --git a/lib/repositories/user_repo.dart b/lib/repositories/user_repo.dart index dba85f4..4e6756e 100644 --- a/lib/repositories/user_repo.dart +++ b/lib/repositories/user_repo.dart @@ -7,7 +7,7 @@ import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; -import 'package:mc_common_app/models/general/m_response.dart'; +import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/user_models/basic_otp.dart'; import 'package:mc_common_app/models/user_models/change_email.dart'; import 'package:mc_common_app/models/user_models/change_mobile.dart'; diff --git a/lib/utils/enums.dart b/lib/utils/enums.dart index e0a9505..395bb64 100644 --- a/lib/utils/enums.dart +++ b/lib/utils/enums.dart @@ -172,3 +172,9 @@ enum RequestOfferStatusEnum { rejected, cancel, } + +enum ChatTypeEnum { + general, + ads, + requestOffer, +} diff --git a/lib/view_models/ad_view_model.dart b/lib/view_models/ad_view_model.dart index 114b4b5..3120c45 100644 --- a/lib/view_models/ad_view_model.dart +++ b/lib/view_models/ad_view_model.dart @@ -15,10 +15,10 @@ import 'package:mc_common_app/models/advertisment_models/special_service_model.d import 'package:mc_common_app/models/advertisment_models/ss_car_check_schedule_model.dart'; import 'package:mc_common_app/models/advertisment_models/ss_photo_schedule_model.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; -import 'package:mc_common_app/models/general/enums_model.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/enums_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/repositories/ads_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/services/common_services.dart'; diff --git a/lib/view_models/appointments_view_model.dart b/lib/view_models/appointments_view_model.dart index 10c0e4d..f55b9d7 100644 --- a/lib/view_models/appointments_view_model.dart +++ b/lib/view_models/appointments_view_model.dart @@ -4,14 +4,14 @@ import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; -import 'package:mc_common_app/models/general/enums_model.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/general_models/enums_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/service_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/repositories/appointment_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/repositories/provider_repo.dart'; diff --git a/lib/view_models/chat_view_model.dart b/lib/view_models/chat_view_model.dart index be00103..f91ce50 100644 --- a/lib/view_models/chat_view_model.dart +++ b/lib/view_models/chat_view_model.dart @@ -1,7 +1,10 @@ +import 'dart:convert'; + import 'package:flutter/cupertino.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/main.dart'; +import 'package:mc_common_app/models/chat_models/cat_message_model.dart'; import 'package:mc_common_app/repositories/chat_repo.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/utils.dart'; @@ -14,14 +17,34 @@ class ChatVM extends ChangeNotifier { late HubConnection hubConnection; + List chatMessages = []; + + String chatMessageText = ""; + + updateChatMessageText(String value) { + chatMessageText = value; + } + + Future onNewMessageReceived({required List messages}) async { + chatMessages.addAll(messages); + notifyListeners(); + } + Future buildHubConnection() async { // if (hubConnection.state != HubConnectionState.Connected) { try { hubConnection = await chatRepo.getHubConnection(); await hubConnection.start(); hubConnection.on("ReceiveMessageRequestOffer", (List? arguments) { - print("this is the offer: ${arguments.toString()}"); + if (arguments == null || arguments.isEmpty) return; + List chat = []; + for (var message in arguments) { + final chatMessage = ChatMessageModel.fromJson(message as Map); + chat.add(chatMessage); + } + onNewMessageReceived(messages: chat); Utils.showToast("I received ping : ${arguments.toString()}"); + logger.i("I received ping : ${arguments.toString()}"); }); } catch (e) { logger.i("Error: ${e.toString()}"); @@ -31,14 +54,18 @@ class ChatVM extends ChangeNotifier { // } } - Future onSendMessageForRequestOffer( - {required String receiverId, required ChatMessageTypeEnum chatMessageType, required String message, required int requestId, required String offerPrice}) async { + Future onSendMessageForRequestOffer({ + required String receiverId, + required ChatMessageTypeEnum chatMessageType, + required String message, + required int requestId, + required String offerPrice, + }) async { if (hubConnection.state != HubConnectionState.connected) { await buildHubConnection(); } if (hubConnection.state == HubConnectionState.connected) { final providerId = AppState().getUser.data!.userInfo!.providerId; - print("providerId: $providerId"); hubConnection.invoke( "SendMessageRequestOffer", args: [ @@ -65,4 +92,43 @@ class ChatVM extends ChangeNotifier { } return true; } + + Future onTextMessageSend({ + required String receiverId, + required ChatMessageTypeEnum chatMessageType, + required String message, + required int requestId, + required String offerPrice, + }) async { + if (hubConnection.state != HubConnectionState.connected) { + await buildHubConnection(); + } + if (hubConnection.state == HubConnectionState.connected) { + final providerId = AppState().getUser.data!.userInfo!.providerId; + hubConnection.invoke( + "SendMessageRequestOffer", + args: [ + { + "ReceiverUserID": receiverId, + "MessageType": chatMessageType.getIdFromChatMessageTypeEnum(), + "Message": message, + "RequestID": requestId, + // "RequestOfferID": 0, + // "RequestOffer": { + // "RequestID": requestId, + // "Price": double.parse(offerPrice), + // "ServiceProviderID": providerId, + // "OfferStatus": RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(), + // "Comment": message, + // }, + } + ], + ).catchError((e) { + logger.i("error in invoking SendMessageRequestOffer: ${e.toString()}"); + Utils.showToast(e.toString()); + return false; + }); + } + return true; + } } diff --git a/lib/view_models/requests_view_model.dart b/lib/view_models/requests_view_model.dart index 44f6f4c..d751286 100644 --- a/lib/view_models/requests_view_model.dart +++ b/lib/view_models/requests_view_model.dart @@ -1,19 +1,24 @@ +// ignore_for_file: use_build_context_synchronously + import 'dart:convert'; import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; -import 'package:mc_common_app/models/general/enums_model.dart'; -import 'package:mc_common_app/models/general/generic_resp_model.dart'; +import 'package:mc_common_app/models/chat_models/cat_message_model.dart'; +import 'package:mc_common_app/models/general_models/enums_model.dart'; +import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/requests_models/offers_model.dart'; import 'package:mc_common_app/models/requests_models/request_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/repositories/request_repo.dart'; import 'package:mc_common_app/services/common_services.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/base_view_model.dart'; import 'package:mc_common_app/view_models/chat_view_model.dart'; @@ -384,7 +389,14 @@ class RequestsVM extends BaseVM { notifyListeners(); } - Future onSendOfferPressed({required BuildContext context, required String receiverId, required String message, required int requestId, required String offerPrice}) async { + Future onSendOfferPressed({ + required BuildContext context, + required String receiverId, + required String message, + required int requestId, + required String offerPrice, + required RequestModel requestModel, + }) async { if (isSendOfferValidated()) { bool status = await context.read().onSendMessageForRequestOffer( receiverId: receiverId, @@ -397,6 +409,10 @@ class RequestsVM extends BaseVM { if (status) { // resetSendOfferBottomSheet(); Navigator.pop(context); + ChatMessageModel chatMessageModel = ChatMessageModel(isMyMessage: true, message: message, messageType: ChatMessageTypeEnum.freeText, ); + context.read().onNewMessageReceived(messages: messages); + ChatViewArguments chatViewArguments = ChatViewArguments(chatTypeEnum: ChatTypeEnum.requestOffer, requestModel: requestModel); + navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments); } } } diff --git a/lib/view_models/user_view_model.dart b/lib/view_models/user_view_model.dart index ac41cd1..708bc18 100644 --- a/lib/view_models/user_view_model.dart +++ b/lib/view_models/user_view_model.dart @@ -8,7 +8,7 @@ import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; -import 'package:mc_common_app/models/general/m_response.dart'; +import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/user_models/basic_otp.dart'; import 'package:mc_common_app/models/user_models/change_email.dart'; import 'package:mc_common_app/models/user_models/change_mobile.dart'; diff --git a/lib/views/advertisement/ad_creation_steps/ad_duration_container.dart b/lib/views/advertisement/ad_creation_steps/ad_duration_container.dart index 0e979cb..139ba00 100644 --- a/lib/views/advertisement/ad_creation_steps/ad_duration_container.dart +++ b/lib/views/advertisement/ad_creation_steps/ad_duration_container.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; diff --git a/lib/views/advertisement/ad_creation_steps/vehicle_details_container.dart b/lib/views/advertisement/ad_creation_steps/vehicle_details_container.dart index 6405510..8b0b247 100644 --- a/lib/views/advertisement/ad_creation_steps/vehicle_details_container.dart +++ b/lib/views/advertisement/ad_creation_steps/vehicle_details_container.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/views/advertisement/ad_creation_steps/ad_creation_steps_containers.dart'; diff --git a/lib/views/advertisement/ad_duration_selection_sheet_content.dart b/lib/views/advertisement/ad_duration_selection_sheet_content.dart index 47a2524..c0758f6 100644 --- a/lib/views/advertisement/ad_duration_selection_sheet_content.dart +++ b/lib/views/advertisement/ad_duration_selection_sheet_content.dart @@ -3,7 +3,7 @@ import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; diff --git a/lib/views/advertisement/ads_detail_view.dart b/lib/views/advertisement/ads_detail_view.dart index 1117492..9a955cf 100644 --- a/lib/views/advertisement/ads_detail_view.dart +++ b/lib/views/advertisement/ads_detail_view.dart @@ -9,7 +9,7 @@ import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/special_service_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/enums.dart'; diff --git a/lib/views/advertisement/ads_filter_view.dart b/lib/views/advertisement/ads_filter_view.dart index 51d4d38..dd1247a 100644 --- a/lib/views/advertisement/ads_filter_view.dart +++ b/lib/views/advertisement/ads_filter_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; diff --git a/lib/views/advertisement/bottom_sheet_content.dart b/lib/views/advertisement/bottom_sheet_content.dart index a91b36a..1b7a5b9 100644 --- a/lib/views/advertisement/bottom_sheet_content.dart +++ b/lib/views/advertisement/bottom_sheet_content.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; diff --git a/lib/views/advertisement/select_ad_type_view.dart b/lib/views/advertisement/select_ad_type_view.dart index 0a8af7d..d8acbf9 100644 --- a/lib/views/advertisement/select_ad_type_view.dart +++ b/lib/views/advertisement/select_ad_type_view.dart @@ -4,7 +4,7 @@ import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; diff --git a/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart b/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart index 384b6d9..b086514 100644 --- a/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart +++ b/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/view_models/appointments_view_model.dart'; diff --git a/lib/views/chat/chat_view.dart b/lib/views/chat/chat_view.dart index 62ff217..269371a 100644 --- a/lib/views/chat/chat_view.dart +++ b/lib/views/chat/chat_view.dart @@ -1,66 +1,88 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/models/chat_models/cat_message_model.dart'; import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/enums.dart'; +import 'package:mc_common_app/view_models/chat_view_model.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/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; +import 'package:provider/provider.dart'; class ChatView extends StatelessWidget { - const ChatView({super.key}); + final ChatViewArguments chatViewArguments; + + const ChatView({super.key, required this.chatViewArguments}); @override Widget build(BuildContext context) { return Scaffold( appBar: const CustomAppBar(title: "Chat"), - body: Column( - children: [ - Expanded( - child: ListView.separated( - itemCount: 15, - separatorBuilder: (BuildContext context, int index) => 20.height, - itemBuilder: (BuildContext context, int index) { - return ChatMessageCustomWidget( - isSent: index.isOdd, - profileUrl: MyAssets.bnCar, - messageText: "Hi, How Are you? I can help you out with the desired request.", - messageTypeEnum: index == 10 - ? (MessageTypeEnum.newOfferRequired) - : index == 12 - ? (MessageTypeEnum.offerProvided) - : (MessageTypeEnum.text), - senderName: "Al Abdullah Cars", - ); - }).horPaddingMain(), - ), - 10.width, - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - flex: 7, - child: TxtField( - // value: adVM.vehicleDemandAmount, - // errorValue: adVM.demandAmountError, - hint: "Type your message here..", - keyboardType: TextInputType.text, - isNeedBorder: false, - onChanged: (v) => null, + body: Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) { + return Column( + children: [ + Expanded( + child: ListView.separated( + itemCount: chatVM.chatMessages.length, + separatorBuilder: (BuildContext context, int index) => 20.height, + itemBuilder: (BuildContext context, int index) { + ChatMessageModel chatMessageModel = chatVM.chatMessages[index]; + return ChatMessageCustomWidget( + isSent: chatMessageModel.isMyMessage ?? false, + profileUrl: MyAssets.bnCar, + messageText: "${chatMessageModel.message}", + messageTypeEnum: chatMessageModel.messageTypeEnum ?? ChatMessageTypeEnum.freeText, + requestOfferStatusEnum: + (chatMessageModel.requestOffer != null ? chatMessageModel.requestOffer!.requestOfferStatusEnum : RequestOfferStatusEnum.offer) ?? RequestOfferStatusEnum.offer, + senderName: "${chatMessageModel.senderName}", + ); + }).horPaddingMain(), + ), + 10.width, + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 7, + child: TxtField( + value: chatVM.chatMessageText, + hint: "Type your message here..", + keyboardType: TextInputType.text, + isNeedBorder: false, + onChanged: (v) => chatVM.updateChatMessageText(v), + ), ), - ), - Expanded( + Expanded( flex: 1, child: const Icon( Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30, - ).onPress(() {})) - ], - ).toContainer(isShadowEnabled: true), - ], - ), + ).onPress( + () async { + final status = await chatVM.onTextMessageSend( + receiverId: "7db5e1ae-6de4-47d7-984b-08db2842f899", //Todo: This should be managed somehow!! + message: chatVM.chatMessageText, + requestId: chatViewArguments.chatTypeEnum == ChatTypeEnum.requestOffer ? chatViewArguments.requestModel!.id : 0, + offerPrice: "0.0", + chatMessageType: ChatMessageTypeEnum.freeText, + ); + + if (status) { + chatVM.updateChatMessageText(""); + } + }, + ), + ) + ], + ).toContainer(isShadowEnabled: true), + ], + ); + }), // body: ); } @@ -70,7 +92,8 @@ class ChatMessageCustomWidget extends StatelessWidget { final String profileUrl; final String senderName; final String messageText; - final MessageTypeEnum messageTypeEnum; + final ChatMessageTypeEnum messageTypeEnum; + final RequestOfferStatusEnum requestOfferStatusEnum; final bool isSent; const ChatMessageCustomWidget({ @@ -79,9 +102,107 @@ class ChatMessageCustomWidget extends StatelessWidget { required this.senderName, required this.messageText, required this.messageTypeEnum, + this.requestOfferStatusEnum = RequestOfferStatusEnum.offer, required this.isSent, }); + Widget buildOfferDetailsInChatMessage({required RequestOfferStatusEnum requestOfferStatusEnum}) { + switch (requestOfferStatusEnum) { + case RequestOfferStatusEnum.offer: + return Column( + children: [ + 5.height, + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + "40000".toText(fontSize: 19, isBold: true), + 2.width, + "SAR".toText(color: MyColors.lightTextColor, height: 2.2, fontSize: 10, isBold: true), + ], + ), + 10.height, + Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 27, + title: "Accept", + fontSize: 9, + borderColor: MyColors.greenColor, + isFilled: false, + onPressed: () {}, + backgroundColor: MyColors.white, + txtColor: MyColors.greenColor, + ), + ), + 20.width, + Expanded( + child: ShowFillButton( + maxHeight: 27, + title: "Reject", + borderColor: MyColors.redColor, + isFilled: false, + onPressed: () {}, + backgroundColor: MyColors.white, + txtColor: MyColors.redColor, + fontSize: 9, + ), + ) + ], + ), + ], + ); + case RequestOfferStatusEnum.negotiate: + return Column( + children: [ + Center( + child: "You asked for the new offer.".toText( + color: MyColors.adPendingStatusColor, + fontSize: 12, + isItalic: true, + ), + ).toContainer(borderRadius: 40, width: double.infinity, backgroundColor: MyColors.adPendingStatusColor.withOpacity(0.16)), + ], + ); + case RequestOfferStatusEnum.accepted: + return Column( + children: [ + Center( + child: "You have accepted the offer.".toText( + color: MyColors.adPendingStatusColor, + fontSize: 12, + isItalic: true, + ), + ).toContainer(borderRadius: 40, width: double.infinity, backgroundColor: MyColors.adPendingStatusColor.withOpacity(0.16)), + ], + ); + case RequestOfferStatusEnum.rejected: + return Column( + children: [ + Center( + child: "You have rejected the offer.".toText( + color: MyColors.adPendingStatusColor, + fontSize: 12, + isItalic: true, + ), + ).toContainer(borderRadius: 40, width: double.infinity, backgroundColor: MyColors.adPendingStatusColor.withOpacity(0.16)), + ], + ); + case RequestOfferStatusEnum.cancel: + return Column( + children: [ + Center( + child: "You have cancelled the offer.".toText( + color: MyColors.adPendingStatusColor, + fontSize: 12, + isItalic: true, + ), + ).toContainer(borderRadius: 40, width: double.infinity, backgroundColor: MyColors.adPendingStatusColor.withOpacity(0.16)), + ], + ); + } + } + @override Widget build(BuildContext context) { return Directionality( @@ -125,56 +246,8 @@ class ChatMessageCustomWidget extends StatelessWidget { ), ], ), - if (messageTypeEnum == MessageTypeEnum.offerProvided || messageTypeEnum == MessageTypeEnum.newOfferRequired) ...[ - 5.height, - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - "40000".toText(fontSize: 19, isBold: true), - 2.width, - "SAR".toText(color: MyColors.lightTextColor, height: 2.2, fontSize: 10, isBold: true), - ], - ), - 10.height, - if (messageTypeEnum == MessageTypeEnum.newOfferRequired) ...[ - Center( - child: "You asked for the new offer.".toText( - color: MyColors.adPendingStatusColor, - fontSize: 12, - isItalic: true, - ), - ).toContainer(borderRadius: 40, width: double.infinity, backgroundColor: MyColors.adPendingStatusColor.withOpacity(0.16)), - ] else ...[ - Row( - children: [ - Expanded( - child: ShowFillButton( - maxHeight: 27, - title: "Accept", - fontSize: 9, - borderColor: MyColors.greenColor, - isFilled: false, - onPressed: () {}, - backgroundColor: MyColors.white, - txtColor: MyColors.greenColor, - ), - ), - 20.width, - Expanded( - child: ShowFillButton( - maxHeight: 27, - title: "Reject", - borderColor: MyColors.redColor, - isFilled: false, - onPressed: () {}, - backgroundColor: MyColors.white, - txtColor: MyColors.redColor, - fontSize: 9, - ), - ) - ], - ), - ], + if (messageTypeEnum == ChatMessageTypeEnum.offer) ...[ + buildOfferDetailsInChatMessage(requestOfferStatusEnum: requestOfferStatusEnum), ], ], ).toContainer( @@ -191,5 +264,3 @@ class ChatMessageCustomWidget extends StatelessWidget { ); } } - -enum MessageTypeEnum { text, picture, offerProvided, recording, video, newOfferRequired } diff --git a/lib/views/requests/create_request_page.dart b/lib/views/requests/create_request_page.dart index cb12e6c..43bc84c 100644 --- a/lib/views/requests/create_request_page.dart +++ b/lib/views/requests/create_request_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/views/advertisement/ad_creation_steps/ad_creation_steps_containers.dart'; import 'package:mc_common_app/views/advertisement/picked_images_container.dart'; diff --git a/lib/views/requests/offer_list_page.dart b/lib/views/requests/offer_list_page.dart index 995e863..51f078b 100644 --- a/lib/views/requests/offer_list_page.dart +++ b/lib/views/requests/offer_list_page.dart @@ -4,24 +4,26 @@ import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/requests_models/offers_model.dart'; import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; class OfferListPage extends StatelessWidget { - final List offersList; + final OfferListPageArguments offerListPageArguments; - OfferListPage({required this.offersList}); + const OfferListPage({super.key, required this.offerListPageArguments}); @override Widget build(BuildContext context) { + final List offersList = offerListPageArguments.offersList; return Scaffold( - appBar: CustomAppBar(title: "Offers"), + appBar: const CustomAppBar(title: "Offers"), body: offersList.isEmpty ? Center(child: "No Requests to show.".toText(fontSize: 16, color: MyColors.lightTextColor)) : ListView.separated( itemCount: offersList.length, - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), itemBuilder: (context, index) { OffersModel offersModel = offersList[index]; return Stack( @@ -33,7 +35,7 @@ class OfferListPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ - "${offersModel.serviceProvider!.companyName ?? ""}".toText(fontSize: 16, isBold: true), + (offersModel.serviceProvider!.companyName ?? "").toText(fontSize: 16, isBold: true), //Un read offers count @@ -70,14 +72,15 @@ class OfferListPage extends StatelessWidget { ), ], ), - Icon( + const Icon( Icons.arrow_forward, color: MyColors.darkIconColor, size: 18, ), ], ).onPress(() { - navigateWithName(context, AppRoutes.chatView); + ChatViewArguments chatViewArguments = ChatViewArguments(chatTypeEnum: ChatTypeEnum.requestOffer, requestModel: offerListPageArguments.requestModel); + navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments); }).toContainer(isShadowEnabled: true); }, separatorBuilder: (context, index) => 16.height, diff --git a/lib/views/requests/widget/request_item.dart b/lib/views/requests/widget/request_item.dart index 842035a..b70fed8 100644 --- a/lib/views/requests/widget/request_item.dart +++ b/lib/views/requests/widget/request_item.dart @@ -1,3 +1,5 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:flutter/material.dart'; @@ -34,7 +36,7 @@ class RequestItem extends StatelessWidget { 6.height, "${request.brand} ${request.model}".toText(fontSize: 16, isBold: true), showItem("Model:", "${request.year}"), - showItem("Customer Name:", "${request.customerName}"), + showItem("Customer Name:", request.customerName), ], ), ), @@ -93,7 +95,7 @@ class RequestItem extends StatelessWidget { ), ], ), - Icon( + const Icon( Icons.arrow_forward, color: MyColors.darkIconColor, size: 18, @@ -106,7 +108,8 @@ class RequestItem extends StatelessWidget { navigateWithName(context, AppRoutes.requestsDetailPage, arguments: request); } else { List offers = await context.read().getOffersByRequest(requestId: request.id, context: context); - navigateWithName(context, AppRoutes.offersListPage, arguments: offers); + OfferListPageArguments offerListPageArguments = OfferListPageArguments(offersList: offers, requestModel: request); + navigateWithName(context, AppRoutes.offersListPage, arguments: offerListPageArguments); } }); } diff --git a/lib/widgets/common_widgets/categories_list.dart b/lib/widgets/common_widgets/categories_list.dart index 4acf882..051d3be 100644 --- a/lib/widgets/common_widgets/categories_list.dart +++ b/lib/widgets/common_widgets/categories_list.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; class FiltersList extends StatelessWidget { diff --git a/lib/widgets/common_widgets/time_slots.dart b/lib/widgets/common_widgets/time_slots.dart index f3702cb..2e7bef9 100644 --- a/lib/widgets/common_widgets/time_slots.dart +++ b/lib/widgets/common_widgets/time_slots.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; -import 'package:mc_common_app/models/general/widgets_models.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; class BuildTimeSlots extends StatelessWidget {