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 StatefulWidget { final Function onSelect; const SpaceTreeView({required this.onSelect, super.key}); @override State createState() => _SpaceTreeViewState(); } class _SpaceTreeViewState extends State { final ScrollController _scrollController = ScrollController(); @override void dispose() { _scrollController.dispose(); super.dispose(); } @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, child: state is SpaceTreeLoadingState ? const Center(child: CircularProgressIndicator()) : Column( children: [ CustomSearchBar( searchQuery: state.searchQuery, onSearchChanged: (query) { context.read().add(SearchQueryEvent(query)); }, ), const SizedBox(height: 16), Expanded( child: ListView( shrinkWrap: true, scrollDirection: Axis.horizontal, children: [ Container( width: MediaQuery.sizeOf(context).width * 0.5, 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, fontWeight: FontWeight.w400, ), ), ) : Scrollbar( scrollbarOrientation: ScrollbarOrientation.left, thumbVisibility: true, controller: _scrollController, child: Padding( padding: const EdgeInsets.only(left: 16), child: ListView( controller: _scrollController, 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)); widget.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)); widget.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(), ), ), ), ), ], ), ), // 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)); widget.onSelect(); }, onExpansionChanged: () { context.read().add(OnSpaceExpanded(communityId, child.uuid ?? '')); }, children: _buildNestedSpaces(context, state, child, communityId), ); }).toList(); } }