diff --git a/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart b/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart index 3b7b2626..ddc294d7 100644 --- a/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart +++ b/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart @@ -1,7 +1,5 @@ import 'dart:async'; import 'dart:developer'; - -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'; @@ -30,9 +28,14 @@ class SpaceManagementBloc List? _cachedProducts; List? _cachedSpaceModels; + final SpaceTreeBloc _spaceTreeBloc; - SpaceManagementBloc(this._api, this._productApi, this._spaceModelApi) - : super(SpaceManagementInitial()) { + SpaceManagementBloc( + this._api, + this._productApi, + this._spaceModelApi, + this._spaceTreeBloc, + ) : super(SpaceManagementInitial()) { on(_onLoadCommunityAndSpaces); on(_onCreateCommunity); on(_onSelectCommunity); @@ -44,14 +47,63 @@ class SpaceManagementBloc on(_onNewCommunity); on(_onBlankState); on(_onLoadSpaceModel); + on(_updateSpaceModelCache); + on(_deleteSpaceModelFromCache); + } + + Future _updateSpaceModelCache( + UpdateSpaceModelCache event, Emitter emit) async { + if (_cachedSpaceModels != null) { + _cachedSpaceModels = _cachedSpaceModels!.map((model) { + return model.uuid == event.updatedModel.uuid + ? event.updatedModel + : model; + }).toList(); + } else { + _cachedSpaceModels = await fetchSpaceModels(); + } + + emit(SpaceModelLoaded( + communities: state is SpaceManagementLoaded + ? (state as SpaceManagementLoaded).communities + : [], + products: _cachedProducts ?? [], + spaceModels: List.from(_cachedSpaceModels ?? []), + )); + } + + void _deleteSpaceModelFromCache(DeleteSpaceModelFromCache event, + Emitter emit) async { + if (_cachedSpaceModels != null) { + _cachedSpaceModels = _cachedSpaceModels! + .where((model) => model.uuid != event.deletedUuid) + .toList(); + } else { + _cachedSpaceModels = await fetchSpaceModels(); + } + + emit(SpaceModelLoaded( + communities: state is SpaceManagementLoaded + ? (state as SpaceManagementLoaded).communities + : [], + products: _cachedProducts ?? [], + spaceModels: List.from(_cachedSpaceModels ?? []), + )); } void _logEvent(String eventName) { log('Event Triggered: $eventName'); } - Future> fetchSpaceModels( - SpaceManagementState previousState) async { + void updateCachedSpaceModels(List updatedModels) { + _cachedSpaceModels = List.from(updatedModels); + } + + void addToCachedSpaceModels(SpaceTemplateModel newModel) { + _cachedSpaceModels?.add(newModel); + } + + Future> fetchSpaceModels() async { try { if (_cachedSpaceModels != null) { return _cachedSpaceModels!; @@ -87,7 +139,6 @@ class SpaceManagementBloc UpdateCommunityEvent event, Emitter emit, ) async { - _logEvent('UpdateCommunityEvent'); final previousState = state; try { @@ -107,7 +158,7 @@ class SpaceManagementBloc } } - var prevSpaceModels = await fetchSpaceModels(previousState); + var prevSpaceModels = await fetchSpaceModels(); emit(SpaceManagementLoaded( communities: updatedCommunities, @@ -161,7 +212,7 @@ class SpaceManagementBloc return; } - var prevSpaceModels = await fetchSpaceModels(previousState); + var prevSpaceModels = await fetchSpaceModels(); emit(BlankState( communities: event.communities, @@ -181,7 +232,7 @@ class SpaceManagementBloc var spaceBloc = event.context.read(); List communities = await _waitForCommunityList(spaceBloc); - var prevSpaceModels = await fetchSpaceModels(previousState); + var prevSpaceModels = await fetchSpaceModels(); if (previousState is SpaceManagementLoaded || previousState is BlankState) { @@ -239,7 +290,7 @@ class SpaceManagementBloc List communities = await _waitForCommunityList(spaceBloc); // Fetch space models after communities are available - final prevSpaceModels = await fetchSpaceModels(state); + final prevSpaceModels = await fetchSpaceModels(); emit(SpaceManagementLoaded( communities: communities, products: _cachedProducts ?? [], @@ -297,12 +348,10 @@ class SpaceManagementBloc try { final projectUuid = await ProjectManager.getProjectUUID() ?? ''; - final BuildContext safeContext = - event.context; // Capture context safely before async calls CommunityModel? newCommunity = await _api.createCommunity( event.name, event.description, projectUuid); - var prevSpaceModels = await fetchSpaceModels(previousState); + var prevSpaceModels = await fetchSpaceModels(); if (newCommunity != null) { if (previousState is SpaceManagementLoaded || @@ -311,12 +360,7 @@ class SpaceManagementBloc (previousState as dynamic).communities, ); final updatedCommunities = prevCommunities..add(newCommunity); - - if (safeContext.mounted) { - final spaceTreeBloc = safeContext.read< - SpaceTreeBloc>(); // ✅ Read bloc only when context is mounted - spaceTreeBloc.add(OnCommunityAdded(newCommunity)); - } + _spaceTreeBloc.add(OnCommunityAdded(newCommunity)); emit(SpaceManagementLoaded( spaceModels: prevSpaceModels, @@ -430,7 +474,7 @@ class SpaceManagementBloc String communityUuid, Emitter emit, ) async { - var prevSpaceModels = await fetchSpaceModels(previousState); + var prevSpaceModels = await fetchSpaceModels(); final communities = List.from(previousState.communities); @@ -629,7 +673,7 @@ class SpaceManagementBloc var spaceBloc = event.context.read(); List communities = spaceBloc.state.communityList; - var prevSpaceModels = await fetchSpaceModels(prevState); + var prevSpaceModels = await fetchSpaceModels(); if (communities.isEmpty) { communities = await _api.fetchCommunities(projectUuid); diff --git a/lib/pages/spaces_management/all_spaces/bloc/space_management_event.dart b/lib/pages/spaces_management/all_spaces/bloc/space_management_event.dart index 38e4bfb3..6bd685ba 100644 --- a/lib/pages/spaces_management/all_spaces/bloc/space_management_event.dart +++ b/lib/pages/spaces_management/all_spaces/bloc/space_management_event.dart @@ -1,7 +1,8 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; -import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; // Import for Offset +import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; // Import for Offset abstract class SpaceManagementEvent extends Equatable { const SpaceManagementEvent(); @@ -160,3 +161,13 @@ class SpaceModelLoadEvent extends SpaceManagementEvent { @override List get props => [context]; } + +class UpdateSpaceModelCache extends SpaceManagementEvent { + final SpaceTemplateModel updatedModel; + UpdateSpaceModelCache(this.updatedModel); +} + +class DeleteSpaceModelFromCache extends SpaceManagementEvent { + final String deletedUuid; + DeleteSpaceModelFromCache(this.deletedUuid); +} \ No newline at end of file diff --git a/lib/pages/spaces_management/all_spaces/bloc/space_management_state.dart b/lib/pages/spaces_management/all_spaces/bloc/space_management_state.dart index 10a02294..674fce4c 100644 --- a/lib/pages/spaces_management/all_spaces/bloc/space_management_state.dart +++ b/lib/pages/spaces_management/all_spaces/bloc/space_management_state.dart @@ -71,3 +71,4 @@ class SpaceModelLoaded extends SpaceManagementState { @override List get props => [communities, products, spaceModels]; } + diff --git a/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart b/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart index 6c30e03b..b296eca8 100644 --- a/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart +++ b/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/structure_selector/bloc/center_body_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_event.dart'; @@ -34,6 +35,7 @@ class SpaceManagementPageState extends State { _api, _productApi, _spaceModelApi, + BlocProvider.of(context), )..add(LoadCommunityAndSpacesEvent(this.context)), ), BlocProvider(