diff --git a/lib/pages/space_management_v2/modules/update_community/data/services/remote_update_community_service.dart b/lib/pages/space_management_v2/modules/update_community/data/services/remote_update_community_service.dart new file mode 100644 index 00000000..6c550673 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_community/data/services/remote_update_community_service.dart @@ -0,0 +1,39 @@ +import 'package:dio/dio.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_community/domain/params/update_community_param.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_community/domain/services/update_community_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +class RemoteUpdateCommunityService implements UpdateCommunityService { + const RemoteUpdateCommunityService(this._httpService); + + final HTTPService _httpService; + + static const _defaultErrorMessage = 'Failed to update community'; + + @override + Future updateCommunity(UpdateCommunityParam param) async { + try { + final response = await _httpService.put( + path: 'endpoint', + expectedResponseModel: (data) => CommunityModel.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_community/domain/params/update_community_param.dart b/lib/pages/space_management_v2/modules/update_community/domain/params/update_community_param.dart new file mode 100644 index 00000000..69dfc4e2 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_community/domain/params/update_community_param.dart @@ -0,0 +1,10 @@ +import 'package:equatable/equatable.dart'; + +class UpdateCommunityParam extends Equatable { + const UpdateCommunityParam({required this.name}); + + final String name; + + @override + List get props => [name]; +} diff --git a/lib/pages/space_management_v2/modules/update_community/domain/services/update_community_service.dart b/lib/pages/space_management_v2/modules/update_community/domain/services/update_community_service.dart new file mode 100644 index 00000000..9703fdc6 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_community/domain/services/update_community_service.dart @@ -0,0 +1,6 @@ +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_community/domain/params/update_community_param.dart'; + +abstract class UpdateCommunityService { + Future updateCommunity(UpdateCommunityParam param); +} diff --git a/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_bloc.dart b/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_bloc.dart new file mode 100644 index 00000000..4e913c22 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_bloc.dart @@ -0,0 +1,36 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_community/domain/params/update_community_param.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/update_community/domain/services/update_community_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; + +part 'update_community_event.dart'; +part 'update_community_state.dart'; + +class UpdateCommunityBloc extends Bloc { + final UpdateCommunityService _updateCommunityService; + + UpdateCommunityBloc( + this._updateCommunityService, + ) : super(UpdateCommunityInitial()) { + on(_onUpdateCommunity); + } + + Future _onUpdateCommunity( + UpdateCommunity event, + Emitter emit, + ) async { + emit(UpdateCommunityLoading()); + try { + final updatedCommunity = await _updateCommunityService.updateCommunity( + event.param, + ); + emit(UpdateCommunitySuccess(updatedCommunity)); + } on APIException catch (e) { + emit(UpdateCommunityFailure(e.message)); + } catch (e) { + emit(UpdateCommunityFailure(e.toString())); + } + } +} diff --git a/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_event.dart b/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_event.dart new file mode 100644 index 00000000..234298a0 --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_event.dart @@ -0,0 +1,17 @@ +part of 'update_community_bloc.dart'; + +sealed class UpdateCommunityEvent extends Equatable { + const UpdateCommunityEvent(); + + @override + List get props => []; +} + +final class UpdateCommunity extends UpdateCommunityEvent { + const UpdateCommunity(this.param); + + final UpdateCommunityParam param; + + @override + List get props => [param]; +} diff --git a/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_state.dart b/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_state.dart new file mode 100644 index 00000000..9126be0a --- /dev/null +++ b/lib/pages/space_management_v2/modules/update_community/presentation/bloc/update_community_state.dart @@ -0,0 +1,30 @@ +part of 'update_community_bloc.dart'; + +sealed class UpdateCommunityState extends Equatable { + const UpdateCommunityState(); + + @override + List get props => []; +} + +final class UpdateCommunityInitial extends UpdateCommunityState {} + +final class UpdateCommunityLoading extends UpdateCommunityState {} + +final class UpdateCommunitySuccess extends UpdateCommunityState { + final CommunityModel community; + + const UpdateCommunitySuccess(this.community); + + @override + List get props => [community]; +} + +final class UpdateCommunityFailure extends UpdateCommunityState { + final String message; + + const UpdateCommunityFailure(this.message); + + @override + List get props => [message]; +}