Request and Chat WIP

aamir_dev
Faiz Hashmi 2 years ago
parent a47cae92f2
commit 711be7f5da

@ -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: 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: 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 }

@ -1,7 +1,6 @@
import 'package:car_customer_app/repositories/provider_repo.dart'; import 'package:car_customer_app/repositories/provider_repo.dart';
import 'package:car_customer_app/repositories/appointment_repo.dart'; import 'package:car_customer_app/repositories/appointment_repo.dart';
import 'package:car_customer_app/repositories/request_repo.dart'; import 'package:car_customer_app/repositories/request_repo.dart';
import 'package:car_customer_app/repositories/schedule_repo.dart';
import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/dependencies.dart';
class CustomerDependencies { class CustomerDependencies {
@ -9,7 +8,6 @@ class CustomerDependencies {
AppDependencies.addDependencies(); AppDependencies.addDependencies();
injector.registerSingleton<ProviderRepo>(() => ProviderRepoImp()); injector.registerSingleton<ProviderRepo>(() => ProviderRepoImp());
injector.registerSingleton<AppointmentRepo>(() => ScheduleRepoImp()); injector.registerSingleton<AppointmentRepo>(() => ScheduleRepoImp());
injector.registerSingleton<RequestRepo>(() => RequestRepoImp());
} }
} }

@ -1,3 +1,4 @@
import 'package:car_customer_app/chat/chat_view.dart';
import 'package:car_customer_app/views/appointments/appointment_detail_view.dart'; import 'package:car_customer_app/views/appointments/appointment_detail_view.dart';
import 'package:car_customer_app/views/appointments/book_appointment_schedules_view.dart'; import 'package:car_customer_app/views/appointments/book_appointment_schedules_view.dart';
import 'package:car_customer_app/views/appointments/book_appointment_services_view.dart'; import 'package:car_customer_app/views/appointments/book_appointment_services_view.dart';
@ -13,6 +14,7 @@ import 'package:mc_common_app/config/routes.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/appointments_models/appointment_list_model.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_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/requests/offers_model.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/views/advertisement/ads_detail_view.dart'; import 'package:mc_common_app/views/advertisement/ads_detail_view.dart';
import 'package:mc_common_app/views/advertisement/create_ad_view.dart'; import 'package:mc_common_app/views/advertisement/create_ad_view.dart';
@ -40,7 +42,8 @@ class CustomerAppRoutes {
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes), AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes),
AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchDetailModel: ModalRoute.of(context)!.settings.arguments as BranchDetailModel), AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchDetailModel: ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int), AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int),
AppRoutes.offersListPage: (context) => OfferListPage(), AppRoutes.offersListPage: (context) => OfferListPage(offersList: ModalRoute.of(context)!.settings.arguments as List<OffersModel>),
AppRoutes.createRequestPage: (context) => CreateRequestPage(), AppRoutes.createRequestPage: (context) => CreateRequestPage(),
AppRoutes.chatView: (context) => ChatView(),
}; };
} }

@ -3,7 +3,6 @@ import 'package:car_customer_app/config/customer_routes.dart';
import 'package:car_customer_app/repositories/provider_repo.dart'; import 'package:car_customer_app/repositories/provider_repo.dart';
import 'package:car_customer_app/repositories/appointment_repo.dart'; import 'package:car_customer_app/repositories/appointment_repo.dart';
import 'package:car_customer_app/repositories/request_repo.dart'; import 'package:car_customer_app/repositories/request_repo.dart';
import 'package:car_customer_app/repositories/schedule_repo.dart';
import 'package:car_customer_app/view_models/appointments_view_model.dart'; import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:car_customer_app/view_models/dashboard_view_model.dart'; import 'package:car_customer_app/view_models/dashboard_view_model.dart';
import 'package:car_customer_app/view_models/requests_view_model.dart'; import 'package:car_customer_app/view_models/requests_view_model.dart';
@ -68,8 +67,13 @@ Future<void> main() async {
ChangeNotifierProvider<PaymentVM>( ChangeNotifierProvider<PaymentVM>(
create: (_) => PaymentVM(paymentService: injector.get<PaymentService>(), paymentRepo: injector.get<PaymentsRepo>()), create: (_) => PaymentVM(paymentService: injector.get<PaymentService>(), paymentRepo: injector.get<PaymentsRepo>()),
), ),
scheduleRepo: injector.get<AppointmentRepo>(), ChangeNotifierProvider<RequestsVM>(
create: (_) => RequestsVM(
requestRepo: injector.get<RequestRepo>(),
commonServices: injector.get<CommonAppServices>(),
commonRepo: injector.get<CommonRepo>(),
),
),
], ],
child: MyApp(), child: MyApp(),
).setupLocale(), ).setupLocale(),

@ -1,138 +0,0 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/utils/enums.dart';
class Request {
int requestType;
String requestTypeName;
String requestStatusName;
RequestStatus requestStatus;
String cityName;
String vehicleTypeName;
String countryName;
String customerName;
dynamic serviceProviders;
int offerCount;
int id;
int customerId;
dynamic customer;
String brand;
String model;
int year;
bool isNew;
String description;
List<dynamic> requestImages;
int cityId;
dynamic city;
double price;
int paymentStatus;
int vehicleTypeId;
int countryId;
List<dynamic> requestProviderItem;
bool isActive;
int createdBy;
DateTime createdOn;
dynamic modifiedBy;
dynamic modifiedOn;
Request({
required this.requestType,
required this.requestTypeName,
required this.requestStatusName,
required this.requestStatus,
required this.cityName,
required this.vehicleTypeName,
required this.countryName,
required this.customerName,
required this.serviceProviders,
required this.offerCount,
required this.id,
required this.customerId,
required this.customer,
required this.brand,
required this.model,
required this.year,
required this.isNew,
required this.description,
required this.requestImages,
required this.cityId,
required this.city,
required this.price,
required this.paymentStatus,
required this.vehicleTypeId,
required this.countryId,
required this.requestProviderItem,
required this.isActive,
required this.createdBy,
required this.createdOn,
required this.modifiedBy,
required this.modifiedOn,
});
factory Request.fromJson(Map<String, dynamic> json) => Request(
requestType: json["requestType"],
requestTypeName: json["requestTypeName"],
requestStatusName: json["requestStatusName"],
requestStatus: (json['requestStatus'] as int).toRequestStatusEnum(),
cityName: json["cityName"],
vehicleTypeName: json["vehicleTypeName"],
countryName: json["countryName"],
customerName: json["customerName"],
serviceProviders: json["serviceProviders"],
offerCount: json["offerCount"],
id: json["id"],
customerId: json["customerID"],
customer: json["customer"],
brand: json["brand"],
model: json["model"],
year: json["year"],
isNew: json["isNew"],
description: json["description"],
requestImages: List<dynamic>.from(json["requestImages"].map((x) => x)),
cityId: json["cityID"],
city: json["city"],
price: json["price"],
paymentStatus: json["paymentStatus"],
vehicleTypeId: json["vehicleTypeID"],
countryId: json["countryID"],
requestProviderItem: List<dynamic>.from(json["requestProviderItem"].map((x) => x)),
isActive: json["isActive"],
createdBy: json["createdBy"],
createdOn: DateTime.parse(json["createdOn"]),
modifiedBy: json["modifiedBy"],
modifiedOn: json["modifiedOn"],
);
Map<String, dynamic> toJson() => {
"requestType": requestType,
"requestTypeName": requestTypeName,
"requestStatusName": requestStatusName,
"requestStatus": requestStatus,
"cityName": cityName,
"vehicleTypeName": vehicleTypeName,
"countryName": countryName,
"customerName": customerName,
"serviceProviders": serviceProviders,
"offerCount": offerCount,
"id": id,
"customerID": customerId,
"customer": customer,
"brand": brand,
"model": model,
"year": year,
"isNew": isNew,
"description": description,
"requestImages": List<dynamic>.from(requestImages.map((x) => x)),
"cityID": cityId,
"city": city,
"price": price,
"paymentStatus": paymentStatus,
"vehicleTypeID": vehicleTypeId,
"countryID": countryId,
"requestProviderItem": List<dynamic>.from(requestProviderItem.map((x) => x)),
"isActive": isActive,
"createdBy": createdBy,
"createdOn": createdOn.toIso8601String(),
"modifiedBy": modifiedBy,
"modifiedOn": modifiedOn,
};
}

