diff --git a/lib/pages/space_management_v2/modules/update_space/data/services/remote_update_space_service.dart b/lib/pages/space_management_v2/modules/update_space/data/services/remote_update_space_service.dart new file mode 100644 index 00000000..b15e6095 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_space/data/services/remote_update_space_service.dart @@ -0,0 +1,40 @@ +import 'package:dio/dio.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/space_details/domain/models/space_details_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_space/domain/services/update_space_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +class RemoteUpdateSpaceService implements UpdateSpaceService { + const RemoteUpdateSpaceService(this._httpService); + + final HTTPService _httpService; + + static const _defaultErrorMessage = 'Failed to update space'; + + @override + Future updateSpace(SpaceDetailsModel space) async { + try { + final response = await _httpService.put( + path: 'endpoint', + body: space.toJson(), + expectedResponseModel: (data) => SpaceDetailsModel.fromJson( + data as Map, + ), + ); + + return response; + } 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/space_management_v2/modules/update_space/domain/services/update_space_service.dart b/lib/pages/space_management_v2/modules/update_space/domain/services/update_space_service.dart new file mode 100644 index 00000000..29bc9419 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_space/domain/services/update_space_service.dart @@ -0,0 +1,5 @@ +import 'package:syncrow_web/pages/space_management_v2/modules/space_details/domain/models/space_details_model.dart'; + +abstract class UpdateSpaceService { + Future updateSpace(SpaceDetailsModel space); +} diff --git a/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_bloc.dart b/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_bloc.dart new file mode 100644 index 00000000..3bc4e187 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_bloc.dart @@ -0,0 +1,31 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/space_details/domain/models/space_details_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_space/domain/services/update_space_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; + +part 'update_space_event.dart'; +part 'update_space_state.dart'; + +class UpdateSpaceBloc extends Bloc { + final UpdateSpaceService _updateSpaceService; + + UpdateSpaceBloc(this._updateSpaceService) : super(UpdateSpaceInitial()) { + on(_onUpdateSpace); + } + + Future _onUpdateSpace( + UpdateSpace event, + Emitter emit, + ) async { + emit(UpdateSpaceLoading()); + try { + final updatedSpace = await _updateSpaceService.updateSpace(event.space); + emit(UpdateSpaceSuccess(updatedSpace)); + } on APIException catch (e) { + emit(UpdateSpaceFailure(e.message)); + } catch (e) { + emit(UpdateSpaceFailure(e.toString())); + } + } +} diff --git a/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_event.dart b/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_event.dart new file mode 100644 index 00000000..b7d476af --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_event.dart @@ -0,0 +1,17 @@ +part of 'update_space_bloc.dart'; + +sealed class UpdateSpaceEvent extends Equatable { + const UpdateSpaceEvent(); + + @override + List get props => []; +} + +final class UpdateSpace extends UpdateSpaceEvent { + const UpdateSpace(this.space); + + final SpaceDetailsModel space; + + @override + List get props => [space]; +} diff --git a/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_state.dart b/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_state.dart new file mode 100644 index 00000000..f0bc5a2b --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_space/presentation/bloc/update_space_state.dart @@ -0,0 +1,30 @@ +part of 'update_space_bloc.dart'; + +sealed class UpdateSpaceState extends Equatable { + const UpdateSpaceState(); + + @override + List get props => []; +} + +final class UpdateSpaceInitial extends UpdateSpaceState {} + +final class UpdateSpaceLoading extends UpdateSpaceState {} + +final class UpdateSpaceSuccess extends UpdateSpaceState { + final SpaceDetailsModel space; + + const UpdateSpaceSuccess(this.space); + + @override + List get props => [space]; +} + +final class UpdateSpaceFailure extends UpdateSpaceState { + final String message; + + const UpdateSpaceFailure(this.message); + + @override + List get props => [message]; +}