mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 07:07:19 +00:00
cached space models
This commit is contained in:
@ -1,7 +1,5 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/common/bloc/project_manager.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_bloc.dart';
|
||||||
@ -30,9 +28,14 @@ class SpaceManagementBloc
|
|||||||
|
|
||||||
List<ProductModel>? _cachedProducts;
|
List<ProductModel>? _cachedProducts;
|
||||||
List<SpaceTemplateModel>? _cachedSpaceModels;
|
List<SpaceTemplateModel>? _cachedSpaceModels;
|
||||||
|
final SpaceTreeBloc _spaceTreeBloc;
|
||||||
|
|
||||||
SpaceManagementBloc(this._api, this._productApi, this._spaceModelApi)
|
SpaceManagementBloc(
|
||||||
: super(SpaceManagementInitial()) {
|
this._api,
|
||||||
|
this._productApi,
|
||||||
|
this._spaceModelApi,
|
||||||
|
this._spaceTreeBloc,
|
||||||
|
) : super(SpaceManagementInitial()) {
|
||||||
on<LoadCommunityAndSpacesEvent>(_onLoadCommunityAndSpaces);
|
on<LoadCommunityAndSpacesEvent>(_onLoadCommunityAndSpaces);
|
||||||
on<CreateCommunityEvent>(_onCreateCommunity);
|
on<CreateCommunityEvent>(_onCreateCommunity);
|
||||||
on<SelectCommunityEvent>(_onSelectCommunity);
|
on<SelectCommunityEvent>(_onSelectCommunity);
|
||||||
@ -44,14 +47,63 @@ class SpaceManagementBloc
|
|||||||
on<NewCommunityEvent>(_onNewCommunity);
|
on<NewCommunityEvent>(_onNewCommunity);
|
||||||
on<BlankStateEvent>(_onBlankState);
|
on<BlankStateEvent>(_onBlankState);
|
||||||
on<SpaceModelLoadEvent>(_onLoadSpaceModel);
|
on<SpaceModelLoadEvent>(_onLoadSpaceModel);
|
||||||
|
on<UpdateSpaceModelCache>(_updateSpaceModelCache);
|
||||||
|
on<DeleteSpaceModelFromCache>(_deleteSpaceModelFromCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _updateSpaceModelCache(
|
||||||
|
UpdateSpaceModelCache event, Emitter<SpaceManagementState> 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<SpaceManagementState> 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) {
|
void _logEvent(String eventName) {
|
||||||
log('Event Triggered: $eventName');
|
log('Event Triggered: $eventName');
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<SpaceTemplateModel>> fetchSpaceModels(
|
void updateCachedSpaceModels(List<SpaceTemplateModel> updatedModels) {
|
||||||
SpaceManagementState previousState) async {
|
_cachedSpaceModels = List.from(updatedModels);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addToCachedSpaceModels(SpaceTemplateModel newModel) {
|
||||||
|
_cachedSpaceModels?.add(newModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<SpaceTemplateModel>> fetchSpaceModels() async {
|
||||||
try {
|
try {
|
||||||
if (_cachedSpaceModels != null) {
|
if (_cachedSpaceModels != null) {
|
||||||
return _cachedSpaceModels!;
|
return _cachedSpaceModels!;
|
||||||
@ -87,7 +139,6 @@ class SpaceManagementBloc
|
|||||||
UpdateCommunityEvent event,
|
UpdateCommunityEvent event,
|
||||||
Emitter<SpaceManagementState> emit,
|
Emitter<SpaceManagementState> emit,
|
||||||
) async {
|
) async {
|
||||||
_logEvent('UpdateCommunityEvent');
|
|
||||||
|
|
||||||
final previousState = state;
|
final previousState = state;
|
||||||
try {
|
try {
|
||||||
@ -107,7 +158,7 @@ class SpaceManagementBloc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var prevSpaceModels = await fetchSpaceModels(previousState);
|
var prevSpaceModels = await fetchSpaceModels();
|
||||||
|
|
||||||
emit(SpaceManagementLoaded(
|
emit(SpaceManagementLoaded(
|
||||||
communities: updatedCommunities,
|
communities: updatedCommunities,
|
||||||
@ -161,7 +212,7 @@ class SpaceManagementBloc
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var prevSpaceModels = await fetchSpaceModels(previousState);
|
var prevSpaceModels = await fetchSpaceModels();
|
||||||
|
|
||||||
emit(BlankState(
|
emit(BlankState(
|
||||||
communities: event.communities,
|
communities: event.communities,
|
||||||
@ -181,7 +232,7 @@ class SpaceManagementBloc
|
|||||||
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
||||||
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc);
|
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc);
|
||||||
|
|
||||||
var prevSpaceModels = await fetchSpaceModels(previousState);
|
var prevSpaceModels = await fetchSpaceModels();
|
||||||
|
|
||||||
if (previousState is SpaceManagementLoaded ||
|
if (previousState is SpaceManagementLoaded ||
|
||||||
previousState is BlankState) {
|
previousState is BlankState) {
|
||||||
@ -239,7 +290,7 @@ class SpaceManagementBloc
|
|||||||
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc);
|
List<CommunityModel> communities = await _waitForCommunityList(spaceBloc);
|
||||||
|
|
||||||
// Fetch space models after communities are available
|
// Fetch space models after communities are available
|
||||||
final prevSpaceModels = await fetchSpaceModels(state);
|
final prevSpaceModels = await fetchSpaceModels();
|
||||||
emit(SpaceManagementLoaded(
|
emit(SpaceManagementLoaded(
|
||||||
communities: communities,
|
communities: communities,
|
||||||
products: _cachedProducts ?? [],
|
products: _cachedProducts ?? [],
|
||||||
@ -297,12 +348,10 @@ class SpaceManagementBloc
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
final BuildContext safeContext =
|
|
||||||
event.context; // Capture context safely before async calls
|
|
||||||
|
|
||||||
CommunityModel? newCommunity = await _api.createCommunity(
|
CommunityModel? newCommunity = await _api.createCommunity(
|
||||||
event.name, event.description, projectUuid);
|
event.name, event.description, projectUuid);
|
||||||
var prevSpaceModels = await fetchSpaceModels(previousState);
|
var prevSpaceModels = await fetchSpaceModels();
|
||||||
|
|
||||||
if (newCommunity != null) {
|
if (newCommunity != null) {
|
||||||
if (previousState is SpaceManagementLoaded ||
|
if (previousState is SpaceManagementLoaded ||
|
||||||
@ -311,12 +360,7 @@ class SpaceManagementBloc
|
|||||||
(previousState as dynamic).communities,
|
(previousState as dynamic).communities,
|
||||||
);
|
);
|
||||||
final updatedCommunities = prevCommunities..add(newCommunity);
|
final updatedCommunities = prevCommunities..add(newCommunity);
|
||||||
|
_spaceTreeBloc.add(OnCommunityAdded(newCommunity));
|
||||||
if (safeContext.mounted) {
|
|
||||||
final spaceTreeBloc = safeContext.read<
|
|
||||||
SpaceTreeBloc>(); // ✅ Read bloc only when context is mounted
|
|
||||||
spaceTreeBloc.add(OnCommunityAdded(newCommunity));
|
|
||||||
}
|
|
||||||
|
|
||||||
emit(SpaceManagementLoaded(
|
emit(SpaceManagementLoaded(
|
||||||
spaceModels: prevSpaceModels,
|
spaceModels: prevSpaceModels,
|
||||||
@ -430,7 +474,7 @@ class SpaceManagementBloc
|
|||||||
String communityUuid,
|
String communityUuid,
|
||||||
Emitter<SpaceManagementState> emit,
|
Emitter<SpaceManagementState> emit,
|
||||||
) async {
|
) async {
|
||||||
var prevSpaceModels = await fetchSpaceModels(previousState);
|
var prevSpaceModels = await fetchSpaceModels();
|
||||||
|
|
||||||
final communities = List<CommunityModel>.from(previousState.communities);
|
final communities = List<CommunityModel>.from(previousState.communities);
|
||||||
|
|
||||||
@ -629,7 +673,7 @@ class SpaceManagementBloc
|
|||||||
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
||||||
List<CommunityModel> communities = spaceBloc.state.communityList;
|
List<CommunityModel> communities = spaceBloc.state.communityList;
|
||||||
|
|
||||||
var prevSpaceModels = await fetchSpaceModels(prevState);
|
var prevSpaceModels = await fetchSpaceModels();
|
||||||
|
|
||||||
if (communities.isEmpty) {
|
if (communities.isEmpty) {
|
||||||
communities = await _api.fetchCommunities(projectUuid);
|
communities = await _api.fetchCommunities(projectUuid);
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:flutter/material.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/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 {
|
abstract class SpaceManagementEvent extends Equatable {
|
||||||
const SpaceManagementEvent();
|
const SpaceManagementEvent();
|
||||||
@ -160,3 +161,13 @@ class SpaceModelLoadEvent extends SpaceManagementEvent {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [context];
|
List<Object?> get props => [context];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UpdateSpaceModelCache extends SpaceManagementEvent {
|
||||||
|
final SpaceTemplateModel updatedModel;
|
||||||
|
UpdateSpaceModelCache(this.updatedModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeleteSpaceModelFromCache extends SpaceManagementEvent {
|
||||||
|
final String deletedUuid;
|
||||||
|
DeleteSpaceModelFromCache(this.deletedUuid);
|
||||||
|
}
|
@ -71,3 +71,4 @@ class SpaceModelLoaded extends SpaceManagementState {
|
|||||||
@override
|
@override
|
||||||
List<Object> get props => [communities, products, spaceModels];
|
List<Object> get props => [communities, products, spaceModels];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import 'dart:developer';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.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/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/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_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_event.dart';
|
import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_event.dart';
|
||||||
@ -34,6 +35,7 @@ class SpaceManagementPageState extends State<SpaceManagementPage> {
|
|||||||
_api,
|
_api,
|
||||||
_productApi,
|
_productApi,
|
||||||
_spaceModelApi,
|
_spaceModelApi,
|
||||||
|
BlocProvider.of<SpaceTreeBloc>(context),
|
||||||
)..add(LoadCommunityAndSpacesEvent(this.context)),
|
)..add(LoadCommunityAndSpacesEvent(this.context)),
|
||||||
),
|
),
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
|
Reference in New Issue
Block a user