diff --git a/lib/pages/space_management_v2/modules/communities/data/services/remote_communities_service.dart b/lib/pages/space_management_v2/modules/communities/data/services/remote_communities_service.dart new file mode 100644 index 00000000..b6cfa8fc --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/data/services/remote_communities_service.dart @@ -0,0 +1,20 @@ +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/services/communities_service.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +class RemoteCommunitiesService implements CommunitiesService { + const RemoteCommunitiesService(this._httpService); + + final HTTPService _httpService; + + @override + Future> getCommunity(LoadCommunitiesParam param) async { + return _httpService.get( + path: '/api/communities/', + expectedResponseModel: (json) => (json as List) + .map((e) => CommunityModel.fromJson(e as Map)) + .toList(), + ); + } +} diff --git a/lib/pages/space_management_v2/modules/communities/domain/models/community_model.dart b/lib/pages/space_management_v2/modules/communities/domain/models/community_model.dart new file mode 100644 index 00000000..c6efad9e --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/domain/models/community_model.dart @@ -0,0 +1,27 @@ +import 'package:equatable/equatable.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/space_model.dart'; + +class CommunityModel extends Equatable { + final String uuid; + final String name; + final List spaces; + + const CommunityModel({ + required this.uuid, + required this.name, + required this.spaces, + }); + + factory CommunityModel.fromJson(Map json) { + return CommunityModel( + uuid: json['uuid'] as String, + name: json['name'] as String, + spaces: (json['spaces'] as List) + .map((e) => SpaceModel.fromJson(e as Map)) + .toList(), + ); + } + + @override + List get props => [uuid, name, spaces]; +} diff --git a/lib/pages/space_management_v2/modules/communities/domain/models/space_model.dart b/lib/pages/space_management_v2/modules/communities/domain/models/space_model.dart new file mode 100644 index 00000000..0f8aadb2 --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/domain/models/space_model.dart @@ -0,0 +1,30 @@ +import 'package:equatable/equatable.dart'; + +class SpaceModel extends Equatable { + final String uuid; + final String spaceName; + final String icon; + final List children; + + const SpaceModel({ + required this.uuid, + required this.spaceName, + required this.icon, + required this.children, + }); + + factory SpaceModel.fromJson(Map json) { + return SpaceModel( + uuid: json['uuid'] as String, + spaceName: json['spaceName'] as String, + icon: json['icon'] as String, + children: (json['children'] as List?) + ?.map((e) => SpaceModel.fromJson(e as Map)) + .toList() ?? + [], + ); + } + + @override + List get props => [uuid, spaceName, icon, children]; +} diff --git a/lib/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart b/lib/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart new file mode 100644 index 00000000..9bdc215c --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart @@ -0,0 +1,3 @@ +class LoadCommunitiesParam { + const LoadCommunitiesParam(); +} diff --git a/lib/pages/space_management_v2/modules/communities/domain/services/communities_service.dart b/lib/pages/space_management_v2/modules/communities/domain/services/communities_service.dart new file mode 100644 index 00000000..bccad2ad --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/domain/services/communities_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/communities/domain/params/load_communities_param.dart'; + +abstract class CommunitiesService { + Future> getCommunity(LoadCommunitiesParam param); +} diff --git a/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart new file mode 100644 index 00000000..dd556f21 --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart @@ -0,0 +1,35 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.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/communities/domain/params/load_communities_param.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/services/communities_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; + +part 'communities_event.dart'; +part 'communities_state.dart'; + +class CommunitiesBloc extends Bloc { + final CommunitiesService _communitiesService; + + CommunitiesBloc({ + required CommunitiesService communitiesService, + }) : _communitiesService = communitiesService, + super(CommunitiesInitial()) { + on(_onGetCommunity); + } + + Future _onGetCommunity( + LoadCommunities event, + Emitter emit, + ) async { + try { + emit(CommunitiesLoading()); + final communities = await _communitiesService.getCommunity(event.param); + emit(CommunitiesLoaded(communities)); + } on APIException catch (e) { + emit(CommunitiesFailure(e.message)); + } catch (e) { + emit(CommunitiesFailure(e.toString())); + } + } +} diff --git a/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_event.dart b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_event.dart new file mode 100644 index 00000000..ef375c5a --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_event.dart @@ -0,0 +1,17 @@ +part of 'communities_bloc.dart'; + +sealed class CommunitiesEvent extends Equatable { + const CommunitiesEvent(); + + @override + List get props => []; +} + +class LoadCommunities extends CommunitiesEvent { + const LoadCommunities(this.param); + + final LoadCommunitiesParam param; + + @override + List get props => [param]; +} diff --git a/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_state.dart b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_state.dart new file mode 100644 index 00000000..910c87e1 --- /dev/null +++ b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_state.dart @@ -0,0 +1,30 @@ +part of 'communities_bloc.dart'; + +sealed class CommunitiesState extends Equatable { + const CommunitiesState(); + + @override + List get props => []; +} + +final class CommunitiesInitial extends CommunitiesState {} + +final class CommunitiesLoading extends CommunitiesState {} + +final class CommunitiesLoaded extends CommunitiesState { + final List communities; + + const CommunitiesLoaded(this.communities); + + @override + List get props => [communities]; +} + +final class CommunitiesFailure extends CommunitiesState { + final String message; + + const CommunitiesFailure(this.message); + + @override + List get props => [message]; +}