You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
6.7 KiB
Dart
157 lines
6.7 KiB
Dart
import 'package:flutter/gestures.dart';
|
|
import 'package:mc_common_app/classes/app_state.dart';
|
|
import 'package:mc_common_app/classes/consts.dart';
|
|
import 'package:mc_common_app/config/routes.dart';
|
|
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
|
import 'package:mc_common_app/models/requests_models/request_model.dart';
|
|
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
|
|
import 'package:mc_common_app/utils/navigator.dart';
|
|
import 'package:mc_common_app/view_models/requests_view_model.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:mc_common_app/extensions/int_extensions.dart';
|
|
import 'package:mc_common_app/extensions/string_extensions.dart';
|
|
import 'package:mc_common_app/theme/colors.dart';
|
|
import 'package:mc_common_app/utils/enums.dart';
|
|
import 'package:mc_common_app/views/requests/widget/request_item.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/categories_list.dart';
|
|
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:easy_localization/easy_localization.dart';
|
|
|
|
class MyRequestsFragment extends StatelessWidget {
|
|
const MyRequestsFragment({super.key});
|
|
|
|
void cancelRequestBottomSheet(BuildContext context, int requestId) {
|
|
return actionConfirmationBottomSheet(
|
|
context: context,
|
|
title: LocaleKeys.cancelRequestPrompt.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
subtitle: LocaleKeys.requestPermanentlyCancelled.tr(),
|
|
actionButtonYes: Expanded(
|
|
child: ShowFillButton(
|
|
maxHeight: 55,
|
|
title: LocaleKeys.yes.tr(),
|
|
fontSize: 15,
|
|
onPressed: () async {
|
|
Navigator.pop(context);
|
|
|
|
final requestVM = context.read<RequestsVM>();
|
|
|
|
bool status = await requestVM.onActionRequestTapped(context: context, requestStatusEnum: RequestStatusEnum.cancelled, requestId: requestId);
|
|
if (status) {
|
|
await requestVM.getRequests(isNeedToRebuild: true, appType: AppType.provider);
|
|
}
|
|
},
|
|
),
|
|
),
|
|
actionButtonNo: Expanded(
|
|
child: ShowFillButton(
|
|
maxHeight: 55,
|
|
isFilled: false,
|
|
borderColor: MyColors.darkPrimaryColor,
|
|
title: LocaleKeys.no.tr(),
|
|
txtColor: MyColors.darkPrimaryColor,
|
|
fontSize: 15,
|
|
onPressed: () {
|
|
Navigator.pop(context);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
bool shouldDismiss(RequestStatusEnum requestStatusEnum) {
|
|
if (AppState().currentAppType == AppType.provider) {
|
|
return false;
|
|
}
|
|
|
|
if (requestStatusEnum == RequestStatusEnum.pending || requestStatusEnum == RequestStatusEnum.submitted) {
|
|
return true;
|
|
}
|
|
return false;
|
|
;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: CustomAppBar(
|
|
title: LocaleKeys.myRequests.tr(),
|
|
isRemoveBackButton: true,
|
|
),
|
|
body: Container(
|
|
color: MyColors.backgroundColor,
|
|
width: double.infinity,
|
|
height: double.infinity,
|
|
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
|
|
return Column(
|
|
children: [
|
|
16.height,
|
|
FiltersList(
|
|
filterList: requestsVM.requestsTypeFilterOptions,
|
|
onFilterTapped: (index, selectedFilterId) {
|
|
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
|
|
},
|
|
),
|
|
8.height,
|
|
Expanded(
|
|
child: RefreshIndicator(
|
|
onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider),
|
|
child: requestsVM.state == ViewState.busy
|
|
? const Center(child: CircularProgressIndicator())
|
|
: requestsVM.myFilteredRequests.isEmpty
|
|
? Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
|
|
],
|
|
)
|
|
: ListView.separated(
|
|
itemBuilder: (context, index) {
|
|
return Dismissible(
|
|
key: Key(index.toString()),
|
|
background: const SizedBox(),
|
|
secondaryBackground: Container(
|
|
color: const Color(0xFFDD0505),
|
|
child: Row(
|
|
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),
|
|
],
|
|
),
|
|
),
|
|
dragStartBehavior: DragStartBehavior.start,
|
|
direction: shouldDismiss(requestsVM.myFilteredRequests[index].requestStatus) ? DismissDirection.endToStart : DismissDirection.none,
|
|
confirmDismiss: (DismissDirection direction) async {
|
|
cancelRequestBottomSheet(context, requestsVM.myFilteredRequests[index].id);
|
|
},
|
|
child: RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppState().currentAppType, requestIndex: index),
|
|
);
|
|
},
|
|
separatorBuilder: (context, index) {
|
|
return 16.height;
|
|
},
|
|
itemCount: requestsVM.myFilteredRequests.length,
|
|
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
|
|
),
|
|
))
|
|
],
|
|
);
|
|
}),
|
|
),
|
|
floatingActionButton: AppState().currentAppType == AppType.customer
|
|
? FloatingActionButton(
|
|
onPressed: () => navigateWithName(context, AppRoutes.createRequestPage),
|
|
backgroundColor: MyColors.darkPrimaryColor,
|
|
child: const Icon(
|
|
Icons.add,
|
|
color: MyColors.white,
|
|
),
|
|
)
|
|
: null,
|
|
);
|
|
}
|
|
}
|