import 'dart:ui'; import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/connection_model.dart'; class SpaceModel { String? uuid; final String? icon; final String? spaceTuyaUuid; final String name; final bool isPrivate; final String? invitationCode; SpaceModel? parent; final CommunityModel? community; List children; Offset position; bool isHovered; List outgoingConnections = []; // Connections from this space Connection? incomingConnection; // Connections to this space SpaceModel( {this.uuid, this.spaceTuyaUuid, required this.icon, required this.name, required this.isPrivate, this.invitationCode, this.parent, this.community, required this.children, required this.position, this.isHovered = false, this.incomingConnection}); factory SpaceModel.fromJson(Map json) { // Create SpaceModel instance first final instance = SpaceModel( 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, 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'] as String?, position: json['x'] != null && json['y'] != null ? Offset(json['x'], json['y']) : const Offset(0, 0), isHovered: false, ); // 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; } @override String toString() { return ''' SpaceModel { uuid: $uuid, name: $name, isPrivate: $isPrivate, position: {dx: ${position.dx}, dy: ${position.dy}}, parentUuid: ${parent?.uuid}, children: ${children.map((child) => child.name).toList()}, isHovered: $isHovered }'''; } Map toMap() { return { 'uuid': uuid ?? '', 'spaceTuyaUuid': spaceTuyaUuid, 'name': name, 'isPrivate': isPrivate, 'invitationCode': invitationCode, 'parent': parent?.uuid, 'community': community?.toMap(), 'children': children.map((child) => child.toMap()).toList(), 'icon': icon, 'position': {'dx': position.dx, 'dy': position.dy}, 'isHovered': isHovered, 'outgoingConnections': outgoingConnections.map((c) => c.toMap()).toList(), 'incomingConnection': incomingConnection?.toMap(), }; } void addOutgoingConnection(Connection connection) { outgoingConnections.add(connection); } }