diff --git a/lib/pages/space_management_v2/modules/create_community/data/services/remote_create_community_service.dart b/lib/pages/space_management_v2/modules/create_community/data/services/remote_create_community_service.dart new file mode 100644 index 00000000..be83124b --- /dev/null +++ b/lib/pages/space_management_v2/modules/create_community/data/services/remote_create_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/create_community/domain/param/create_community_param.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/create_community/domain/services/create_community_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +class RemoteCreateCommunityService implements CreateCommunityService { + const RemoteCreateCommunityService(this._httpService); + + final HTTPService _httpService; + + static const _defaultErrorMessage = 'Failed to create community'; + + @override + Future createCommunity(CreateCommunityParam param) async { + try { + final response = await _httpService.post( + 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/create_community/domain/param/create_community_param.dart b/lib/pages/space_management_v2/modules/create_community/domain/param/create_community_param.dart new file mode 100644 index 00000000..3d7c203b --- /dev/null +++ b/lib/pages/space_management_v2/modules/create_community/domain/param/create_community_param.dart @@ -0,0 +1,10 @@ +import 'package:equatable/equatable.dart'; + +class CreateCommunityParam extends Equatable { + const CreateCommunityParam({required this.name}); + + final String name; + + @override + List get props => [name]; +} diff --git a/lib/pages/space_management_v2/modules/create_community/domain/services/create_community_service.dart b/lib/pages/space_management_v2/modules/create_community/domain/services/create_community_service.dart new file mode 100644 index 00000000..ddb1a72d --- /dev/null +++ b/lib/pages/space_management_v2/modules/create_community/domain/services/create_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/create_community/domain/param/create_community_param.dart'; + +abstract class CreateCommunityService { + Future createCommunity(CreateCommunityParam param); +} diff --git a/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_bloc.dart b/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_bloc.dart new file mode 100644 index 00000000..817b1e0e --- /dev/null +++ b/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_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/create_community/domain/param/create_community_param.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/create_community/domain/services/create_community_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; + +part 'create_community_event.dart'; +part 'create_community_state.dart'; + +class CreateCommunityBloc extends Bloc { + final CreateCommunityService _createCommunityService; + + CreateCommunityBloc( + this._createCommunityService, + ) : super(CreateCommunityInitial()) { + on(_onCreateCommunity); + } + + Future _onCreateCommunity( + CreateCommunity event, + Emitter emit, + ) async { + emit(CreateCommunityLoading()); + try { + final createdCommunity = await _createCommunityService.createCommunity( + event.param, + ); + emit(CreateCommunitySuccess(createdCommunity)); + } on APIException catch (e) { + emit(CreateCommunityFailure(e.message)); + } catch (e) { + emit(CreateCommunityFailure(e.toString())); + } + } +} diff --git a/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_event.dart b/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_event.dart new file mode 100644 index 00000000..d27c5752 --- /dev/null +++ b/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_event.dart @@ -0,0 +1,17 @@ +part of 'create_community_bloc.dart'; + +sealed class CreateCommunityEvent extends Equatable { + const CreateCommunityEvent(); + + @override + List get props => []; +} + +final class CreateCommunity extends CreateCommunityEvent { + const CreateCommunity(this.param); + + final CreateCommunityParam param; + + @override + List get props => [param]; +} diff --git a/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_state.dart b/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_state.dart new file mode 100644 index 00000000..56345aab --- /dev/null +++ b/lib/pages/space_management_v2/modules/create_community/presentation/bloc/create_community_state.dart @@ -0,0 +1,30 @@ +part of 'create_community_bloc.dart'; + +sealed class CreateCommunityState extends Equatable { + const CreateCommunityState(); + + @override + List get props => []; +} + +final class CreateCommunityInitial extends CreateCommunityState {} + +final class CreateCommunityLoading extends CreateCommunityState {} + +final class CreateCommunitySuccess extends CreateCommunityState { + const CreateCommunitySuccess(this.community); + + final CommunityModel community; + + @override + List get props => [community]; +} + +final class CreateCommunityFailure extends CreateCommunityState { + final String message; + + const CreateCommunityFailure(this.message); + + @override + List get props => [message]; +}