models refinement

models_removal
Faiz Hashmi 2 years ago
parent 08fd442a36
commit 76fd46c654

@ -1,5 +1,5 @@
import 'package:google_maps_flutter/google_maps_flutter.dart'; 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/models/user/user.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';

@ -147,7 +147,8 @@ class GlobalConsts {
static String fontZoomSize = "font_zoom_size"; static String fontZoomSize = "font_zoom_size";
static String welcomeVideoUrl = "welcomeVideoUrl"; static String welcomeVideoUrl = "welcomeVideoUrl";
static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; 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 vehicleVinError = "Vehicle VIN Cannot be Empty";
static String vehicleTitleError = "Vehicle Title Cannot be Empty"; static String vehicleTitleError = "Vehicle Title Cannot be Empty";
static String warrantyError = "Warranty Duration Cannot be Empty"; static String warrantyError = "Warranty Duration Cannot be Empty";

@ -71,6 +71,9 @@ class AppRoutes {
static const String myRequestsPage = "/myRequestsPage"; static const String myRequestsPage = "/myRequestsPage";
static const String createRequestPage = "/createRequestPage"; static const String createRequestPage = "/createRequestPage";
static const String offersListPage = "/offersListPage"; static const String offersListPage = "/offersListPage";
static const String requestsDetailPage = "/requestsDetailPage";
static const String sendOfferPage = "/sendOfferPage";
//Setting Options //Setting Options
static const String settingOptionsFaqs = "/settingOptionsFaqs"; static const String settingOptionsFaqs = "/settingOptionsFaqs";

@ -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 { extension AdPostStatusToInt on AdPostStatus {
int getIdFromAdPostStatusEnum() { int getIdFromAdPostStatusEnum() {
switch (this) { 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 { extension CreatedByRoleEnumToInt on CreatedByRoleEnum {
int getIdFromCreatedByRoleEnum() { int getIdFromCreatedByRoleEnum() {
switch (this) { 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;
}
}
}

@ -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>? parentList;
int selectedItem;
factory Account.fromJson(Map<String, dynamic> json) => Account(
parentList: json["parentList"] == null
? null
: List<ParentList>.from(
json["parentList"].map((x) => ParentList.fromJson(x))),
selectedItem:
json["selectedItem"] == null ? null : json["selectedItem"],
);
Map<String, dynamic> toJson() => {
"parentList": parentList == null
? null
: List<dynamic>.from(parentList!.map((x) => x.toJson())),
"selectedItem": selectedItem == null ? null : selectedItem,
};
Map<String, dynamic> toJsonData() => {
"selectedItem": selectedItem == null ? null : selectedItem,
};
}

@ -1,5 +1,5 @@
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/widgets_models.dart'; import 'package:mc_common_app/models/general/widgets_models.dart';
class SSCarCheckScheduleModel { class SSCarCheckScheduleModel {
int? serviceProviderID; int? serviceProviderID;

@ -1,6 +1,6 @@
import 'package:mc_common_app/extensions/string_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/widgets_models.dart'; import 'package:mc_common_app/models/general/widgets_models.dart';
class SSPhotoOfficeScheduleModel { class SSPhotoOfficeScheduleModel {
int? photoOfficeID; int? photoOfficeID;

@ -1,6 +1,6 @@
import 'package:mc_common_app/extensions/string_extensions.dart'; 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/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 { class CustomTimeDateSlotModel {
TimeSlotModel? date; TimeSlotModel? date;

@ -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<String, dynamic> 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<String, dynamic> 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'];
}
}

@ -1,12 +0,0 @@
class ConfigModel {
ConfigModel(this.endpoint, this.organizationName);
String endpoint;
String organizationName;
factory ConfigModel.fromJson(Map<String, dynamic> json) =>
ConfigModel("", "");
// Map<String, dynamic> toJson() => _$ConfigModelToJson(this);
}

@ -1,65 +0,0 @@
class ContentInfoModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<ContentInfoDataModel>? data;
ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data});
ContentInfoModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
contentInfoId = json['contentInfoId'];
contentTypeId = json['contentTypeId'];
content = json['content'];
contentTypeNameEn = json['contentTypeNameEn'];
contentTypeNameAr = json['contentTypeNameAr'];
fileName = json['fileName'];
exposeFilePath = json['exposeFilePath'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

@ -1,62 +0,0 @@
class MemberModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<MemberDataModel>? data;
MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data});
MemberModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
committeeId = json['committeeId'];
firstName = json['firstName'];
lastName = json['lastName'];
description = json['description'];
picture = json['picture'];
orderNo = json['orderNo'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

@ -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<String, dynamic> 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<String, dynamic> toJson() => {
"dbId": dbId == null ? null : dbId,
"text": text == null ? null : text,
"path": path == null ? null : path,
};
}

@ -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<String, dynamic> 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<String, dynamic> toJson() => _$BackendResponseToJson(this);
}

@ -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<Subscription>? data;
String? message;
factory SubscriptionModel.fromJson(Map<String, dynamic> json) => SubscriptionModel(
messageStatus: json["messageStatus"],
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? [] : List<Subscription>.from(json["data"]!.map((x) => Subscription.fromJson(x))),
message: json["message"],
);
Map<String, dynamic> toJson() => {
"messageStatus": messageStatus,
"totalItemsCount": totalItemsCount,
"data": data == null ? [] : List<dynamic>.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<String, dynamic> 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<String, dynamic> 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,
};
}

@ -1,74 +0,0 @@
class SurahModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<SurahModelData>? data;
SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data});
SurahModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

@ -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>? parentList;
// int selectedItem;
//
// factory Account.fromJson(Map<String, dynamic> json) => Account(
// parentList: json["parentList"] == null
// ? null
// : List<ParentList>.from(
// json["parentList"].map((x) => ParentList.fromJson(x))),
// selectedItem:
// json["selectedItem"] == null ? null : json["selectedItem"],
// );
//
// Map<String, dynamic> toJson() => {
// "parentList": parentList == null
// ? null
// : List<dynamic>.from(parentList!.map((x) => x.toJson())),
// "selectedItem": selectedItem == null ? null : selectedItem,
// };
//
// Map<String, dynamic> toJsonData() => {
// "selectedItem": selectedItem == null ? null : selectedItem,
// };
// }

@ -0,0 +1,12 @@
// class ConfigModel {
// ConfigModel(this.endpoint, this.organizationName);
//
// String endpoint;
//
// String organizationName;
//
// factory ConfigModel.fromJson(Map<String, dynamic> json) =>
// ConfigModel("", "");
//
// // Map<String, dynamic> toJson() => _$ConfigModelToJson(this);
// }

@ -0,0 +1,65 @@
// class ContentInfoModel {
// int? totalItemsCount;
// int? statusCode;
// String? message;
// List<ContentInfoDataModel>? data;
//
// ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data});
//
// ContentInfoModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// 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<String, dynamic> json) {
// contentInfoId = json['contentInfoId'];
// contentTypeId = json['contentTypeId'];
// content = json['content'];
// contentTypeNameEn = json['contentTypeNameEn'];
// contentTypeNameAr = json['contentTypeNameAr'];
// fileName = json['fileName'];
// exposeFilePath = json['exposeFilePath'];
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// 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;
// }
// }

@ -0,0 +1,62 @@
// class MemberModel {
// int? totalItemsCount;
// int? statusCode;
// String? message;
// List<MemberDataModel>? data;
//
// MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data});
//
// MemberModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// 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<String, dynamic> json) {
// committeeId = json['committeeId'];
// firstName = json['firstName'];
// lastName = json['lastName'];
// description = json['description'];
// picture = json['picture'];
// orderNo = json['orderNo'];
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// 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;
// }
// }

@ -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<String, dynamic> 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<String, dynamic> toJson() => {
// "dbId": dbId == null ? null : dbId,
// "text": text == null ? null : text,
// "path": path == null ? null : path,
// };
// }

@ -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}'; // 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

@ -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<String, dynamic> 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<String, dynamic> toJson() => _$BackendResponseToJson(this);
// }

@ -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<Subscription>? data;
// String? message;
//
// factory SubscriptionModel.fromJson(Map<String, dynamic> json) => SubscriptionModel(
// messageStatus: json["messageStatus"],
// totalItemsCount: json["totalItemsCount"],
// data: json["data"] == null ? [] : List<Subscription>.from(json["data"]!.map((x) => Subscription.fromJson(x))),
// message: json["message"],
// );
//
// Map<String, dynamic> toJson() => {
// "messageStatus": messageStatus,
// "totalItemsCount": totalItemsCount,
// "data": data == null ? [] : List<dynamic>.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<String, dynamic> 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<String, dynamic> 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,
// };
// }

@ -0,0 +1,74 @@
// class SurahModel {
// int? totalItemsCount;
// int? statusCode;
// String? message;
// List<SurahModelData>? data;
//
// SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data});
//
// SurahModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// 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<String, dynamic> 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<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// 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;
// }
// }

@ -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/reserved_ads_models.dart';
import 'package:mc_common_app/models/advertisment_models/special_service_model.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/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'; import 'package:mc_common_app/utils/enums.dart';
abstract class AdsRepo { abstract class AdsRepo {

@ -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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.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/m_response.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/provider_branches_models/profile/services.dart';
import 'package:mc_common_app/models/schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/schedule_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/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
abstract class AppointmentRepo { abstract class AppointmentRepo {

@ -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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:signalr_core/signalr_core.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';
abstract class ChatRepo { abstract class ChatRepo {
Future<HubConnection?> buildChatHubConnection(); Future<HubConnection> getHubConnection();
} }
class ChatRepoImp implements ChatRepo { class ChatRepoImp implements ChatRepo {
@override @override
Future<HubConnection?> buildChatHubConnection() async { Future<HubConnection> getHubConnection() async {
final userId = AppState().getUser.data!.userInfo!.userId ?? ""; final userId = AppState().getUser.data!.userInfo!.userId ?? "";
HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true); final hubUrl = "https://ms.hmg.com/McHub?userID=$userId";
HubConnection hubConnection = HubConnectionBuilder() logger.i("Connecting with Hub ($hubUrl)");
HubConnection hub;
hub = HubConnectionBuilder()
.withUrl( .withUrl(
"${ApiConsts.chatHubUrl}?userID=$userId", hubUrl,
options: httpOptions, HttpConnectionOptions(
) client: IOClient(HttpClient()
.withAutomaticReconnect( ..badCertificateCallback = (x, y, z) => true),
retryDelays: <int>[2000, 5000, 10000, 20000], logging: (level, message) {
) print(message);
.configureLogging( },
Logger("configureLogging"), ))
)
.build(); .build();
hubConnection.onclose( return hub;
({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<Object?>? arguments) {
Utils.showToast("I received ping : ${arguments.toString()}");
});
} catch (e) {
logger.i("Error in OnSendQuestionToParticipant");
}
}
return hubConnection;
} }
} }

@ -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_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/ss_photo_schedule_model.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_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/cities.dart';
import 'package:mc_common_app/models/user/country.dart'; import 'package:mc_common_app/models/user/country.dart';
import 'package:mc_common_app/models/user/role.dart'; import 'package:mc_common_app/models/user/role.dart';
import '../models/advertisment_models/vehicle_details_models.dart'; import '../models/advertisment_models/vehicle_details_models.dart';
import '../models/enums_model.dart'; import '../models/general/enums_model.dart';
abstract class CommonRepo { abstract class CommonRepo {
Future<Country> getAllCountries(); Future<Country> getAllCountries();

@ -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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.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'; import 'package:mc_common_app/models/payment_models/pay_order_detail_resp_model.dart';
abstract class PaymentsRepo { abstract class PaymentsRepo {

@ -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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.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/branch_detail_model.dart';
import 'package:mc_common_app/models/provider_branches_models/provider_profile_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'; import 'package:mc_common_app/models/services/item_model.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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.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/offers_model.dart';
import 'package:mc_common_app/models/requests/request_model.dart'; import 'package:mc_common_app/models/requests/request_model.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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.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/basic_otp.dart';
import 'package:mc_common_app/models/user/change_email.dart'; import 'package:mc_common_app/models/user/change_email.dart';
import 'package:mc_common_app/models/user/change_mobile.dart'; import 'package:mc_common_app/models/user/change_mobile.dart';

@ -155,3 +155,20 @@ enum RequestsTypeEnum {
specialCarRequest, specialCarRequest,
serviceRequest, serviceRequest,
} }
enum ChatMessageTypeEnum {
freeText,
image,
audio,
video,
file,
offer,
}
enum RequestOfferStatusEnum {
offer,
negotiate,
accepted,
rejected,
cancel,
}

@ -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_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/ss_photo_schedule_model.dart';
import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.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/general/enums_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/service_schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_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/ads_repo.dart'; import 'package:mc_common_app/repositories/ads_repo.dart';
import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/services/common_services.dart'; import 'package:mc_common_app/services/common_services.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/enums_model.dart'; import 'package:mc_common_app/models/general/enums_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/provider_branches_models/branch_detail_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/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/item_model.dart';
import 'package:mc_common_app/models/services/service_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/appointment_repo.dart';
import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/repositories/provider_repo.dart'; import 'package:mc_common_app/repositories/provider_repo.dart';

@ -1,39 +1,68 @@
import 'package:flutter/cupertino.dart'; 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/repositories/chat_repo.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.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; final ChatRepo chatRepo;
ChatVM({required this.chatRepo}); ChatVM({required this.chatRepo});
HubConnection? hubConnection; late HubConnection hubConnection;
Future<void> buildHubConnection() async { Future<void> buildHubConnection() async {
hubConnection = await chatRepo.buildChatHubConnection(); // if (hubConnection.state != HubConnectionState.Connected) {
try {
hubConnection = await chatRepo.getHubConnection();
await hubConnection.start();
hubConnection.on("ReceiveMessageRequestOffer", (List<Object?>? arguments) {
print("this is the offer: ${arguments.toString()}");
Utils.showToast("I received ping : ${arguments.toString()}");
});
} catch (e) {
logger.i("Error: ${e.toString()}");
}
notifyListeners(); notifyListeners();
// }
} }
Future<void> onSendMessageForRequestOffer() async { Future<bool> onSendMessageForRequestOffer(
if (hubConnection == null || hubConnection!.state != HubConnectionState.Connected) { {required String receiverId, required ChatMessageTypeEnum chatMessageType, required String message, required int requestId, required String offerPrice}) async {
if (hubConnection.state != HubConnectionState.connected) {
await buildHubConnection(); await buildHubConnection();
} }
if (hubConnection != null) { if (hubConnection.state == HubConnectionState.connected) {
hubConnection!.invoke( final providerId = AppState().getUser.data!.userInfo!.providerId;
print("providerId: $providerId");
hubConnection.invoke(
"SendMessageRequestOffer", "SendMessageRequestOffer",
args: <Object>[ args: <Object>[
// <String, dynamic>{ <String, dynamic>{
// "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER ?? "", "ReceiverUserID": receiverId,
// "employeeName": AppState().memberInformationList!.eMPLOYEENAME ?? "", "MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
// "marathonId": AppState().getMarathonProjectId, "Message": message,
// "prizeId": "8577B2E8-5DD7-43F0-10DD-08DACB0AC064", "RequestID": requestId,
// } "RequestOfferID": 0,
"RequestOffer": <String, dynamic>{
"RequestID": requestId,
"Price": double.parse(offerPrice),
"ServiceProviderID": providerId,
"OfferStatus": RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(),
"Comment": message,
},
}
], ],
).catchError((e) { ).catchError((e) {
logger.i("error in invoking SendMessageRequestOffer: ${e.toString()}");
Utils.showToast(e.toString()); Utils.showToast(e.toString());
return null; return false;
}); });
} }
return true;
} }
} }

@ -2,19 +2,22 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/string_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/advertisment_models/vehicle_details_models.dart';
import 'package:mc_common_app/models/enums_model.dart'; import 'package:mc_common_app/models/general/enums_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/requests/offers_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/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/common_repo.dart';
import 'package:mc_common_app/repositories/request_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/services/common_services.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.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/base_view_model.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:provider/provider.dart';
class RequestsVM extends BaseVM { class RequestsVM extends BaseVM {
final CommonAppServices commonServices; final CommonAppServices commonServices;
@ -33,26 +36,46 @@ class RequestsVM extends BaseVM {
populateRequestsFilterList() async { populateRequestsFilterList() async {
requestsTypeFilterOptions.clear(); requestsTypeFilterOptions.clear();
if (myRequestsTypeEnum.isEmpty) { 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++) { for (int i = 0; i < myRequestsTypeEnum.length; i++) {
requestsTypeFilterOptions.add(FilterListModel(title: myRequestsTypeEnum[i].enumValueStr, isSelected: false, id: myRequestsTypeEnum[i].enumValue)); requestsTypeFilterOptions.add(FilterListModel(title: myRequestsTypeEnum[i].enumValueStr, isSelected: false, id: myRequestsTypeEnum[i].enumValue));
} }
print("requestsTypeFilterOptions: ${requestsTypeFilterOptions.toString()}");
notifyListeners(); notifyListeners();
} }
Future<void> getMyRequests({bool isNeedToRebuild = false}) async { Future<void> getRequests({bool isNeedToRebuild = false, required AppType appType}) async {
if (isNeedToRebuild) setState(ViewState.busy); if (isNeedToRebuild) setState(ViewState.busy);
myRequests = await requestRepo.getRequests( var paramsForGetRequests = <String, dynamic>{};
{
"customerID": AppState().getUser.data!.userInfo!.customerId, paramsForGetRequests = {
"pageSize": 100, "pageSize": 100,
"pageIndex": 0, "pageIndex": 0,
"requestType": 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); applyFilterOnRequestsVM(requestsTypeEnum: RequestsTypeEnum.specialCarRequest);
setState(ViewState.idle); setState(ViewState.idle);
notifyListeners(); notifyListeners();
@ -252,7 +275,7 @@ class RequestsVM extends BaseVM {
if (respModel.messageStatus == 1) { if (respModel.messageStatus == 1) {
Utils.showToast("Request Successfully Created"); Utils.showToast("Request Successfully Created");
Navigator.pop(context); Navigator.pop(context);
await getMyRequests(); await getRequests(appType: AppType.customer);
} else { } else {
Utils.showToast(respModel.message.toString()); Utils.showToast(respModel.message.toString());
} }
@ -308,4 +331,73 @@ class RequestsVM extends BaseVM {
return []; 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<void> onSendOfferPressed({required BuildContext context, required String receiverId, required String message, required int requestId, required String offerPrice}) async {
if (isSendOfferValidated()) {
bool status = await context.read<ChatVM>().onSendMessageForRequestOffer(
receiverId: receiverId,
chatMessageType: ChatMessageTypeEnum.offer,
message: message,
requestId: requestId,
offerPrice: offerPrice,
);
if (status) {
// resetSendOfferBottomSheet();
Navigator.pop(context);
}
}
}
} }

@ -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/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.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/basic_otp.dart';
import 'package:mc_common_app/models/user/change_email.dart'; import 'package:mc_common_app/models/user/change_email.dart';
import 'package:mc_common_app/models/user/change_mobile.dart'; import 'package:mc_common_app/models/user/change_mobile.dart';

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/theme/colors.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/theme/colors.dart';
import 'package:mc_common_app/view_models/ad_view_model.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'; import 'package:mc_common_app/views/advertisement/ad_creation_steps/ad_creation_steps_containers.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.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/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.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/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/theme/colors.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/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/common_widgets/time_slots.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.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/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:sizer/sizer.dart';
class AdsDetailView extends StatefulWidget { class AdsDetailView extends StatefulWidget {
final AdDetailsModel adDetails; 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<AdVM>();
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}) { Widget cancelReservationAction(BuildContext context, {required AdDetailsModel adDetails}) {
return Row( return Row(
children: [ children: [
@ -904,36 +977,7 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
maxHeight: 55, maxHeight: 55,
title: "Cancel Reservation", title: "Cancel Reservation",
onPressed: () { onPressed: () {
AdVM adVM = context.read<AdVM>(); buildCancelReservationBottomSheet(context, adDetails: adDetails);
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);
},
),
),
);
}), }),
), ),
], ],

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.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/theme/colors.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/theme/colors.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';

@ -1,8 +1,7 @@
import 'package:flutter/material.dart'; 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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/models/services/service_model.dart';
import 'package:mc_common_app/theme/colors.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/view_models/appointments_view_model.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/item_model.dart';
import 'package:mc_common_app/models/services/service_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/theme/colors.dart';

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/theme/colors.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart'; import 'package:mc_common_app/view_models/appointments_view_model.dart';

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/string_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/theme/colors.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/view_models/appointments_view_model.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.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 }

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/ad_creation_steps/ad_creation_steps_containers.dart';
import 'package:mc_common_app/views/advertisement/picked_images_container.dart'; import 'package:mc_common_app/views/advertisement/picked_images_container.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:mc_common_app/view_models/requests_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
@ -13,8 +14,9 @@ import 'package:provider/provider.dart';
class RequestItem extends StatelessWidget { class RequestItem extends StatelessWidget {
final RequestModel request; final RequestModel request;
final AppType appType;
RequestItem({required this.request}); const RequestItem({super.key, required this.request, required this.appType});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -100,8 +102,12 @@ class RequestItem extends StatelessWidget {
), ),
], ],
).toContainer(isShadowEnabled: true).onPress(() async { ).toContainer(isShadowEnabled: true).onPress(() async {
List<OffersModel> offers = await context.read<RequestsVM>().getOffersByRequest(requestId: request.id, context: context); if (appType == AppType.provider) {
navigateWithName(context, AppRoutes.offersListPage, arguments: offers); navigateWithName(context, AppRoutes.requestsDetailPage, arguments: request);
} else {
List<OffersModel> offers = await context.read<RequestsVM>().getOffersByRequest(requestId: request.id, context: context);
navigateWithName(context, AppRoutes.offersListPage, arguments: offers);
}
}); });
} }

@ -12,6 +12,7 @@ import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:sizer/sizer.dart';
import '../../theme/colors.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), Utils.mFlex(3),
], ],
), ),

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/string_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/theme/colors.dart';
class FiltersList extends StatelessWidget { class FiltersList extends StatelessWidget {

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/string_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/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/theme/colors.dart';
class BuildTimeSlots extends StatelessWidget { class BuildTimeSlots extends StatelessWidget {

@ -613,14 +613,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" 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: meta:
dependency: transitive dependency: transitive
description: description:
@ -789,14 +781,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.6" version: "2.1.6"
pool:
dependency: transitive
description:
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
url: "https://pub.dev"
source: hosted
version: "1.5.1"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
@ -877,14 +861,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.3.1"
shelf:
dependency: transitive
description:
name: shelf
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
url: "https://pub.dev"
source: hosted
version: "1.4.1"
shimmer: shimmer:
dependency: "direct main" dependency: "direct main"
description: description:
@ -893,14 +869,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
signalr_netcore: signalr_core:
dependency: "direct main" dependency: "direct main"
description: description:
name: signalr_netcore name: signalr_core
sha256: "8f84b4b516c03f3a6872f94e9729d1441d5d223a77c81d0a7d7dae5dd0ce1f2f" sha256: dca676372a00c051511591ed0e24521ff7aa4e9320a7fa778a1007f7f522c8c0
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.6" version: "1.1.1"
simple_gesture_detector: simple_gesture_detector:
dependency: transitive dependency: transitive
description: description:
@ -946,22 +922,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.0" version: "2.5.0"
sse: sse_client:
dependency: transitive
description:
name: sse
sha256: "3ff9088cac3f45aa8b91336f1962e3ea6c81baaba0bbba361c05f8aa7fb59442"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
sse_channel:
dependency: transitive dependency: transitive
description: description:
name: sse_channel name: sse_client
sha256: ba2b1382b9423c58fa83e1f01a3a40fbaa16a0594aa984870c88bad0b45d4ca4 sha256: "71bd826430b41ab20a69d85bf2dfe9f11cfe222938e681ada1aea71fc8adf348"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.0.3" version: "0.1.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:

@ -39,7 +39,7 @@ dependencies:
country_code_picker: ^3.0.0 country_code_picker: ^3.0.0
table_calendar: ^3.0.9 table_calendar: ^3.0.9
intl: any intl: any
signalr_netcore: ^1.3.6 signalr_core: ^1.1.1
logging: ^1.2.0 logging: ^1.2.0

Loading…
Cancel
Save