bloc and separation of widgets

This commit is contained in:
hannathkadher
2024-10-08 13:44:55 +04:00
parent 081d6fd65f
commit 062daa6c77
10 changed files with 135 additions and 119 deletions

View File

@ -1,62 +1,57 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.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/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 class SpaceManagementBloc
abstract class SpaceEvent extends Equatable { extends Bloc<SpaceManagementEvent, SpaceManagementState> {
@override final CommunitySpaceManagementApi _api;
List<Object> get props => [];
}
class LoadSpaces extends SpaceEvent {} SpaceManagementBloc(this._api) : super(SpaceManagementInitial()) {
on<LoadCommunityAndSpacesEvent>(_onLoadCommunityAndSpaces);
on<CreateSpaceEvent>(_onCreateSpace);
on<UpdateSpacePositionEvent>(_onUpdateSpacePosition);
}
class SelectSpace extends SpaceEvent { void _onLoadCommunityAndSpaces(
final String selectedSpace; LoadCommunityAndSpacesEvent event,
Emitter<SpaceManagementState> emit,
SelectSpace(this.selectedSpace); ) async {
emit(SpaceManagementLoading());
try {
// Fetch all communities
List<CommunityModel> communities = await _api.fetchCommunities();
@override Map<String, List<SpaceModel>> communitySpaces = {};
List<Object> get props => [selectedSpace];
}
// States for (CommunityModel community in communities) {
abstract class SpaceState extends Equatable { // Fetch spaces hierarchy for each community
@override List<SpaceModel> spaces = await _api.getSpaceHierarchy(community.uuid);
List<Object> get props => []; community.spaces = spaces;
} communitySpaces[community.uuid] = spaces;
class SpaceInitial extends SpaceState {}
class SpaceLoaded extends SpaceState {
final List<SpaceModel> spaces;
final String selectedSpace;
SpaceLoaded({required this.spaces, required this.selectedSpace});
@override
List<Object> get props => [spaces, selectedSpace];
}
// Bloc
class SpacesManagementBloc extends Bloc<SpaceEvent, SpaceState> {
SpacesManagementBloc() : super(SpaceInitial()) {
on<LoadSpaces>((event, emit) {
final List<SpaceModel> 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<SelectSpace>((event, emit) {
if (state is SpaceLoaded) {
final loadedState = state as SpaceLoaded;
emit(SpaceLoaded(spaces: loadedState.spaces, selectedSpace: event.selectedSpace));
} }
});
emit(SpaceManagementLoaded(communitySpaces: communitySpaces));
} catch (e) {
emit(SpaceManagementError('Error loading communities and spaces: $e'));
}
}
void _onCreateSpace(
CreateSpaceEvent event,
Emitter<SpaceManagementState> emit,
) {
// Handle space creation logic
// You can emit a new state here based on your needs
emit(SpaceCreationSuccess());
}
void _onUpdateSpacePosition(
UpdateSpacePositionEvent event,
Emitter<SpaceManagementState> emit,
) {
// Handle space position update logic
} }
} }

View File

@ -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<Object> 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<Object> 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<Object> get props => [index, newPosition];
}

View File

@ -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<Object> get props => [];
}
class SpaceManagementInitial extends SpaceManagementState {}
class SpaceManagementLoading extends SpaceManagementState {}
class SpaceManagementLoaded extends SpaceManagementState {
final Map<String, List<SpaceModel>> communitySpaces;
const SpaceManagementLoaded({required this.communitySpaces});
@override
List<Object> get props => [communitySpaces];
}
class SpaceCreationSuccess extends SpaceManagementState {}
class SpaceManagementError extends SpaceManagementState {
final String errorMessage;
const SpaceManagementError(this.errorMessage);
@override
List<Object> get props => [errorMessage];
}

View File

@ -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<Object> get props => [];
}
class UserInitial extends UserState {}
class UserLoaded extends UserState {
final List<String> users;
final String selectedUser;
UserLoaded({required this.users, required this.selectedUser});
@override
List<Object> get props => [users, selectedUser];
}
abstract class UserEvent extends Equatable {
@override
List<Object> get props => [];
}
class LoadUsers extends UserEvent {
@override
List<Object> get props => [];
}
class SelectUser extends UserEvent {
final String selectedUser;
SelectUser(this.selectedUser);
@override
List<Object> get props => [selectedUser];
}
class UserManagementBloc extends Bloc<UserEvent, UserState> {
UserManagementBloc() : super(UserInitial()) {
on<LoadUsers>((event, emit) {
// Dummy list of users
final List<String> users = [];
// Emit the UserLoaded state with the dummy users
emit(UserLoaded(users: users, selectedUser: users[0]));
});
on<SelectUser>((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));
}
});
}
}

View File

@ -3,7 +3,7 @@ import 'package:flutter_svg/svg.dart';
import 'package:syncrow_web/common/custom_expansion_tile.dart'; import 'package:syncrow_web/common/custom_expansion_tile.dart';
import 'package:syncrow_web/common/search_bar.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/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/pages/spaces_management/view/dialogs/create_community_dialog.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/assets.dart';
@ -103,6 +103,8 @@ class _SidebarWidgetState extends State<SidebarWidget> {
width: 300, width: 300,
decoration: subSectionContainerDecoration, decoration: subSectionContainerDecoration,
child: Column( child: Column(
mainAxisSize:
MainAxisSize.min, // Ensures the Column only takes necessary height
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
// Communities title with the add button // Communities title with the add button
@ -117,9 +119,7 @@ class _SidebarWidgetState extends State<SidebarWidget> {
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
GestureDetector( GestureDetector(
onTap: () { onTap: _showCreateCommunityDialog,
_showCreateCommunityDialog();
},
child: Container( child: Container(
width: 30, width: 30,
height: 30, height: 30,
@ -143,13 +143,15 @@ class _SidebarWidgetState extends State<SidebarWidget> {
CustomSearchBar( CustomSearchBar(
onSearchChanged: (query) { onSearchChanged: (query) {
setState(() { setState(() {
_searchQuery = query; // Update search query on text change _searchQuery = query;
}); });
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
// Community list with one item expanded at a time // Community list
Expanded( Flexible(
fit: FlexFit
.loose, // Ensure the ListView can flex but doesn't expand indefinitely
child: ListView( child: ListView(
children: filteredCommunities.keys.map((communityName) { children: filteredCommunities.keys.map((communityName) {
return _buildCommunityTile( return _buildCommunityTile(