diff --git a/lib/pages/spaces_management/all_spaces/widgets/sidebar_widget.dart b/lib/pages/spaces_management/all_spaces/widgets/sidebar_widget.dart index 6dc8ae9c..374f0a0a 100644 --- a/lib/pages/spaces_management/all_spaces/widgets/sidebar_widget.dart +++ b/lib/pages/spaces_management/all_spaces/widgets/sidebar_widget.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/common/widgets/empty_search_result_widget.dart'; import 'package:syncrow_web/common/widgets/search_bar.dart'; import 'package:syncrow_web/common/widgets/sidebar_communities_list.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_event.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; @@ -15,6 +16,8 @@ import 'package:syncrow_web/pages/spaces_management/structure_selector/bloc/cent import 'package:syncrow_web/pages/spaces_management/structure_selector/bloc/center_body_event.dart'; import 'package:syncrow_web/utils/style.dart'; +import '../../../space_tree/bloc/space_tree_event.dart'; + class SidebarWidget extends StatefulWidget { final List communities; final String? selectedSpaceUuid; @@ -40,13 +43,31 @@ class _SidebarWidgetState extends State { @override void initState() { - _selectedId = widget.selectedSpaceUuid; _scrollController = ScrollController(); + _scrollController.addListener(_onScroll); + _selectedId = widget.selectedSpaceUuid; super.initState(); } + void _onScroll() { + if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 100) { + // Trigger pagination event + final bloc = context.read(); + if (!bloc.state.paginationIsLoading && bloc.state.paginationModel?.hasNext == true) { + bloc.add( + PaginationEvent( + bloc.state.paginationModel!, + bloc.state.communityList, + ), + ); + } + } + } + @override void dispose() { + _scrollController.removeListener(_onScroll); + _scrollController.dispose(); super.dispose(); } @@ -59,38 +80,6 @@ class _SidebarWidgetState extends State { super.didUpdateWidget(oldWidget); } - List _filteredCommunities() { - if (_searchQuery.isEmpty) { - _selectedSpaceUuid = null; - return widget.communities; - } - - return widget.communities.where((community) { - final containsQueryInCommunity = - community.name.toLowerCase().contains(_searchQuery.toLowerCase()); - final containsQueryInSpaces = community.spaces.any((space) => - _containsQuery(space: space, query: _searchQuery.toLowerCase())); - - return containsQueryInCommunity || containsQueryInSpaces; - }).toList(); - } - - bool _containsQuery({ - required SpaceModel space, - required String query, - }) { - final matchesSpace = space.name.toLowerCase().contains(query); - final matchesChildren = space.children.any( - (child) => _containsQuery(space: child, query: query), - ); - - if (matchesSpace || matchesChildren) { - _selectedSpaceUuid = space.uuid; - } - - return matchesSpace || matchesChildren; - } - bool _isSpaceOrChildSelected(SpaceModel space) { final isSpaceSelected = _selectedSpaceUuid == space.uuid; final anySubSpaceIsSelected = space.children.any(_isSpaceOrChildSelected); @@ -101,7 +90,10 @@ class _SidebarWidgetState extends State { @override Widget build(BuildContext context) { - final filteredCommunities = _filteredCommunities(); + final spaceTreeState = context.watch().state; + final filteredCommunities = spaceTreeState.isSearching + ? spaceTreeState.filteredCommunity + : spaceTreeState.communityList; return Container( width: _width, @@ -112,7 +104,13 @@ class _SidebarWidgetState extends State { children: [ SidebarHeader(onAddCommunity: _onAddCommunity), CustomSearchBar( - onSearchChanged: (query) => setState(() => _searchQuery = query), + onSearchChanged: (query) { + setState(() { + _searchQuery = query; + }); + + context.read().add(SearchQueryEvent(query)); + }, ), const SizedBox(height: 16), Expanded( @@ -120,14 +118,18 @@ class _SidebarWidgetState extends State { visible: filteredCommunities.isNotEmpty, replacement: const EmptySearchResultWidget(), child: SidebarCommunitiesList( - scrollController: _scrollController, - onScrollToEnd: () {}, - communities: filteredCommunities, - itemBuilder: (context, index) => _buildCommunityTile( - context, - filteredCommunities[index], - ), - ), + scrollController: _scrollController, + onScrollToEnd: () {}, + communities: filteredCommunities, + itemBuilder: (context, index) { + if (index == filteredCommunities.length) { + return const Padding( + padding: EdgeInsets.all(8.0), + child: Center(child: CircularProgressIndicator()), + ); + } + return _buildCommunityTile(context, filteredCommunities[index]); + }), ), ), ], @@ -205,9 +207,8 @@ class _SidebarWidgetState extends State { ); } - void _onAddCommunity() => _selectedId?.isNotEmpty ?? true - ? _clearSelection() - : _showCreateCommunityDialog(); + void _onAddCommunity() => + _selectedId?.isNotEmpty ?? true ? _clearSelection() : _showCreateCommunityDialog(); void _clearSelection() { setState(() => _selectedId = '');