|
|
|
|
@ -29,9 +29,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
void cancelRequestBottomSheet(BuildContext context, int requestId) {
|
|
|
|
|
return actionConfirmationBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
title: LocaleKeys.cancelRequestPrompt
|
|
|
|
|
.tr()
|
|
|
|
|
.toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
|
|
|
title: LocaleKeys.cancelRequestPrompt.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
|
|
|
subtitle: LocaleKeys.requestPermanentlyCancelled.tr(),
|
|
|
|
|
actionButtonYes: Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
@ -43,10 +41,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
|
|
|
|
|
final requestVM = context.read<RequestsVM>();
|
|
|
|
|
|
|
|
|
|
bool status = await requestVM.onActionRequestTapped(
|
|
|
|
|
context: context,
|
|
|
|
|
requestStatusEnum: RequestStatusEnum.cancelled,
|
|
|
|
|
requestId: requestId);
|
|
|
|
|
bool status = await requestVM.onActionRequestTapped(context: context, requestStatusEnum: RequestStatusEnum.cancelled, requestId: requestId);
|
|
|
|
|
if (status) {
|
|
|
|
|
await requestVM.getRequests(isNeedToRebuild: true);
|
|
|
|
|
}
|
|
|
|
|
@ -74,8 +69,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (requestStatusEnum == RequestStatusEnum.pending ||
|
|
|
|
|
requestStatusEnum == RequestStatusEnum.submitted) {
|
|
|
|
|
if (requestStatusEnum == RequestStatusEnum.pending || requestStatusEnum == RequestStatusEnum.submitted) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
@ -83,8 +77,40 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Consumer(
|
|
|
|
|
builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
|
|
|
|
|
// Access guard: Only dealerships can access Special Requests
|
|
|
|
|
if (AppState().userType != UserType.providerDealer && AppState().currentAppType == AppType.provider) {
|
|
|
|
|
return Scaffold(
|
|
|
|
|
appBar: CustomAppBar(
|
|
|
|
|
title: LocaleKeys.manageRequests.tr(),
|
|
|
|
|
isRemoveBackButton: true,
|
|
|
|
|
),
|
|
|
|
|
body: Center(
|
|
|
|
|
child: Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
Icon(
|
|
|
|
|
Icons.block,
|
|
|
|
|
size: 64,
|
|
|
|
|
color: MyColors.lightTextColor,
|
|
|
|
|
),
|
|
|
|
|
16.height,
|
|
|
|
|
LocaleKeys.accessDenied.tr().toText(
|
|
|
|
|
fontSize: 20,
|
|
|
|
|
isBold: true,
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
"This feature is only available for Dealerships.".toText(
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
color: MyColors.lightTextColor,
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
).paddingAll(24),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
|
|
|
|
|
return Scaffold(
|
|
|
|
|
appBar: CustomAppBar(
|
|
|
|
|
title: LocaleKeys.manageRequests.tr(),
|
|
|
|
|
@ -93,9 +119,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
if (AppState().currentAppType == AppType.provider) ...[
|
|
|
|
|
Padding(
|
|
|
|
|
padding: const EdgeInsets.only(top: 8, bottom: 8, right: 15),
|
|
|
|
|
child: const Icon(Icons.messenger_outline_rounded,
|
|
|
|
|
color: Colors.black, size: 18)
|
|
|
|
|
.toContainer(
|
|
|
|
|
child: const Icon(Icons.messenger_outline_rounded, color: Colors.black, size: 18).toContainer(
|
|
|
|
|
borderRadius: 80,
|
|
|
|
|
borderColor: MyColors.lightGreyEFColor,
|
|
|
|
|
isEnabledBorder: true,
|
|
|
|
|
@ -105,9 +129,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
})
|
|
|
|
|
],
|
|
|
|
|
Padding(
|
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
|
top: requestsVM.requestsFiltersCounter > 0 ? 20 : 0,
|
|
|
|
|
right: 21),
|
|
|
|
|
padding: EdgeInsets.only(top: requestsVM.requestsFiltersCounter > 0 ? 20 : 0, right: 21),
|
|
|
|
|
child: Badge(
|
|
|
|
|
isLabelVisible: requestsVM.requestsFiltersCounter > 0,
|
|
|
|
|
largeSize: 15,
|
|
|
|
|
@ -121,8 +143,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
}),
|
|
|
|
|
],
|
|
|
|
|
).toViewOnly(context, onTap: () {
|
|
|
|
|
navigateWithName(context, AppRoutes.loginWithPassword,
|
|
|
|
|
arguments: false);
|
|
|
|
|
navigateWithName(context, AppRoutes.loginWithPassword, arguments: false);
|
|
|
|
|
}),
|
|
|
|
|
body: Container(
|
|
|
|
|
color: MyColors.backgroundColor,
|
|
|
|
|
@ -134,8 +155,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
FiltersList(
|
|
|
|
|
filterList: requestsVM.requestsTypeFilterOptions,
|
|
|
|
|
onFilterTapped: (index, selectedFilterId) {
|
|
|
|
|
requestsVM.applyFilterOnRequestsVM(
|
|
|
|
|
requestsTypeEnum: selectedFilterId.toRequestTypeEnum());
|
|
|
|
|
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeEnum());
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
// Show condition filters for all request types
|
|
|
|
|
@ -144,31 +164,27 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
FiltersList(
|
|
|
|
|
filterList: requestsVM.sparePartsConditionFilterOptions,
|
|
|
|
|
onFilterTapped: (index, selectedFilterId) {
|
|
|
|
|
requestsVM.applySparePartsConditionFilter(
|
|
|
|
|
conditionId: selectedFilterId);
|
|
|
|
|
requestsVM.applySparePartsConditionFilter(conditionId: selectedFilterId);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
8.height,
|
|
|
|
|
Expanded(
|
|
|
|
|
child: RefreshIndicator(
|
|
|
|
|
onRefresh: () async =>
|
|
|
|
|
await requestsVM.getRequestsBasedOnFilters(),
|
|
|
|
|
onRefresh: () async => await requestsVM.getRequestsBasedOnFilters(),
|
|
|
|
|
child: requestsVM.state == ViewState.busy
|
|
|
|
|
? const RequestsListShimmer(itemCount: 5)
|
|
|
|
|
: requestsVM.myFilteredRequests.isEmpty
|
|
|
|
|
? Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
LocaleKeys.noRequeststoShow.tr().toText(
|
|
|
|
|
fontSize: 16, color: MyColors.lightTextColor),
|
|
|
|
|
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
|
|
|
|
|
if (requestsVM.requestsFiltersCounter > 0) ...[
|
|
|
|
|
8.height,
|
|
|
|
|
InkWell(
|
|
|
|
|
onTap: () async {
|
|
|
|
|
requestsVM.clearRequestsFilters();
|
|
|
|
|
await requestsVM
|
|
|
|
|
.getRequestsBasedOnFilters();
|
|
|
|
|
await requestsVM.getRequestsBasedOnFilters();
|
|
|
|
|
},
|
|
|
|
|
child: LocaleKeys.clearFilters.tr().toText(
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
@ -187,76 +203,43 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
secondaryBackground: Container(
|
|
|
|
|
color: const Color(0xFFDD0505),
|
|
|
|
|
child: Row(
|
|
|
|
|
crossAxisAlignment:
|
|
|
|
|
CrossAxisAlignment.center,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
|
|
|
children: [
|
|
|
|
|
LocaleKeys.cancel
|
|
|
|
|
.tr()
|
|
|
|
|
.toText(
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
fontWeight: MyFonts.Medium,
|
|
|
|
|
height: 23 / 25,
|
|
|
|
|
color: MyColors.white)
|
|
|
|
|
.margin(right: 23),
|
|
|
|
|
LocaleKeys.cancel.tr().toText(fontSize: 15, fontWeight: MyFonts.Medium, height: 23 / 25, color: MyColors.white).margin(right: 23),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
dragStartBehavior: DragStartBehavior.start,
|
|
|
|
|
direction: shouldDismiss(requestsVM
|
|
|
|
|
.myFilteredRequests[index]
|
|
|
|
|
.requestStatus)
|
|
|
|
|
? DismissDirection.endToStart
|
|
|
|
|
: DismissDirection.none,
|
|
|
|
|
confirmDismiss:
|
|
|
|
|
(DismissDirection direction) async {
|
|
|
|
|
cancelRequestBottomSheet(context,
|
|
|
|
|
requestsVM.myFilteredRequests[index].id);
|
|
|
|
|
direction: shouldDismiss(requestsVM.myFilteredRequests[index].requestStatus) ? DismissDirection.endToStart : DismissDirection.none,
|
|
|
|
|
confirmDismiss: (DismissDirection direction) async {
|
|
|
|
|
cancelRequestBottomSheet(context, requestsVM.myFilteredRequests[index].id);
|
|
|
|
|
return;
|
|
|
|
|
},
|
|
|
|
|
child: RequestItem(
|
|
|
|
|
request:
|
|
|
|
|
requestsVM.myFilteredRequests[index],
|
|
|
|
|
request: requestsVM.myFilteredRequests[index],
|
|
|
|
|
shouldShowStatuses: true,
|
|
|
|
|
onTap: () async {
|
|
|
|
|
RequestModel request =
|
|
|
|
|
requestsVM.myFilteredRequests[index];
|
|
|
|
|
requestsVM.updateCurrentSelectedRequest(
|
|
|
|
|
request);
|
|
|
|
|
RequestModel request = requestsVM.myFilteredRequests[index];
|
|
|
|
|
requestsVM.updateCurrentSelectedRequest(request);
|
|
|
|
|
|
|
|
|
|
log("request.requestStatus: ${request.requestStatus}");
|
|
|
|
|
|
|
|
|
|
if (request.requestStatus ==
|
|
|
|
|
RequestStatusEnum.pending ||
|
|
|
|
|
request.requestStatus ==
|
|
|
|
|
RequestStatusEnum.cancelled ||
|
|
|
|
|
request.requestStatus ==
|
|
|
|
|
RequestStatusEnum.expired) {
|
|
|
|
|
if (request.requestStatus == RequestStatusEnum.pending ||
|
|
|
|
|
request.requestStatus == RequestStatusEnum.cancelled ||
|
|
|
|
|
request.requestStatus == RequestStatusEnum.expired) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (AppState().currentAppType ==
|
|
|
|
|
AppType.provider) {
|
|
|
|
|
RequestDetailPageArguments
|
|
|
|
|
requestDetailPageArguments =
|
|
|
|
|
RequestDetailPageArguments(
|
|
|
|
|
requestIndex: index,
|
|
|
|
|
requestModel: request);
|
|
|
|
|
navigateWithName(context,
|
|
|
|
|
AppRoutes.requestsDetailPage,
|
|
|
|
|
arguments:
|
|
|
|
|
requestDetailPageArguments);
|
|
|
|
|
if (AppState().currentAppType == AppType.provider) {
|
|
|
|
|
RequestDetailPageArguments requestDetailPageArguments = RequestDetailPageArguments(requestIndex: index, requestModel: request);
|
|
|
|
|
navigateWithName(context, AppRoutes.requestsDetailPage, arguments: requestDetailPageArguments);
|
|
|
|
|
} else {
|
|
|
|
|
requestsVM.myFilteredRequests[index]
|
|
|
|
|
.offerCount = 0;
|
|
|
|
|
requestsVM.myFilteredRequests[index].offerCount = 0;
|
|
|
|
|
requestsVM.notifyListeners();
|
|
|
|
|
navigateWithName(
|
|
|
|
|
context, AppRoutes.offersListPage,
|
|
|
|
|
arguments: request.id);
|
|
|
|
|
navigateWithName(context, AppRoutes.offersListPage, arguments: request.id);
|
|
|
|
|
}
|
|
|
|
|
}).toViewOnly(context, onTap: () {
|
|
|
|
|
navigateWithName(
|
|
|
|
|
context, AppRoutes.loginWithPassword,
|
|
|
|
|
arguments: false);
|
|
|
|
|
navigateWithName(context, AppRoutes.loginWithPassword, arguments: false);
|
|
|
|
|
}),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
@ -264,8 +247,7 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
return 16.height;
|
|
|
|
|
},
|
|
|
|
|
itemCount: requestsVM.myFilteredRequests.length,
|
|
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
|
left: 16, right: 16, bottom: 16, top: 8),
|
|
|
|
|
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
|
|
|
|
|
),
|
|
|
|
|
))
|
|
|
|
|
],
|
|
|
|
|
@ -273,16 +255,14 @@ class MyRequestsFragment extends StatelessWidget {
|
|
|
|
|
),
|
|
|
|
|
floatingActionButton: AppState().currentAppType == AppType.customer
|
|
|
|
|
? FloatingActionButton(
|
|
|
|
|
onPressed: () =>
|
|
|
|
|
navigateWithName(context, AppRoutes.createRequestPage),
|
|
|
|
|
onPressed: () => navigateWithName(context, AppRoutes.createRequestPage),
|
|
|
|
|
backgroundColor: MyColors.darkPrimaryColor,
|
|
|
|
|
child: const Icon(
|
|
|
|
|
Icons.add,
|
|
|
|
|
color: MyColors.white,
|
|
|
|
|
),
|
|
|
|
|
).toViewOnly(context, onTap: () {
|
|
|
|
|
navigateWithName(context, AppRoutes.loginWithPassword,
|
|
|
|
|
arguments: false);
|
|
|
|
|
navigateWithName(context, AppRoutes.loginWithPassword, arguments: false);
|
|
|
|
|
})
|
|
|
|
|
: null,
|
|
|
|
|
);
|
|
|
|
|
|