mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
bloc and separation of widgets
This commit is contained in:
@ -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<Object> get props => [];
|
||||
}
|
||||
class SpaceManagementBloc
|
||||
extends Bloc<SpaceManagementEvent, SpaceManagementState> {
|
||||
final CommunitySpaceManagementApi _api;
|
||||
|
||||
class LoadSpaces extends SpaceEvent {}
|
||||
|
||||
class SelectSpace extends SpaceEvent {
|
||||
final String selectedSpace;
|
||||
|
||||
SelectSpace(this.selectedSpace);
|
||||
|
||||
@override
|
||||
List<Object> get props => [selectedSpace];
|
||||
}
|
||||
|
||||
// States
|
||||
abstract class SpaceState extends Equatable {
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
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));
|
||||
SpaceManagementBloc(this._api) : super(SpaceManagementInitial()) {
|
||||
on<LoadCommunityAndSpacesEvent>(_onLoadCommunityAndSpaces);
|
||||
on<CreateSpaceEvent>(_onCreateSpace);
|
||||
on<UpdateSpacePositionEvent>(_onUpdateSpacePosition);
|
||||
}
|
||||
});
|
||||
|
||||
void _onLoadCommunityAndSpaces(
|
||||
LoadCommunityAndSpacesEvent event,
|
||||
Emitter<SpaceManagementState> emit,
|
||||
) async {
|
||||
emit(SpaceManagementLoading());
|
||||
try {
|
||||
// Fetch all communities
|
||||
List<CommunityModel> communities = await _api.fetchCommunities();
|
||||
|
||||
Map<String, List<SpaceModel>> communitySpaces = {};
|
||||
|
||||
for (CommunityModel community in communities) {
|
||||
// Fetch spaces hierarchy for each community
|
||||
List<SpaceModel> 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<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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
46
lib/pages/spaces_management/bloc/space_management_event.dart
Normal file
46
lib/pages/spaces_management/bloc/space_management_event.dart
Normal 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];
|
||||
}
|
33
lib/pages/spaces_management/bloc/space_management_state.dart
Normal file
33
lib/pages/spaces_management/bloc/space_management_state.dart
Normal 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];
|
||||
}
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -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<SidebarWidget> {
|
||||
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<SidebarWidget> {
|
||||
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<SidebarWidget> {
|
||||
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(
|
Reference in New Issue
Block a user