make sendApi bloc and service

This commit is contained in:
Rafeek-Khoudare
2025-07-21 14:29:48 +03:00
parent 0cb2875672
commit 631766e0ec
12 changed files with 122 additions and 58 deletions

View File

@ -58,28 +58,4 @@ class RemoteNonBookableSpaces implements NonBookableSpacesService {
return completer.future;
}
@override
Future<void> 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<String, dynamic>?;
final error = message?['error'] as Map<String, dynamic>?;
final errorMessage = error?['error'] as String? ?? '';
final formattedErrorMessage = [
_defaultErrorMessage,
errorMessage,
].join(': ');
throw APIException(formattedErrorMessage);
} catch (e) {
final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': ');
throw APIException(formattedErrorMessage);
}
}
}

View File

@ -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<void> 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<String, dynamic>?;
final error = message?['error'] as Map<String, dynamic>?;
final errorMessage = error?['error'] as String? ?? '';
final formattedErrorMessage = [
_defaultErrorMessage,
errorMessage,
].join(': ');
throw APIException(formattedErrorMessage);
} catch (e) {
final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': ');
throw APIException(formattedErrorMessage);
}
}
}

View File

@ -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<PaginatedDataModel<BookableSpacemodel>> load(
NonBookableSpacesParams params);
Future<void> sendBookableSpacesToApi(SendBookableSpacesToApiParams params);
}

View File

@ -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<void> sendBookableSpacesToApi(SendBookableSpacesToApiParams params);
}

View File

@ -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<SendBookableSpacesEvent, SendBookableSpacesState> {
SendBookableSpacesService sendBookableSpacesService;
SendBookableSpacesBloc(
this.sendBookableSpacesService,
) : super(SendBookableSpacesInitial()) {
on<SendBookableSpacesToApi>(_onSendBookableSpacesToApi);
}
Future<void> _onSendBookableSpacesToApi(SendBookableSpacesToApi event,
Emitter<SendBookableSpacesState> emit) async {
emit(SendBookableSpacesLoading());
try {
await sendBookableSpacesService.sendBookableSpacesToApi(
SendBookableSpacesToApiParams.fromBookableSpacesModel(
event.selectedBookableSpaces),
);
emit(SendBookableSpacesSuccess());
} catch (e) {
emit(
SendBookableSpacesError(e.toString()),
);
}
}
}

View File

@ -0,0 +1,13 @@
part of 'send_bookable_spaces_bloc.dart';
sealed class SendBookableSpacesEvent extends Equatable {
const SendBookableSpacesEvent();
@override
List<Object> get props => [];
}
class SendBookableSpacesToApi extends SendBookableSpacesEvent {
final List<BookableSpacemodel> selectedBookableSpaces;
const SendBookableSpacesToApi({required this.selectedBookableSpaces});
}

View File

@ -0,0 +1,19 @@
part of 'send_bookable_spaces_bloc.dart';
sealed class SendBookableSpacesState extends Equatable {
const SendBookableSpacesState();
@override
List<Object> 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);
}

View File

@ -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<AddToBookableSpaceEvent>(_onAddToBookableSpaceEvent);
on<RemoveFromBookableSpaceEvent>(_onRemoveFromBookableSpaceEvent);
on<SendBookableSpacesToApi>(_onSendBookableSpacesToApi);
on<CheckConfigurValidityEvent>(_onCheckConfigurValidityEvent);
on<EditModeSelected>(_onEditModeSelected);
}
@ -44,23 +43,6 @@ class SetupBookableSpacesBloc
bookableSpaces: selectedBookableSpaces));
}
Future<void> _onSendBookableSpacesToApi(SendBookableSpacesToApi event,
Emitter<SetupBookableSpacesState> emit) async {
emit(SendBookableSpacesLoading());
try {
await nonBookableSpacesService.sendBookableSpacesToApi(
SendBookableSpacesToApiParams.fromBookableSpacesModel(
selectedBookableSpaces,
),
);
emit(SendBookableSpacesSuccess());
} catch (e) {
emit(
SendBookableSpacesError(e.toString()),
);
}
}
void _onCheckConfigurValidityEvent(CheckConfigurValidityEvent event,
Emitter<SetupBookableSpacesState> emit) {
if (selectedBookableSpaces.first.spaceConfig!.isValid) {

View File

@ -6,6 +6,7 @@ sealed class SetupBookableSpacesEvent extends Equatable {
@override
List<Object> 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,
});
}
}

View File

@ -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);
}

View File

@ -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<SetupBookableSpacesDialog> {
..add(EditModeSelected(
editingBookableSpace: widget.editingBookableSpace!,
)),
),
BlocProvider(
create: (context) => SendBookableSpacesBloc(
RemoteSendBookableSpaces(HTTPService()),
),
)
],
child: AlertDialog(

View File

@ -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<SetupBookableSpacesBloc, SetupBookableSpacesState>(
return BlocConsumer<SendBookableSpacesBloc, SendBookableSpacesState>(
listener: (context, state) {
if (state is SendBookableSpacesSuccess) {
context.read<NonBookableSpacesBloc>().add(CallInitStateEvent());
@ -45,8 +46,11 @@ class SaveSecondStepButton extends StatelessWidget {
)) {
isEditingMode
? callEditLogic(context)
: context.read<SetupBookableSpacesBloc>().add(
SendBookableSpacesToApi(),
: context.read<SendBookableSpacesBloc>().add(
SendBookableSpacesToApi(
selectedBookableSpaces: context
.read<SetupBookableSpacesBloc>()
.selectedBookableSpaces),
);
}
},