@ -1,14 +1,17 @@
import 'package:car_customer_app/model/request.dart';
import 'package:mc_common_app/api/api_client.dart'; 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/generic_resp_model.dart';
import 'package:mc_common_app/models/requests/offers_model.dart';
import 'package:mc_common_app/models/requests/request_model.dart';
abstract class RequestRepo { abstract class RequestRepo {
Future<GenericRespModel> createRequest(Map<String, dynamic> map); Future<GenericRespModel> createRequest(Map<String, dynamic> map);
Future<List<Request>> getRequests(Map<String, dynamic> postParams); Future<List<OffersModel>> getOffersByRequest({required int requestId, int serviceProviderId = 0});
Future<List<RequestModel>> getRequests(Map<String, dynamic> postParams);
} }
class RequestRepoImp implements RequestRepo { class RequestRepoImp implements RequestRepo {
@ -27,19 +30,40 @@ class RequestRepoImp implements RequestRepo {
} }
@override @override
Future<List<Request>> getRequests(Map<String, dynamic> postParams) async { Future<List<RequestModel>> getRequests(Map<String, dynamic> postParams) async {
GenericRespModel enumGenericModel = await apiClient.postJsonForObject( GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getRequest, ApiConsts.getRequest,
postParams, postParams,
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
); );
List<Request> requests = List.generate( List<RequestModel> requests = List.generate(
enumGenericModel.data.length, enumGenericModel.data.length,
(index) => Request.fromJson( (index) => RequestModel.fromJson(
enumGenericModel.data[index], enumGenericModel.data[index],
), ),
); );
return requests; return requests;
} }
@override
Future<List<OffersModel>> getOffersByRequest({required int requestId, int serviceProviderId = 0}) async {
var queryParameters = {
"RequestID": requestId.toString(),
"ServiceProviderID": serviceProviderId.toString(),
};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getRequestOffers,
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);
List<OffersModel> offersList = List.generate(
genericRespModel.data.length,
(index) => OffersModel.fromJson(
genericRespModel.data[index],
),
);
return offersList;
}
} }

