diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart index 6b9852ee..608a44ff 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart @@ -1,9 +1,7 @@ import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; -import 'package:flutter/material.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/send_bookable_spaces_to_api_params.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/shared/models/paginated_data_model.dart'; @@ -13,24 +11,13 @@ part 'non_bookaable_spaces_state.dart'; class NonBookableSpacesBloc extends Bloc { NonBookableSpacesService nonBookableSpacesService; - List selectedBookableSpaces = []; + NonBookableSpacesBloc(this.nonBookableSpacesService) : super(NonBookableSpacesInitial()) { on(_onCallInitStateEvent); on(_onLoadUnBookableSpacesEvent); - on(_onAddToBookableSpaceEvent); - on(_onRemoveFromBookableSpaceEvent); - on(_onSendBookableSpacesToApi); - on(_onCheckConfigurValidityEvent); - on(_onEditModeSelected); } - TimeOfDay? get endTime => - selectedBookableSpaces.first.spaceConfig!.bookingEndTime; - - TimeOfDay? get startTime => - selectedBookableSpaces.first.spaceConfig!.bookingStartTime; - void _onCallInitStateEvent( CallInitStateEvent event, Emitter emit) { emit(NonBookableSpacesInitial()); @@ -75,76 +62,4 @@ class NonBookableSpacesBloc } } } - - void _onAddToBookableSpaceEvent( - AddToBookableSpaceEvent event, - Emitter emit, - ) { - if (state is NonBookableSpacesLoaded) { - final currentState = state as NonBookableSpacesLoaded; - emit(AddNonBookableSpaceIntoBookableState()); - final updatedSelectedSpaces = - List.from(currentState.selectedBookableSpaces) - ..add(event.nonBookableSpace); - - selectedBookableSpaces.add(event.nonBookableSpace); - - emit( - NonBookableSpacesLoaded( - nonBookableSpaces: currentState.nonBookableSpaces, - selectedBookableSpaces: updatedSelectedSpaces, - ), - ); - } - } - - void _onRemoveFromBookableSpaceEvent(RemoveFromBookableSpaceEvent event, - Emitter emit) { - if (state is NonBookableSpacesLoaded) { - final currentState = state as NonBookableSpacesLoaded; - emit(RemoveBookableSpaceIntoNonBookableState()); - if (currentState.selectedBookableSpaces.isNotEmpty) { - currentState.selectedBookableSpaces.remove(event.bookableSpace); - } - selectedBookableSpaces.remove(event.bookableSpace); - emit( - NonBookableSpacesLoaded( - nonBookableSpaces: currentState.nonBookableSpaces, - selectedBookableSpaces: currentState.selectedBookableSpaces, - ), - ); - } - } - - Future _onSendBookableSpacesToApi(SendBookableSpacesToApi event, - Emitter emit) async { - emit(const NonBookableSpacesLoading()); - try { - await nonBookableSpacesService.sendBookableSpacesToApi( - SendBookableSpacesToApiParams.fromBookableSpacesModel( - selectedBookableSpaces, - ), - ); - add(CallInitStateEvent()); - } catch (e) { - emit( - NonBookableSpacesError(e.toString()), - ); - } - } - - void _onCheckConfigurValidityEvent( - CheckConfigurValidityEvent event, Emitter emit) { - if (selectedBookableSpaces.first.spaceConfig!.isValid) { - emit(ValidSaveButtonState()); - } else { - emit(UnValidSaveButtonState()); - } - } - - void _onEditModeSelected( - EditModeSelected event, Emitter emit) { - selectedBookableSpaces.clear(); - selectedBookableSpaces.add(event.editingBookableSpace); - } } diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_event.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_event.dart index f3000560..e185fae6 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_event.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_event.dart @@ -15,28 +15,3 @@ class LoadUnBookableSpacesEvent extends NonBookableSpacesEvent { required this.nonBookableSpacesParams, }); } - -class AddToBookableSpaceEvent extends NonBookableSpacesEvent { - final BookableSpacemodel nonBookableSpace; - const AddToBookableSpaceEvent({ - required this.nonBookableSpace, - }); -} - -class RemoveFromBookableSpaceEvent extends NonBookableSpacesEvent { - final BookableSpacemodel bookableSpace; - const RemoveFromBookableSpaceEvent({ - required this.bookableSpace, - }); -} - -class SendBookableSpacesToApi extends NonBookableSpacesEvent {} - -class CheckConfigurValidityEvent extends NonBookableSpacesEvent {} - -class EditModeSelected extends NonBookableSpacesEvent { - final BookableSpacemodel editingBookableSpace; - const EditModeSelected({ - required this.editingBookableSpace, - }); -} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_state.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_state.dart index b8d7a518..a5804f9d 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_state.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_state.dart @@ -30,10 +30,3 @@ class NonBookableSpacesError extends NonBookableSpacesState { const NonBookableSpacesError(this.error); } -class AddNonBookableSpaceIntoBookableState extends NonBookableSpacesState {} - -class RemoveBookableSpaceIntoNonBookableState extends NonBookableSpacesState {} - -class ValidSaveButtonState extends NonBookableSpacesState {} - -class UnValidSaveButtonState extends NonBookableSpacesState {} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_bloc.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_bloc.dart new file mode 100644 index 00000000..6787f0c1 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_bloc.dart @@ -0,0 +1,78 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.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/send_bookable_spaces_to_api_params.dart'; +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart'; + +part 'setup_bookable_spaces_event.dart'; +part 'setup_bookable_spaces_state.dart'; + +class SetupBookableSpacesBloc + extends Bloc { + NonBookableSpacesService nonBookableSpacesService; + List selectedBookableSpaces = []; + SetupBookableSpacesBloc(this.nonBookableSpacesService) + : super(SetupBookableSpacesInitial()) { + on(_onAddToBookableSpaceEvent); + on(_onRemoveFromBookableSpaceEvent); + on(_onSendBookableSpacesToApi); + on(_onCheckConfigurValidityEvent); + on(_onEditModeSelected); + } + TimeOfDay? get endTime => + selectedBookableSpaces.first.spaceConfig!.bookingEndTime; + + TimeOfDay? get startTime => + selectedBookableSpaces.first.spaceConfig!.bookingStartTime; + + void _onAddToBookableSpaceEvent( + AddToBookableSpaceEvent event, + Emitter emit, + ) { + emit(InProgressState()); + selectedBookableSpaces.add(event.nonBookableSpace); + emit(AddNonBookableSpaceIntoBookableState( + bookableSpaces: selectedBookableSpaces)); + } + + void _onRemoveFromBookableSpaceEvent(RemoveFromBookableSpaceEvent event, + Emitter emit) { + emit(InProgressState()); + selectedBookableSpaces.remove(event.bookableSpace); + emit(RemoveBookableSpaceIntoNonBookableState( + bookableSpaces: selectedBookableSpaces)); + } + + Future _onSendBookableSpacesToApi(SendBookableSpacesToApi event, + Emitter emit) async { + emit(SendBookableSpacesLoading()); + try { + await nonBookableSpacesService.sendBookableSpacesToApi( + SendBookableSpacesToApiParams.fromBookableSpacesModel( + selectedBookableSpaces, + ), + ); + emit(SendBookableSpacesSuccess()); + } catch (e) { + emit( + SendBookableSpacesError(e.toString()), + ); + } + } + + void _onCheckConfigurValidityEvent(CheckConfigurValidityEvent event, + Emitter emit) { + if (selectedBookableSpaces.first.spaceConfig!.isValid) { + emit(ValidSaveButtonState()); + } else { + emit(UnValidSaveButtonState()); + } + } + + void _onEditModeSelected( + EditModeSelected event, Emitter emit) { + selectedBookableSpaces.clear(); + selectedBookableSpaces.add(event.editingBookableSpace); + } +} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_event.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_event.dart new file mode 100644 index 00000000..d6fe715c --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_event.dart @@ -0,0 +1,32 @@ +part of 'setup_bookable_spaces_bloc.dart'; + +sealed class SetupBookableSpacesEvent extends Equatable { + const SetupBookableSpacesEvent(); + + @override + List get props => []; +} +class AddToBookableSpaceEvent extends SetupBookableSpacesEvent { + final BookableSpacemodel nonBookableSpace; + const AddToBookableSpaceEvent({ + required this.nonBookableSpace, + }); +} + +class RemoveFromBookableSpaceEvent extends SetupBookableSpacesEvent { + final BookableSpacemodel bookableSpace; + const RemoveFromBookableSpaceEvent({ + required this.bookableSpace, + }); +} + +class SendBookableSpacesToApi extends SetupBookableSpacesEvent {} + +class CheckConfigurValidityEvent extends SetupBookableSpacesEvent {} + +class EditModeSelected extends SetupBookableSpacesEvent { + final BookableSpacemodel editingBookableSpace; + const EditModeSelected({ + required this.editingBookableSpace, + }); +} \ No newline at end of file diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_state.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_state.dart new file mode 100644 index 00000000..d8f1f4f3 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_state.dart @@ -0,0 +1,39 @@ +part of 'setup_bookable_spaces_bloc.dart'; + +sealed class SetupBookableSpacesState extends Equatable { + const SetupBookableSpacesState(); + + @override + List get props => []; +} + +final class SetupBookableSpacesInitial extends SetupBookableSpacesState {} + +class AddNonBookableSpaceIntoBookableState extends SetupBookableSpacesState { + final List bookableSpaces; + const AddNonBookableSpaceIntoBookableState({ + required this.bookableSpaces, + }); +} + +class InProgressState extends SetupBookableSpacesState {} + +class RemoveBookableSpaceIntoNonBookableState extends SetupBookableSpacesState { + final List bookableSpaces; + const RemoveBookableSpaceIntoNonBookableState({ + required this.bookableSpaces, + }); +} + +class ValidSaveButtonState extends SetupBookableSpacesState {} + +class UnValidSaveButtonState extends SetupBookableSpacesState {} + +class SendBookableSpacesLoading extends SetupBookableSpacesState {} + +class SendBookableSpacesSuccess extends SetupBookableSpacesState {} + +class SendBookableSpacesError extends SetupBookableSpacesState { + final String error; + const SendBookableSpacesError(this.error); +} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/toggle_cubit/toggle_points_switch_cubit.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/toggle_cubit/toggle_points_switch_cubit.dart new file mode 100644 index 00000000..0b0f11f0 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/toggle_cubit/toggle_points_switch_cubit.dart @@ -0,0 +1,18 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; + +part 'toggle_points_switch_state.dart'; + +class TogglePointsSwitchCubit extends Cubit { + TogglePointsSwitchCubit() : super(TogglePointsSwitchInitial()); + bool switchValue = true; + void activateSwitch() { + switchValue = true; + emit(ActivatePointsSwitch()); + } + + void unActivateSwitch() { + switchValue = false; + emit(UnActivatePointsSwitch()); + } +} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/toggle_cubit/toggle_points_switch_state.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/toggle_cubit/toggle_points_switch_state.dart new file mode 100644 index 00000000..872ae8dc --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/toggle_cubit/toggle_points_switch_state.dart @@ -0,0 +1,14 @@ +part of 'toggle_points_switch_cubit.dart'; + +sealed class TogglePointsSwitchState extends Equatable { + const TogglePointsSwitchState(); + + @override + List get props => []; +} + +final class TogglePointsSwitchInitial extends TogglePointsSwitchState {} + +class ActivatePointsSwitch extends TogglePointsSwitchState {} + +class UnActivatePointsSwitch extends TogglePointsSwitchState {} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/screens/setup_bookable_spaces_dialog.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/screens/setup_bookable_spaces_dialog.dart index ec3db30a..3b72c30c 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/screens/setup_bookable_spaces_dialog.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/screens/setup_bookable_spaces_dialog.dart @@ -4,6 +4,7 @@ import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/data/ 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/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart'; +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_bloc.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/steps_cubit/cubit/steps_cubit.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/details_steps_widget.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/next_first_step_button.dart'; @@ -42,22 +43,25 @@ class _SetupBookableSpacesDialogState extends State { : (context) => StepsCubit()..editValueInit(), ), BlocProvider( - create: widget.editingBookableSpace == null - ? (context) => NonBookableSpacesBloc( - RemoteNonBookableSpaces(HTTPService()), - )..add( - LoadUnBookableSpacesEvent( - nonBookableSpacesParams: - NonBookableSpacesParams(currentPage: 1), - ), - ) - : (context) => NonBookableSpacesBloc( - RemoteNonBookableSpaces(HTTPService()), - )..add( - EditModeSelected( - editingBookableSpace: widget.editingBookableSpace!), - ), + create: (context) => NonBookableSpacesBloc( + RemoteNonBookableSpaces(HTTPService()), + )..add( + LoadUnBookableSpacesEvent( + nonBookableSpacesParams: + NonBookableSpacesParams(currentPage: 1), + ), + ), ), + BlocProvider( + create: widget.editingBookableSpace == null + ? (context) => SetupBookableSpacesBloc( + RemoteNonBookableSpaces(HTTPService())) + : (context) => SetupBookableSpacesBloc( + RemoteNonBookableSpaces(HTTPService())) + ..add(EditModeSelected( + editingBookableSpace: widget.editingBookableSpace!, + )), + ) ], child: AlertDialog( backgroundColor: ColorsManager.whiteColors, @@ -101,8 +105,10 @@ class _SetupBookableSpacesDialogState extends State { ), Builder(builder: (context) { final stepsState = context.watch().state; - final nonBookableBloc = context.watch(); - final selectedSpaces = nonBookableBloc.selectedBookableSpaces; + final setupBookableSpacesBloc = + context.watch(); + final selectedSpaces = + setupBookableSpacesBloc.selectedBookableSpaces; return stepsState is StepOneState ? NextFirstStepButton(selectedSpaces: selectedSpaces) : SaveSecondStepButton( diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/check_box_space_widget.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/check_box_space_widget.dart index b5610166..e37c8e0e 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/check_box_space_widget.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/check_box_space_widget.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.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/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart'; +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/setup_bookable_spaces_bloc/setup_bookable_spaces_bloc.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; class CheckBoxSpaceWidget extends StatelessWidget { final BookableSpacemodel nonBookableSpace; @@ -15,33 +16,58 @@ class CheckBoxSpaceWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final isChecked = selectedSpaces.any( - (element) => element.spaceUuid == nonBookableSpace.spaceUuid, - ); - return Row( children: [ - Checkbox( - value: isChecked, - onChanged: (value) { - final bloc = context.read(); - if (value ?? false) { - bloc.add( - AddToBookableSpaceEvent( - nonBookableSpace: nonBookableSpace, - ), - ); - } else { - bloc.add( - RemoveFromBookableSpaceEvent( - bookableSpace: nonBookableSpace, - ), - ); - } + BlocBuilder( + builder: (context, state) { + final isChecked = switch (state) { + AddNonBookableSpaceIntoBookableState( + bookableSpaces: final spaces + ) => + spaces.any((s) => s.spaceUuid == nonBookableSpace.spaceUuid), + RemoveBookableSpaceIntoNonBookableState( + bookableSpaces: final spaces + ) => + spaces.any((s) => s.spaceUuid == nonBookableSpace.spaceUuid), + _ => false, + }; + + return Checkbox( + value: isChecked, + onChanged: (value) { + final bloc = context.read(); + if (value ?? false) { + bloc.add(AddToBookableSpaceEvent( + nonBookableSpace: nonBookableSpace)); + } else { + bloc.add(RemoveFromBookableSpaceEvent( + bookableSpace: nonBookableSpace)); + } + }, + ); }, ), const SizedBox(width: 5), - Expanded(child: Text(nonBookableSpace.spaceName)), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + nonBookableSpace.spaceName, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: ColorsManager.textGray, + ), + ), + Text( + nonBookableSpace.spaceVirtualAddress, + style: const TextStyle( + fontSize: 12, + color: ColorsManager.textGray, + ), + ), + ], + )), ], ); }