diff --git a/lib/pages/spaces_management/widgets/blank_community_widget.dart b/lib/pages/spaces_management/widgets/blank_community_widget.dart index e8ad4ddb..6b97c956 100644 --- a/lib/pages/spaces_management/widgets/blank_community_widget.dart +++ b/lib/pages/spaces_management/widgets/blank_community_widget.dart @@ -2,12 +2,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/bloc/space_management_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/bloc/space_management_event.dart'; +import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/widgets/dialogs/create_community_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; -class BlankCommunityWidget extends StatelessWidget { - const BlankCommunityWidget({Key? key}) : super(key: key); +class BlankCommunityWidget extends StatefulWidget { + final List communities; + BlankCommunityWidget({required this.communities}); + + @override + _BlankCommunityWidgetState createState() => _BlankCommunityWidgetState(); +} + +class _BlankCommunityWidgetState extends State { @override Widget build(BuildContext context) { return Expanded( @@ -17,11 +25,10 @@ class BlankCommunityWidget extends StatelessWidget { child: GridView.builder( padding: const EdgeInsets.only(left: 40.0, top: 20.0), gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 400, // Each item's width will be 400 or less - mainAxisSpacing: 10, // Spacing between items - crossAxisSpacing: 10, // Spacing between items - childAspectRatio: - 2.0, // Aspect ratio for width:height (e.g., 300:150 = 2.0) + maxCrossAxisExtent: 400, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + childAspectRatio: 2.0, ), itemCount: 1, // Only one item itemBuilder: (context, index) { @@ -48,9 +55,8 @@ class BlankCommunityWidget extends StatelessWidget { ), ), ), - - const SizedBox(height: 9), // Space between item and text - Text('Blank', // Text below the item + const SizedBox(height: 9), + Text('Blank', style: Theme.of(context).textTheme.bodyLarge?.copyWith( color: ColorsManager.blackColor, )), @@ -66,6 +72,7 @@ class BlankCommunityWidget extends StatelessWidget { showDialog( context: parentContext, builder: (context) => CreateCommunityDialog( + communities: widget.communities, onCreateCommunity: (String communityName, String description) { parentContext.read().add( CreateCommunityEvent( diff --git a/lib/pages/spaces_management/widgets/community_structure_widget.dart b/lib/pages/spaces_management/widgets/community_structure_widget.dart index eedde30e..c8d7c8d7 100644 --- a/lib/pages/spaces_management/widgets/community_structure_widget.dart +++ b/lib/pages/spaces_management/widgets/community_structure_widget.dart @@ -24,12 +24,13 @@ class CommunityStructureArea extends StatefulWidget { SpaceModel? selectedSpace; final List? products; final ValueChanged? onSpaceSelected; - + final List communities; final List spaces; CommunityStructureArea({ this.selectedCommunity, this.selectedSpace, + required this.communities, this.products, required this.spaces, this.onSpaceSelected, @@ -97,7 +98,9 @@ class _CommunityStructureAreaState extends State { @override Widget build(BuildContext context) { if (widget.selectedCommunity == null) { - return BlankCommunityWidget(); + return BlankCommunityWidget( + communities: widget.communities, + ); } Size screenSize = MediaQuery.of(context).size; diff --git a/lib/pages/spaces_management/widgets/dialogs/create_community_dialog.dart b/lib/pages/spaces_management/widgets/dialogs/create_community_dialog.dart index 135ada3b..a29e6c9d 100644 --- a/lib/pages/spaces_management/widgets/dialogs/create_community_dialog.dart +++ b/lib/pages/spaces_management/widgets/dialogs/create_community_dialog.dart @@ -1,37 +1,46 @@ import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/common/buttons/cancel_button.dart'; +import 'package:syncrow_web/pages/common/buttons/default_button.dart'; +import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; import 'package:syncrow_web/utils/color_manager.dart'; class CreateCommunityDialog extends StatefulWidget { final Function(String name, String description) onCreateCommunity; + final List communities; - const CreateCommunityDialog({super.key, required this.onCreateCommunity}); + const CreateCommunityDialog( + {super.key, required this.onCreateCommunity, required this.communities}); @override CreateCommunityDialogState createState() => CreateCommunityDialogState(); } class CreateCommunityDialogState extends State { - String enteredName = ''; // Store the entered community name + String enteredName = ''; + bool isNameFieldExist = false; @override Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), - backgroundColor: Colors.transparent, // Transparent for shadow effect + backgroundColor: + ColorsManager.transparentColor, // Transparent for shadow effect child: Stack( children: [ // Background container with shadow and rounded corners Container( - width: 490, + width: screenWidth * 0.3, padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white, + color: ColorsManager.whiteColors, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.25), + color: ColorsManager.blackColor.withOpacity(0.25), blurRadius: 20, spreadRadius: 5, offset: const Offset(0, 5), @@ -53,10 +62,15 @@ class CreateCommunityDialogState extends State { // Input field for the community name TextField( onChanged: (value) { - enteredName = value; // Capture entered name + setState(() { + enteredName = value.trim(); // Trim whitespace + isNameFieldExist = widget.communities.any( + (community) => community.name == enteredName, + ); + }); }, style: const TextStyle( - color: Colors.black, + color: ColorsManager.blackColor, ), decoration: InputDecoration( hintText: 'Please enter the community name', @@ -68,45 +82,51 @@ class CreateCommunityDialogState extends State { fontWeight: FontWeight.w400, ), border: OutlineInputBorder( - borderSide: const BorderSide(color: ColorsManager.boxColor, width: 1), + borderSide: const BorderSide( + color: ColorsManager.boxColor, width: 1), borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( - borderSide: const BorderSide(color: ColorsManager.boxColor, width: 1), + borderSide: const BorderSide( + color: ColorsManager.boxColor, width: 1), borderRadius: BorderRadius.circular(10), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), - borderSide: const BorderSide(color: ColorsManager.boxColor, width: 1), + borderSide: const BorderSide( + color: ColorsManager.boxColor, width: 1), ), ), ), + if (isNameFieldExist) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + '*Name already exists.', + style: Theme.of(context) + .textTheme + .bodySmall + ?.copyWith(color: ColorsManager.red), + ), + ), const SizedBox(height: 24), // Action buttons Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: TextButton( - onPressed: () => Navigator.of(context).pop(), - style: TextButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), - backgroundColor: ColorsManager.boxColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - child: const Text( - 'Cancel', - style: TextStyle(color: Colors.black), + child: Expanded( + child: CancelButton( + label: 'Cancel', + onPressed: () => Navigator.of(context).pop(), ), ), ), const SizedBox(width: 16), Expanded( - child: ElevatedButton( + child: DefaultButton( onPressed: () { - if (enteredName.isNotEmpty) { + if (enteredName.isNotEmpty && !isNameFieldExist) { widget.onCreateCommunity( enteredName, "", @@ -114,14 +134,11 @@ class CreateCommunityDialogState extends State { Navigator.of(context).pop(); } }, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), - backgroundColor: ColorsManager.secondaryColor, - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - ), + backgroundColor: isNameFieldExist || enteredName.isEmpty + ? ColorsManager.lightGrayColor + : ColorsManager.secondaryColor, + borderRadius: 10, + foregroundColor: ColorsManager.whiteColors, child: const Text('OK'), ), ), diff --git a/lib/pages/spaces_management/widgets/loaded_space_widget.dart b/lib/pages/spaces_management/widgets/loaded_space_widget.dart index ef3cf3be..6b149701 100644 --- a/lib/pages/spaces_management/widgets/loaded_space_widget.dart +++ b/lib/pages/spaces_management/widgets/loaded_space_widget.dart @@ -43,6 +43,7 @@ class _LoadedStateViewState extends State { selectedSpace: widget.selectedSpace, spaces: widget.selectedCommunity?.spaces ?? [], products: widget.products, + communities: widget.communities, ), ], ), diff --git a/lib/pages/spaces_management/widgets/sidebar_widget.dart b/lib/pages/spaces_management/widgets/sidebar_widget.dart index efa33b48..9dd61501 100644 --- a/lib/pages/spaces_management/widgets/sidebar_widget.dart +++ b/lib/pages/spaces_management/widgets/sidebar_widget.dart @@ -49,22 +49,6 @@ class _SidebarWidgetState extends State { } } - void _showCreateCommunityDialog(BuildContext parentContext) { - showDialog( - context: parentContext, - builder: (context) => CreateCommunityDialog( - onCreateCommunity: (String communityName, String description) { - parentContext.read().add( - CreateCommunityEvent( - name: communityName, - description: description, - ), - ); - }, - ), - ); - } - // Function to filter communities based on the search query List _filterCommunities() { if (_searchQuery.isEmpty) {