diff --git a/lib/pages/spaces_management/bloc/space_management_bloc.dart b/lib/pages/spaces_management/bloc/space_management_bloc.dart index 678ba96d..dc2829c5 100644 --- a/lib/pages/spaces_management/bloc/space_management_bloc.dart +++ b/lib/pages/spaces_management/bloc/space_management_bloc.dart @@ -1,62 +1,57 @@ -import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - +import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/space_model.dart'; +import 'package:syncrow_web/pages/spaces_management/bloc/space_management_event.dart'; +import 'package:syncrow_web/pages/spaces_management/bloc/space_management_state.dart'; +import 'package:syncrow_web/services/space_mana_api.dart'; -// Events -abstract class SpaceEvent extends Equatable { - @override - List get props => []; -} +class SpaceManagementBloc + extends Bloc { + final CommunitySpaceManagementApi _api; -class LoadSpaces extends SpaceEvent {} + SpaceManagementBloc(this._api) : super(SpaceManagementInitial()) { + on(_onLoadCommunityAndSpaces); + on(_onCreateSpace); + on(_onUpdateSpacePosition); + } -class SelectSpace extends SpaceEvent { - final String selectedSpace; - - SelectSpace(this.selectedSpace); + void _onLoadCommunityAndSpaces( + LoadCommunityAndSpacesEvent event, + Emitter emit, + ) async { + emit(SpaceManagementLoading()); + try { + // Fetch all communities + List communities = await _api.fetchCommunities(); - @override - List get props => [selectedSpace]; -} + Map> communitySpaces = {}; -// States -abstract class SpaceState extends Equatable { - @override - List get props => []; -} - -class SpaceInitial extends SpaceState {} - -class SpaceLoaded extends SpaceState { - final List spaces; - final String selectedSpace; - - SpaceLoaded({required this.spaces, required this.selectedSpace}); - - @override - List get props => [spaces, selectedSpace]; -} - -// Bloc -class SpacesManagementBloc extends Bloc { - SpacesManagementBloc() : super(SpaceInitial()) { - on((event, emit) { - final List spaces = [ - SpaceModel(communityName: 'Downtown Dubai', subSpaces: ['Sub Space 1', 'Sub Space 2']), - SpaceModel(communityName: 'Dubai Creek Harbour', subSpaces: ['Sub Space 1', 'Sub Space 2']), - SpaceModel(communityName: 'Dubai Hills Estate', subSpaces: ['Sub Space 1', 'Sub Space 2']), - ]; - emit(SpaceLoaded(spaces: spaces, selectedSpace: spaces[0].communityName)); - }); - - on((event, emit) { - if (state is SpaceLoaded) { - final loadedState = state as SpaceLoaded; - emit(SpaceLoaded(spaces: loadedState.spaces, selectedSpace: event.selectedSpace)); + for (CommunityModel community in communities) { + // Fetch spaces hierarchy for each community + List spaces = await _api.getSpaceHierarchy(community.uuid); + community.spaces = spaces; + communitySpaces[community.uuid] = spaces; } - }); + + emit(SpaceManagementLoaded(communitySpaces: communitySpaces)); + } catch (e) { + emit(SpaceManagementError('Error loading communities and spaces: $e')); + } + } + + void _onCreateSpace( + CreateSpaceEvent event, + Emitter emit, + ) { + // Handle space creation logic + // You can emit a new state here based on your needs + emit(SpaceCreationSuccess()); + } + + void _onUpdateSpacePosition( + UpdateSpacePositionEvent event, + Emitter emit, + ) { + // Handle space position update logic } } - - diff --git a/lib/pages/spaces_management/bloc/space_management_event.dart b/lib/pages/spaces_management/bloc/space_management_event.dart new file mode 100644 index 00000000..048cc1ce --- /dev/null +++ b/lib/pages/spaces_management/bloc/space_management_event.dart @@ -0,0 +1,46 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; // Import for Offset + +abstract class SpaceManagementEvent extends Equatable { + const SpaceManagementEvent(); + + @override + List get props => []; +} + +class LoadCommunityAndSpacesEvent extends SpaceManagementEvent {} + +class CreateSpaceEvent extends SpaceManagementEvent { + final String name; + final String icon; + final Offset position; + final int? parentIndex; + final String? direction; + + CreateSpaceEvent({ + required this.name, + required this.icon, + required this.position, + this.parentIndex, + this.direction, + }); + + @override + List get props => [ + name, + icon, + position, + parentIndex ?? -1, // Use a fallback value if nullable + direction ?? '', // Use a fallback value if nullable + ]; +} + +class UpdateSpacePositionEvent extends SpaceManagementEvent { + final int index; + final Offset newPosition; + + UpdateSpacePositionEvent(this.index, this.newPosition); + + @override + List get props => [index, newPosition]; +} diff --git a/lib/pages/spaces_management/bloc/space_management_state.dart b/lib/pages/spaces_management/bloc/space_management_state.dart new file mode 100644 index 00000000..e1088cfc --- /dev/null +++ b/lib/pages/spaces_management/bloc/space_management_state.dart @@ -0,0 +1,33 @@ +import 'package:equatable/equatable.dart'; +import 'package:syncrow_web/pages/spaces_management/model/space_model.dart'; + +abstract class SpaceManagementState extends Equatable { + const SpaceManagementState(); + + @override + List get props => []; +} + +class SpaceManagementInitial extends SpaceManagementState {} + +class SpaceManagementLoading extends SpaceManagementState {} + +class SpaceManagementLoaded extends SpaceManagementState { + final Map> communitySpaces; + + const SpaceManagementLoaded({required this.communitySpaces}); + + @override + List get props => [communitySpaces]; +} + +class SpaceCreationSuccess extends SpaceManagementState {} + +class SpaceManagementError extends SpaceManagementState { + final String errorMessage; + + const SpaceManagementError(this.errorMessage); + + @override + List get props => [errorMessage]; +} diff --git a/lib/pages/spaces_management/bloc/test_bloc.dart b/lib/pages/spaces_management/bloc/test_bloc.dart deleted file mode 100644 index 0b4dbe9d..00000000 --- a/lib/pages/spaces_management/bloc/test_bloc.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -// Define User States -abstract class UserState extends Equatable { - @override - List get props => []; -} - -class UserInitial extends UserState {} - -class UserLoaded extends UserState { - final List users; - final String selectedUser; - - UserLoaded({required this.users, required this.selectedUser}); - - @override - List get props => [users, selectedUser]; -} - -abstract class UserEvent extends Equatable { - @override - List get props => []; -} - -class LoadUsers extends UserEvent { - @override - List get props => []; -} - -class SelectUser extends UserEvent { - final String selectedUser; - - SelectUser(this.selectedUser); - - @override - List get props => [selectedUser]; -} - -class UserManagementBloc extends Bloc { - UserManagementBloc() : super(UserInitial()) { - on((event, emit) { - // Dummy list of users - final List users = []; - - // Emit the UserLoaded state with the dummy users - emit(UserLoaded(users: users, selectedUser: users[0])); - }); - - on((event, emit) { - // Handle user selection in the UserLoaded state - if (state is UserLoaded) { - final loadedState = state as UserLoaded; - emit(UserLoaded( - users: loadedState.users, selectedUser: event.selectedUser)); - } - }); - } -} diff --git a/lib/pages/spaces_management/view/community_tile.dart b/lib/pages/spaces_management/widgets/community_tile.dart similarity index 100% rename from lib/pages/spaces_management/view/community_tile.dart rename to lib/pages/spaces_management/widgets/community_tile.dart diff --git a/lib/pages/spaces_management/view/plus_button_widget.dart b/lib/pages/spaces_management/widgets/plus_button_widget.dart similarity index 100% rename from lib/pages/spaces_management/view/plus_button_widget.dart rename to lib/pages/spaces_management/widgets/plus_button_widget.dart diff --git a/lib/pages/spaces_management/view/sidebar_widget.dart b/lib/pages/spaces_management/widgets/sidebar_widget.dart similarity index 93% rename from lib/pages/spaces_management/view/sidebar_widget.dart rename to lib/pages/spaces_management/widgets/sidebar_widget.dart index 2056c148..68d811ff 100644 --- a/lib/pages/spaces_management/view/sidebar_widget.dart +++ b/lib/pages/spaces_management/widgets/sidebar_widget.dart @@ -3,7 +3,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:syncrow_web/common/custom_expansion_tile.dart'; import 'package:syncrow_web/common/search_bar.dart'; import 'package:syncrow_web/pages/spaces_management/model/space_model.dart'; -import 'package:syncrow_web/pages/spaces_management/view/community_tile.dart'; +import 'package:syncrow_web/pages/spaces_management/widgets/community_tile.dart'; import 'package:syncrow_web/pages/spaces_management/view/dialogs/create_community_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -103,6 +103,8 @@ class _SidebarWidgetState extends State { width: 300, decoration: subSectionContainerDecoration, child: Column( + mainAxisSize: + MainAxisSize.min, // Ensures the Column only takes necessary height crossAxisAlignment: CrossAxisAlignment.start, children: [ // Communities title with the add button @@ -117,9 +119,7 @@ class _SidebarWidgetState extends State { style: Theme.of(context).textTheme.titleMedium, ), GestureDetector( - onTap: () { - _showCreateCommunityDialog(); - }, + onTap: _showCreateCommunityDialog, child: Container( width: 30, height: 30, @@ -143,13 +143,15 @@ class _SidebarWidgetState extends State { CustomSearchBar( onSearchChanged: (query) { setState(() { - _searchQuery = query; // Update search query on text change + _searchQuery = query; }); }, ), const SizedBox(height: 16), - // Community list with one item expanded at a time - Expanded( + // Community list + Flexible( + fit: FlexFit + .loose, // Ensure the ListView can flex but doesn't expand indefinitely child: ListView( children: filteredCommunities.keys.map((communityName) { return _buildCommunityTile( diff --git a/lib/pages/spaces_management/view/space_card_widget.dart b/lib/pages/spaces_management/widgets/space_card_widget.dart similarity index 100% rename from lib/pages/spaces_management/view/space_card_widget.dart rename to lib/pages/spaces_management/widgets/space_card_widget.dart diff --git a/lib/pages/spaces_management/view/space_container_widget.dart b/lib/pages/spaces_management/widgets/space_container_widget.dart similarity index 100% rename from lib/pages/spaces_management/view/space_container_widget.dart rename to lib/pages/spaces_management/widgets/space_container_widget.dart diff --git a/lib/pages/spaces_management/view/space_widget.dart b/lib/pages/spaces_management/widgets/space_widget.dart similarity index 100% rename from lib/pages/spaces_management/view/space_widget.dart rename to lib/pages/spaces_management/widgets/space_widget.dart