3import 'package:connect/core/localization/app_localizations.dart';
4import 'package:connect/core/ui/widgets/custom_scaffold.dart';
5import 'package:connect/features/collections/domain/entities/update_collection_req_entity.dart';
6import 'package:flutter/cupertino.dart';
7import 'package:flutter/services.dart';
9import '../../../../../../../../authentication/presentation/logic/authentication_bloc/authentication_bloc.dart';
10import '/core/ui/theme/color_palette.dart';
11import '/core/ui/widgets/custom_action_slider.dart';
12import '/core/ui/widgets/custom_snackbar.dart';
13import '/core/ui/widgets/custom_text_form_field.dart';
14import '/features/collections/domain/entities/collection_entity.dart';
15import '/features/collections/presentation/logic/collection_requests_history_bloc/collection_requests_history_bloc.dart';
16import '/features/collections/presentation/logic/update_collection_cubit/update_collection_cubit.dart';
17import '/features/collections/presentation/screens/transaction_history_screen/widgets/expected_date_field.dart';
18import '/features/collections/presentation/screens/transaction_history_screen/widgets/time_ranges_field.dart';
19import 'package:flutter/material.dart';
20import 'package:flutter_bloc/flutter_bloc.dart';
21import 'package:flutter_screenutil/flutter_screenutil.dart';
22import 'package:go_router/go_router.dart';
34 _EditCollectionRequestsScreenState();
37class _EditCollectionRequestsScreenState
38 extends State<EditCollectionRequestsScreen>
39 with SingleTickerProviderStateMixin {
53 if (widget.collection.orderLines?.first.productQty != null) {
55 widget.collection.orderLines!.first.productQty!.toString();
63 duration:
const Duration(milliseconds: 800),
67 CurvedAnimation(parent:
_controller, curve: Curves.easeOutBack),
75 if (
_formKey.currentState!.validate()) {
76 final authenticationState = context.read<AuthenticationBloc>().state;
77 if (authenticationState is AuthenticatedState) {
78 String
partnerId = authenticationState.session.partnerId!;
80 int uid = authenticationState.session.uid!;
83 id: widget.collection.id ?? 0,
93 .read<UpdateCollectionCubit>()
94 .updateCollectionRequest(entity: updatedCollection);
100 Widget
build(BuildContext context) {
101 return BlocConsumer<UpdateCollectionCubit, UpdateCollectionState>(
102 listener: (context, state) {
103 if (state is CollectionUpdatedState) {
109 .
translate(
'Your collection has been successfully updated'));
111 final authenticationState = context.read<AuthenticationBloc>().state;
112 if (authenticationState is AuthenticatedState) {
113 String?
partnerId = authenticationState.session.partnerId;
114 context.read<CollectionRequestsHistoryBloc>().add(
124 .
translate(
'Error while updating your collection, try again'),
128 builder: (context, state) {
129 return CustomScaffold(
133 padding: EdgeInsets.symmetric(horizontal: 10.sp, vertical: 15.sp),
134 child: state is UpdatingCollectionState
136 child: CircularProgressIndicator(),
141 borderRadius: BorderRadius.circular(20),
142 child: BackdropFilter(
143 filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
145 padding: EdgeInsets.all(15.sp),
146 decoration: BoxDecoration(
147 color: Theme.of(context).colorScheme.surface,
148 borderRadius: BorderRadius.circular(20),
150 child: SingleChildScrollView(
156 SizedBox(height: 15.sp),
211 icon: CupertinoIcons.calendar,
216 SizedBox(width: 15.sp),
221 SizedBox(height: 15.sp),
223 icon: CupertinoIcons.cube_box,
227 SizedBox(height: 15.sp),
229 icon: CupertinoIcons.text_quote,
238 required IconData
icon,
239 required String
title,
240 required Widget
child,
243 crossAxisAlignment: CrossAxisAlignment.start,
247 Icon(
icon,
color: Theme.of(context).colorScheme.primary),
248 SizedBox(width: 10.sp),
251 style: Theme.of(context).textTheme.titleMedium?.copyWith(
252 fontWeight: FontWeight.w600,
257 Divider(height: 20.sp),
259 SizedBox(height: 10.sp),
265 return CustomSliderV2(
275 crossAxisAlignment: CrossAxisAlignment.start,
279 style: Theme.of(context).textTheme.bodySmall?.copyWith(
280 color: Theme.of(context).hintColor,
283 SizedBox(height: 8.sp),
285 decoration: BoxDecoration(
286 color: Theme.of(context).colorScheme.surface,
287 borderRadius: BorderRadius.circular(10),
289 color: Theme.of(context).colorScheme.outline.withOpacity(0.3),
293 child: ExpectedDateField(
294 isEditingField:
true,
296 onDatePicked: (newDate) {
297 setState(() => _expectedDate = newDate);
307 crossAxisAlignment: CrossAxisAlignment.start,
311 style: Theme.of(context).textTheme.bodySmall?.copyWith(
312 color: Theme.of(context).hintColor,
315 SizedBox(height: 8.sp),
317 decoration: BoxDecoration(
318 color: Theme.of(context).colorScheme.surface,
319 borderRadius: BorderRadius.circular(10),
321 color: Theme.of(context).colorScheme.outline.withOpacity(0.3),
327 onPickTimeRange: (time) {
337 return CustomTextFormField(
340 inputType: TextInputType.number,
342 FilteringTextInputFormatter.digitsOnly,
343 LengthLimitingTextInputFormatter(
351 final int? number =
int.tryParse(
value);
352 if (number == null) {
355 if (number > 10000) {
357 .
translate(
'Maximum allowed quantity is 10,000');
366 crossAxisAlignment: CrossAxisAlignment.start,
370 .
translate(
'Enter any special instructions'),
385 required this.onToggle,
386 required this.initialValue,
390 AutoManualSwitcherState
createState() => AutoManualSwitcherState();
393class AutoManualSwitcherState
extends State<AutoManualSwitcher> {
399 isAuto = widget.initialValue;
410 Widget
build(BuildContext context) {
411 return GestureDetector(
414 padding: EdgeInsets.symmetric(vertical: 15.sp, horizontal: 30.sp),
415 decoration: BoxDecoration(
416 borderRadius: BorderRadius.circular(10),
417 gradient: LinearGradient(
420 Theme.of(context).scaffoldBackgroundColor,
421 Theme.of(context).colorScheme.surface,
424 Theme.of(context).colorScheme.surface,
425 Theme.of(context).scaffoldBackgroundColor,
430 mainAxisAlignment: MainAxisAlignment.spaceAround,
433 opacity:
isAuto ? 1.0 : 0.5,
434 duration:
const Duration(milliseconds: 300),
437 style: Theme.of(context).textTheme.bodySmall?.copyWith(
439 ? Theme.of(context).colorScheme.primary
440 : Theme.of(context).colorScheme.onSurface,
441 fontWeight:
isAuto ? FontWeight.bold : FontWeight.normal,
445 const SizedBox(width: 20),
447 opacity:
isAuto ? 0.5 : 1.0,
448 duration:
const Duration(milliseconds: 300),
451 style: Theme.of(context).textTheme.bodySmall?.copyWith(
453 ? Theme.of(context).colorScheme.onSurface
454 : Theme.of(context).colorScheme.primary,
455 fontWeight:
isAuto ? FontWeight.normal : FontWeight.bold,
477 Widget
build(BuildContext context) {
479 crossAxisAlignment: CrossAxisAlignment.center,
488 color: Theme.of(context).hintColor,
491 SizedBox(width: 10.sp),
494 style: Theme.of(context).textTheme.bodySmall?.copyWith(
495 color: Theme.of(context).hintColor,
498 SizedBox(width: 10.sp),
503 color: Theme.of(context).hintColor,
508 SizedBox(height: 12.sp),
AppLocalizations(this.locale)
class CalenderTransactionsSummaryVeiw extends StatefulWidget collection
String translate(String key)
static AppLocalizations of(BuildContext context)
static display(final BuildContext context, final Color color, final String message,)
ProposedTimeEntity({ required this.id, required this.name, })
const LoadOnGoingCollectionRequestsEvent({required this.partnerId})
ProposedTimeEntity _selectedTimeRange
Widget _buildAnimatedInputs()
final _instructioncontroller
Widget _buildInputCard({ required IconData icon, required String title, required Widget child, })
Widget _buildTimeField(BuildContext context)
late Animation< double > _scaleAnimation
Widget _buildDateField(BuildContext context)
Widget _buildInstructionsField()
Widget _buildQuantityField()
Widget _buildSubmitButton()
override void initState()
class AutoManualSwitcher extends StatefulWidget isAuto
override Widget build(BuildContext context)
final ProposedTimeEntity selectedTimeRange
const TimeRangeField({ super.key, required this.selectedTimeRange, required this.onPickTimeRange, })
const CollectionUpdateFailureState({ required this.failure, })