diff --git a/lib/pages/spaces_management/all_spaces/widgets/sidebar_add_community_button.dart b/lib/pages/spaces_management/all_spaces/widgets/sidebar_add_community_button.dart new file mode 100644 index 00000000..2f434350 --- /dev/null +++ b/lib/pages/spaces_management/all_spaces/widgets/sidebar_add_community_button.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; + +class SidebarAddCommunityButton extends StatelessWidget { + const SidebarAddCommunityButton({super.key}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _navigateToBlank(context), + child: Container( + width: 30, + height: 30, + decoration: const BoxDecoration( + color: ColorsManager.whiteColors, + shape: BoxShape.circle, + ), + child: Center( + child: SvgPicture.asset( + Assets.roundedAddIcon, + width: 24, + height: 24, + ), + ), + ), + ); + } + + void _navigateToBlank(BuildContext context) {} +} diff --git a/lib/pages/spaces_management/all_spaces/widgets/sidebar_header.dart b/lib/pages/spaces_management/all_spaces/widgets/sidebar_header.dart new file mode 100644 index 00000000..1e386d4f --- /dev/null +++ b/lib/pages/spaces_management/all_spaces/widgets/sidebar_header.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/spaces_management/all_spaces/widgets/sidebar_add_community_button.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; +import 'package:syncrow_web/utils/style.dart'; + +class SidebarHeader extends StatelessWidget { + const SidebarHeader({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: subSectionContainerDecoration, + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Communities', + style: context.textTheme.titleMedium?.copyWith( + color: ColorsManager.blackColor, + ), + ), + const SidebarAddCommunityButton(), + ], + ), + ); + } +} 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 1e6b2bf5..a98dead8 100644 --- a/lib/pages/spaces_management/all_spaces/widgets/sidebar_widget.dart +++ b/lib/pages/spaces_management/all_spaces/widgets/sidebar_widget.dart @@ -1,18 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:syncrow_web/common/widgets/search_bar.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'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/widgets/community_tile.dart'; +import 'package:syncrow_web/pages/spaces_management/all_spaces/widgets/sidebar_header.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/widgets/space_tile_widget.dart'; import 'package:syncrow_web/pages/spaces_management/structure_selector/bloc/center_body_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/structure_selector/bloc/center_body_event.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/constants/assets.dart'; -import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/style.dart'; class SidebarWidget extends StatefulWidget { @@ -20,9 +17,9 @@ class SidebarWidget extends StatefulWidget { final String? selectedSpaceUuid; const SidebarWidget({ - super.key, required this.communities, this.selectedSpaceUuid, + super.key, }); @override @@ -36,21 +33,19 @@ class _SidebarWidgetState extends State { @override void initState() { - super.initState(); _selectedId = widget.selectedSpaceUuid; + super.initState(); } @override void didUpdateWidget(covariant SidebarWidget oldWidget) { - super.didUpdateWidget(oldWidget); if (widget.selectedSpaceUuid != oldWidget.selectedSpaceUuid) { - setState(() { - _selectedId = widget.selectedSpaceUuid; - }); + setState(() => _selectedId = widget.selectedSpaceUuid); } + super.didUpdateWidget(oldWidget); } - List _filterCommunities() { + List _filteredCommunities() { if (_searchQuery.isEmpty) { _selectedSpaceUuid = null; return widget.communities; @@ -59,17 +54,20 @@ class _SidebarWidgetState extends State { return widget.communities.where((community) { final containsQueryInCommunity = community.name.toLowerCase().contains(_searchQuery.toLowerCase()); - final containsQueryInSpaces = community.spaces - .any((space) => _containsQuery(space, _searchQuery.toLowerCase())); + final containsQueryInSpaces = community.spaces.any((space) => + _containsQuery(space: space, query: _searchQuery.toLowerCase())); return containsQueryInCommunity || containsQueryInSpaces; }).toList(); } - bool _containsQuery(SpaceModel space, String query) { + bool _containsQuery({ + required SpaceModel space, + required String query, + }) { final matchesSpace = space.name.toLowerCase().contains(query); final matchesChildren = space.children.any( - (child) => _containsQuery(child, query), + (child) => _containsQuery(space: child, query: query), ); if (matchesSpace || matchesChildren) { @@ -95,7 +93,7 @@ class _SidebarWidgetState extends State { @override Widget build(BuildContext context) { - final filteredCommunities = _filterCommunities(); + final filteredCommunities = _filteredCommunities(); return Container( width: 300, @@ -104,39 +102,7 @@ class _SidebarWidgetState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - decoration: subSectionContainerDecoration, - padding: const EdgeInsets.all(16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Communities', - style: context.textTheme.titleMedium?.copyWith( - color: ColorsManager.blackColor, - ), - ), - GestureDetector( - onTap: () => _navigateToBlank(context), - child: Container( - width: 30, - height: 30, - decoration: const BoxDecoration( - color: ColorsManager.whiteColors, - shape: BoxShape.circle, - ), - child: Center( - child: SvgPicture.asset( - Assets.roundedAddIcon, - width: 24, - height: 24, - ), - ), - ), - ), - ], - ), - ), + const SidebarHeader(), CustomSearchBar( onSearchChanged: (query) => setState(() => _searchQuery = query), ), @@ -153,15 +119,8 @@ class _SidebarWidgetState extends State { ); } - void _navigateToBlank(BuildContext context) { - setState(() => _selectedId = ''); - context.read().add( - NewCommunityEvent(communities: widget.communities), - ); - } - Widget _buildCommunityTile(BuildContext context, CommunityModel community) { - bool hasChildren = community.spaces.isNotEmpty; + final hasChildren = community.spaces.isNotEmpty; return CommunityTile( title: community.name, @@ -197,12 +156,11 @@ class _SidebarWidgetState extends State { Widget _buildSpaceTile({ required SpaceModel space, required CommunityModel community, - int depth = 1, }) { - bool spaceIsExpanded = _isSpaceOrChildSelected(space); + final spaceIsExpanded = _isSpaceOrChildSelected(space); final isSelected = _selectedId == space.uuid; return Padding( - padding: EdgeInsets.only(left: depth * 16.0), + padding: const EdgeInsetsDirectional.only(start: 16.0), child: SpaceTile( title: space.name, key: ValueKey(space.uuid),