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: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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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/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(
|
Reference in New Issue
Block a user