cancel direction

This commit is contained in:
Rafeek Alkhoudare
2025-05-28 06:50:04 -05:00
parent 321df401fd
commit c99b32fb81
8 changed files with 100 additions and 106 deletions

View File

@ -21,7 +21,8 @@ import 'package:syncrow_web/services/space_mana_api.dart';
import 'package:syncrow_web/services/space_model_mang_api.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart';
import 'package:syncrow_web/utils/constants/action_enum.dart' as custom_action; import 'package:syncrow_web/utils/constants/action_enum.dart' as custom_action;
class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementState> { class SpaceManagementBloc
extends Bloc<SpaceManagementEvent, SpaceManagementState> {
final CommunitySpaceManagementApi _api; final CommunitySpaceManagementApi _api;
final ProductApi _productApi; final ProductApi _productApi;
final SpaceModelManagementApi _spaceModelApi; final SpaceModelManagementApi _spaceModelApi;
@ -62,7 +63,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
int page = 1; int page = 1;
while (hasNext) { while (hasNext) {
final spaceModels = await _spaceModelApi.listSpaceModels(page: page, projectId: projectUuid); final spaceModels = await _spaceModelApi.listSpaceModels(
page: page, projectId: projectUuid);
if (spaceModels.isNotEmpty) { if (spaceModels.isNotEmpty) {
allSpaceModels.addAll(spaceModels); allSpaceModels.addAll(spaceModels);
page++; page++;
@ -75,26 +77,29 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
await fetchTags(); await fetchTags();
emit(SpaceModelLoaded( emit(SpaceModelLoaded(
communities: communities: state is SpaceManagementLoaded
state is SpaceManagementLoaded ? (state as SpaceManagementLoaded).communities : [], ? (state as SpaceManagementLoaded).communities
: [],
products: _cachedProducts ?? [], products: _cachedProducts ?? [],
spaceModels: List.from(_cachedSpaceModels ?? []), spaceModels: List.from(_cachedSpaceModels ?? []),
allTags: _cachedTags ?? [])); allTags: _cachedTags ?? []));
} }
void _deleteSpaceModelFromCache( void _deleteSpaceModelFromCache(DeleteSpaceModelFromCache event,
DeleteSpaceModelFromCache event, Emitter<SpaceManagementState> emit) async { Emitter<SpaceManagementState> emit) async {
if (_cachedSpaceModels != null) { if (_cachedSpaceModels != null) {
_cachedSpaceModels = _cachedSpaceModels = _cachedSpaceModels!
_cachedSpaceModels!.where((model) => model.uuid != event.deletedUuid).toList(); .where((model) => model.uuid != event.deletedUuid)
.toList();
} else { } else {
_cachedSpaceModels = await fetchSpaceModels(); _cachedSpaceModels = await fetchSpaceModels();
} }
await fetchTags(); await fetchTags();
emit(SpaceModelLoaded( emit(SpaceModelLoaded(
communities: communities: state is SpaceManagementLoaded
state is SpaceManagementLoaded ? (state as SpaceManagementLoaded).communities : [], ? (state as SpaceManagementLoaded).communities
: [],
products: _cachedProducts ?? [], products: _cachedProducts ?? [],
spaceModels: List.from(_cachedSpaceModels ?? []), spaceModels: List.from(_cachedSpaceModels ?? []),
allTags: _cachedTags ?? [])); allTags: _cachedTags ?? []));
@ -122,8 +127,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
int page = 1; int page = 1;
while (hasNext) { while (hasNext) {
final spaceModels = final spaceModels = await _spaceModelApi.listSpaceModels(
await _spaceModelApi.listSpaceModels(page: page, projectId: projectUuid); page: page, projectId: projectUuid);
if (spaceModels.isNotEmpty) { if (spaceModels.isNotEmpty) {
allSpaceModels.addAll(spaceModels); allSpaceModels.addAll(spaceModels);
page++; page++;
@ -164,10 +169,12 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
await fetchTags(); await fetchTags();
emit(SpaceManagementLoading()); emit(SpaceManagementLoading());
final success = await _api.updateCommunity(event.communityUuid, event.name, projectUuid); final success = await _api.updateCommunity(
event.communityUuid, event.name, projectUuid);
if (success) { if (success) {
if (previousState is SpaceManagementLoaded) { if (previousState is SpaceManagementLoaded) {
final updatedCommunities = List<CommunityModel>.from(previousState.communities); final updatedCommunities =
List<CommunityModel>.from(previousState.communities);
for (var community in updatedCommunities) { for (var community in updatedCommunities) {
if (community.uuid == event.communityUuid) { if (community.uuid == event.communityUuid) {
community.name = event.name; community.name = event.name;
@ -212,7 +219,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
} }
} }
Future<List<SpaceModel>> _fetchSpacesForCommunity(String communityUuid) async { Future<List<SpaceModel>> _fetchSpacesForCommunity(
String communityUuid) async {
final projectUuid = await ProjectManager.getProjectUUID() ?? ''; final projectUuid = await ProjectManager.getProjectUUID() ?? '';
return await _api.getSpaceHierarchy(communityUuid, projectUuid); return await _api.getSpaceHierarchy(communityUuid, projectUuid);
@ -242,20 +250,23 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
} }
} }
Future<void> _onBlankState(BlankStateEvent event, Emitter<SpaceManagementState> emit) async { Future<void> _onBlankState(
BlankStateEvent event, Emitter<SpaceManagementState> emit) async {
try { try {
final previousState = state; final previousState = state;
final projectUuid = await ProjectManager.getProjectUUID() ?? ''; final projectUuid = await ProjectManager.getProjectUUID() ?? '';
var spaceBloc = event.context.read<SpaceTreeBloc>(); var spaceBloc = event.context.read<SpaceTreeBloc>();
var spaceTreeState = event.context.read<SpaceTreeBloc>().state; var spaceTreeState = event.context.read<SpaceTreeBloc>().state;
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc, spaceTreeState); List<CommunityModel> communities =
await _waitForCommunityList(spaceBloc, spaceTreeState);
await fetchSpaceModels(); await fetchSpaceModels();
await fetchTags(); await fetchTags();
var prevSpaceModels = await fetchSpaceModels(); var prevSpaceModels = await fetchSpaceModels();
if (previousState is SpaceManagementLoaded || previousState is BlankState) { if (previousState is SpaceManagementLoaded ||
previousState is BlankState) {
final prevCommunities = (previousState as dynamic).communities ?? []; final prevCommunities = (previousState as dynamic).communities ?? [];
emit(BlankState( emit(BlankState(
communities: List<CommunityModel>.from(prevCommunities), communities: List<CommunityModel>.from(prevCommunities),
@ -286,7 +297,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
_onloadProducts(); _onloadProducts();
await fetchTags(); await fetchTags();
// Wait until `communityList` is loaded // Wait until `communityList` is loaded
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc, spaceTreeState); List<CommunityModel> communities =
await _waitForCommunityList(spaceBloc, spaceTreeState);
// Fetch space models after communities are available // Fetch space models after communities are available
final prevSpaceModels = await fetchSpaceModels(); final prevSpaceModels = await fetchSpaceModels();
@ -310,8 +322,9 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
final completer = Completer<List<CommunityModel>>(); final completer = Completer<List<CommunityModel>>();
final subscription = spaceBloc.stream.listen((state) { final subscription = spaceBloc.stream.listen((state) {
if (!completer.isCompleted && state.communityList.isNotEmpty) { if (!completer.isCompleted && state.communityList.isNotEmpty) {
completer completer.complete(state.searchQuery.isNotEmpty
.complete(state.searchQuery.isNotEmpty ? state.filteredCommunity : state.communityList); ? state.filteredCommunity
: state.communityList);
} }
}); });
try { try {
@ -339,7 +352,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
emit(SpaceManagementLoading()); emit(SpaceManagementLoading());
final projectUuid = await ProjectManager.getProjectUUID() ?? ''; final projectUuid = await ProjectManager.getProjectUUID() ?? '';
final success = await _api.deleteCommunity(event.communityUuid, projectUuid); final success =
await _api.deleteCommunity(event.communityUuid, projectUuid);
if (success) { if (success) {
// add(LoadCommunityAndSpacesEvent()); // add(LoadCommunityAndSpacesEvent());
} else { } else {
@ -361,12 +375,13 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
try { try {
final projectUuid = await ProjectManager.getProjectUUID() ?? ''; final projectUuid = await ProjectManager.getProjectUUID() ?? '';
await fetchTags(); await fetchTags();
CommunityModel? newCommunity = CommunityModel? newCommunity = await _api.createCommunity(
await _api.createCommunity(event.name, event.description, projectUuid); event.name, event.description, projectUuid);
var prevSpaceModels = await fetchSpaceModels(); var prevSpaceModels = await fetchSpaceModels();
if (newCommunity != null) { if (newCommunity != null) {
if (previousState is SpaceManagementLoaded || previousState is BlankState) { if (previousState is SpaceManagementLoaded ||
previousState is BlankState) {
final prevCommunities = List<CommunityModel>.from( final prevCommunities = List<CommunityModel>.from(
(previousState as dynamic).communities, (previousState as dynamic).communities,
); );
@ -459,8 +474,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
try { try {
final spaceTreeState = event.context.read<SpaceTreeBloc>().state; final spaceTreeState = event.context.read<SpaceTreeBloc>().state;
final updatedSpaces = final updatedSpaces = await saveSpacesHierarchically(
await saveSpacesHierarchically(event.context, event.spaces, event.communityUuid); event.context, event.spaces, event.communityUuid);
final allSpaces = await _fetchSpacesForCommunity(event.communityUuid); final allSpaces = await _fetchSpacesForCommunity(event.communityUuid);
emit(SpaceCreationSuccess(spaces: updatedSpaces)); emit(SpaceCreationSuccess(spaces: updatedSpaces));
@ -520,8 +535,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
} }
} }
Future<List<SpaceModel>> saveSpacesHierarchically( Future<List<SpaceModel>> saveSpacesHierarchically(BuildContext context,
BuildContext context, List<SpaceModel> spaces, String communityUuid) async { List<SpaceModel> spaces, String communityUuid) async {
final orderedSpaces = flattenHierarchy(spaces); final orderedSpaces = flattenHierarchy(spaces);
final projectUuid = await ProjectManager.getProjectUUID() ?? ''; final projectUuid = await ProjectManager.getProjectUUID() ?? '';
@ -575,17 +590,19 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
if (prevSubspaces != null || newSubspaces != null) { if (prevSubspaces != null || newSubspaces != null) {
if (prevSubspaces != null && newSubspaces != null) { if (prevSubspaces != null && newSubspaces != null) {
for (var prevSubspace in prevSubspaces) { for (var prevSubspace in prevSubspaces) {
final existsInNew = final existsInNew = newSubspaces
newSubspaces.any((subspace) => subspace.uuid == prevSubspace.uuid); .any((subspace) => subspace.uuid == prevSubspace.uuid);
if (!existsInNew) { if (!existsInNew) {
subspaceUpdates.add(UpdateSubspaceTemplateModel( subspaceUpdates.add(UpdateSubspaceTemplateModel(
action: custom_action.Action.delete, uuid: prevSubspace.uuid)); action: custom_action.Action.delete,
uuid: prevSubspace.uuid));
} }
} }
} else if (prevSubspaces != null && newSubspaces == null) { } else if (prevSubspaces != null && newSubspaces == null) {
for (var prevSubspace in prevSubspaces) { for (var prevSubspace in prevSubspaces) {
subspaceUpdates.add(UpdateSubspaceTemplateModel( subspaceUpdates.add(UpdateSubspaceTemplateModel(
action: custom_action.Action.delete, uuid: prevSubspace.uuid)); action: custom_action.Action.delete,
uuid: prevSubspace.uuid));
} }
} }
@ -613,7 +630,9 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
} }
if (prevSubspaces != null && newSubspaces != null) { if (prevSubspaces != null && newSubspaces != null) {
final newSubspaceMap = {for (var subspace in newSubspaces) subspace.uuid: subspace}; final newSubspaceMap = {
for (var subspace in newSubspaces) subspace.uuid: subspace
};
for (var prevSubspace in prevSubspaces) { for (var prevSubspace in prevSubspaces) {
final newSubspace = newSubspaceMap[prevSubspace.uuid]; final newSubspace = newSubspaceMap[prevSubspace.uuid];
@ -641,7 +660,6 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
icon: space.icon, icon: space.icon,
subspaces: subspaceUpdates, subspaces: subspaceUpdates,
tags: tagUpdates, tags: tagUpdates,
direction: space.incomingConnection?.direction,
spaceModelUuid: space.spaceModel?.uuid, spaceModelUuid: space.spaceModel?.uuid,
projectId: projectUuid); projectId: projectUuid);
} else { } else {
@ -651,8 +669,10 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
: []; : [];
var createSubspaceBodyModels = space.subspaces?.map((subspace) { var createSubspaceBodyModels = space.subspaces?.map((subspace) {
final tagBodyModels = final tagBodyModels = subspace.tags
subspace.tags?.map((tag) => tag.toCreateTagBodyModel()).toList() ?? []; ?.map((tag) => tag.toCreateTagBodyModel())
.toList() ??
[];
return CreateSubspaceModel() return CreateSubspaceModel()
..subspaceName = subspace.subspaceName ..subspaceName = subspace.subspaceName
..tags = tagBodyModels; ..tags = tagBodyModels;
@ -671,7 +691,6 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
isPrivate: space.isPrivate, isPrivate: space.isPrivate,
position: space.position, position: space.position,
icon: space.icon, icon: space.icon,
direction: space.incomingConnection?.direction,
spaceModelUuid: space.spaceModel?.uuid, spaceModelUuid: space.spaceModel?.uuid,
tags: tagBodyModels, tags: tagBodyModels,
subspaces: createSubspaceBodyModels, subspaces: createSubspaceBodyModels,
@ -710,7 +729,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
return result.toList(); // Convert back to a list return result.toList(); // Convert back to a list
} }
void _onLoadSpaceModel(SpaceModelLoadEvent event, Emitter<SpaceManagementState> emit) async { void _onLoadSpaceModel(
SpaceModelLoadEvent event, Emitter<SpaceManagementState> emit) async {
emit(SpaceManagementLoading()); emit(SpaceManagementLoading());
try { try {
@ -757,14 +777,17 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
// Case 1: Tags deleted // Case 1: Tags deleted
if (prevTags != null && newTags != null) { if (prevTags != null && newTags != null) {
for (var prevTag in prevTags) { for (var prevTag in prevTags) {
final existsInNew = newTags.any((newTag) => newTag.uuid == prevTag.uuid); final existsInNew =
newTags.any((newTag) => newTag.uuid == prevTag.uuid);
if (!existsInNew) { if (!existsInNew) {
tagUpdates.add(TagModelUpdate(action: custom_action.Action.delete, uuid: prevTag.uuid)); tagUpdates.add(TagModelUpdate(
action: custom_action.Action.delete, uuid: prevTag.uuid));
} }
} }
} else if (prevTags != null && newTags == null) { } else if (prevTags != null && newTags == null) {
for (var prevTag in prevTags) { for (var prevTag in prevTags) {
tagUpdates.add(TagModelUpdate(action: custom_action.Action.delete, uuid: prevTag.uuid)); tagUpdates.add(TagModelUpdate(
action: custom_action.Action.delete, uuid: prevTag.uuid));
} }
} }
@ -807,15 +830,16 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
return tagUpdates; return tagUpdates;
} }
List<SpaceModel> findMatchingSpaces(List<SpaceModel> spaces, String targetUuid) { List<SpaceModel> findMatchingSpaces(
List<SpaceModel> spaces, String targetUuid) {
List<SpaceModel> matched = []; List<SpaceModel> matched = [];
for (var space in spaces) { for (var space in spaces) {
if (space.uuid == targetUuid) { if (space.uuid == targetUuid) {
matched.add(space); matched.add(space);
} }
matched matched.addAll(findMatchingSpaces(
.addAll(findMatchingSpaces(space.children, targetUuid)); // Recursively search in children space.children, targetUuid)); // Recursively search in children
} }
return matched; return matched;

View File

@ -3,23 +3,26 @@ import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model
class Connection { class Connection {
final SpaceModel startSpace; final SpaceModel startSpace;
final SpaceModel endSpace; final SpaceModel endSpace;
final String direction;
Connection({required this.startSpace, required this.endSpace, required this.direction}); Connection({
required this.startSpace,
required this.endSpace,
});
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'startUuid': startSpace.uuid ?? 'unsaved-start-space-${startSpace.name}', // Fallback for unsaved spaces 'startUuid': startSpace.uuid ??
'endUuid': endSpace.uuid ?? 'unsaved-end-space-${endSpace.name}', // Fallback for unsaved spaces 'unsaved-start-space-${startSpace.name}', // Fallback for unsaved spaces
'direction': direction, 'endUuid': endSpace.uuid ??
'unsaved-end-space-${endSpace.name}', // Fallback for unsaved spaces
}; };
} }
static Connection fromMap(Map<String, dynamic> map, Map<String, SpaceModel> spaces) { static Connection fromMap(
Map<String, dynamic> map, Map<String, SpaceModel> spaces) {
return Connection( return Connection(
startSpace: spaces[map['startUuid']]!, startSpace: spaces[map['startUuid']]!,
endSpace: spaces[map['endUuid']]!, endSpace: spaces[map['endUuid']]!,
direction: map['direction'],
); );
} }
} }

View File

@ -116,7 +116,7 @@ class SpaceModel {
instance.incomingConnection = Connection( instance.incomingConnection = Connection(
startSpace: instance.parent ?? instance, // Parent space startSpace: instance.parent ?? instance, // Parent space
endSpace: instance, // This space instance endSpace: instance, // This space instance
direction: conn['direction'],
); );
} }

View File

@ -199,13 +199,11 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
top: entry.value.position.dy, top: entry.value.position.dy,
child: SpaceCardWidget( child: SpaceCardWidget(
index: entry.key, index: entry.key,
onButtonTap: (int index, Offset newPosition, onButtonTap: (int index, Offset newPosition) {
String direction) {
_showCreateSpaceDialog(screenSize, _showCreateSpaceDialog(screenSize,
position: position:
spaces[index].position + newPosition, spaces[index].position + newPosition,
parentIndex: index, parentIndex: index,
direction: direction,
projectTags: widget.projectTags); projectTags: widget.projectTags);
}, },
position: entry.value.position, position: entry.value.position,
@ -296,7 +294,6 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
void _showCreateSpaceDialog(Size screenSize, void _showCreateSpaceDialog(Size screenSize,
{Offset? position, {Offset? position,
int? parentIndex, int? parentIndex,
String? direction,
double? canvasWidth, double? canvasWidth,
double? canvasHeight, double? canvasHeight,
required List<Tag> projectTags}) { required List<Tag> projectTags}) {
@ -338,14 +335,13 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
subspaces: subspaces, subspaces: subspaces,
tags: tags); tags: tags);
if (parentIndex != null && direction != null) { if (parentIndex != null) {
SpaceModel parentSpace = spaces[parentIndex]; SpaceModel parentSpace = spaces[parentIndex];
parentSpace.internalId = spaces[parentIndex].internalId; parentSpace.internalId = spaces[parentIndex].internalId;
newSpace.parent = parentSpace; newSpace.parent = parentSpace;
final newConnection = Connection( final newConnection = Connection(
startSpace: parentSpace, startSpace: parentSpace,
endSpace: newSpace, endSpace: newSpace,
direction: direction,
); );
connections.add(newConnection); connections.add(newConnection);
newSpace.incomingConnection = newConnection; newSpace.incomingConnection = newConnection;
@ -467,7 +463,6 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
Connection( Connection(
startSpace: parent, startSpace: parent,
endSpace: child, endSpace: child,
direction: "down",
), ),
); );
@ -750,7 +745,6 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
final newConnection = Connection( final newConnection = Connection(
startSpace: parent, startSpace: parent,
endSpace: duplicated, endSpace: duplicated,
direction: "down",
); );
connections.add(newConnection); connections.add(newConnection);
duplicated.incomingConnection = newConnection; duplicated.incomingConnection = newConnection;
@ -786,7 +780,6 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
final newConnection = Connection( final newConnection = Connection(
startSpace: newSpace, startSpace: newSpace,
endSpace: duplicatedChild, endSpace: duplicatedChild,
direction: "down",
); );
connections.add(newConnection); connections.add(newConnection);

View File

@ -30,28 +30,13 @@ class CurvedLinePainter extends CustomPainter {
Offset end = connection.endSpace.position + Offset end = connection.endSpace.position +
const Offset(75, 0); // Center top of end space const Offset(75, 0); // Center top of end space
if (connection.direction == 'down') { // Curved line for down connections
// Curved line for down connections final controlPoint = Offset((start.dx + end.dx) / 2, start.dy + 50);
final controlPoint = Offset((start.dx + end.dx) / 2, start.dy + 50); final path = Path()
final path = Path() ..moveTo(start.dx, start.dy)
..moveTo(start.dx, start.dy) ..quadraticBezierTo(controlPoint.dx, controlPoint.dy, end.dx, end.dy);
..quadraticBezierTo(controlPoint.dx, controlPoint.dy, end.dx, end.dy); canvas.drawPath(path, paint);
canvas.drawPath(path, paint);
} else if (connection.direction == 'right') {
start = connection.startSpace.position +
const Offset(150, 30); // Right center
end = connection.endSpace.position + const Offset(0, 30); // Left center
canvas.drawLine(start, end, paint);
} else if (connection.direction == 'left') {
start =
connection.startSpace.position + const Offset(0, 30); // Left center
end = connection.endSpace.position +
const Offset(150, 30); // Right center
canvas.drawLine(start, end, paint);
}
final dotPaint = Paint()..color = ColorsManager.blackColor; final dotPaint = Paint()..color = ColorsManager.blackColor;
canvas.drawCircle(start, 5, dotPaint); // Start dot canvas.drawCircle(start, 5, dotPaint); // Start dot
canvas.drawCircle(end, 5, dotPaint); // End dot canvas.drawCircle(end, 5, dotPaint); // End dot

View File

@ -5,7 +5,7 @@ class PlusButtonWidget extends StatelessWidget {
final int index; final int index;
final String direction; final String direction;
final Offset offset; final Offset offset;
final Function(int index, Offset newPosition, String direction) onButtonTap; final Function(int index, Offset newPosition) onButtonTap;
const PlusButtonWidget({ const PlusButtonWidget({
super.key, super.key,
@ -19,21 +19,7 @@ class PlusButtonWidget extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
Offset newPosition; onButtonTap(index, const Offset(0, 150));
switch (direction) {
case 'left':
newPosition = const Offset(-200, 0);
break;
case 'right':
newPosition = const Offset(200, 0);
break;
case 'down':
newPosition = const Offset(0, 150);
break;
default:
newPosition = Offset.zero;
}
onButtonTap(index, newPosition, direction);
}, },
child: Container( child: Container(
width: 30, width: 30,
@ -42,8 +28,11 @@ class PlusButtonWidget extends StatelessWidget {
color: ColorsManager.spaceColor, color: ColorsManager.spaceColor,
shape: BoxShape.circle, shape: BoxShape.circle,
), ),
child: child: const Icon(
const Icon(Icons.add, color: ColorsManager.whiteColors, size: 20), Icons.add,
color: ColorsManager.whiteColors,
size: 20,
),
), ),
); );
} }

View File

@ -7,7 +7,7 @@ class SpaceCardWidget extends StatelessWidget {
final Offset position; final Offset position;
final bool isHovered; final bool isHovered;
final Function(int index, bool isHovered) onHoverChanged; final Function(int index, bool isHovered) onHoverChanged;
final Function(int index, Offset newPosition, String direction) onButtonTap; final Function(int index, Offset newPosition) onButtonTap;
final Widget Function(int index) buildSpaceContainer; final Widget Function(int index) buildSpaceContainer;
final ValueChanged<Offset> onPositionChanged; final ValueChanged<Offset> onPositionChanged;

View File

@ -199,7 +199,7 @@ class CommunitySpaceManagementApi {
{required String communityId, {required String communityId,
required String name, required String name,
String? parentId, String? parentId,
String? direction,
bool isPrivate = false, bool isPrivate = false,
required Offset position, required Offset position,
String? spaceModelUuid, String? spaceModelUuid,
@ -213,7 +213,7 @@ class CommunitySpaceManagementApi {
'isPrivate': isPrivate, 'isPrivate': isPrivate,
'x': position.dx, 'x': position.dx,
'y': position.dy, 'y': position.dy,
'direction': direction,
'icon': icon, 'icon': icon,
}; };
if (parentId != null) { if (parentId != null) {
@ -248,7 +248,7 @@ class CommunitySpaceManagementApi {
required String name, required String name,
String? parentId, String? parentId,
String? icon, String? icon,
String? direction,
bool isPrivate = false, bool isPrivate = false,
required Offset position, required Offset position,
List<TagModelUpdate>? tags, List<TagModelUpdate>? tags,
@ -261,7 +261,7 @@ class CommunitySpaceManagementApi {
'isPrivate': isPrivate, 'isPrivate': isPrivate,
'x': position.dx, 'x': position.dx,
'y': position.dy, 'y': position.dy,
'direction': direction,
'icon': icon, 'icon': icon,
'subspace': subspaces, 'subspace': subspaces,
'tags': tags, 'tags': tags,