@ -9,6 +9,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/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/generic_resp_model.dart'; import 'package:mc_common_app/models/generic_resp_model.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/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';
@ -218,15 +219,18 @@ class AppointmentsVM extends BaseVM {
serviceAppointmentScheduleList.clear(); serviceAppointmentScheduleList.clear();
} }
populateAppointmentsFilterList() { List<EnumsModel> myAppointmentsEnum = [];
populateAppointmentsFilterList() async {
appointmentsFilterOptions.clear(); appointmentsFilterOptions.clear();
appointmentsFilterOptions = [
FilterListModel(title: "All Appointments", isSelected: true, id: -1), myAppointmentsEnum = await commonRepo.getEnumTypeValues(enumTypeID: 13); //TODO: 13 is to get Appointments Filter Enums
FilterListModel(title: "Booked", isSelected: false, id: 1),
FilterListModel(title: "Confirmed", isSelected: false, id: 2), for (int i = 0; i < myAppointmentsEnum.length; i++) {
FilterListModel(title: "Arrived", isSelected: false, id: 3), appointmentsFilterOptions.add(FilterListModel(title: myAppointmentsEnum[i].enumValueStr, isSelected: false, id: myAppointmentsEnum[i].enumValue));
FilterListModel(title: "Cancelled", isSelected: false, id: 4), }
]; appointmentsFilterOptions.insert(0, FilterListModel(title: "All Appointments", isSelected: true, id: 0));
notifyListeners(); notifyListeners();
} }
@ -235,9 +239,9 @@ class AppointmentsVM extends BaseVM {
for (var value in appointmentsFilterOptions) { for (var value in appointmentsFilterOptions) {
value.isSelected = false; value.isSelected = false;
} }
appointmentsFilterOptions[appointmentStatusEnum.getIdFromAppointmentStatusEnum() == -1 ? 0 : appointmentStatusEnum.getIdFromAppointmentStatusEnum()].isSelected = true; appointmentsFilterOptions[appointmentStatusEnum.getIdFromAppointmentStatusEnum()].isSelected = true;
if (appointmentStatusEnum.getIdFromAppointmentStatusEnum() == -1) { if (appointmentStatusEnum.getIdFromAppointmentStatusEnum() == 0) {
myFilteredAppointments = myAppointments; myFilteredAppointments = myAppointments;
notifyListeners(); notifyListeners();
return; return;
@ -247,13 +251,14 @@ class AppointmentsVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
Future<void> getMyAppointments() async { Future<void> getMyAppointments({bool isNeedToRebuild = false}) async {
isFetchingLists = true; if (isNeedToRebuild) setState(ViewState.busy);
myAppointments = await commonRepo.getMyAppointments(); myAppointments = await commonRepo.getMyAppointments();
myFilteredAppointments = myAppointments; myFilteredAppointments = myAppointments;
myUpComingAppointments = myAppointments.where((element) => element.appointmentStatusEnum == AppointmentStatusEnum.booked).toList(); myUpComingAppointments = myAppointments.where((element) => element.appointmentStatusEnum == AppointmentStatusEnum.booked).toList();
setState(ViewState.idle);
// applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments); // applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments);
isFetchingLists = false;
notifyListeners(); notifyListeners();
} }
@ -331,12 +336,12 @@ class AppointmentsVM extends BaseVM {
populateBranchesFilterList() { populateBranchesFilterList() {
providersFilterOptions.clear(); providersFilterOptions.clear();
providersFilterOptions = [ providersFilterOptions = [
FilterListModel(title: "All Providers", isSelected: true, id: -1), FilterListModel(title: "All Providers", isSelected: true, id: 0),
FilterListModel(title: "Maintenance", isSelected: false, id: 0), FilterListModel(title: "Maintenance", isSelected: false, id: 1),
FilterListModel(title: "Oil Service", isSelected: false, id: 1), FilterListModel(title: "Oil Service", isSelected: false, id: 2),
FilterListModel(title: "Accessories", isSelected: false, id: 2), FilterListModel(title: "Accessories", isSelected: false, id: 3),
FilterListModel(title: "Tire Service", isSelected: false, id: 3), FilterListModel(title: "Tire Service", isSelected: false, id: 4),
FilterListModel(title: "Dent and Paint", isSelected: false, id: 4), FilterListModel(title: "Dent and Paint", isSelected: false, id: 5),
]; ];
notifyListeners(); notifyListeners();
} }
@ -405,7 +410,6 @@ class AppointmentsVM extends BaseVM {
pickHomeLocationError = ""; pickHomeLocationError = "";
if (categoryId != -1) { if (categoryId != -1) {
isFetchingServices = true; isFetchingServices = true;
// notifyListeners();
branchServices = getFilteredBranchServices(categoryId: categoryId); branchServices = getFilteredBranchServices(categoryId: categoryId);
isFetchingServices = false; isFetchingServices = false;
notifyListeners(); notifyListeners();

@ -1,18 +1,22 @@
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:car_customer_app/repositories/request_repo.dart'; import 'package:car_customer_app/repositories/request_repo.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/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.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/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/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/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/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 '../model/request.dart';
class RequestsVM extends BaseVM { class RequestsVM extends BaseVM {
final CommonAppServices commonServices; final CommonAppServices commonServices;
final CommonRepo commonRepo; final CommonRepo commonRepo;
@ -20,23 +24,49 @@ class RequestsVM extends BaseVM {
RequestsVM({required this.commonServices, required this.commonRepo, required this.requestRepo}); RequestsVM({required this.commonServices, required this.commonRepo, required this.requestRepo});
List<FilterListModel> requestsFilterOptions = []; List<RequestModel> myRequests = [];
List<RequestModel> myFilteredRequests = [];
List<FilterListModel> requestsTypeFilterOptions = [];
List<EnumsModel> myRequestsTypeEnum = [];
populateRequestsFilterList() async {
requestsTypeFilterOptions.clear();
myRequestsTypeEnum = await commonRepo.getEnumTypeValues(enumTypeID: 16); //TODO: 13 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));
}
notifyListeners();
}
Future<void> getMyRequests({bool isNeedToRebuild = false}) async {
if (isNeedToRebuild) setState(ViewState.busy);
populateRequestsFilterList() { myRequests = await requestRepo.getRequests(
requestsFilterOptions.clear(); {
requestsFilterOptions = [ "customerID": AppState().getUser.data!.userInfo!.customerId,
FilterListModel(title: "Cars", isSelected: true, id: 1), "pageSize": 100,
FilterListModel(title: "Spare Parts", isSelected: false, id: 2), "pageIndex": 0,
]; "requestType": 0,
},
);
applyFilterOnRequestsVM(requestsTypeEnum: RequestsTypeEnum.specialCarRequest);
setState(ViewState.idle);
notifyListeners(); notifyListeners();
} }
applyFilterOnRequestsVM({required int index}) { applyFilterOnRequestsVM({required RequestsTypeEnum requestsTypeEnum}) {
if (requestsFilterOptions.isEmpty) return; if (requestsTypeFilterOptions.isEmpty) return;
for (var value in requestsFilterOptions) { for (var value in requestsTypeFilterOptions) {
value.isSelected = false; value.isSelected = false;
} }
requestsFilterOptions[index].isSelected = true; requestsTypeFilterOptions[requestsTypeEnum.getIdFromRequestTypeStatusEnum() - 1].isSelected = true; // -1 to match with the index
myFilteredRequests = myRequests.where((element) => element.requestType == requestsTypeEnum.getIdFromRequestTypeStatusEnum()).toList();
notifyListeners(); notifyListeners();
} }
@ -62,7 +92,6 @@ class RequestsVM extends BaseVM {
bool isFetchingRequestType = false; bool isFetchingRequestType = false;
bool isFetchingVehicleType = true; bool isFetchingVehicleType = true;
bool isFetchingVehicleDetail = false; bool isFetchingVehicleDetail = false;
List<Enums> requestTypes = [];
List<VehicleTypeModel> vehicleTypes = []; List<VehicleTypeModel> vehicleTypes = [];
VehicleDetailsModel? vehicleDetails; VehicleDetailsModel? vehicleDetails;
List<VehicleBrandsModel> vehicleBrands = []; List<VehicleBrandsModel> vehicleBrands = [];
@ -73,14 +102,6 @@ class RequestsVM extends BaseVM {
SelectionModel requestTypeId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); SelectionModel requestTypeId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
getRequestTypes() async {
requestTypeId.selectedId = -1;
isFetchingRequestType = true;
requestTypes = await commonRepo.getEnumTypeValues(enumTypeID: 16); //TODO: 16 is to get Request types
isFetchingRequestType = false;
notifyListeners();
}
void updateSelectionRequestTypeId(SelectionModel id) async { void updateSelectionRequestTypeId(SelectionModel id) async {
requestTypeId = id; requestTypeId = id;
getVehicleTypes(); getVehicleTypes();
@ -90,14 +111,14 @@ class RequestsVM extends BaseVM {
SelectionModel vehicleTypeId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); SelectionModel vehicleTypeId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
Future<void> getVehicleTypes() async { Future<void> getVehicleTypes() async {
reset(); resetRequestCreationForm();
isFetchingVehicleType = true; isFetchingVehicleType = true;
vehicleTypes = await commonRepo.getVehicleTypes(); vehicleTypes = await commonRepo.getVehicleTypes();
isFetchingVehicleType = false; isFetchingVehicleType = false;
notifyListeners(); notifyListeners();
} }
reset() { resetRequestCreationForm() {
vehicleTypeId.selectedId = -1; vehicleTypeId.selectedId = -1;
vehicleBrandId.selectedId = -1; vehicleBrandId.selectedId = -1;
vehicleModelId.selectedId = -1; vehicleModelId.selectedId = -1;
@ -191,9 +212,27 @@ class RequestsVM extends BaseVM {
description = v; description = v;
} }
Future<GenericRespModel?> createRequest() async { Future<VehiclePostingImages> convertFileToRequestPostingImages({required File file}) async {
if (validate()) { List<int> imageBytes = await file.readAsBytes();
Map<String, dynamic> m = { String image = base64Encode(imageBytes);
String fileName = file.path.split('/').last;
VehiclePostingImages vehiclePostingImages = VehiclePostingImages(
imageName: fileName,
imageStr: image,
imageUrl: file.path,
);
return vehiclePostingImages;
}
Future<void> onCreateRequestTapped(BuildContext context) async {
if (validateCreateRequestForm()) {
Utils.showLoading(context);
List<VehiclePostingImages> vehicleImages = [];
pickedVehicleImages.forEach((element) async {
vehicleImages.add(await convertFileToRequestPostingImages(file: element));
});
Map<String, dynamic> body = {
"customerID": AppState().getUser.data!.userInfo!.customerId ?? 0, "customerID": AppState().getUser.data!.userInfo!.customerId ?? 0,
"requestType": requestTypeId.selectedId, "requestType": requestTypeId.selectedId,
"vehicleTypeID": vehicleTypeId.selectedId, "vehicleTypeID": vehicleTypeId.selectedId,
@ -206,16 +245,26 @@ class RequestsVM extends BaseVM {
"price": price, "price": price,
"description": description, "description": description,
"isSpecialServiceNeeded": false, "isSpecialServiceNeeded": false,
"requestImages": [] "requestImages": vehicleImages,
}; };
GenericRespModel respModel = await requestRepo.createRequest(m); try {
return respModel; GenericRespModel respModel = await requestRepo.createRequest(body);
} else { Utils.hideLoading(context);
return null; if (respModel.messageStatus == 1) {
Utils.showToast("Request Successfully Created");
Navigator.pop(context);
await getMyRequests();
} else {
Utils.showToast(respModel.message.toString());
}
} catch (e, s) {
Utils.hideLoading(context);
print(s);
}
} }
} }
bool validate() { bool validateCreateRequestForm() {
bool isValid = true; bool isValid = true;
if (requestTypeId.selectedId == -1) { if (requestTypeId.selectedId == -1) {
Utils.showToast("Please select valid Request Type"); Utils.showToast("Please select valid Request Type");
@ -248,25 +297,16 @@ class RequestsVM extends BaseVM {
return isValid; return isValid;
} }
bool isRequestLoading = true; Future<List<OffersModel>> getOffersByRequest({required int requestId, required BuildContext context}) async {
List<Request> requests = []; try {
Utils.showLoading(context);
getRequests() async { List<OffersModel> respModel = await requestRepo.getOffersByRequest(requestId: requestId);
isRequestLoading = true; Utils.hideLoading(context);
notifyListeners(); return respModel;
} catch (e) {
int selectedRequestType; Utils.showToast(e.toString());
// Find the FilterListModel with isSelected equal to true Utils.hideLoading(context);
return [];
requests = await requestRepo.getRequests( }
{
"customerID": AppState().getUser.data!.userInfo!.customerId,
"pageSize": 100,
"pageIndex": 0,
"requestType": requestsFilterOptions.firstWhere((element) => element.isSelected).id,
},
);
isRequestLoading = false;
notifyListeners();
} }
} }

@ -79,6 +79,22 @@ class AppointmentDetailView extends StatelessWidget {
); );
case AppointmentStatusEnum.allAppointments: case AppointmentStatusEnum.allAppointments:
return SizedBox(); return SizedBox();
case AppointmentStatusEnum.rescheduled:
return Align(
alignment: Alignment.bottomCenter,
child: Row(
children: [
getBaseActionButtonWidget(color: MyColors.redColor, onPressed: () => appointmentCancelConfirmationSheet(context), text: "Cancel"),
12.width,
getBaseActionButtonWidget(
color: MyColors.greenColor,
onPressed: () {
context.read<AppointmentsVM>().onConfirmAppointmentPressed(context: context, appointmentId: appointmentListModel.id);
},
text: "Confirm"),
],
),
);
} }
} }

@ -40,7 +40,6 @@ class _DashboardPageState extends State<DashboardPage> {
scheduleMicrotask(() { scheduleMicrotask(() {
context.read<AppointmentsVM>().populateAppointmentsFilterList(); context.read<AppointmentsVM>().populateAppointmentsFilterList();
context.read<AppointmentsVM>().populateBranchesFilterList(); context.read<AppointmentsVM>().populateBranchesFilterList();
context.read<AppointmentsVM>().populateProvidersFilterList();
context.read<RequestsVM>().populateRequestsFilterList(); context.read<RequestsVM>().populateRequestsFilterList();
context.read<AdVM>().populateAdsFilterList(); context.read<AdVM>().populateAdsFilterList();
_onRefresh(); _onRefresh();
@ -50,6 +49,7 @@ class _DashboardPageState extends State<DashboardPage> {
Future<void> _onRefresh() async { Future<void> _onRefresh() async {
AdVM adVM = Provider.of<AdVM>(context, listen: false); AdVM adVM = Provider.of<AdVM>(context, listen: false);
AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false); AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false);
RequestsVM requestsVM = Provider.of<RequestsVM>(context, listen: false);
if (appointmentsVM.myAppointments.isEmpty) { if (appointmentsVM.myAppointments.isEmpty) {
await appointmentsVM.getMyAppointments(); await appointmentsVM.getMyAppointments();
} }
@ -62,6 +62,9 @@ class _DashboardPageState extends State<DashboardPage> {
if (adVM.exploreAds.isEmpty) { if (adVM.exploreAds.isEmpty) {
await adVM.getExploreAds(); await adVM.getExploreAds();
} }
if (requestsVM.myRequests.isEmpty) {
await requestsVM.getMyRequests();
}
if (adVM.vehicleTypes.isEmpty) { if (adVM.vehicleTypes.isEmpty) {
await adVM.getVehicleTypes(); await adVM.getVehicleTypes();
@ -135,19 +138,6 @@ class _DashboardPageState extends State<DashboardPage> {
drawer: CustomDrawer(dashboardVM: context.watch<DashboardVM>()), drawer: CustomDrawer(dashboardVM: context.watch<DashboardVM>()),
bottomNavigationBar: CustomBottomNavbar(), bottomNavigationBar: CustomBottomNavbar(),
body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex], body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex],
floatingActionButton: context.watch<DashboardVM>().selectedNavbarBarIndex == 4
? FloatingActionButton(
onPressed: () {
if (context.read<DashboardVM>().selectedNavbarBarIndex == 4) {
navigateWithName(context, AppRoutes.createRequestPage);
}
},
child: Icon(
Icons.add,
color: Colors.white,
),
)
: null,
); );
} }
} }

@ -5,7 +5,6 @@ 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/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/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';

@ -8,6 +8,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/appointments_models/appointment_list_model.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.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/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -27,38 +28,46 @@ class AppointmentsFragment extends StatelessWidget {
children: [ children: [
16.height, 16.height,
FiltersList( FiltersList(
filterList: appointmentsVM.appointmentsFilterOptions, filterList: appointmentsVM.appointmentsFilterOptions,
onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnAppointmentsVM(appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum()), onFilterTapped: (index, selectedFilterId) {
), appointmentsVM.applyFilterOnAppointmentsVM(appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum());
}),
16.height, 16.height,
Expanded( Expanded(
child: appointmentsVM.myFilteredAppointments.isEmpty child: RefreshIndicator(
? Column( onRefresh: () async {
mainAxisAlignment: MainAxisAlignment.center, appointmentsVM.getMyAppointments(isNeedToRebuild: true);
children: [ },
"No Appointments to show.".toText(fontSize: 16, color: MyColors.lightTextColor), child: appointmentsVM.state == ViewState.busy
], ? const Center(child: CircularProgressIndicator())
) : appointmentsVM.myFilteredAppointments.isEmpty
: ListView.builder( ? Column(
shrinkWrap: true, mainAxisAlignment: MainAxisAlignment.center,
itemCount: appointmentsVM.myFilteredAppointments.length, children: [
itemBuilder: (BuildContext context, int index) { "No Appointments to show.".toText(fontSize: 16, color: MyColors.lightTextColor),
return BuildAppointmentContainerForCustomer( ],
onTapped: () { )
AppointmentListModel appointmentModel = appointmentsVM.myFilteredAppointments[index]; : ListView.builder(
appointmentModel.appointmentServicesList!.forEach((service) { shrinkWrap: true,
double totalServicePrice = 0.0; itemCount: appointmentsVM.myFilteredAppointments.length,
service.serviceItems!.forEach((item) { itemBuilder: (BuildContext context, int index) {
totalServicePrice = totalServicePrice + (double.parse("${item.price ?? 0.0}")); return BuildAppointmentContainerForCustomer(
}); onTapped: () {
service.currentTotalServicePrice = totalServicePrice; AppointmentListModel appointmentModel = appointmentsVM.myFilteredAppointments[index];
}); appointmentModel.appointmentServicesList!.forEach((service) {
navigateWithName(context, AppRoutes.appointmentDetailView, arguments: appointmentModel); double totalServicePrice = 0.0;
}, service.serviceItems!.forEach((item) {
appointmentListModel: appointmentsVM.myFilteredAppointments[index], totalServicePrice = totalServicePrice + (double.parse("${item.price ?? 0.0}"));
); });
}, service.currentTotalServicePrice = totalServicePrice;
), });
navigateWithName(context, AppRoutes.appointmentDetailView, arguments: appointmentModel);
},
appointmentListModel: appointmentsVM.myFilteredAppointments[index],
);
},
),
),
), ),
], ],
); );

@ -38,44 +38,35 @@ class BranchesFragment extends StatelessWidget {
onRefresh: () async { onRefresh: () async {
context.read<AppointmentsVM>().getAllNearBranches(isNeedToRebuild: true); context.read<AppointmentsVM>().getAllNearBranches(isNeedToRebuild: true);
}, },
child: SingleChildScrollView( child: Container(
child: Container(
width: double.infinity, width: double.infinity,
height: MediaQuery.of(context).size.height / 1.37, height: MediaQuery.of(context).size.height / 1.37,
child: Consumer<AppointmentsVM>( child: appointmentsVM.state == ViewState.busy
builder: (context, model, _) { ? const Center(child: CircularProgressIndicator())
if (model.state == ViewState.busy) { : appointmentsVM.nearbyBranches.isEmpty
return const Center(child: CircularProgressIndicator()); ? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
} else { : ListView.separated(
return model.nearbyBranches.isEmpty itemCount: appointmentsVM.nearbyBranches.length,
? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor)) itemBuilder: (context, index) {
: ListView.separated( BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index];
itemCount: model.nearbyBranches.length,
itemBuilder: (context, index) {
BranchDetailModel branchDetailModel = model.nearbyBranches[index];
return ProviderDetailsCard( return ProviderDetailsCard(
onCardTapped: () { onCardTapped: () {
navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel); navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
}, },
providerImageUrl: MyAssets.bnCar, providerImageUrl: MyAssets.bnCar,
title: branchDetailModel.branchName ?? "", title: branchDetailModel.branchName ?? "",
providerLocation: branchDetailModel.distanceKm.toString() + " KM", providerLocation: branchDetailModel.distanceKm.toString() + " KM",
providerName: branchDetailModel.serviceProviderName ?? "", providerName: branchDetailModel.serviceProviderName ?? "",
providerRatings: "4.9", providerRatings: "4.9",
services: branchDetailModel.branchServices, services: branchDetailModel.branchServices,
); );
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return 12.height; return 12.height;
}, },
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
); )),
}
},
),
),
),
), ),
), ),
], ],

@ -1,63 +1,69 @@
import 'package:car_customer_app/view_models/requests_view_model.dart'; import 'package:car_customer_app/view_models/requests_view_model.dart';
import 'package:car_customer_app/views/requests/widget/request_item.dart';
import 'package:flutter/material.dart'; 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/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/theme/colors.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/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../requests/widget/request_item.dart';
class RequestsFragment extends StatelessWidget { class RequestsFragment extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Scaffold(
color: MyColors.backgroundColor, body: Container(
width: double.infinity, color: MyColors.backgroundColor,
height: double.infinity, width: double.infinity,
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { height: double.infinity,
return Column( child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
children: [ return Column(
ShowFillButton( children: [
title: "title", 16.height,
onPressed: () { FiltersList(
context.read<RequestsVM>().getRequests(); filterList: requestsVM.requestsTypeFilterOptions,
}), onFilterTapped: (index, selectedFilterId) {
16.height, requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
FiltersList( },
filterList: requestsVM.requestsFilterOptions, ),
onFilterTapped: (index, selectedFilterId) => requestsVM.applyFilterOnRequestsVM(index: index), 8.height,
), Expanded(
8.height, child: RefreshIndicator(
Expanded( onRefresh: () async => await requestsVM.getMyRequests(isNeedToRebuild: true),
child: requestsVM.isRequestLoading child: requestsVM.state == ViewState.busy
? Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: requestsVM.requests.length == 0 : requestsVM.myFilteredRequests.isEmpty
? Center( ? Column(
child: "No Request Available".toText( mainAxisAlignment: MainAxisAlignment.center,
isBold: true, children: [
), "No Requests to show.".toText(fontSize: 16, color: MyColors.lightTextColor),
) ],
: ListView.separated( )
itemBuilder: (context, index) { : ListView.separated(
return RequestItem(requestsVM.requests[index]); itemBuilder: (context, index) {
}, return RequestItem(request: requestsVM.myRequests[index]);
separatorBuilder: (context, index) { },
return 16.height; separatorBuilder: (context, index) {
}, return 16.height;
itemCount: requestsVM.requests.length, },
padding: EdgeInsets.only( itemCount: requestsVM.myRequests.length,
left: 16, padding: EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
right: 16,
bottom: 16,
top: 8,
), ),
), ))
) ],
], );
); }),
}), ),
floatingActionButton: FloatingActionButton(
onPressed: () => navigateWithName(context, AppRoutes.createRequestPage),
backgroundColor: MyColors.darkPrimaryColor,
child: Icon(
Icons.add,
color: MyColors.white,
),
),
); );
} }
} }

