refactor code

This commit is contained in:
Rafeek-Khoudare
2025-07-10 15:52:38 +03:00
parent aab2b4a52a
commit bbf2891804
2 changed files with 9 additions and 233 deletions

View File

@ -2,11 +2,10 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/models/bookable_space_model.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/params/non_bookable_spaces_params.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/params/non_bookable_spaces_params.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/search_unbookable_spaces_widget.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/search_unbookable_spaces_widget.dart';
import 'package:syncrow_web/pages/space_management_v2/main_module/shared/models/paginated_data_model.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/unbookable_list_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
class SpacesStepDetailsWidget extends StatefulWidget { class SpacesStepDetailsWidget extends StatefulWidget {
@ -180,94 +179,3 @@ class _SpacesStepDetailsWidgetState extends State<SpacesStepDetailsWidget> {
); );
} }
} }
class UnbookableListWidget extends StatelessWidget {
final PaginatedDataModel<BookableSpacemodel> nonBookableSpaces;
const UnbookableListWidget({
super.key,
required this.scrollController,
required this.nonBookableSpaces,
});
final ScrollController scrollController;
@override
Widget build(BuildContext context) {
return Container(
width: 490,
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.vertical(
bottom: Radius.circular(20),
),
),
padding: const EdgeInsets.only(top: 10, left: 20, bottom: 5),
child: ListView.separated(
separatorBuilder: (context, index) => const SizedBox(
height: 5,
),
controller: scrollController,
itemCount: nonBookableSpaces.data.length,
itemBuilder: (context, index) {
if (index < nonBookableSpaces.data.length) {
return CheckBoxSpaceWidget(
nonBookableSpace: nonBookableSpaces.data[index],
);
} else {
return const Padding(
padding: EdgeInsets.symmetric(vertical: 10),
child: Center(child: CircularProgressIndicator()),
);
}
},
),
);
}
}
class CheckBoxSpaceWidget extends StatefulWidget {
final BookableSpacemodel nonBookableSpace;
const CheckBoxSpaceWidget({
super.key,
required this.nonBookableSpace,
});
@override
State<CheckBoxSpaceWidget> createState() => _CheckBoxSpaceWidgetState();
}
class _CheckBoxSpaceWidgetState extends State<CheckBoxSpaceWidget> {
bool isChecked = false;
@override
Widget build(BuildContext context) {
return Row(
children: [
Checkbox(
value: isChecked,
onChanged: (value) => setState(() {
isChecked = value ?? false;
if (isChecked) {
context.read<NonBookableSpacesBloc>().add(
AddToBookableSpaceEvent(
nonBookableSpace: widget.nonBookableSpace,
),
);
} else {
context.read<NonBookableSpacesBloc>().add(
RemoveFromBookableSpaceEvent(
bookableSpace: widget.nonBookableSpace,
),
);
}
}),
),
const SizedBox(
width: 5,
),
Expanded(child: Text(widget.nonBookableSpace.spaceName)),
],
);
}
}

View File

@ -1,12 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/cubit/toggle_points_switch_cubit.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/search_unbookable_spaces_widget.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/booking_period_widget.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/time_picker_widget.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/points_part_widget.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/week_checkbox_title_widget.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/week_checkbox_title_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/string_utils.dart';
class StepTwoDetailsWidget extends StatelessWidget { class StepTwoDetailsWidget extends StatelessWidget {
final TextEditingController pointsController; final TextEditingController pointsController;
@ -26,145 +23,16 @@ class StepTwoDetailsWidget extends StatelessWidget {
const SizedBox( const SizedBox(
height: 20, height: 20,
), ),
Row( const BookingPeriodWidget(),
children: [
TitleAndTimePickerWidget(
title: 'Booking Start Time',
onTimePicked: (timePicked) {
if (timePicked == null) {
return;
}
final nonBookableBloc = context.read<NonBookableSpacesBloc>();
if (nonBookableBloc.endTime != null &&
isEndTimeAfterStartTime(
timePicked, nonBookableBloc.endTime!)) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content:
Text("You can't choose start Time Before End time"),
duration: Duration(seconds: 2),
backgroundColor: ColorsManager.red,
));
throw Exception();
} else {
nonBookableBloc.selectedBookableSpaces.forEach(
(e) => e.spaceConfig!.bookingStartTime = timePicked,
);
}
},
),
const SizedBox(
width: 20,
),
TitleAndTimePickerWidget(
title: 'Booking End Time',
onTimePicked: (timePicked) {
if (timePicked == null) {
return;
}
final nonBookableBloc = context.read<NonBookableSpacesBloc>();
if (nonBookableBloc.startTime != null &&
isEndTimeAfterStartTime(
nonBookableBloc.startTime!, timePicked)) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content:
Text("You can't choose End Time After Start time"),
duration: Duration(seconds: 2),
backgroundColor: ColorsManager.red,
));
throw Exception();
} else {
nonBookableBloc.selectedBookableSpaces.forEach(
(e) => e.spaceConfig!.bookingEndTime = timePicked,
);
}
},
)
],
),
const SizedBox( const SizedBox(
height: 20, height: 20,
), ),
Row( BlocProvider(
mainAxisAlignment: MainAxisAlignment.start, create: (context) => TogglePointsSwitchCubit()..activateSwitch(),
children: [ child: PointsPartWidget(pointsController: pointsController),
Text( )
'* ',
style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(color: Colors.red),
),
const Text('Points/hrs'),
],
),
const SizedBox(
height: 5,
),
SearchUnbookableSpacesWidget(
title: 'Ex: 0',
height: 40,
onChanged: (p0) {
context
.read<NonBookableSpacesBloc>()
.selectedBookableSpaces
.forEach(
(e) => e.spaceConfig!.cost = int.parse(
pointsController.text.isEmpty
? '0'
: pointsController.text,
),
);
context
.read<NonBookableSpacesBloc>()
.add(CheckConfigurValidityEvent());
},
controller: pointsController,
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
suffix: const SizedBox(),
),
], ],
), ),
); );
} }
} }
class TitleAndTimePickerWidget extends StatelessWidget {
final void Function(TimeOfDay? timePicked) onTimePicked;
final String title;
const TitleAndTimePickerWidget({
super.key,
required this.onTimePicked,
required this.title,
});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'* ',
style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(color: Colors.red),
),
Text(title),
],
),
const SizedBox(
height: 5,
),
TimePickerWidget(
onTimePicked: onTimePicked,
),
],
);
}
}