import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/common/widgets/search_bar.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_state.dart'; import 'package:syncrow_web/pages/space_tree/view/custom_expansion.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/style.dart'; class SpaceTreeView extends StatelessWidget { final Function onSelect; const SpaceTreeView({required this.onSelect, super.key}); @override Widget build(BuildContext context) { return BlocBuilder(builder: (context, state) { List list = state.isSearching ? state.filteredCommunity : state.communityList; return Container( height: MediaQuery.sizeOf(context).height, decoration: subSectionContainerDecoration, // padding: const EdgeInsets.all(16.0), child: state is SpaceTreeLoadingState ? const Center(child: CircularProgressIndicator()) : Column( children: [ CustomSearchBar( onSearchChanged: (query) { context.read().add(SearchQueryEvent(query)); }, ), const SizedBox(height: 16), Expanded( child: Padding( padding: const EdgeInsets.all(8.0), child: list.isEmpty ? Center( child: Text( 'No results found', style: Theme.of(context).textTheme.bodySmall!.copyWith( color: ColorsManager.lightGrayColor, // Gray when not selected fontWeight: FontWeight.w400, ), ), ) : ListView( shrinkWrap: true, children: list .map( (community) => CustomExpansionTileSpaceTree( title: community.name, isSelected: state.selectedCommunities.contains(community.uuid), isSoldCheck: state.selectedCommunities.contains(community.uuid), onExpansionChanged: () { context .read() .add(OnCommunityExpanded(community.uuid)); }, isExpanded: state.expandedCommunities.contains(community.uuid), onItemSelected: () { context.read().add( OnCommunitySelected(community.uuid, community.spaces)); onSelect(); }, children: community.spaces.map((space) { return CustomExpansionTileSpaceTree( title: space.name, isExpanded: state.expandedSpaces.contains(space.uuid), onItemSelected: () { context.read().add(OnSpaceSelected( community.uuid, space.uuid ?? '', space.children)); onSelect(); }, onExpansionChanged: () { context.read().add( OnSpaceExpanded(community.uuid, space.uuid ?? '')); }, isSelected: state.selectedSpaces.contains(space.uuid) || state.soldCheck.contains(space.uuid), isSoldCheck: state.soldCheck.contains(space.uuid), children: _buildNestedSpaces( context, state, space, community.uuid), ); }).toList(), ), ) .toList(), ), ), ), ], ), ); }); } List _buildNestedSpaces( BuildContext context, SpaceTreeState state, SpaceModel space, String communityId) { return space.children.map((child) { return CustomExpansionTileSpaceTree( isSelected: state.selectedSpaces.contains(child.uuid) || state.soldCheck.contains(child.uuid), isSoldCheck: state.soldCheck.contains(child.uuid), title: child.name, isExpanded: state.expandedSpaces.contains(child.uuid), onItemSelected: () { context .read() .add(OnSpaceSelected(communityId, child.uuid ?? '', child.children)); onSelect(); }, onExpansionChanged: () { context.read().add(OnSpaceExpanded(communityId, child.uuid ?? '')); }, children: _buildNestedSpaces(context, state, child, communityId), ); }).toList(); } }