Aidra Driver 1.3.5+68
Aidra Driver - Your path to green energy
Loading...
Searching...
No Matches
collection_slider.dart
Go to the documentation of this file.
1import 'package:easy_localization/easy_localization.dart';
2import 'package:flutter/material.dart';
3import 'package:flutter_bloc/flutter_bloc.dart';
4import 'package:go_router/go_router.dart';
5
6import '../../../../../../core/common/entities/collection_entity.dart';
7import '../../../../../../core/common/enums/collection_status.dart';
8import '../../../../../../core/router/routes.dart';
9import '../../../../../../core/services/location_service.dart';
10import '../../../../../../core/services/notifications_service.dart';
11import '../../../../../../core/ui/theme/color_palette.dart';
12import '../../../../../../core/ui/widgets/custom_dual_slider.dart';
13import '../../../../../../core/ui/widgets/custom_slider.dart';
14import '../../../../../../core/ui/widgets/custom_snackbar.dart';
15import '../../../../../auth/presentation/bloc/authentication_bloc/authentication_bloc.dart';
16import '../../../bloc/collections_bloc/collections_bloc.dart';
17import 'cancellation_bottom_sheet.dart';
18import 'confirmation_dialog.dart';
19
20class CollectionSlider extends StatelessWidget {
23 final int collectionId;
24
26 required this.collection,
27 required this.status,
28 required this.collectionId,
29 super.key,
30 });
31
32 @override
33 Widget build(BuildContext context) {
34 if (status == CollectionStatus.done || status == CollectionStatus.cancelled) {
35 return const SizedBox.shrink();
36 }
37
38 return Center(
39 child: status == CollectionStatus.arrived
41 startText: "${'common.cancel'.tr()} < <",
42 endText: " > > ${'common.collect'.tr()}",
43 startAction: (_) => _showCancellationReasonSheet(context),
44 endAction: (sliderController) {
45 sliderController.loading();
46 _validateCollection(context);
47 context.read<CollectionsBloc>().stream.listen(
48 (state) {
49 if (state is CollectionValidationSuccess) {
50 if (context.mounted) {
51 context.push(Routes.collectionRequestInformationScreen.route, extra: collection);
52 sliderController.reset();
53 }
54 } else if (state is CollectionValidationError) {
55 if (context.mounted) CustomSnackBar.display(context, ColorPalette.red, state.failure.message);
56 sliderController.reset();
57 }
58 },
59 );
60 },
61 )
62 : CustomSlider(
63 text: _getSliderText(),
64 action: (_) => changeCollectionStatus(
66 context: context,
70 cancellationReasonId: null,
71 cancellationReasonName: null,
73 ),
74 ),
75 );
76 }
77
78 String _getSliderText() => status == CollectionStatus.onTheWay ? " > > ${'common.arrived'.tr()}" : " > > ${'common.on_the_way'.tr()}";
79
81 required int collectionId,
82 required BuildContext context,
83 required CollectionStatus status,
84 required String? cancellationReasonId,
85 required String? cancellationReasonName,
86 required String reference,
87 }) {
88 final authState = context.read<AuthenticationBloc>().state;
89 final int? userId;
90 if (authState is AuthenticatedState) {
91 userId = authState.session.uid;
92 } else {
93 return;
94 }
96 poId: collectionId,
97 poStatus: status.value,
98 );
99 context.read<CollectionsBloc>().add(
100 UpdateCollectionStatusEvent(
101 cancellationReasonId: cancellationReasonId,
103 status: status,
104 userId: userId,
106 ),
107 );
109 partnerId: collection.restaurantId.toString(),
111 );
112 }
113
114 void _showCancellationReasonSheet(BuildContext parentContext) {
115 showModalBottomSheet(
116 context: parentContext,
117 builder: (context) {
120 onReasonSelected: (reasonId) async {
121 Navigator.pop(context);
123 poId: collectionId,
124 poStatus: CollectionStatus.cancelled.value,
125 );
126 final bool? confirmed = await showConfirmationDialog(
127 context: parentContext,
128 );
129 if (confirmed == true && parentContext.mounted) {
133 context: parentContext,
134 status: CollectionStatus.cancelled,
135 cancellationReasonId: reasonId.toString(),
136 cancellationReasonName: null,
137 reference: collection.reference ?? '',
138 );
139 }
140 },
141 );
142 },
143 );
144 }
145
146 void _validateCollection(BuildContext context) {
147 final authState = context.read<AuthenticationBloc>().state;
148 if (authState is AuthenticatedState) {
149 context.read<CollectionsBloc>().add(
151 collectionId: collectionId.toString(),
152 userId: authState.session.uid.toString(),
153 ),
154 );
155 }
156 }
157}
AuthGuard _()
const CancellationBottomSheet({ super.key, required this.collectionId, required this.onReasonSelected, })
sealed class CheckInOutEvent extends Equatable userId
static const red
static ScaffoldFeatureController< SnackBar, SnackBarClosedReason > display(final BuildContext context, final Color color, final String message,)
void updateDeliveryContext({int? poId, String? poStatus})
Future< void > sendBusinessNotification({ required String partnerId, required status, }) async
void _showCancellationReasonSheet(BuildContext parentContext)
const CustomDualSlider({ super.key, required this.startText, required this.endText, required this.startAction, required this.endAction, })
final CollectionsState state
final Widget child
override Widget build(BuildContext context)
final CollectionEntity collection
const CollectionSlider({ required this.collection, required this.status, required this.collectionId, super.key, })
final CollectionStatus status
void _validateCollection(BuildContext context)
String _getSliderText()
void changeCollectionStatus({ required int collectionId, required BuildContext context, required CollectionStatus status, required String? cancellationReasonId, required String? cancellationReasonName, required String reference, })
CollectionStatus
final Partner partnerId
class UpdateCollectionStatusEvent extends CollectionsEvent collectionId
const ValidateCollectionEvent({ required this.collectionId, required this.userId })
Future< bool?> showConfirmationDialog({ required BuildContext context, String title='Confirm Cancellation', String message='Are you sure you want to cancel this collection?', })
class Partner String
class GetCollectionsParams extends Equatable CollectionEntity
class SearchWeeklyCollectionsEvent extends WeeklyCollectionsEvent collection
style SizedBox(height:2.h)