|
|
|
|
@ -4,6 +4,7 @@ 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/space_tree/bloc/space_tree_event.dart';
|
|
|
|
|
import 'package:syncrow_web/pages/space_tree/bloc/space_tree_state.dart';
|
|
|
|
|
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart';
|
|
|
|
|
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/create_subspace_model.dart';
|
|
|
|
|
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart';
|
|
|
|
|
@ -246,7 +247,9 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
|
|
|
|
|
final previousState = state;
|
|
|
|
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
|
|
|
|
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
|
|
|
|
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc);
|
|
|
|
|
var spaceTreeState = event.context.read<SpaceTreeBloc>().state;
|
|
|
|
|
|
|
|
|
|
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc, spaceTreeState);
|
|
|
|
|
await fetchSpaceModels();
|
|
|
|
|
await fetchTags();
|
|
|
|
|
|
|
|
|
|
@ -277,11 +280,13 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
|
|
|
|
|
LoadCommunityAndSpacesEvent event,
|
|
|
|
|
Emitter<SpaceManagementState> emit,
|
|
|
|
|
) async {
|
|
|
|
|
var spaceTreeState = event.context.read<SpaceTreeBloc>().state;
|
|
|
|
|
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
|
|
|
|
|
|
|
|
|
_onloadProducts();
|
|
|
|
|
await fetchTags();
|
|
|
|
|
// Wait until `communityList` is loaded
|
|
|
|
|
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc);
|
|
|
|
|
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc, spaceTreeState);
|
|
|
|
|
|
|
|
|
|
// Fetch space models after communities are available
|
|
|
|
|
final prevSpaceModels = await fetchSpaceModels();
|
|
|
|
|
@ -292,23 +297,38 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
|
|
|
|
|
allTags: _cachedTags ?? []));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<List<CommunityModel>> _waitForCommunityList(SpaceTreeBloc spaceBloc) async {
|
|
|
|
|
Future<List<CommunityModel>> _waitForCommunityList(
|
|
|
|
|
SpaceTreeBloc spaceBloc, SpaceTreeState spaceTreeState) async {
|
|
|
|
|
// Check if communityList is already populated
|
|
|
|
|
if (spaceBloc.state.communityList.isNotEmpty) {
|
|
|
|
|
return spaceBloc.state.communityList;
|
|
|
|
|
final filteredCommunities = spaceTreeState.searchQuery.isNotEmpty
|
|
|
|
|
? spaceTreeState.filteredCommunity
|
|
|
|
|
: spaceTreeState.communityList;
|
|
|
|
|
if (filteredCommunities.isNotEmpty) {
|
|
|
|
|
return filteredCommunities;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final completer = Completer<List<CommunityModel>>();
|
|
|
|
|
final subscription = spaceBloc.stream.listen((state) {
|
|
|
|
|
if (state.communityList.isNotEmpty) {
|
|
|
|
|
completer.complete(state.communityList);
|
|
|
|
|
if (!completer.isCompleted && state.communityList.isNotEmpty) {
|
|
|
|
|
completer
|
|
|
|
|
.complete(state.searchQuery.isNotEmpty ? state.filteredCommunity : state.communityList);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
try {
|
|
|
|
|
final communities = await completer.future.timeout(
|
|
|
|
|
const Duration(seconds: 10),
|
|
|
|
|
onTimeout: () {
|
|
|
|
|
if (!completer.isCompleted) {
|
|
|
|
|
completer.complete([]);
|
|
|
|
|
}
|
|
|
|
|
return [];
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Return the list once available, then cancel the listener
|
|
|
|
|
final communities = await completer.future;
|
|
|
|
|
await subscription.cancel();
|
|
|
|
|
return communities;
|
|
|
|
|
return communities;
|
|
|
|
|
} finally {
|
|
|
|
|
await subscription.cancel();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _onCommunityDelete(
|
|
|
|
|
@ -491,12 +511,21 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
|
|
|
|
|
Future<List<SpaceModel>> saveSpacesHierarchically(
|
|
|
|
|
BuildContext context, List<SpaceModel> spaces, String communityUuid) async {
|
|
|
|
|
final orderedSpaces = flattenHierarchy(spaces);
|
|
|
|
|
|
|
|
|
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
|
|
|
|
var spaceBloc = context.read<SpaceTreeBloc>();
|
|
|
|
|
List<CommunityModel> communities = spaceBloc.state.communityList;
|
|
|
|
|
CommunityModel? selectedCommunity = communities.firstWhere(
|
|
|
|
|
(community) => community.uuid == communityUuid,
|
|
|
|
|
);
|
|
|
|
|
CommunityModel? selectedCommunity;
|
|
|
|
|
try {
|
|
|
|
|
final spaceTreeState = context.read<SpaceTreeBloc>().state;
|
|
|
|
|
final filteredCommunities = spaceTreeState.searchQuery.isNotEmpty
|
|
|
|
|
? spaceTreeState.filteredCommunity
|
|
|
|
|
: spaceTreeState.communityList;
|
|
|
|
|
|
|
|
|
|
selectedCommunity = filteredCommunities.firstWhere(
|
|
|
|
|
(community) => community.uuid == communityUuid,
|
|
|
|
|
);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final parentsToDelete = orderedSpaces.where((space) =>
|
|
|
|
|
space.status == SpaceStatus.deleted &&
|
|
|
|
|
@ -669,9 +698,12 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await fetchTags();
|
|
|
|
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
|
|
|
|
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
|
|
|
|
List<CommunityModel> communities = spaceBloc.state.communityList;
|
|
|
|
|
final spaceTreeState = event.context.read<SpaceTreeBloc>().state;
|
|
|
|
|
final filteredCommunities = spaceTreeState.searchQuery.isNotEmpty
|
|
|
|
|
? spaceTreeState.filteredCommunity
|
|
|
|
|
: spaceTreeState.communityList;
|
|
|
|
|
|
|
|
|
|
List<CommunityModel> communities = filteredCommunities;
|
|
|
|
|
|
|
|
|
|
var prevSpaceModels = await fetchSpaceModels();
|
|
|
|
|
|
|
|
|
|
|