From 79b3d116ca6839729de362770a46b2f855fb1edf Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Wed, 27 Nov 2024 19:17:15 +0400 Subject: [PATCH] added internal id for mapping spaces internally --- .../bloc/space_management_bloc.dart | 1 - .../spaces_management/model/space_model.dart | 62 ++++++++++--------- .../view/spaces_management_page.dart | 6 -- .../widgets/community_structure_widget.dart | 19 +++--- 4 files changed, 45 insertions(+), 43 deletions(-) diff --git a/lib/pages/spaces_management/bloc/space_management_bloc.dart b/lib/pages/spaces_management/bloc/space_management_bloc.dart index eda95ee2..f178dd3a 100644 --- a/lib/pages/spaces_management/bloc/space_management_bloc.dart +++ b/lib/pages/spaces_management/bloc/space_management_bloc.dart @@ -86,7 +86,6 @@ class SpaceManagementBloc extends Bloc communities = await _api.fetchCommunities(); - // Use Future.wait to handle async calls within map List updatedCommunities = await Future.wait( communities.map((community) async { List spaces = await _api.getSpaceHierarchy(community.uuid); diff --git a/lib/pages/spaces_management/model/space_model.dart b/lib/pages/spaces_management/model/space_model.dart index e1594a4c..6efe19ec 100644 --- a/lib/pages/spaces_management/model/space_model.dart +++ b/lib/pages/spaces_management/model/space_model.dart @@ -3,6 +3,7 @@ import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/connection_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/selected_product_model.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:uuid/uuid.dart'; enum SpaceStatus { newSpace, modified, unchanged, deleted } @@ -20,12 +21,14 @@ class SpaceModel { bool isHovered; SpaceStatus status; List selectedProducts; + String internalId; List outgoingConnections = []; // Connections from this space Connection? incomingConnection; // Connections to this space SpaceModel({ this.uuid, + String? internalId, this.spaceTuyaUuid, required this.icon, required this.name, @@ -39,25 +42,44 @@ class SpaceModel { this.incomingConnection, this.status = SpaceStatus.unchanged, this.selectedProducts = const [], - }); + }) : internalId = internalId ?? const Uuid().v4(); - factory SpaceModel.fromJson(Map json) { - // Create SpaceModel instance first - final instance = SpaceModel( + factory SpaceModel.fromJson(Map json, {String? parentInternalId}) { + final String internalId = json['internalId'] ?? const Uuid().v4(); + + final List children = json['children'] != null + ? (json['children'] as List).map((childJson) { + return SpaceModel.fromJson( + childJson, + parentInternalId: internalId, + ); + }).toList() + : []; + + return SpaceModel( + internalId: internalId, uuid: json['uuid'] ?? '', spaceTuyaUuid: json['spaceTuyaUuid'], name: json['spaceName'], isPrivate: json['isPrivate'] ?? false, invitationCode: json['invitationCode'], - parent: json['parent'] != null ? SpaceModel.fromJson(json['parent']) : null, + parent: parentInternalId != null + ? SpaceModel( + internalId: parentInternalId, + uuid: json['parent']?['uuid'], + spaceTuyaUuid: json['parent']?['spaceTuyaUuid'], + name: json['parent']?['spaceName'] ?? '', + isPrivate: json['parent']?['isPrivate'] ?? false, + invitationCode: json['parent']?['invitationCode'], + children: [], + position: Offset(json['parent']?['x'] ?? 0, json['parent']?['y'] ?? 0), + icon: json['parent']?['icon'] ?? Assets.location, + ) + : null, community: json['community'] != null ? CommunityModel.fromJson(json['community']) : null, - children: json['children'] != null - ? (json['children'] as List).map((child) => SpaceModel.fromJson(child)).toList() - : [], - icon: json['icon'] != null? json['icon'] : Assets.location, - position: json['x'] != null && json['y'] != null - ? Offset(json['x'], json['y']) - : const Offset(0, 0), + children: children, + icon: json['icon'] ?? Assets.location, + position: Offset(json['x'] ?? 0, json['y'] ?? 0), isHovered: false, selectedProducts: json['spaceProducts'] != null ? (json['spaceProducts'] as List).map((product) { @@ -68,21 +90,6 @@ class SpaceModel { }).toList() : [], ); - - // Add incomingConnection to the instance after creation - if (json['incomingConnections'] != null && - json['incomingConnections'] is List && - (json['incomingConnections'] as List).isNotEmpty && - instance.parent != null) { - final conn = json['incomingConnections'][0]; - instance.incomingConnection = Connection( - startSpace: instance.parent ?? instance, // Parent space - endSpace: instance, // This space instance - direction: conn['direction'], - ); - } - - return instance; } Map toMap() { @@ -106,5 +113,4 @@ class SpaceModel { void addOutgoingConnection(Connection connection) { outgoingConnections.add(connection); } - } diff --git a/lib/pages/spaces_management/view/spaces_management_page.dart b/lib/pages/spaces_management/view/spaces_management_page.dart index 3748bee3..54027066 100644 --- a/lib/pages/spaces_management/view/spaces_management_page.dart +++ b/lib/pages/spaces_management/view/spaces_management_page.dart @@ -5,9 +5,7 @@ import 'package:syncrow_web/pages/spaces_management/bloc/space_management_bloc.d import 'package:syncrow_web/pages/spaces_management/bloc/space_management_event.dart'; import 'package:syncrow_web/pages/spaces_management/bloc/space_management_state.dart'; import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; -import 'package:syncrow_web/pages/spaces_management/model/connection_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/product_model.dart'; -import 'package:syncrow_web/pages/spaces_management/model/space_data_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/space_model.dart'; import 'package:syncrow_web/pages/spaces_management/widgets/loaded_space_widget.dart'; import 'package:syncrow_web/services/product_api.dart'; @@ -27,10 +25,6 @@ class SpaceManagementPageState extends State { final CommunitySpaceManagementApi _api = CommunitySpaceManagementApi(); final ProductApi _productApi = ProductApi(); Map> communitySpaces = {}; - double canvasWidth = 1000; - double canvasHeight = 1000; - List spaces = []; - List connections = []; List products = []; bool isProductDataLoaded = false; diff --git a/lib/pages/spaces_management/widgets/community_structure_widget.dart b/lib/pages/spaces_management/widgets/community_structure_widget.dart index 40cb6077..7322caaa 100644 --- a/lib/pages/spaces_management/widgets/community_structure_widget.dart +++ b/lib/pages/spaces_management/widgets/community_structure_widget.dart @@ -286,6 +286,7 @@ class _CommunityStructureAreaState extends State { if (parentIndex != null && direction != null) { SpaceModel parentSpace = spaces[parentIndex]; + parentSpace.internalId = spaces[parentIndex].internalId; newSpace.parent = parentSpace; final newConnection = Connection( startSpace: parentSpace, @@ -371,13 +372,11 @@ class _CommunityStructureAreaState extends State { for (var child in parent.children) { if (child.status == SpaceStatus.deleted) continue; - // Create a connection object connections.add( Connection( startSpace: parent, endSpace: child, - direction: child.incomingConnection?.direction ?? - "down", // Assuming "down" for all direct children + direction: child.incomingConnection?.direction ?? "down", ), ); @@ -478,11 +477,15 @@ class _CommunityStructureAreaState extends State { bool _isHighlightedSpace(SpaceModel space) { if (widget.selectedSpace == null) return true; if (space == widget.selectedSpace) return true; - if (widget.selectedSpace?.parent?.name == space.name && - widget.selectedSpace?.parent?.position == space.position) return true; - if (widget.selectedSpace?.children.contains(space) == true) return true; - - return false; // Otherwise, reduce opacity + if (widget.selectedSpace?.parent?.internalId == space.internalId) return true; + if (widget.selectedSpace?.children != null) { + for (var child in widget.selectedSpace!.children) { + if (child.internalId == space.internalId) { + return true; + } + } + } + return false; } void _deselectSpace() {