From 631766e0ec52e252c63076717d46c63a19ee07fa Mon Sep 17 00:00:00 2001 From: Rafeek-Khoudare Date: Mon, 21 Jul 2025 14:29:48 +0300 Subject: [PATCH] make sendApi bloc and service --- .../data/remote_non_bookable_spaces.dart | 24 ------------- .../data/remote_send_bookable_spaces.dart | 35 +++++++++++++++++++ .../service/non_bookable_spaces_service.dart | 2 -- .../service/send_bookable_spaces_service.dart | 5 +++ .../send_bookable_spaces_bloc.dart | 33 +++++++++++++++++ .../send_bookable_spaces_event.dart | 13 +++++++ .../send_bookable_spaces_state.dart | 19 ++++++++++ .../setup_bookable_spaces_bloc.dart | 20 +---------- .../setup_bookable_spaces_event.dart | 5 ++- .../setup_bookable_spaces_state.dart | 7 ---- .../screens/setup_bookable_spaces_dialog.dart | 7 ++++ .../widgets/save_second_step_button.dart | 10 ++++-- 12 files changed, 122 insertions(+), 58 deletions(-) create mode 100644 lib/pages/access_management/manage_bookable_spaces/data/remote_send_bookable_spaces.dart create mode 100644 lib/pages/access_management/manage_bookable_spaces/domain/service/send_bookable_spaces_service.dart create mode 100644 lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_bloc.dart create mode 100644 lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_event.dart create mode 100644 lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_state.dart diff --git a/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart b/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart index c42e8129..b9a499af 100644 --- a/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart +++ b/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart @@ -58,28 +58,4 @@ class RemoteNonBookableSpaces implements NonBookableSpacesService { return completer.future; } - - @override - Future sendBookableSpacesToApi( - SendBookableSpacesToApiParams params) async { - try { - await _httpService.post( - path: ApiEndpoints.bookableSpaces, - body: params.toJson(), - expectedResponseModel: (p0) {}, - ); - } on DioException catch (e) { - final message = e.response?.data as Map?; - final error = message?['error'] as Map?; - final errorMessage = error?['error'] as String? ?? ''; - final formattedErrorMessage = [ - _defaultErrorMessage, - errorMessage, - ].join(': '); - throw APIException(formattedErrorMessage); - } catch (e) { - final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); - throw APIException(formattedErrorMessage); - } - } } diff --git a/lib/pages/access_management/manage_bookable_spaces/data/remote_send_bookable_spaces.dart b/lib/pages/access_management/manage_bookable_spaces/data/remote_send_bookable_spaces.dart new file mode 100644 index 00000000..5d50fd55 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/data/remote_send_bookable_spaces.dart @@ -0,0 +1,35 @@ +import 'package:dio/dio.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/send_bookable_spaces_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; +import 'package:syncrow_web/utils/constants/api_const.dart'; + +class RemoteSendBookableSpaces implements SendBookableSpacesService { + final HTTPService _httpService; + RemoteSendBookableSpaces(this._httpService); + static const _defaultErrorMessage = 'Failed to load Spaces'; + @override + Future sendBookableSpacesToApi( + SendBookableSpacesToApiParams params) async { + try { + await _httpService.post( + path: ApiEndpoints.bookableSpaces, + body: params.toJson(), + expectedResponseModel: (p0) {}, + ); + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [ + _defaultErrorMessage, + errorMessage, + ].join(': '); + throw APIException(formattedErrorMessage); + } catch (e) { + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); + } + } +} diff --git a/lib/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart b/lib/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart index d4bc82fa..a5034bbf 100644 --- a/lib/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart +++ b/lib/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart @@ -1,10 +1,8 @@ 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/space_management_v2/main_module/shared/models/paginated_data_model.dart'; abstract class NonBookableSpacesService { Future> load( NonBookableSpacesParams params); - Future sendBookableSpacesToApi(SendBookableSpacesToApiParams params); } diff --git a/lib/pages/access_management/manage_bookable_spaces/domain/service/send_bookable_spaces_service.dart b/lib/pages/access_management/manage_bookable_spaces/domain/service/send_bookable_spaces_service.dart new file mode 100644 index 00000000..6b3f40d5 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/domain/service/send_bookable_spaces_service.dart @@ -0,0 +1,5 @@ +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/params/send_bookable_spaces_to_api_params.dart'; + +abstract class SendBookableSpacesService{ + Future sendBookableSpacesToApi(SendBookableSpacesToApiParams params); +} \ No newline at end of file diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_bloc.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_bloc.dart new file mode 100644 index 00000000..a2993db9 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_bloc.dart @@ -0,0 +1,33 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.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/send_bookable_spaces_service.dart'; + +part 'send_bookable_spaces_event.dart'; +part 'send_bookable_spaces_state.dart'; + +class SendBookableSpacesBloc + extends Bloc { + SendBookableSpacesService sendBookableSpacesService; + SendBookableSpacesBloc( + this.sendBookableSpacesService, + ) : super(SendBookableSpacesInitial()) { + on(_onSendBookableSpacesToApi); + } + Future _onSendBookableSpacesToApi(SendBookableSpacesToApi event, + Emitter emit) async { + emit(SendBookableSpacesLoading()); + try { + await sendBookableSpacesService.sendBookableSpacesToApi( + SendBookableSpacesToApiParams.fromBookableSpacesModel( + event.selectedBookableSpaces), + ); + emit(SendBookableSpacesSuccess()); + } catch (e) { + emit( + SendBookableSpacesError(e.toString()), + ); + } + } +} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_event.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_event.dart new file mode 100644 index 00000000..3e82ea0b --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_event.dart @@ -0,0 +1,13 @@ +part of 'send_bookable_spaces_bloc.dart'; + +sealed class SendBookableSpacesEvent extends Equatable { + const SendBookableSpacesEvent(); + + @override + List get props => []; +} + +class SendBookableSpacesToApi extends SendBookableSpacesEvent { + final List selectedBookableSpaces; + const SendBookableSpacesToApi({required this.selectedBookableSpaces}); +} diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_state.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_state.dart new file mode 100644 index 00000000..2fce5476 --- /dev/null +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_spaces_state.dart @@ -0,0 +1,19 @@ +part of 'send_bookable_spaces_bloc.dart'; + +sealed class SendBookableSpacesState extends Equatable { + const SendBookableSpacesState(); + + @override + List get props => []; +} + +final class SendBookableSpacesInitial extends SendBookableSpacesState {} + +class SendBookableSpacesLoading extends SendBookableSpacesState {} + +class SendBookableSpacesSuccess extends SendBookableSpacesState {} + +class SendBookableSpacesError extends SendBookableSpacesState { + final String error; + const SendBookableSpacesError(this.error); +} 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 index 6787f0c1..2212da77 100644 --- 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 @@ -2,7 +2,6 @@ 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'; @@ -16,7 +15,7 @@ class SetupBookableSpacesBloc : super(SetupBookableSpacesInitial()) { on(_onAddToBookableSpaceEvent); on(_onRemoveFromBookableSpaceEvent); - on(_onSendBookableSpacesToApi); + on(_onCheckConfigurValidityEvent); on(_onEditModeSelected); } @@ -44,23 +43,6 @@ class SetupBookableSpacesBloc 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) { 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 index d6fe715c..68deee73 100644 --- 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 @@ -6,6 +6,7 @@ sealed class SetupBookableSpacesEvent extends Equatable { @override List get props => []; } + class AddToBookableSpaceEvent extends SetupBookableSpacesEvent { final BookableSpacemodel nonBookableSpace; const AddToBookableSpaceEvent({ @@ -20,8 +21,6 @@ class RemoveFromBookableSpaceEvent extends SetupBookableSpacesEvent { }); } -class SendBookableSpacesToApi extends SetupBookableSpacesEvent {} - class CheckConfigurValidityEvent extends SetupBookableSpacesEvent {} class EditModeSelected extends SetupBookableSpacesEvent { @@ -29,4 +28,4 @@ class EditModeSelected extends SetupBookableSpacesEvent { 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 index d8f1f4f3..b6dbad70 100644 --- 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 @@ -29,11 +29,4 @@ 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/screens/setup_bookable_spaces_dialog.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/screens/setup_bookable_spaces_dialog.dart index 3b72c30c..77d07e52 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 @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart'; +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/data/remote_send_bookable_spaces.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/presentation/blocs/non_bookable_spaces_bloc/non_bookaable_spaces_bloc.dart'; +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/blocs/send_bookable_spaces_bloc/send_bookable_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'; @@ -61,6 +63,11 @@ class _SetupBookableSpacesDialogState extends State { ..add(EditModeSelected( editingBookableSpace: widget.editingBookableSpace!, )), + ), + BlocProvider( + create: (context) => SendBookableSpacesBloc( + RemoteSendBookableSpaces(HTTPService()), + ), ) ], child: AlertDialog( diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/save_second_step_button.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/save_second_step_button.dart index 67b88d32..957bab1d 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/save_second_step_button.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/save_second_step_button.dart @@ -4,6 +4,7 @@ import 'package:go_router/go_router.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/update_bookable_space_param.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/send_bookable_spaces_bloc/send_bookable_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/update_bookable_spaces/update_bookable_spaces_bloc.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/presentation/widgets/buttons_divider_bottom_dialog_widget.dart'; @@ -22,7 +23,7 @@ class SaveSecondStepButton extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocConsumer( + return BlocConsumer( listener: (context, state) { if (state is SendBookableSpacesSuccess) { context.read().add(CallInitStateEvent()); @@ -45,8 +46,11 @@ class SaveSecondStepButton extends StatelessWidget { )) { isEditingMode ? callEditLogic(context) - : context.read().add( - SendBookableSpacesToApi(), + : context.read().add( + SendBookableSpacesToApi( + selectedBookableSpaces: context + .read() + .selectedBookableSpaces), ); } },