diff --git a/lib/classes/app_state.dart b/lib/classes/app_state.dart index 18dfa20..208654d 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/post_params_model.dart'; +import 'package:mc_common_app/models/general/post_params_model.dart'; import 'package:mc_common_app/models/user/user.dart'; import 'package:mc_common_app/utils/enums.dart'; diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index b05708b..d24672d 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -147,7 +147,8 @@ class GlobalConsts { static String fontZoomSize = "font_zoom_size"; static String welcomeVideoUrl = "welcomeVideoUrl"; static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; - static String demandAmountError = "Demand Amount Cannot be Empty"; + static String demandAmountError = "Amount Cannot be Empty"; + static String descriptionError = "Description Cannot be Empty"; static String vehicleVinError = "Vehicle VIN Cannot be Empty"; static String vehicleTitleError = "Vehicle Title Cannot be Empty"; static String warrantyError = "Warranty Duration Cannot be Empty"; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 4a3ad64..e934484 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -71,6 +71,9 @@ class AppRoutes { static const String myRequestsPage = "/myRequestsPage"; static const String createRequestPage = "/createRequestPage"; static const String offersListPage = "/offersListPage"; + static const String requestsDetailPage = "/requestsDetailPage"; + static const String sendOfferPage = "/sendOfferPage"; + //Setting Options static const String settingOptionsFaqs = "/settingOptionsFaqs"; diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 000ed6a..744d93e 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -235,6 +235,21 @@ extension RequestTypeTypeEnum on int { } } +extension RequestTypeStatusToInt on RequestsTypeEnum { + int getIdFromRequestTypeStatusEnum() { + switch (this) { + case RequestsTypeEnum.specialCarRequest: + return 1; + + case RequestsTypeEnum.serviceRequest: + return 2; + + default: + return 0; + } + } +} + extension AdPostStatusToInt on AdPostStatus { int getIdFromAdPostStatusEnum() { switch (this) { @@ -323,21 +338,6 @@ extension AppointmentStatusToInt on AppointmentStatusEnum { } } -extension RequestTypeStatusToInt on RequestsTypeEnum { - int getIdFromRequestTypeStatusEnum() { - switch (this) { - case RequestsTypeEnum.specialCarRequest: - return 1; - - case RequestsTypeEnum.serviceRequest: - return 2; - - default: - return 0; - } - } -} - extension CreatedByRoleEnumToInt on CreatedByRoleEnum { int getIdFromCreatedByRoleEnum() { switch (this) { @@ -548,3 +548,66 @@ extension FormatMonthByNumber on String { } } } + +extension ChatMessageTypeEnumExt on int { + ChatMessageTypeEnum toChatMessageTypeEnum() { + if (this == 1) { + return ChatMessageTypeEnum.freeText; + } else if (this == 2) { + return ChatMessageTypeEnum.freeText; + } + return ChatMessageTypeEnum.freeText; + } +} + +extension ChatMessageTypeToInt on ChatMessageTypeEnum { + int getIdFromChatMessageTypeEnum() { + switch (this) { + case ChatMessageTypeEnum.freeText: + return 1; + + case ChatMessageTypeEnum.offer: + return 2; + + default: + return 0; + } + } +} + +extension RequestOfferStatusEnumExt on int { + RequestOfferStatusEnum toChatMessageTypeEnum() { + if (this == 1) { + return RequestOfferStatusEnum.offer; + } else if (this == 2) { + return RequestOfferStatusEnum.negotiate; + } else if (this == 3) { + return RequestOfferStatusEnum.accepted; + } else if (this == 4) { + return RequestOfferStatusEnum.rejected; + } else if (this == 5) { + return RequestOfferStatusEnum.cancel; + } + return RequestOfferStatusEnum.cancel; + } +} + +extension RequestOfferStatusEnumToInt on RequestOfferStatusEnum { + int getIdFromRequestOfferStatusEnum() { + switch (this) { + case RequestOfferStatusEnum.offer: + return 1; + case RequestOfferStatusEnum.negotiate: + return 2; + case RequestOfferStatusEnum.accepted: + return 3; + case RequestOfferStatusEnum.rejected: + return 4; + case RequestOfferStatusEnum.cancel: + return 5; + + default: + return 0; + } + } +} diff --git a/lib/models/account.dart b/lib/models/account.dart deleted file mode 100644 index ecafb24..0000000 --- a/lib/models/account.dart +++ /dev/null @@ -1,44 +0,0 @@ -// To parse this JSON data, do -// -// final account = accountFromJson(jsonString); - -import 'dart:convert'; - -import 'package:mc_common_app/models/parent_list.dart'; - - - - -Account accountFromJson(String str) => Account.fromJson(json.decode(str)); - -String accountToJson(Account data) => json.encode(data.toJson()); - -class Account { - Account({ - required this.parentList, - required this.selectedItem, - }); - - List? parentList; - int selectedItem; - - factory Account.fromJson(Map json) => Account( - parentList: json["parentList"] == null - ? null - : List.from( - json["parentList"].map((x) => ParentList.fromJson(x))), - selectedItem: - json["selectedItem"] == null ? null : json["selectedItem"], - ); - - Map toJson() => { - "parentList": parentList == null - ? null - : List.from(parentList!.map((x) => x.toJson())), - "selectedItem": selectedItem == null ? null : selectedItem, - }; - - Map toJsonData() => { - "selectedItem": selectedItem == null ? null : selectedItem, - }; -} 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 0c0e22d..bd15655 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/service_schedule_model.dart'; -import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; +import 'package:mc_common_app/models/general/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 fdef0fa..048c42b 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/service_schedule_model.dart'; -import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; +import 'package:mc_common_app/models/general/widgets_models.dart'; class SSPhotoOfficeScheduleModel { int? photoOfficeID; diff --git a/lib/models/schedule_model.dart b/lib/models/appointments_models/schedule_model.dart similarity index 100% rename from lib/models/schedule_model.dart rename to lib/models/appointments_models/schedule_model.dart diff --git a/lib/models/service_schedule_model.dart b/lib/models/appointments_models/service_schedule_model.dart similarity index 98% rename from lib/models/service_schedule_model.dart rename to lib/models/appointments_models/service_schedule_model.dart index 5df14a7..4e3671a 100644 --- a/lib/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/service_model.dart'; -import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/models/general/widgets_models.dart'; class CustomTimeDateSlotModel { TimeSlotModel? date; diff --git a/lib/models/chat/cat_message_model.dart b/lib/models/chat/cat_message_model.dart new file mode 100644 index 0000000..ca8d778 --- /dev/null +++ b/lib/models/chat/cat_message_model.dart @@ -0,0 +1,49 @@ +class ChatMessageModel { + String? senderUserID; + String? senderName; + int? messageType; + String? message; + RequestOffer? requestOffer; + int? requestID; + int? requestOfferID; + + ChatMessageModel({this.senderUserID, this.senderName, this.messageType, this.message, this.requestOffer, this.requestID, this.requestOfferID}); + + ChatMessageModel.fromJson(Map json) { + senderUserID = json['senderUserID']; + senderName = json['senderName']; + messageType = json['messageType']; + message = json['message']; + if (json['requestOffer'] != null) { + requestOffer = RequestOffer.fromJson(json['requestOffer']); + } else { + requestOffer = null; + } + requestID = json['requestID']; + requestOfferID = json['requestOfferID']; + } +} + +class RequestOffer { + int? id; + int? requestID; + int? serviceProviderID; + int? offerStatus; + String? comment; + int? price; + String? offeredItemCreatedBy; + String? offeredItemCreatedOn; + + RequestOffer({this.id, this.requestID, this.serviceProviderID, this.offerStatus, this.comment, this.price, this.offeredItemCreatedBy, this.offeredItemCreatedOn}); + + RequestOffer.fromJson(Map json) { + id = json['id']; + requestID = json['requestID']; + serviceProviderID = json['serviceProviderID']; + offerStatus = json['offerStatus']; + comment = json['comment']; + price = json['price']; + offeredItemCreatedBy = json['offeredItemCreatedBy']; + offeredItemCreatedOn = json['offeredItemCreatedOn']; + } +} diff --git a/lib/models/config_model.dart b/lib/models/config_model.dart deleted file mode 100644 index 0245ede..0000000 --- a/lib/models/config_model.dart +++ /dev/null @@ -1,12 +0,0 @@ -class ConfigModel { - ConfigModel(this.endpoint, this.organizationName); - - String endpoint; - - String organizationName; - - factory ConfigModel.fromJson(Map json) => - ConfigModel("", ""); - -// Map toJson() => _$ConfigModelToJson(this); -} diff --git a/lib/models/content_info_model.dart b/lib/models/content_info_model.dart deleted file mode 100644 index 4eec746..0000000 --- a/lib/models/content_info_model.dart +++ /dev/null @@ -1,65 +0,0 @@ -class ContentInfoModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - ContentInfoModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(new ContentInfoDataModel.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - data['statusCode'] = this.statusCode; - data['message'] = this.message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class ContentInfoDataModel { - int? contentInfoId; - int? contentTypeId; - String? content; - String? contentTypeNameEn; - String? contentTypeNameAr; - String? fileName; - String? exposeFilePath; - - ContentInfoDataModel({this.contentInfoId, this.contentTypeId, this.content, this.contentTypeNameEn, this.contentTypeNameAr, this.fileName, this.exposeFilePath}); - - ContentInfoDataModel.fromJson(Map json) { - contentInfoId = json['contentInfoId']; - contentTypeId = json['contentTypeId']; - content = json['content']; - contentTypeNameEn = json['contentTypeNameEn']; - contentTypeNameAr = json['contentTypeNameAr']; - fileName = json['fileName']; - exposeFilePath = json['exposeFilePath']; - } - - Map toJson() { - final Map data = new Map(); - data['contentInfoId'] = this.contentInfoId; - data['contentTypeId'] = this.contentTypeId; - data['content'] = this.content; - data['contentTypeNameEn'] = this.contentTypeNameEn; - data['contentTypeNameAr'] = this.contentTypeNameAr; - data['fileName'] = this.fileName; - data['exposeFilePath'] = this.exposeFilePath; - return data; - } -} diff --git a/lib/models/enums_model.dart b/lib/models/general/enums_model.dart similarity index 100% rename from lib/models/enums_model.dart rename to lib/models/general/enums_model.dart diff --git a/lib/models/generic_resp_model.dart b/lib/models/general/generic_resp_model.dart similarity index 100% rename from lib/models/generic_resp_model.dart rename to lib/models/general/generic_resp_model.dart diff --git a/lib/models/m_response.dart b/lib/models/general/m_response.dart similarity index 100% rename from lib/models/m_response.dart rename to lib/models/general/m_response.dart diff --git a/lib/models/post_params_model.dart b/lib/models/general/post_params_model.dart similarity index 100% rename from lib/models/post_params_model.dart rename to lib/models/general/post_params_model.dart diff --git a/lib/models/widgets_models.dart b/lib/models/general/widgets_models.dart similarity index 100% rename from lib/models/widgets_models.dart rename to lib/models/general/widgets_models.dart diff --git a/lib/models/member_model.dart b/lib/models/member_model.dart deleted file mode 100644 index d968827..0000000 --- a/lib/models/member_model.dart +++ /dev/null @@ -1,62 +0,0 @@ -class MemberModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - MemberModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(new MemberDataModel.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - data['statusCode'] = this.statusCode; - data['message'] = this.message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class MemberDataModel { - int? committeeId; - String? firstName; - String? lastName; - String? description; - String? picture; - int? orderNo; - - MemberDataModel({this.committeeId, this.firstName, this.lastName, this.description, this.picture, this.orderNo}); - - MemberDataModel.fromJson(Map json) { - committeeId = json['committeeId']; - firstName = json['firstName']; - lastName = json['lastName']; - description = json['description']; - picture = json['picture']; - orderNo = json['orderNo']; - } - - Map toJson() { - final Map data = new Map(); - data['committeeId'] = this.committeeId; - data['firstName'] = this.firstName; - data['lastName'] = this.lastName; - data['description'] = this.description; - data['picture'] = this.picture; - data['orderNo'] = this.orderNo; - return data; - } -} diff --git a/lib/models/parent_list.dart b/lib/models/parent_list.dart deleted file mode 100644 index 3f2286f..0000000 --- a/lib/models/parent_list.dart +++ /dev/null @@ -1,26 +0,0 @@ -class ParentList { - ParentList({ - required this.dbId, - required this.text, - required this.path, - required this.isSelected, - }); - - int dbId; - String text; - String path; - bool isSelected; - - factory ParentList.fromJson(Map json) => ParentList( - dbId: json["dbId"] == null ? null : json["dbId"], - text: json["text"] == null ? null : json["text"], - path: json["path"] == null ? null : json["path"], - isSelected: false, - ); - - Map toJson() => { - "dbId": dbId == null ? null : dbId, - "text": text == null ? null : text, - "path": path == null ? null : path, - }; -} diff --git a/lib/models/model/provider_model.dart b/lib/models/provider_branches_models/provider_model.dart similarity index 100% rename from lib/models/model/provider_model.dart rename to lib/models/provider_branches_models/provider_model.dart diff --git a/lib/models/response_models.dart b/lib/models/response_models.dart deleted file mode 100644 index 872893b..0000000 --- a/lib/models/response_models.dart +++ /dev/null @@ -1,34 +0,0 @@ -/// -/// This example was taken from -/// https://flutter.dev/docs/development/data-and-backend/json -/// - -/// This allows the `User` class to access private members in -/// the generated file. The value for this is *.g.dart, where -/// the star denotes the source file name. - -/// An annotation for the code generator to know that this class needs the -/// JSON serialization logic to be generated. - -class BackendResponse { - BackendResponse({required this.id, required this.isOk, required this.result}); - - int id; - bool isOk; - dynamic result; - - /// A necessary factory constructor for creating a new User instance - /// from a map. Pass the map to the generated `_$UserFromJson()` constructor. - /// The constructor is named after the source class, in this case, User. - factory BackendResponse.fromJson(Map json) => - BackendResponse( - id: 1, - isOk: false, - result: null, - ); -// -// /// `toJson` is the convention for a class to declare support for serialization -// /// to JSON. The implementation simply calls the private, generated -// /// helper method `_$UserToJson`. -// Map toJson() => _$BackendResponseToJson(this); -} diff --git a/lib/models/subscription_model.dart b/lib/models/subscription_model.dart deleted file mode 100644 index d192566..0000000 --- a/lib/models/subscription_model.dart +++ /dev/null @@ -1,125 +0,0 @@ -// To parse this JSON data, do -// -// final subscription = subscriptionFromJson(jsonString); - -import 'dart:convert'; - -Subscription subscriptionFromJson(String str) => Subscription.fromJson(json.decode(str)); - -String subscriptionToJson(Subscription data) => json.encode(data.toJson()); - -class SubscriptionModel { - SubscriptionModel({ - this.messageStatus, - this.totalItemsCount, - this.data, - this.message, - }); - - int? messageStatus; - int? totalItemsCount; - List? data; - String? message; - - factory SubscriptionModel.fromJson(Map json) => SubscriptionModel( - messageStatus: json["messageStatus"], - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? [] : List.from(json["data"]!.map((x) => Subscription.fromJson(x))), - message: json["message"], - ); - - Map toJson() => { - "messageStatus": messageStatus, - "totalItemsCount": totalItemsCount, - "data": data == null ? [] : List.from(data!.map((x) => x.toJson())), - "message": message, - }; -} - -class Subscription { - Subscription({ - this.id, - this.name, - this.description, - this.durationName, - this.durationDays, - this.price, - this.currency, - this.numberOfBranches, - this.numberOfSubUsers, - this.numberOfAds, - this.countryId, - this.countryName, - this.isSubscribed, - this.subscriptionAppliedId, - this.serviceProviderId, - this.dateStart, - this.dateEnd, - this.isExpired, - this.isActive, - }); - - int? id; - String? name; - String? description; - String? durationName; - int? durationDays; - double? price; - String? currency; - int? numberOfBranches; - int? numberOfSubUsers; - int? numberOfAds; - int? countryId; - String? countryName; - bool? isSubscribed; - int? subscriptionAppliedId; - int? serviceProviderId; - DateTime? dateStart; - DateTime? dateEnd; - bool? isExpired; - bool? isActive; - - factory Subscription.fromJson(Map json) => Subscription( - id: json["id"], - name: json["name"], - description: json["description"], - durationName: json["durationName"], - durationDays: json["durationDays"], - price: json["price"]?.toDouble(), - currency: json["currency"], - numberOfBranches: json["numberOfBranches"], - numberOfSubUsers: json["numberOfSubUsers"], - numberOfAds: json["numberOfAds"], - countryId: json["countryID"], - countryName: json["countryName"]!, - isSubscribed: json["isSubscribed"], - subscriptionAppliedId: json["subscriptionAppliedID"], - serviceProviderId: json["serviceProviderID"], - dateStart: json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]), - dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]), - isExpired: json["isExpired"], - isActive: json["isActive"], - ); - - Map toJson() => { - "id": id, - "name": name, - "description": description, - "durationName": durationName, - "durationDays": durationDays, - "price": price, - "currency": currency, - "numberOfBranches": numberOfBranches, - "numberOfSubUsers": numberOfSubUsers, - "numberOfAds": numberOfAds, - "countryID": countryId, - "countryName": countryName, - "isSubscribed": isSubscribed, - "subscriptionAppliedID": subscriptionAppliedId, - "serviceProviderID": serviceProviderId, - "dateStart": dateStart?.toIso8601String(), - "dateEnd": dateEnd?.toIso8601String(), - "isExpired": isExpired, - "isActive": isActive, - }; -} diff --git a/lib/models/surah_model.dart b/lib/models/surah_model.dart deleted file mode 100644 index acc171a..0000000 --- a/lib/models/surah_model.dart +++ /dev/null @@ -1,74 +0,0 @@ -class SurahModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - SurahModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(SurahModelData.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = totalItemsCount; - data['statusCode'] = statusCode; - data['message'] = message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class SurahModelData { - int? id; - int? surahID; - String? nameAR; - String? nameEN; - int? numberOfAyahs; - String? englishNameTranslation; - int? revelationID; - String? revelationType; - int? startPageNo; - int? endPageNo; - - SurahModelData({this.id, this.surahID, this.nameAR, this.nameEN, this.numberOfAyahs, this.englishNameTranslation, this.revelationID, this.revelationType, this.startPageNo, this.endPageNo}); - - SurahModelData.fromJson(Map json) { - id = json['id']; - surahID = json['surahID']; - nameAR = json['nameAR']; - nameEN = json['nameEN']; - numberOfAyahs = json['numberOfAyahs']; - englishNameTranslation = json['englishNameTranslation']; - revelationID = json['revelation_ID']; - revelationType = json['revelationType']; - startPageNo = json['startPageNo']; - endPageNo = json['endPageNo']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['surahID'] = this.surahID; - data['nameAR'] = this.nameAR; - data['nameEN'] = this.nameEN; - data['numberOfAyahs'] = this.numberOfAyahs; - data['englishNameTranslation'] = this.englishNameTranslation; - data['revelation_ID'] = this.revelationID; - data['revelationType'] = this.revelationType; - data['startPageNo'] = this.startPageNo; - data['endPageNo'] = this.endPageNo; - return data; - } -} diff --git a/lib/models/verify_usage_before_deleting_these/account.dart b/lib/models/verify_usage_before_deleting_these/account.dart new file mode 100644 index 0000000..32991b3 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/account.dart @@ -0,0 +1,44 @@ +// // To parse this JSON data, do +// // +// // final account = accountFromJson(jsonString); +// +// import 'dart:convert'; +// +// import 'package:mc_common_app/models/parent_list.dart'; +// +// +// +// +// Account accountFromJson(String str) => Account.fromJson(json.decode(str)); +// +// String accountToJson(Account data) => json.encode(data.toJson()); +// +// class Account { +// Account({ +// required this.parentList, +// required this.selectedItem, +// }); +// +// List? parentList; +// int selectedItem; +// +// factory Account.fromJson(Map json) => Account( +// parentList: json["parentList"] == null +// ? null +// : List.from( +// json["parentList"].map((x) => ParentList.fromJson(x))), +// selectedItem: +// json["selectedItem"] == null ? null : json["selectedItem"], +// ); +// +// Map toJson() => { +// "parentList": parentList == null +// ? null +// : List.from(parentList!.map((x) => x.toJson())), +// "selectedItem": selectedItem == null ? null : selectedItem, +// }; +// +// Map toJsonData() => { +// "selectedItem": selectedItem == null ? null : selectedItem, +// }; +// } diff --git a/lib/models/verify_usage_before_deleting_these/config_model.dart b/lib/models/verify_usage_before_deleting_these/config_model.dart new file mode 100644 index 0000000..2fc7102 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/config_model.dart @@ -0,0 +1,12 @@ +// class ConfigModel { +// ConfigModel(this.endpoint, this.organizationName); +// +// String endpoint; +// +// String organizationName; +// +// factory ConfigModel.fromJson(Map json) => +// ConfigModel("", ""); +// +// // Map toJson() => _$ConfigModelToJson(this); +// } diff --git a/lib/models/verify_usage_before_deleting_these/content_info_model.dart b/lib/models/verify_usage_before_deleting_these/content_info_model.dart new file mode 100644 index 0000000..548a2f4 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/content_info_model.dart @@ -0,0 +1,65 @@ +// class ContentInfoModel { +// int? totalItemsCount; +// int? statusCode; +// String? message; +// List? data; +// +// ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data}); +// +// ContentInfoModel.fromJson(Map json) { +// totalItemsCount = json['totalItemsCount']; +// statusCode = json['statusCode']; +// message = json['message']; +// if (json['data'] != null) { +// data = []; +// json['data'].forEach((v) { +// data?.add(new ContentInfoDataModel.fromJson(v)); +// }); +// } +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['totalItemsCount'] = this.totalItemsCount; +// data['statusCode'] = this.statusCode; +// data['message'] = this.message; +// if (this.data != null) { +// data['data'] = this.data?.map((v) => v.toJson()).toList(); +// } +// return data; +// } +// } +// +// class ContentInfoDataModel { +// int? contentInfoId; +// int? contentTypeId; +// String? content; +// String? contentTypeNameEn; +// String? contentTypeNameAr; +// String? fileName; +// String? exposeFilePath; +// +// ContentInfoDataModel({this.contentInfoId, this.contentTypeId, this.content, this.contentTypeNameEn, this.contentTypeNameAr, this.fileName, this.exposeFilePath}); +// +// ContentInfoDataModel.fromJson(Map json) { +// contentInfoId = json['contentInfoId']; +// contentTypeId = json['contentTypeId']; +// content = json['content']; +// contentTypeNameEn = json['contentTypeNameEn']; +// contentTypeNameAr = json['contentTypeNameAr']; +// fileName = json['fileName']; +// exposeFilePath = json['exposeFilePath']; +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['contentInfoId'] = this.contentInfoId; +// data['contentTypeId'] = this.contentTypeId; +// data['content'] = this.content; +// data['contentTypeNameEn'] = this.contentTypeNameEn; +// data['contentTypeNameAr'] = this.contentTypeNameAr; +// data['fileName'] = this.fileName; +// data['exposeFilePath'] = this.exposeFilePath; +// return data; +// } +// } diff --git a/lib/models/verify_usage_before_deleting_these/member_model.dart b/lib/models/verify_usage_before_deleting_these/member_model.dart new file mode 100644 index 0000000..0401282 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/member_model.dart @@ -0,0 +1,62 @@ +// class MemberModel { +// int? totalItemsCount; +// int? statusCode; +// String? message; +// List? data; +// +// MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data}); +// +// MemberModel.fromJson(Map json) { +// totalItemsCount = json['totalItemsCount']; +// statusCode = json['statusCode']; +// message = json['message']; +// if (json['data'] != null) { +// data = []; +// json['data'].forEach((v) { +// data?.add(new MemberDataModel.fromJson(v)); +// }); +// } +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['totalItemsCount'] = this.totalItemsCount; +// data['statusCode'] = this.statusCode; +// data['message'] = this.message; +// if (this.data != null) { +// data['data'] = this.data?.map((v) => v.toJson()).toList(); +// } +// return data; +// } +// } +// +// class MemberDataModel { +// int? committeeId; +// String? firstName; +// String? lastName; +// String? description; +// String? picture; +// int? orderNo; +// +// MemberDataModel({this.committeeId, this.firstName, this.lastName, this.description, this.picture, this.orderNo}); +// +// MemberDataModel.fromJson(Map json) { +// committeeId = json['committeeId']; +// firstName = json['firstName']; +// lastName = json['lastName']; +// description = json['description']; +// picture = json['picture']; +// orderNo = json['orderNo']; +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['committeeId'] = this.committeeId; +// data['firstName'] = this.firstName; +// data['lastName'] = this.lastName; +// data['description'] = this.description; +// data['picture'] = this.picture; +// data['orderNo'] = this.orderNo; +// return data; +// } +// } diff --git a/lib/models/verify_usage_before_deleting_these/parent_list.dart b/lib/models/verify_usage_before_deleting_these/parent_list.dart new file mode 100644 index 0000000..26e9a35 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/parent_list.dart @@ -0,0 +1,26 @@ +// class ParentList { +// ParentList({ +// required this.dbId, +// required this.text, +// required this.path, +// required this.isSelected, +// }); +// +// int dbId; +// String text; +// String path; +// bool isSelected; +// +// factory ParentList.fromJson(Map json) => ParentList( +// dbId: json["dbId"] == null ? null : json["dbId"], +// text: json["text"] == null ? null : json["text"], +// path: json["path"] == null ? null : json["path"], +// isSelected: false, +// ); +// +// Map toJson() => { +// "dbId": dbId == null ? null : dbId, +// "text": text == null ? null : text, +// "path": path == null ? null : path, +// }; +// } diff --git a/lib/models/provider_category_model.dart b/lib/models/verify_usage_before_deleting_these/provider_category_model.dart similarity index 98% rename from lib/models/provider_category_model.dart rename to lib/models/verify_usage_before_deleting_these/provider_category_model.dart index 18c8dda..37ef197 100644 --- a/lib/models/provider_category_model.dart +++ b/lib/models/verify_usage_before_deleting_these/provider_category_model.dart @@ -30,3 +30,6 @@ // return data; // } // } + +// // test + diff --git a/lib/models/provider_service_model.dart b/lib/models/verify_usage_before_deleting_these/provider_service_model.dart similarity index 99% rename from lib/models/provider_service_model.dart rename to lib/models/verify_usage_before_deleting_these/provider_service_model.dart index 914ce65..830bb2a 100644 --- a/lib/models/provider_service_model.dart +++ b/lib/models/verify_usage_before_deleting_these/provider_service_model.dart @@ -63,3 +63,5 @@ // return 'ProviderServiceModel{id: $id, description: $description, descriptionN: $descriptionN, serviceIconUrl: $serviceIconUrl, serviceImageUrl: $serviceImageUrl, serviceCategoryID: $serviceCategoryID, isActive: $isActive, categoryName: $categoryName, ispartial: $ispartial, appointmentPricePercentage: $appointmentPricePercentage, refundAmountPercentage: $refundAmountPercentage, isSelected: $isSelected}'; // } // } + +// // test \ No newline at end of file diff --git a/lib/models/verify_usage_before_deleting_these/response_models.dart b/lib/models/verify_usage_before_deleting_these/response_models.dart new file mode 100644 index 0000000..6680252 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/response_models.dart @@ -0,0 +1,34 @@ +// /// +// /// This example was taken from +// /// https://flutter.dev/docs/development/data-and-backend/json +// /// +// +// /// This allows the `User` class to access private members in +// /// the generated file. The value for this is *.g.dart, where +// /// the star denotes the source file name. +// +// /// An annotation for the code generator to know that this class needs the +// /// JSON serialization logic to be generated. +// +// class BackendResponse { +// BackendResponse({required this.id, required this.isOk, required this.result}); +// +// int id; +// bool isOk; +// dynamic result; +// +// /// A necessary factory constructor for creating a new User instance +// /// from a map. Pass the map to the generated `_$UserFromJson()` constructor. +// /// The constructor is named after the source class, in this case, User. +// factory BackendResponse.fromJson(Map json) => +// BackendResponse( +// id: 1, +// isOk: false, +// result: null, +// ); +// // +// // /// `toJson` is the convention for a class to declare support for serialization +// // /// to JSON. The implementation simply calls the private, generated +// // /// helper method `_$UserToJson`. +// // Map toJson() => _$BackendResponseToJson(this); +// } diff --git a/lib/models/verify_usage_before_deleting_these/subscription_model.dart b/lib/models/verify_usage_before_deleting_these/subscription_model.dart new file mode 100644 index 0000000..c8e781a --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/subscription_model.dart @@ -0,0 +1,125 @@ +// // To parse this JSON data, do +// // +// // final subscription = subscriptionFromJson(jsonString); +// +// import 'dart:convert'; +// +// Subscription subscriptionFromJson(String str) => Subscription.fromJson(json.decode(str)); +// +// String subscriptionToJson(Subscription data) => json.encode(data.toJson()); +// +// class SubscriptionModel { +// SubscriptionModel({ +// this.messageStatus, +// this.totalItemsCount, +// this.data, +// this.message, +// }); +// +// int? messageStatus; +// int? totalItemsCount; +// List? data; +// String? message; +// +// factory SubscriptionModel.fromJson(Map json) => SubscriptionModel( +// messageStatus: json["messageStatus"], +// totalItemsCount: json["totalItemsCount"], +// data: json["data"] == null ? [] : List.from(json["data"]!.map((x) => Subscription.fromJson(x))), +// message: json["message"], +// ); +// +// Map toJson() => { +// "messageStatus": messageStatus, +// "totalItemsCount": totalItemsCount, +// "data": data == null ? [] : List.from(data!.map((x) => x.toJson())), +// "message": message, +// }; +// } +// +// class Subscription { +// Subscription({ +// this.id, +// this.name, +// this.description, +// this.durationName, +// this.durationDays, +// this.price, +// this.currency, +// this.numberOfBranches, +// this.numberOfSubUsers, +// this.numberOfAds, +// this.countryId, +// this.countryName, +// this.isSubscribed, +// this.subscriptionAppliedId, +// this.serviceProviderId, +// this.dateStart, +// this.dateEnd, +// this.isExpired, +// this.isActive, +// }); +// +// int? id; +// String? name; +// String? description; +// String? durationName; +// int? durationDays; +// double? price; +// String? currency; +// int? numberOfBranches; +// int? numberOfSubUsers; +// int? numberOfAds; +// int? countryId; +// String? countryName; +// bool? isSubscribed; +// int? subscriptionAppliedId; +// int? serviceProviderId; +// DateTime? dateStart; +// DateTime? dateEnd; +// bool? isExpired; +// bool? isActive; +// +// factory Subscription.fromJson(Map json) => Subscription( +// id: json["id"], +// name: json["name"], +// description: json["description"], +// durationName: json["durationName"], +// durationDays: json["durationDays"], +// price: json["price"]?.toDouble(), +// currency: json["currency"], +// numberOfBranches: json["numberOfBranches"], +// numberOfSubUsers: json["numberOfSubUsers"], +// numberOfAds: json["numberOfAds"], +// countryId: json["countryID"], +// countryName: json["countryName"]!, +// isSubscribed: json["isSubscribed"], +// subscriptionAppliedId: json["subscriptionAppliedID"], +// serviceProviderId: json["serviceProviderID"], +// dateStart: json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]), +// dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]), +// isExpired: json["isExpired"], +// isActive: json["isActive"], +// ); +// +// Map toJson() => { +// "id": id, +// "name": name, +// "description": description, +// "durationName": durationName, +// "durationDays": durationDays, +// "price": price, +// "currency": currency, +// "numberOfBranches": numberOfBranches, +// "numberOfSubUsers": numberOfSubUsers, +// "numberOfAds": numberOfAds, +// "countryID": countryId, +// "countryName": countryName, +// "isSubscribed": isSubscribed, +// "subscriptionAppliedID": subscriptionAppliedId, +// "serviceProviderID": serviceProviderId, +// "dateStart": dateStart?.toIso8601String(), +// "dateEnd": dateEnd?.toIso8601String(), +// "isExpired": isExpired, +// "isActive": isActive, +// }; +// } diff --git a/lib/models/verify_usage_before_deleting_these/surah_model.dart b/lib/models/verify_usage_before_deleting_these/surah_model.dart new file mode 100644 index 0000000..ef57819 --- /dev/null +++ b/lib/models/verify_usage_before_deleting_these/surah_model.dart @@ -0,0 +1,74 @@ +// class SurahModel { +// int? totalItemsCount; +// int? statusCode; +// String? message; +// List? data; +// +// SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data}); +// +// SurahModel.fromJson(Map json) { +// totalItemsCount = json['totalItemsCount']; +// statusCode = json['statusCode']; +// message = json['message']; +// if (json['data'] != null) { +// data = []; +// json['data'].forEach((v) { +// data?.add(SurahModelData.fromJson(v)); +// }); +// } +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['totalItemsCount'] = totalItemsCount; +// data['statusCode'] = statusCode; +// data['message'] = message; +// if (this.data != null) { +// data['data'] = this.data?.map((v) => v.toJson()).toList(); +// } +// return data; +// } +// } +// +// class SurahModelData { +// int? id; +// int? surahID; +// String? nameAR; +// String? nameEN; +// int? numberOfAyahs; +// String? englishNameTranslation; +// int? revelationID; +// String? revelationType; +// int? startPageNo; +// int? endPageNo; +// +// SurahModelData({this.id, this.surahID, this.nameAR, this.nameEN, this.numberOfAyahs, this.englishNameTranslation, this.revelationID, this.revelationType, this.startPageNo, this.endPageNo}); +// +// SurahModelData.fromJson(Map json) { +// id = json['id']; +// surahID = json['surahID']; +// nameAR = json['nameAR']; +// nameEN = json['nameEN']; +// numberOfAyahs = json['numberOfAyahs']; +// englishNameTranslation = json['englishNameTranslation']; +// revelationID = json['revelation_ID']; +// revelationType = json['revelationType']; +// startPageNo = json['startPageNo']; +// endPageNo = json['endPageNo']; +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['id'] = this.id; +// data['surahID'] = this.surahID; +// data['nameAR'] = this.nameAR; +// data['nameEN'] = this.nameEN; +// data['numberOfAyahs'] = this.numberOfAyahs; +// data['englishNameTranslation'] = this.englishNameTranslation; +// data['revelation_ID'] = this.revelationID; +// data['revelationType'] = this.revelationType; +// data['startPageNo'] = this.startPageNo; +// data['endPageNo'] = this.endPageNo; +// return data; +// } +// } diff --git a/lib/repositories/ads_repo.dart b/lib/repositories/ads_repo.dart index 7f2f8e9..728cfb5 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/generic_resp_model.dart'; +import 'package:mc_common_app/models/general/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 e3f5236..3f53f24 100644 --- a/lib/repositories/appointment_repo.dart +++ b/lib/repositories/appointment_repo.dart @@ -4,11 +4,11 @@ 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/generic_resp_model.dart'; -import 'package:mc_common_app/models/m_response.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/provider_branches_models/profile/services.dart'; -import 'package:mc_common_app/models/schedule_model.dart'; -import 'package:mc_common_app/models/service_schedule_model.dart'; +import 'package:mc_common_app/models/appointments_models/schedule_model.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/utils/enums.dart'; abstract class AppointmentRepo { diff --git a/lib/repositories/chat_repo.dart b/lib/repositories/chat_repo.dart index 2f379cb..337a09d 100644 --- a/lib/repositories/chat_repo.dart +++ b/lib/repositories/chat_repo.dart @@ -1,60 +1,32 @@ +import 'dart:io'; +import 'package:http/io_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; -import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/main.dart'; -import 'package:mc_common_app/utils/utils.dart'; -import 'package:signalr_netcore/http_connection_options.dart'; -import 'package:signalr_netcore/hub_connection.dart'; -import 'package:signalr_netcore/hub_connection_builder.dart'; -import 'package:logging/logging.dart'; +import 'package:signalr_core/signalr_core.dart'; abstract class ChatRepo { - Future buildChatHubConnection(); + Future getHubConnection(); } class ChatRepoImp implements ChatRepo { @override - Future buildChatHubConnection() async { + Future getHubConnection() async { final userId = AppState().getUser.data!.userInfo!.userId ?? ""; - HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true); - HubConnection hubConnection = HubConnectionBuilder() + final hubUrl = "https://ms.hmg.com/McHub?userID=$userId"; + logger.i("Connecting with Hub ($hubUrl)"); + + HubConnection hub; + hub = HubConnectionBuilder() .withUrl( - "${ApiConsts.chatHubUrl}?userID=$userId", - options: httpOptions, - ) - .withAutomaticReconnect( - retryDelays: [2000, 5000, 10000, 20000], - ) - .configureLogging( - Logger("configureLogging"), - ) + hubUrl, + HttpConnectionOptions( + client: IOClient(HttpClient() + ..badCertificateCallback = (x, y, z) => true), + logging: (level, message) { + print(message); + }, + )) .build(); - hubConnection.onclose( - ({Exception? error}) { - logger.i("onClose"); - }, - ); - hubConnection.onreconnecting( - ({Exception? error}) { - logger.i("onReconnecting"); - }, - ); - hubConnection.onreconnected( - ({String? connectionId}) { - logger.i("onReconnected"); - }, - ); - if (hubConnection.state != HubConnectionState.Connected) { - await hubConnection.start(); - logger.i("Started HubConnection"); - - try { - hubConnection.on("ReceiveMessageRequestOffer", (List? arguments) { - Utils.showToast("I received ping : ${arguments.toString()}"); - }); - } catch (e) { - logger.i("Error in OnSendQuestionToParticipant"); - } - } - return hubConnection; + return hub; } } diff --git a/lib/repositories/common_repo.dart b/lib/repositories/common_repo.dart index f4dd9d9..8ede9a0 100644 --- a/lib/repositories/common_repo.dart +++ b/lib/repositories/common_repo.dart @@ -5,13 +5,13 @@ 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/appointments_models/appointment_list_model.dart'; -import 'package:mc_common_app/models/generic_resp_model.dart'; +import 'package:mc_common_app/models/general/generic_resp_model.dart'; import 'package:mc_common_app/models/user/cities.dart'; import 'package:mc_common_app/models/user/country.dart'; import 'package:mc_common_app/models/user/role.dart'; import '../models/advertisment_models/vehicle_details_models.dart'; -import '../models/enums_model.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 5fc6407..d760546 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/generic_resp_model.dart'; +import 'package:mc_common_app/models/general/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 fee2cc1..2709588 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/generic_resp_model.dart'; +import 'package:mc_common_app/models/general/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/item_model.dart'; diff --git a/lib/repositories/request_repo.dart b/lib/repositories/request_repo.dart index 2b8de66..8095e4b 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/generic_resp_model.dart'; +import 'package:mc_common_app/models/general/generic_resp_model.dart'; import 'package:mc_common_app/models/requests/offers_model.dart'; import 'package:mc_common_app/models/requests/request_model.dart'; diff --git a/lib/repositories/user_repo.dart b/lib/repositories/user_repo.dart index 1a5b2b1..6d69a24 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/m_response.dart'; +import 'package:mc_common_app/models/general/m_response.dart'; import 'package:mc_common_app/models/user/basic_otp.dart'; import 'package:mc_common_app/models/user/change_email.dart'; import 'package:mc_common_app/models/user/change_mobile.dart'; diff --git a/lib/utils/enums.dart b/lib/utils/enums.dart index 6ef655b..e0a9505 100644 --- a/lib/utils/enums.dart +++ b/lib/utils/enums.dart @@ -155,3 +155,20 @@ enum RequestsTypeEnum { specialCarRequest, serviceRequest, } + +enum ChatMessageTypeEnum { + freeText, + image, + audio, + video, + file, + offer, +} + +enum RequestOfferStatusEnum { + offer, + negotiate, + accepted, + rejected, + cancel, +} diff --git a/lib/view_models/ad_view_model.dart b/lib/view_models/ad_view_model.dart index 2a61780..114b4b5 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/enums_model.dart'; -import 'package:mc_common_app/models/generic_resp_model.dart'; -import 'package:mc_common_app/models/service_schedule_model.dart'; -import 'package:mc_common_app/models/widgets_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/appointments_models/service_schedule_model.dart'; +import 'package:mc_common_app/models/general/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 a09b00e..da26459 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/enums_model.dart'; -import 'package:mc_common_app/models/generic_resp_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/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/service_schedule_model.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/models/services/item_model.dart'; import 'package:mc_common_app/models/services/service_model.dart'; -import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 5d0c70a..be00103 100644 --- a/lib/view_models/chat_view_model.dart +++ b/lib/view_models/chat_view_model.dart @@ -1,39 +1,68 @@ 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/repositories/chat_repo.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/utils.dart'; -import 'package:signalr_netcore/hub_connection.dart'; +import 'package:signalr_core/signalr_core.dart'; - class ChatVM extends ChangeNotifier { +class ChatVM extends ChangeNotifier { final ChatRepo chatRepo; ChatVM({required this.chatRepo}); - HubConnection? hubConnection; + late HubConnection hubConnection; Future buildHubConnection() async { - hubConnection = await chatRepo.buildChatHubConnection(); + // 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()}"); + Utils.showToast("I received ping : ${arguments.toString()}"); + }); + } catch (e) { + logger.i("Error: ${e.toString()}"); + } + notifyListeners(); + // } } - Future onSendMessageForRequestOffer() async { - if (hubConnection == null || hubConnection!.state != HubConnectionState.Connected) { + 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 != null) { - hubConnection!.invoke( + if (hubConnection.state == HubConnectionState.connected) { + final providerId = AppState().getUser.data!.userInfo!.providerId; + print("providerId: $providerId"); + hubConnection.invoke( "SendMessageRequestOffer", args: [ - // { - // "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER ?? "", - // "employeeName": AppState().memberInformationList!.eMPLOYEENAME ?? "", - // "marathonId": AppState().getMarathonProjectId, - // "prizeId": "8577B2E8-5DD7-43F0-10DD-08DACB0AC064", - // } + { + "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 null; + return false; }); } + return true; } } diff --git a/lib/view_models/requests_view_model.dart b/lib/view_models/requests_view_model.dart index 8652d5d..c7ac932 100644 --- a/lib/view_models/requests_view_model.dart +++ b/lib/view_models/requests_view_model.dart @@ -2,19 +2,22 @@ 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/extensions/string_extensions.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; -import 'package:mc_common_app/models/enums_model.dart'; -import 'package:mc_common_app/models/generic_resp_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/requests/offers_model.dart'; import 'package:mc_common_app/models/requests/request_model.dart'; -import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/models/general/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/utils.dart'; import 'package:mc_common_app/view_models/base_view_model.dart'; +import 'package:mc_common_app/view_models/chat_view_model.dart'; +import 'package:provider/provider.dart'; class RequestsVM extends BaseVM { final CommonAppServices commonServices; @@ -33,26 +36,46 @@ class RequestsVM extends BaseVM { populateRequestsFilterList() async { requestsTypeFilterOptions.clear(); if (myRequestsTypeEnum.isEmpty) { - myRequestsTypeEnum = await commonRepo.getEnumTypeValues(enumTypeID: 16); //TODO: 13 is to get Requests Filter Enums + myRequestsTypeEnum = await commonRepo.getEnumTypeValues(enumTypeID: 16); //TODO: 16 is to get Requests Filter Enums } for (int i = 0; i < myRequestsTypeEnum.length; i++) { requestsTypeFilterOptions.add(FilterListModel(title: myRequestsTypeEnum[i].enumValueStr, isSelected: false, id: myRequestsTypeEnum[i].enumValue)); } + print("requestsTypeFilterOptions: ${requestsTypeFilterOptions.toString()}"); + notifyListeners(); } - Future getMyRequests({bool isNeedToRebuild = false}) async { + Future getRequests({bool isNeedToRebuild = false, required AppType appType}) async { if (isNeedToRebuild) setState(ViewState.busy); - myRequests = await requestRepo.getRequests( - { - "customerID": AppState().getUser.data!.userInfo!.customerId, - "pageSize": 100, - "pageIndex": 0, - "requestType": 0, - }, - ); + var paramsForGetRequests = {}; + + paramsForGetRequests = { + "pageSize": 100, + "pageIndex": 0, + "requestType": 0, + }; + if (appType == AppType.provider) { + paramsForGetRequests.addEntries([MapEntry("providerID", AppState().getUser.data!.userInfo!.providerId)]); + // paramsForGetRequests = { + // "providerID": AppState().getUser.data!.userInfo!.providerId, + // "pageSize": 100, + // "pageIndex": 0, + // "requestType": 0, + // }; + } else { + paramsForGetRequests.addEntries([MapEntry("customerID", AppState().getUser.data!.userInfo!.customerId)]); + + // paramsForGetRequests = { + // "customerID": AppState().getUser.data!.userInfo!.customerId, + // "pageSize": 100, + // "pageIndex": 0, + // "requestType": 0, + // }; + } + myRequests = await requestRepo.getRequests(paramsForGetRequests); applyFilterOnRequestsVM(requestsTypeEnum: RequestsTypeEnum.specialCarRequest); setState(ViewState.idle); notifyListeners(); @@ -252,7 +275,7 @@ class RequestsVM extends BaseVM { if (respModel.messageStatus == 1) { Utils.showToast("Request Successfully Created"); Navigator.pop(context); - await getMyRequests(); + await getRequests(appType: AppType.customer); } else { Utils.showToast(respModel.message.toString()); } @@ -308,4 +331,73 @@ class RequestsVM extends BaseVM { return []; } } + + String offerPriceError = ""; + String offerDescriptionError = ""; + + String offerPrice = ""; + + void updateOfferPrice(String value) { + offerPrice = value; + if (value.isNotEmpty) { + offerPriceError = ""; + } + } + + String offerDescription = ""; + + void updateOfferDescription(String value) { + offerDescription = value; + if (value.isNotEmpty) { + offerDescriptionError = ""; + } + } + + //SENDING OFFER + bool isSendOfferValidated() { + bool isValidated = true; + if (offerPrice.isEmpty) { + offerPriceError = GlobalConsts.demandAmountError; + isValidated = false; + notifyListeners(); + } else { + offerPriceError = ""; + } + + if (offerDescription.isEmpty) { + offerDescriptionError = GlobalConsts.descriptionError; + isValidated = false; + notifyListeners(); + } else { + offerDescriptionError = ""; + } + notifyListeners(); + + return isValidated; + } + + void resetSendOfferBottomSheet() { + offerPrice = ""; + offerDescription = ""; + offerDescriptionError = ""; + offerDescription = ""; + notifyListeners(); + } + + Future onSendOfferPressed({required BuildContext context, required String receiverId, required String message, required int requestId, required String offerPrice}) async { + if (isSendOfferValidated()) { + bool status = await context.read().onSendMessageForRequestOffer( + receiverId: receiverId, + chatMessageType: ChatMessageTypeEnum.offer, + message: message, + requestId: requestId, + offerPrice: offerPrice, + ); + + if (status) { + // resetSendOfferBottomSheet(); + Navigator.pop(context); + } + } + } } diff --git a/lib/view_models/user_view_model.dart b/lib/view_models/user_view_model.dart index 27d7518..3e2f511 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/m_response.dart'; +import 'package:mc_common_app/models/general/m_response.dart'; import 'package:mc_common_app/models/user/basic_otp.dart'; import 'package:mc_common_app/models/user/change_email.dart'; import 'package:mc_common_app/models/user/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 7cc8db1..0e979cb 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 17009ec..6405510 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 300da1f..47a2524 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 dbc5c01..1117492 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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'; @@ -27,8 +27,8 @@ import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart'; import 'package:mc_common_app/widgets/common_widgets/time_slots.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.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'; -import 'package:sizer/sizer.dart'; class AdsDetailView extends StatefulWidget { final AdDetailsModel adDetails; @@ -892,6 +892,79 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget { ); } + Future buildCancelReservationBottomSheet(BuildContext context, {required AdDetailsModel adDetails}) { + return showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: true, + builder: (BuildContext context) { + return InfoBottomSheet( + title: "Cancel Reservation".toText(fontSize: 28, isBold: true, letterSpacing: -1.44), + description: Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 12.height, + TxtField( + maxLines: 5, + value: "", + errorValue: "", + keyboardType: TextInputType.text, + hint: "Reason for cancellation", + onChanged: (v) => () {}, + ), + ], + ), + 25.height, + ShowFillButton( + title: "Submit", + onPressed: () { + Navigator.pop(context); + AdVM adVM = context.read(); + return actionConfirmationBottomSheet( + context: context, + title: "Do you want to cancel the reservation?".toText(fontSize: 28, isBold: true, letterSpacing: -1.44), + subtitle: "Your ad reservation will be cancelled and this ad will be again visible to everyone to buy.", + actionButtonYes: Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Yes", + fontSize: 15, + onPressed: () { + Navigator.pop(context); + adVM.cancelMyAdReservation(context, adId: adDetails.id!); + }, + ), + ), + actionButtonNo: Expanded( + child: ShowFillButton( + maxHeight: 55, + isFilled: false, + borderColor: MyColors.darkPrimaryColor, + title: "No", + txtColor: MyColors.darkPrimaryColor, + fontSize: 15, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + ); + }, + maxWidth: double.infinity, + ), + 19.height, + ], + ), + )); + }, + ); + } + Widget cancelReservationAction(BuildContext context, {required AdDetailsModel adDetails}) { return Row( children: [ @@ -904,36 +977,7 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget { maxHeight: 55, title: "Cancel Reservation", onPressed: () { - AdVM adVM = context.read(); - return actionConfirmationBottomSheet( - context: context, - title: "Do you want to cancel the reservation?".toText(fontSize: 28, isBold: true, letterSpacing: -1.44), - subtitle: "Your ad reservation will be cancelled and this ad will be again visible to everyone to buy.", - actionButtonYes: Expanded( - child: ShowFillButton( - maxHeight: 55, - title: "Yes", - fontSize: 15, - onPressed: () { - Navigator.pop(context); - adVM.cancelMyAdReservation(context, adId: adDetails.id!); - }, - ), - ), - actionButtonNo: Expanded( - child: ShowFillButton( - maxHeight: 55, - isFilled: false, - borderColor: MyColors.darkPrimaryColor, - title: "No", - txtColor: MyColors.darkPrimaryColor, - fontSize: 15, - onPressed: () { - Navigator.pop(context); - }, - ), - ), - ); + buildCancelReservationBottomSheet(context, adDetails: adDetails); }), ), ], diff --git a/lib/views/advertisement/ads_filter_view.dart b/lib/views/advertisement/ads_filter_view.dart index 5f3eace..51d4d38 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 6a270ba..a91b36a 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 812f6d8..0a8af7d 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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/book_appointment_schedules_view.dart b/lib/views/appointments/book_appointment_schedules_view.dart index 4b27e26..6580be6 100644 --- a/lib/views/appointments/book_appointment_schedules_view.dart +++ b/lib/views/appointments/book_appointment_schedules_view.dart @@ -1,8 +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/extensions/string_extensions.dart'; -import 'package:mc_common_app/models/service_schedule_model.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/models/services/service_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/view_models/appointments_view_model.dart'; diff --git a/lib/views/appointments/review_appointment_view.dart b/lib/views/appointments/review_appointment_view.dart index 94c0bca..6f26aa8 100644 --- a/lib/views/appointments/review_appointment_view.dart +++ b/lib/views/appointments/review_appointment_view.dart @@ -5,7 +5,7 @@ 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/generated/locale_keys.g.dart'; -import 'package:mc_common_app/models/service_schedule_model.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/models/services/item_model.dart'; import 'package:mc_common_app/models/services/service_model.dart'; import 'package:mc_common_app/theme/colors.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 1c723b2..384b6d9 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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/appointments/widgets/custom_calender_widget.dart b/lib/views/appointments/widgets/custom_calender_widget.dart index 3f91f27..fa903d7 100644 --- a/lib/views/appointments/widgets/custom_calender_widget.dart +++ b/lib/views/appointments/widgets/custom_calender_widget.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/service_schedule_model.dart'; +import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/view_models/appointments_view_model.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; diff --git a/lib/views/chat/chat_view.dart b/lib/views/chat/chat_view.dart new file mode 100644 index 0000000..62ff217 --- /dev/null +++ b/lib/views/chat/chat_view.dart @@ -0,0 +1,195 @@ +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/theme/colors.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'; + +class ChatView extends StatelessWidget { + const ChatView({super.key}); + + @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, + ), + ), + Expanded( + flex: 1, + child: const Icon( + Icons.send_rounded, + color: MyColors.darkPrimaryColor, + size: 30, + ).onPress(() {})) + ], + ).toContainer(isShadowEnabled: true), + ], + ), + // body: + ); + } +} + +class ChatMessageCustomWidget extends StatelessWidget { + final String profileUrl; + final String senderName; + final String messageText; + final MessageTypeEnum messageTypeEnum; + final bool isSent; + + const ChatMessageCustomWidget({ + super.key, + required this.profileUrl, + required this.senderName, + required this.messageText, + required this.messageTypeEnum, + required this.isSent, + }); + + @override + Widget build(BuildContext context) { + return Directionality( + textDirection: isSent ? TextDirection.rtl : TextDirection.ltr, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 1, + child: Image.asset( + profileUrl, + width: 34, + height: 34, + fit: BoxFit.fill, + ).toCircle(borderRadius: 100), + ), + 10.width, + Expanded( + flex: 10, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (isSent ? "You" : senderName).toText(fontSize: 16, isBold: true), + ], + ), + 5.height, + Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: messageText.toText( + color: isSent ? MyColors.white : MyColors.lightTextColor, + fontSize: 12, + // isBold: true, + ), + ), + ], + ), + 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, + ), + ) + ], + ), + ], + ], + ], + ).toContainer( + isShadowEnabled: !isSent, + backgroundColor: isSent ? MyColors.darkIconColor : MyColors.white, + borderRadius: 0, + margin: EdgeInsets.fromLTRB(isSent ? 25 : 0, 0, !isSent ? 25 : 0, 0), + ), + ], + ), + ) + ], + ), + ); + } +} + +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 b24d5e7..cb12e6c 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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/widget/request_item.dart b/lib/views/requests/widget/request_item.dart index 7844b0a..3c37086 100644 --- a/lib/views/requests/widget/request_item.dart +++ b/lib/views/requests/widget/request_item.dart @@ -1,3 +1,4 @@ +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/config/routes.dart'; @@ -13,8 +14,9 @@ import 'package:provider/provider.dart'; class RequestItem extends StatelessWidget { final RequestModel request; + final AppType appType; - RequestItem({required this.request}); + const RequestItem({super.key, required this.request, required this.appType}); @override Widget build(BuildContext context) { @@ -100,8 +102,12 @@ class RequestItem extends StatelessWidget { ), ], ).toContainer(isShadowEnabled: true).onPress(() async { - List offers = await context.read().getOffersByRequest(requestId: request.id, context: context); - navigateWithName(context, AppRoutes.offersListPage, arguments: offers); + if (appType == AppType.provider) { + navigateWithName(context, AppRoutes.requestsDetailPage, arguments: request); + } else { + List offers = await context.read().getOffersByRequest(requestId: request.id, context: context); + navigateWithName(context, AppRoutes.offersListPage, arguments: offers); + } }); } diff --git a/lib/views/user/register_selection_page.dart b/lib/views/user/register_selection_page.dart index b819294..0926b8f 100644 --- a/lib/views/user/register_selection_page.dart +++ b/lib/views/user/register_selection_page.dart @@ -12,6 +12,7 @@ import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:sizer/sizer.dart'; import '../../theme/colors.dart'; @@ -82,6 +83,18 @@ class RegisterSelectionPage extends StatelessWidget { ), ), ), + 10.height, + TextButton( + onPressed: () {}, + child: Text( + "${AppState().currentAppType}", + style: const TextStyle( + color: MyColors.darkPrimaryColor, + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, + ), + ), + ), Utils.mFlex(3), ], ), diff --git a/lib/widgets/common_widgets/categories_list.dart b/lib/widgets/common_widgets/categories_list.dart index 0bc133f..4acf882 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/widgets_models.dart'; +import 'package:mc_common_app/models/general/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 2c4099e..f3702cb 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/service_schedule_model.dart'; -import 'package:mc_common_app/models/widgets_models.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/theme/colors.dart'; class BuildTimeSlots extends StatelessWidget { diff --git a/pubspec.lock b/pubspec.lock index 09c3a03..5aad031 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -613,14 +613,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" - message_pack_dart: - dependency: transitive - description: - name: message_pack_dart - sha256: "71b9f0ff60e5896e60b337960bb535380d7dba3297b457ac763ccae807385b59" - url: "https://pub.dev" - source: hosted - version: "2.0.1" meta: dependency: transitive description: @@ -789,14 +781,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.6" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" provider: dependency: "direct main" description: @@ -877,14 +861,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" shimmer: dependency: "direct main" description: @@ -893,14 +869,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - signalr_netcore: + signalr_core: dependency: "direct main" description: - name: signalr_netcore - sha256: "8f84b4b516c03f3a6872f94e9729d1441d5d223a77c81d0a7d7dae5dd0ce1f2f" + name: signalr_core + sha256: dca676372a00c051511591ed0e24521ff7aa4e9320a7fa778a1007f7f522c8c0 url: "https://pub.dev" source: hosted - version: "1.3.6" + version: "1.1.1" simple_gesture_detector: dependency: transitive description: @@ -946,22 +922,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.5.0" - sse: - dependency: transitive - description: - name: sse - sha256: "3ff9088cac3f45aa8b91336f1962e3ea6c81baaba0bbba361c05f8aa7fb59442" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - sse_channel: + sse_client: dependency: transitive description: - name: sse_channel - sha256: ba2b1382b9423c58fa83e1f01a3a40fbaa16a0594aa984870c88bad0b45d4ca4 + name: sse_client + sha256: "71bd826430b41ab20a69d85bf2dfe9f11cfe222938e681ada1aea71fc8adf348" url: "https://pub.dev" source: hosted - version: "0.0.3" + version: "0.1.0" stack_trace: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index d19a6e1..f7f6455 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,7 +39,7 @@ dependencies: country_code_picker: ^3.0.0 table_calendar: ^3.0.9 intl: any - signalr_netcore: ^1.3.6 + signalr_core: ^1.1.1 logging: ^1.2.0