@ -1,34 +1,27 @@
import 'package:car_customer_app/view_models/requests_view_model.dart'; import 'package:car_customer_app/view_models/requests_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/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/generic_resp_model.dart';
import 'package:mc_common_app/models/widgets_models.dart'; import 'package:mc_common_app/models/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/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';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/dotted_rect.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:mc_common_app/widgets/txt_field.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class CreateRequestPage extends StatelessWidget { class CreateRequestPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// context.read<RequestsVM>().getVehicleTypes();
context.read<RequestsVM>().getRequestTypes();
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: "Create Request", title: "Create Request",
), ),
body: Consumer<RequestsVM>(builder: (context, model, widget) { body: Consumer<RequestsVM>(builder: (context, requestsVM, widget) {
return Column( return Column(
children: [ children: [
Expanded( Expanded(
@ -38,49 +31,49 @@ class CreateRequestPage extends StatelessWidget {
children: [ children: [
"Vehicle Detail".toText(fontSize: 18, isBold: true), "Vehicle Detail".toText(fontSize: 18, isBold: true),
8.height, 8.height,
if (model.isFetchingRequestType) ...[ if (requestsVM.isFetchingRequestType) ...[
Center( Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
] else ...[ ] else ...[
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> requestTypeDrop = []; List<DropValue> requestTypeDrop = [];
for (var element in model.requestTypes) { for (var element in requestsVM.myRequestsTypeEnum) {
requestTypeDrop.add(DropValue(element.enumValue.toInt() ?? 0, element.enumValueStr ?? "", "")); requestTypeDrop.add(DropValue(element.enumValue.toInt() ?? 0, element.enumValueStr ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionRequestTypeId(SelectionModel(selectedId: value.id, selectedOption: value.value)), (DropValue value) => requestsVM.updateSelectionRequestTypeId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
list: requestTypeDrop, list: requestTypeDrop,
dropdownValue: model.requestTypeId.selectedId != -1 ? DropValue(model.requestTypeId.selectedId, model.requestTypeId.selectedOption, "") : null, dropdownValue: requestsVM.requestTypeId.selectedId != -1 ? DropValue(requestsVM.requestTypeId.selectedId, requestsVM.requestTypeId.selectedOption, "") : null,
hint: "Request Type", hint: "Request Type",
errorValue: model.requestTypeId.errorValue, errorValue: requestsVM.requestTypeId.errorValue,
); );
}), }),
], ],
8.height, 8.height,
if (model.requestTypeId.selectedId != -1) if (requestsVM.requestTypeId.selectedId != -1)
if (model.isFetchingVehicleType) ...[ if (requestsVM.isFetchingVehicleType) ...[
Center( Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
] else ...[ ] else ...[
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleTypeDrop = []; List<DropValue> vehicleTypeDrop = [];
for (var element in model.vehicleTypes) { for (var element in requestsVM.vehicleTypes) {
vehicleTypeDrop.add(DropValue(element.id?.toInt() ?? 0, element.vehicleTypeName ?? "", "")); vehicleTypeDrop.add(DropValue(element.id?.toInt() ?? 0, element.vehicleTypeName ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionVehicleTypeId(SelectionModel(selectedId: value.id, selectedOption: value.value)), (DropValue value) => requestsVM.updateSelectionVehicleTypeId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
list: vehicleTypeDrop, list: vehicleTypeDrop,
dropdownValue: model.vehicleTypeId.selectedId != -1 ? DropValue(model.vehicleTypeId.selectedId, model.vehicleTypeId.selectedOption, "") : null, dropdownValue: requestsVM.vehicleTypeId.selectedId != -1 ? DropValue(requestsVM.vehicleTypeId.selectedId, requestsVM.vehicleTypeId.selectedOption, "") : null,
hint: "Vehicle Type", hint: "Vehicle Type",
errorValue: model.vehicleTypeId.errorValue, errorValue: requestsVM.vehicleTypeId.errorValue,
); );
}), }),
], ],
8.height, 8.height,
if (model.vehicleTypeId.selectedId != -1) if (requestsVM.vehicleTypeId.selectedId != -1)
if (model.isFetchingVehicleDetail) ...[ if (requestsVM.isFetchingVehicleDetail) ...[
Center( Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
@ -89,62 +82,62 @@ class CreateRequestPage extends StatelessWidget {
children: [ children: [
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleBrandsDrop = []; List<DropValue> vehicleBrandsDrop = [];
for (var element in model.vehicleBrands) { for (var element in requestsVM.vehicleBrands) {
vehicleBrandsDrop.add(DropValue(element.id?.toInt() ?? 0, element.vehicleBrandDescription ?? "", "")); vehicleBrandsDrop.add(DropValue(element.id?.toInt() ?? 0, element.vehicleBrandDescription ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionVehicleBrandId(SelectionModel(selectedId: value.id, selectedOption: value.value)), (DropValue value) => requestsVM.updateSelectionVehicleBrandId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
list: vehicleBrandsDrop, list: vehicleBrandsDrop,
dropdownValue: model.vehicleBrandId.selectedId != -1 ? DropValue(model.vehicleBrandId.selectedId, model.vehicleBrandId.selectedOption, "") : null, dropdownValue: requestsVM.vehicleBrandId.selectedId != -1 ? DropValue(requestsVM.vehicleBrandId.selectedId, requestsVM.vehicleBrandId.selectedOption, "") : null,
hint: "Brand", hint: "Brand",
errorValue: model.vehicleBrandId.errorValue, errorValue: requestsVM.vehicleBrandId.errorValue,
); );
}), }),
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleModelsDrop = []; List<DropValue> vehicleModelsDrop = [];
for (var element in model.vehicleModels) { for (var element in requestsVM.vehicleModels) {
if (model.vehicleBrandId.selectedId == element.vehicleBrandID) vehicleModelsDrop.add(DropValue(element.id?.toInt() ?? 0, element.model ?? "", "")); if (requestsVM.vehicleBrandId.selectedId == element.vehicleBrandID) vehicleModelsDrop.add(DropValue(element.id?.toInt() ?? 0, element.model ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionVehicleModelId(SelectionModel(selectedId: value.id, selectedOption: value.value)), (DropValue value) => requestsVM.updateSelectionVehicleModelId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
list: vehicleModelsDrop, list: vehicleModelsDrop,
dropdownValue: model.vehicleModelId.selectedId != -1 ? DropValue(model.vehicleModelId.selectedId, model.vehicleModelId.selectedOption, "") : null, dropdownValue: requestsVM.vehicleModelId.selectedId != -1 ? DropValue(requestsVM.vehicleModelId.selectedId, requestsVM.vehicleModelId.selectedOption, "") : null,
hint: "Model", hint: "Model",
errorValue: model.vehicleModelId.errorValue, errorValue: requestsVM.vehicleModelId.errorValue,
); );
}), }),
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleYearModelsDrop = []; List<DropValue> vehicleYearModelsDrop = [];
for (var element in model.vehicleModelYears) { for (var element in requestsVM.vehicleModelYears) {
vehicleYearModelsDrop.add(DropValue(element.id?.toInt() ?? 0, element.modelYear ?? "", "")); vehicleYearModelsDrop.add(DropValue(element.id?.toInt() ?? 0, element.modelYear ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionVehicleModelYearId(SelectionModel(selectedId: value.id, selectedOption: value.value)), (DropValue value) => requestsVM.updateSelectionVehicleModelYearId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
list: vehicleYearModelsDrop, list: vehicleYearModelsDrop,
dropdownValue: model.vehicleModelYearId.selectedId != -1 ? DropValue(model.vehicleModelYearId.selectedId, model.vehicleModelYearId.selectedOption, "") : null, dropdownValue: requestsVM.vehicleModelYearId.selectedId != -1 ? DropValue(requestsVM.vehicleModelYearId.selectedId, requestsVM.vehicleModelYearId.selectedOption, "") : null,
hint: "Year", hint: "Year",
errorValue: model.vehicleModelYearId.errorValue, errorValue: requestsVM.vehicleModelYearId.errorValue,
); );
}), }),
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleCountriesDrop = []; List<DropValue> vehicleCountriesDrop = [];
for (var element in model.vehicleCountries) { for (var element in requestsVM.vehicleCountries) {
vehicleCountriesDrop.add(DropValue(element.id?.toInt() ?? 0, element.countryName ?? "", "")); vehicleCountriesDrop.add(DropValue(element.id?.toInt() ?? 0, element.countryName ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionVehicleCountryId(SelectionModel(selectedOption: value.value, selectedId: value.id)), (DropValue value) => requestsVM.updateSelectionVehicleCountryId(SelectionModel(selectedOption: value.value, selectedId: value.id)),
list: vehicleCountriesDrop, list: vehicleCountriesDrop,
dropdownValue: model.vehicleCountryId.selectedId != -1 ? DropValue(model.vehicleCountryId.selectedId, model.vehicleCountryId.selectedOption, "") : null, dropdownValue: requestsVM.vehicleCountryId.selectedId != -1 ? DropValue(requestsVM.vehicleCountryId.selectedId, requestsVM.vehicleCountryId.selectedOption, "") : null,
hint: "Country", hint: "Country",
errorValue: model.vehicleCountryId.errorValue, errorValue: requestsVM.vehicleCountryId.errorValue,
); );
}), }),
if (model.vehicleCountryId.selectedId != -1) ...[ if (requestsVM.vehicleCountryId.selectedId != -1) ...[
if (model.isCountryFetching) ...[ if (requestsVM.isCountryFetching) ...[
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [const CircularProgressIndicator().paddingAll(10)], children: [const CircularProgressIndicator().paddingAll(10)],
@ -153,15 +146,15 @@ class CreateRequestPage extends StatelessWidget {
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleCitiesDrop = []; List<DropValue> vehicleCitiesDrop = [];
for (var element in model.vehicleCities) { for (var element in requestsVM.vehicleCities) {
vehicleCitiesDrop.add(DropValue(element.id?.toInt() ?? 0, element.cityName ?? "", "")); vehicleCitiesDrop.add(DropValue(element.id?.toInt() ?? 0, element.cityName ?? "", ""));
} }
return DropdownField( return DropdownField(
(DropValue value) => model.updateSelectionVehicleCityId(SelectionModel(selectedId: value.id, selectedOption: value.value)), (DropValue value) => requestsVM.updateSelectionVehicleCityId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
list: vehicleCitiesDrop, list: vehicleCitiesDrop,
dropdownValue: model.vehicleCityId.selectedId != -1 ? DropValue(model.vehicleCityId.selectedId, model.vehicleCityId.selectedOption, "") : null, dropdownValue: requestsVM.vehicleCityId.selectedId != -1 ? DropValue(requestsVM.vehicleCityId.selectedId, requestsVM.vehicleCityId.selectedOption, "") : null,
hint: "City", hint: "City",
errorValue: model.vehicleCityId.errorValue, errorValue: requestsVM.vehicleCityId.errorValue,
); );
}), }),
], ],
@ -169,15 +162,15 @@ class CreateRequestPage extends StatelessWidget {
8.height, 8.height,
TxtField( TxtField(
hint: "Price", hint: "Price",
value: model.price, value: requestsVM.price,
onChanged: (e) => model.updatePrice(e), onChanged: (e) => requestsVM.updatePrice(e),
), ),
8.height, 8.height,
TxtField( TxtField(
hint: "Description", hint: "Description",
maxLines: 5, maxLines: 5,
value: model.description, value: requestsVM.description,
onChanged: (e) => model.updateDescription(e), onChanged: (e) => requestsVM.updateDescription(e),
), ),
8.height, 8.height,
DottedRectContainer( DottedRectContainer(
@ -185,20 +178,20 @@ class CreateRequestPage extends StatelessWidget {
text: "Attach Image", text: "Attach Image",
icon: MyAssets.attachmentIcon.buildSvg(), icon: MyAssets.attachmentIcon.buildSvg(),
), ),
if (model.vehicleImageError != "") ...[ if (requestsVM.vehicleImageError != "") ...[
10.height, 10.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
model.vehicleImageError.toText(fontSize: 14, color: Colors.red), requestsVM.vehicleImageError.toText(fontSize: 14, color: Colors.red),
], ],
).paddingOnly(right: 10) ).paddingOnly(right: 10)
], ],
if (model.pickedVehicleImages.isNotEmpty) ...[ if (requestsVM.pickedVehicleImages.isNotEmpty) ...[
16.height, 16.height,
PickedImagesContainer( PickedImagesContainer(
pickedImages: model.pickedVehicleImages, pickedImages: requestsVM.pickedVehicleImages,
onCrossPressedPrimary: model.removeImageFromList, onCrossPressedPrimary: requestsVM.removeImageFromList,
onAddImagePressed: () { onAddImagePressed: () {
context.read<RequestsVM>().pickMultipleImages(); context.read<RequestsVM>().pickMultipleImages();
}, },
@ -209,13 +202,14 @@ class CreateRequestPage extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Checkbox( Checkbox(
value: model.isShippingDeliveryEnabled, value: requestsVM.isShippingDeliveryEnabled,
onChanged: null, onChanged: null,
), ),
"Shipping/Delivery".toText(color: MyColors.darkPrimaryColor, isBold: true, fontSize: 18) "Shipping/Delivery".toText(color: MyColors.darkPrimaryColor, isBold: true, fontSize: 18)
], ],
).onPress(() { ).onPress(() {
model.updateShippingDeliverEnabled(!model.isShippingDeliveryEnabled); requestsVM.updateShippingDeliverEnabled(!requestsVM.isShippingDeliveryEnabled);
}), }),
], ],
), ),
@ -229,16 +223,7 @@ class CreateRequestPage extends StatelessWidget {
maxWidth: double.infinity, maxWidth: double.infinity,
margin: EdgeInsets.all(16), margin: EdgeInsets.all(16),
onPressed: () async { onPressed: () async {
Utils.showLoading(context); await context.read<RequestsVM>().onCreateRequestTapped(context);
GenericRespModel? response = await model.createRequest();
Utils.hideLoading(context);
if (response != null) {
if (response.messageStatus == 1) {
Utils.showToast("Request Successfully Created");
} else {
Utils.showToast(response.message.toString());
}
}
}, },
) )
], ],

