link space model api integration

This commit is contained in:
mohammad
2025-03-05 14:37:52 +03:00
parent b134823551
commit 215dd9cfa4
8 changed files with 758 additions and 273 deletions

View File

@ -1,36 +1,26 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart';
import 'package:syncrow_web/pages/spaces_management/link_space_model/bloc/link_space_model_event.dart';
import 'package:syncrow_web/pages/spaces_management/link_space_model/bloc/link_space_model_state.dart';
import 'package:syncrow_web/services/space_model_mang_api.dart';
import 'package:syncrow_web/utils/navigation_service.dart';
class SpaceModelBloc extends Bloc<SpaceModelEvent, SpaceModelState> {
SpaceModelBloc() : super(SpaceModelInitial()) {
on<SpaceModelSelectedIdsEvent>(_getSpaceIds);
on<LinkSpaceModelEvent>(_handleLinkSpaceModel);
on<ValidateSpaceModelEvent>(_validateLinkSpaceModel);
on<SpaceModelSelectedEvent>((event, emit) {
emit(SpaceModelSelectedState(event.selectedIndex));
});
}
// Future<void> getSpaceIds(
// SpaceModelSelectedIdsEvent event, Emitter<SpaceModelState> emit) async {
// try {
// BuildContext context = NavigationService.navigatorKey.currentContext!;
// var spaceBloc = context.read<SpaceTreeBloc>();
// for (var communityId in spaceBloc.state.selectedCommunities) {
// List<String> spacesList =
// spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? [];
// for (var spaceId in spacesList) {
// print('spaceId===$spaceId');
// }
// }
// } catch (e) {
// print('Error fetching space IDs: $e');
// }
// }
List<String> spacesListIds = [];
bool hasSelectedSpaces = false;
String validate = '';
Future<void> _getSpaceIds(
SpaceModelSelectedIdsEvent event, Emitter<SpaceModelState> emit) async {
@ -40,22 +30,17 @@ class SpaceModelBloc extends Bloc<SpaceModelEvent, SpaceModelState> {
for (var communityId in spaceBloc.state.selectedCommunities) {
List<String> spacesList =
spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? [];
spacesListIds = spacesList;
for (var spaceId in spacesList) {
print('spaceId===$spaceId');
}
}
// Check if any community has selected spaces
hasSelectedSpaces =
spaceBloc.state.selectedCommunities.any((communityId) {
List<String> spacesList =
spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? [];
return spacesList.isNotEmpty;
});
// Optionally, you could emit a state here if you want to rebuild the UI
// emit(SpaceModelSelectionUpdatedState(hasSelectedSpaces));
// Debug output
if (hasSelectedSpaces) {
print("At least one space is selected.");
} else {
@ -65,4 +50,57 @@ class SpaceModelBloc extends Bloc<SpaceModelEvent, SpaceModelState> {
print("Error in _getSpaceIds: $e");
}
}
Future<void> _handleLinkSpaceModel(
LinkSpaceModelEvent event,
Emitter<SpaceModelState> emit,
) async {
emit(SpaceModelLoading());
try {
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
await SpaceModelManagementApi().linkSpaceModel(
spaceModelUuid: event.selectedSpaceMode!,
projectId: projectUuid,
spaceUuids: spacesListIds,
isOverWrite: event.isOverWrite);
emit(SpaceModelLinkSuccess());
} on DioException catch (e) {
final errorMessage = _parseDioError(e);
emit(SpaceModelOperationFailure(errorMessage));
} catch (e) {
emit(SpaceModelOperationFailure('Unexpected error: $e'));
}
}
Future<void> _validateLinkSpaceModel(
ValidateSpaceModelEvent event,
Emitter<SpaceModelState> emit,
) async {
emit(SpaceModelLoading());
try {
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
await SpaceModelManagementApi().validateSpaceModel(
projectUuid,
spacesListIds,
);
emit(SpaceValidationSuccess());
} on DioException catch (e) {
final errorMessage = _parseDioError(e);
if (errorMessage ==
'Selected spaces already have linked space model / sub-spaces and devices') {
emit(const AlreadyHaveLinkedState());
} else {
emit(SpaceModelOperationFailure(errorMessage));
}
} catch (e) {
emit(SpaceModelOperationFailure('Unexpected error: $e'));
}
}
String _parseDioError(DioException e) {
if (e.response?.data is Map<String, dynamic>) {
return e.response!.data['error']['message'] ?? 'Unknown error occurred';
}
return e.message ?? 'Network request failed';
}
}

View File

@ -1,3 +1,5 @@
import 'package:flutter/material.dart';
abstract class SpaceModelEvent {}
class SpaceModelSelectedEvent extends SpaceModelEvent {
@ -6,8 +8,15 @@ class SpaceModelSelectedEvent extends SpaceModelEvent {
SpaceModelSelectedEvent(this.selectedIndex);
}
class SpaceModelSelectedIdsEvent extends SpaceModelEvent {}
class SpaceModelSelectedIdsEvent extends SpaceModelEvent {
class LinkSpaceModelEvent extends SpaceModelEvent {
final String? selectedSpaceMode;
final bool isOverWrite;
LinkSpaceModelEvent({this.selectedSpaceMode, this.isOverWrite = false});
}
class ValidateSpaceModelEvent extends SpaceModelEvent {
BuildContext? context;
ValidateSpaceModelEvent({this.context});
}

View File

@ -1,9 +1,35 @@
abstract class SpaceModelState {}
abstract class SpaceModelState {
const SpaceModelState();
}
class SpaceModelInitial extends SpaceModelState {}
class SpaceModelLoading extends SpaceModelState {}
class SpaceModelSelectedState extends SpaceModelState {
final int selectedIndex;
SpaceModelSelectedState(this.selectedIndex);
const SpaceModelSelectedState(this.selectedIndex);
}
class SpaceModelSelectionUpdated extends SpaceModelState {
final bool hasSelectedSpaces;
const SpaceModelSelectionUpdated(this.hasSelectedSpaces);
}
class SpaceValidationSuccess extends SpaceModelState {}
class SpaceModelLinkSuccess extends SpaceModelState {}
class ValidationError extends SpaceModelState {
final String message;
const ValidationError(this.message);
}
class SpaceModelOperationFailure extends SpaceModelState {
final String message;
const SpaceModelOperationFailure(this.message);
}
class AlreadyHaveLinkedState extends SpaceModelState {
const AlreadyHaveLinkedState();
}