1import 'package:connect/core/localization/app_localizations.dart';
2import 'package:flutter/services.dart';
4import '/core/ui/theme/color_palette.dart';
5import '/core/ui/widgets/custom_action_slider.dart';
6import '/core/ui/widgets/custom_snackbar.dart';
7import '/core/ui/widgets/custom_text_form_field.dart';
8import '/features/authentication/presentation/logic/authentication_bloc/authentication_bloc.dart';
9import '/features/collections/domain/entities/collection_entity.dart';
10import '/features/collections/domain/entities/create_collection_req_entity.dart';
11import '/features/collections/presentation/logic/collection_requests_history_bloc/collection_requests_history_bloc.dart';
12import '/features/collections/presentation/logic/create_collection_cubit/create_collection_cubit.dart';
13import '/features/collections/presentation/screens/transaction_history_screen/widgets/expected_date_field.dart';
14import '/features/collections/presentation/screens/transaction_history_screen/widgets/time_ranges_field.dart';
15import 'package:flutter/material.dart';
16import 'package:flutter_bloc/flutter_bloc.dart';
17import 'package:flutter_screenutil/flutter_screenutil.dart';
18import 'package:flutter/cupertino.dart';
27 _CreateNewCollectionViewState();
30class _CreateNewCollectionViewState
extends State<CreateNewCollectionView>
31 with SingleTickerProviderStateMixin {
39 duration:
const Duration(milliseconds: 800),
43 CurvedAnimation(parent:
_controller, curve: Curves.easeOutBack),
55 Widget
build(BuildContext context) {
56 return BlocConsumer<CreateCollectionCubit, CreateCollectionState>(
57 listener: (context, state) {
58 if (state is CollectionCreatedState) {
63 .
translate(
'Your collection has been successfully created'),
65 final authenticationState = context.read<AuthenticationBloc>().state;
66 if (authenticationState is AuthenticatedState) {
67 String?
partnerId = authenticationState.session.partnerId;
69 context.read<CollectionRequestsHistoryBloc>().add(
82 .
translate(
'Error while creating your collection, try again'),
86 builder: (context, state) {
87 return ScaleTransition(
90 borderRadius: BorderRadius.circular(20),
91 child: BackdropFilter(
92 filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
94 margin: EdgeInsets.all(15.sp),
96 decoration: BoxDecoration(
97 color: Theme.of(context).colorScheme.surface.withOpacity(0.8),
98 borderRadius: BorderRadius.circular(20),
100 child: SingleChildScrollView(
106 SizedBox(height: 15.sp),
124 icon: CupertinoIcons.calendar,
129 SizedBox(width: 15.sp),
134 SizedBox(height: 15.sp),
136 icon: CupertinoIcons.cube_box,
140 SizedBox(height: 15.sp),
142 icon: CupertinoIcons.text_quote,
151 required IconData
icon,
152 required String
title,
153 required Widget
child,
156 crossAxisAlignment: CrossAxisAlignment.start,
160 Icon(
icon,
color: Theme.of(context).colorScheme.primary),
161 SizedBox(width: 10.sp),
164 style: Theme.of(context).textTheme.titleMedium?.copyWith(
165 fontWeight: FontWeight.w600,
170 Divider(height: 20.sp),
172 SizedBox(height: 10.sp),
178 return CustomSliderV2(
191 final authenticationState = context.read<AuthenticationBloc>().state;
192 if (authenticationState is AuthenticatedState) {
193 String
partnerId = authenticationState.session.partnerId!;
197 _formKey.currentState!.validate()) {
209 userId: authenticationState.session.uid,
214 .read<CreateCollectionCubit>()
215 .createCollection(entity: newCollection);
221 .
translate(
'Please select both time range and date to continue'),
229 crossAxisAlignment: CrossAxisAlignment.start,
233 style: Theme.of(context).textTheme.bodySmall?.copyWith(
234 color: Theme.of(context).hintColor,
237 SizedBox(height: 8.sp),
239 decoration: BoxDecoration(
240 color: Theme.of(context).colorScheme.surface,
241 borderRadius: BorderRadius.circular(10),
243 color: Theme.of(context).colorScheme.outline.withOpacity(0.3),
247 child: ExpectedDateField(
248 isEditingField:
false,
251 onDatePicked: (newDate) {
262 crossAxisAlignment: CrossAxisAlignment.start,
266 style: Theme.of(context).textTheme.bodySmall?.copyWith(
267 color: Theme.of(context).hintColor,
270 SizedBox(height: 8.sp),
272 decoration: BoxDecoration(
273 color: Theme.of(context).colorScheme.surface,
274 borderRadius: BorderRadius.circular(10),
276 color: Theme.of(context).colorScheme.outline.withOpacity(0.3),
282 onPickTimeRange: (time) {
292 return CustomTextFormField(
295 inputType: TextInputType.number,
297 FilteringTextInputFormatter.digitsOnly,
298 LengthLimitingTextInputFormatter(
306 final int? number =
int.tryParse(
value);
307 if (number == null) {
310 if (number > 10000) {
312 .
translate(
'Maximum allowed quantity is 10,000');
321 crossAxisAlignment: CrossAxisAlignment.start,
325 .
translate(
'Enter any special instructions'),
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})
const RequestOrderLineEntity({ required this.partnerId, required this.productQty, })
const CollectionCreattionFailureState({required this.failure})
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()
override Widget build(BuildContext context)
final ProposedTimeEntity selectedTimeRange
const TimeRangeField({ super.key, required this.selectedTimeRange, required this.onPickTimeRange, })