@ -1,84 +1,87 @@
import 'package:flutter/material.dart'; 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/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/requests/offers_model.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/widgets/common_widgets/app_bar.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/extensions/extensions_widget.dart';
class OfferListPage extends StatelessWidget { class OfferListPage extends StatelessWidget {
final List<OffersModel> offersList;
OfferListPage({required this.offersList});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(title: "Offers"),
title: "Offers", body: offersList.isEmpty
), ? Center(child: "No Requests to show.".toText(fontSize: 16, color: MyColors.lightTextColor))
body: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemCount: offersList.length,
return showOfferItem(); padding: EdgeInsets.all(16),
}, itemBuilder: (context, index) {
separatorBuilder: (context, index) { OffersModel offersModel = offersList[index];
return 16.height; return Stack(
}, alignment: Alignment.bottomRight,
itemCount: 2, children: [
padding: EdgeInsets.all(16), Column(
), children: [
); Row(
} mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"${offersModel.serviceProvider!.companyName ?? ""}".toText(fontSize: 16, isBold: true),
Widget showOfferItem() { //Un read offers count
return Stack(
alignment: Alignment.bottomRight, // Center(
children: [ // child: "2".toText(
Column( // color: Colors.white,
children: [ // isBold: true,
Row( // fontSize: 10,
mainAxisAlignment: MainAxisAlignment.spaceBetween, // ),
crossAxisAlignment: CrossAxisAlignment.start, // ).toContainer(
children: [ // backgroundColor: MyColors.redColor,
"Toyota Corolla".toText(fontSize: 16, isBold: true), // borderRadius: 100,
Center( // paddingAll: 1,
child: "2".toText( // width: 20,
color: Colors.white, // height: 20,
isBold: true, // ),
fontSize: 10, ],
), ),
).toContainer( 8.height,
backgroundColor: MyColors.redColor, Row(
borderRadius: 100, crossAxisAlignment: CrossAxisAlignment.start,
paddingAll: 1, children: [
width: 20, Expanded(
height: 20, child: "${offersModel.comment} and This is dummy text edition.".toText(
), color: MyColors.lightTextColor,
], fontSize: 12,
), ),
8.height, ),
Row( 12.width,
crossAxisAlignment: CrossAxisAlignment.start, "9 Hours Ago".toText(
children: [ color: MyColors.lightTextColor,
Expanded( )
child: ],
"Dear, how you doing. I have great offer for You for this car. Dear, how you doing. I have great offer for You for this car. Dear, how you doing. I have great offer for You for this car. Dear, how you doing. I have great offer for You for this car. Dear, how you doing. I have great offer for You for this car." ),
.toText( ],
color: MyColors.lightTextColor, ),
fontSize: 12, Icon(
), Icons.arrow_forward,
), color: MyColors.darkIconColor,
12.width, size: 18,
"9 Hours Ago".toText( ),
color: MyColors.lightTextColor, ],
) ).onPress(() {
], navigateWithName(context, AppRoutes.chatView);
}).toContainer(isShadowEnabled: true);
},
separatorBuilder: (context, index) => 16.height,
), ),
],
),
Icon(
Icons.arrow_forward,
color: MyColors.darkIconColor,
size: 18,
),
],
).toContainer(
isShadowEnabled: true,
); );
} }
} }

@ -1,17 +1,21 @@
import 'package:car_customer_app/model/request.dart'; import 'package:car_customer_app/view_models/requests_view_model.dart';
import 'package:car_customer_app/views/requests/widget/request_status_chip.dart'; import 'package:car_customer_app/views/requests/widget/request_status_chip.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';
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/requests/offers_model.dart';
import 'package:mc_common_app/models/requests/request_model.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/utils/utils.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
class RequestItem extends StatelessWidget { class RequestItem extends StatelessWidget {
Request request; final RequestModel request;
RequestItem(this.request); RequestItem({required this.request});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -25,7 +29,7 @@ class RequestItem extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
RequestStatusChip(request), Utils.statusContainerChip(text: request.requestStatusName, chipColor: Utils.getChipColorByRequestStatus(request.requestStatus)),
6.height, 6.height,
"${request.brand} ${request.model}".toText(fontSize: 16, isBold: true), "${request.brand} ${request.model}".toText(fontSize: 16, isBold: true),
showItem("Model:", "${request.year}"), showItem("Model:", "${request.year}"),
@ -37,19 +41,21 @@ class RequestItem extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Center( if (request.offerCount > 0) ...[
child: "${request.offerCount}".toText( Center(
color: Colors.white, child: "${request.offerCount}".toText(
isBold: true, color: Colors.white,
fontSize: 10, isBold: true,
fontSize: 10,
),
).toContainer(
backgroundColor: MyColors.redColor,
borderRadius: 100,
paddingAll: 1,
width: 20,
height: 20,
), ),
).toContainer( ],
backgroundColor: MyColors.redColor,
borderRadius: 100,
paddingAll: 1,
width: 20,
height: 20,
),
2.height, 2.height,
request.cityName.toText( request.cityName.toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
@ -94,12 +100,9 @@ class RequestItem extends StatelessWidget {
], ],
), ),
], ],
) ).toContainer(isShadowEnabled: true).onPress(() async {
.toContainer( List<OffersModel> offers = await context.read<RequestsVM>().getOffersByRequest(requestId: request.id, context: context);
isShadowEnabled: true, navigateWithName(context, AppRoutes.offersListPage, arguments: offers);
)
.onPress(() {
navigateWithName(context, AppRoutes.offersListPage);
}); });
} }

@ -1,12 +1,12 @@
import 'package:car_customer_app/model/request.dart';
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/requests/request_model.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/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class RequestStatusChip extends StatelessWidget { class RequestStatusChip extends StatelessWidget {
Request request; RequestModel request;
RequestStatusChip(this.request); RequestStatusChip(this.request);

@ -37,7 +37,7 @@ dependencies:
table_calendar: ^3.0.9 table_calendar: ^3.0.9
mc_common_app: mc_common_app:
path: C:/Users/mirza.shafique/AndroidStudioProjects/mc_common_app path: /Volumes/Data/Projects/Flutter/car_common_app
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save