From e1609309cf6a66dc36b29625d93059e97a64c8c9 Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Sat, 15 Feb 2025 00:36:20 +0400 Subject: [PATCH] Added `ProjectCubit` as a dependency in `blocs` for managing project-level state. --- lib/pages/auth/bloc/auth_bloc.dart | 11 +- .../device_managment_bloc.dart | 82 +++++--- .../view/device_managment_page.dart | 3 +- .../view/agreement_and_privacy_dialog.dart | 5 +- .../add_user_dialog/bloc/users_bloc.dart | 56 ++++-- .../add_user_dialog/view/add_user_dialog.dart | 3 +- .../add_user_dialog/view/build_tree_view.dart | 3 +- .../view/edit_user_dialog.dart | 3 +- .../users_table/bloc/user_table_bloc.dart | 17 +- .../view/roles_and_permission_page.dart | 3 +- .../bloc/routine_bloc/routine_bloc.dart | 181 ++++++++++++------ .../space_tree/bloc/space_tree_bloc.dart | 81 +++++--- .../bloc/space_management_bloc.dart | 99 ++++++---- .../view/spaces_management_page.dart | 9 +- .../widgets/loaded_space_widget.dart | 2 + .../bloc/create_space_model_bloc.dart | 21 +- .../space_model/bloc/space_model_bloc.dart | 16 +- .../dialog/create_space_model_dialog.dart | 6 +- lib/services/devices_mang_api.dart | 4 +- lib/services/routines_api.dart | 35 ++-- lib/services/space_mana_api.dart | 70 +++---- lib/services/space_model_mang_api.dart | 24 +-- lib/services/user_permission.dart | 32 ++-- lib/utils/constants/api_const.dart | 4 +- lib/utils/user_drop_down_menu.dart | 7 +- 25 files changed, 509 insertions(+), 268 deletions(-) diff --git a/lib/pages/auth/bloc/auth_bloc.dart b/lib/pages/auth/bloc/auth_bloc.dart index 74980c2d..13490069 100644 --- a/lib/pages/auth/bloc/auth_bloc.dart +++ b/lib/pages/auth/bloc/auth_bloc.dart @@ -9,6 +9,7 @@ import 'package:syncrow_web/pages/auth/model/login_with_email_model.dart'; import 'package:syncrow_web/pages/auth/model/region_model.dart'; import 'package:syncrow_web/pages/auth/model/token.dart'; import 'package:syncrow_web/pages/auth/model/user_model.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/services/auth_api.dart'; import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; @@ -180,7 +181,6 @@ class AuthBloc extends Bloc { return; } - if (token.accessTokenIsNotEmpty) { FlutterSecureStorage storage = const FlutterSecureStorage(); await storage.write( @@ -442,8 +442,13 @@ class AuthBloc extends Bloc { emit(LoginInitial()); } - static logout() { - const storage = FlutterSecureStorage(); + static Future logout( + BuildContext context, ProjectCubit projectCubit) async { + final storage = FlutterSecureStorage(); + + await storage.delete(key: ProjectCubit.projectKey); + + projectCubit.clearProjectUUID(); storage.deleteAll(); } } diff --git a/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart b/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart index 56b08ced..672c4d67 100644 --- a/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart +++ b/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart @@ -1,14 +1,17 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; part 'device_managment_event.dart'; part 'device_managment_state.dart'; -class DeviceManagementBloc extends Bloc { +class DeviceManagementBloc + extends Bloc { int _selectedIndex = 0; List _devices = []; int _onlineCount = 0; @@ -19,8 +22,9 @@ class DeviceManagementBloc extends Bloc(_onFetchDevices); on(_onFilterDevices); on(_onSelectedFilterChanged); @@ -31,19 +35,25 @@ class DeviceManagementBloc extends Bloc(_onUpdateSelection); } - Future _onFetchDevices(FetchDevices event, Emitter emit) async { + Future _onFetchDevices( + FetchDevices event, Emitter emit) async { emit(DeviceManagementLoading()); try { List devices = []; _devices.clear(); var spaceBloc = event.context.read(); + final projectUuid = projectCubit.state; + if (spaceBloc.state.selectedCommunities.isEmpty) { - devices = await DevicesManagementApi().fetchDevices('', ''); + devices = await DevicesManagementApi() + .fetchDevices('', '', projectUuid ?? TempConst.projectId); } else { for (var community in spaceBloc.state.selectedCommunities) { - List spacesList = spaceBloc.state.selectedCommunityAndSpaces[community] ?? []; + List spacesList = + spaceBloc.state.selectedCommunityAndSpaces[community] ?? []; for (var space in spacesList) { - devices.addAll(await DevicesManagementApi().fetchDevices(community, space)); + devices.addAll(await DevicesManagementApi().fetchDevices( + community, space, projectUuid ?? TempConst.projectId)); } } } @@ -66,7 +76,8 @@ class DeviceManagementBloc extends Bloc emit) async { + void _onFilterDevices( + FilterDevices event, Emitter emit) async { if (_devices.isNotEmpty) { _filteredDevices = List.from(_devices.where((device) { switch (event.filter) { @@ -97,7 +108,8 @@ class DeviceManagementBloc extends Bloc _onResetFilters(ResetFilters event, Emitter emit) async { + Future _onResetFilters( + ResetFilters event, Emitter emit) async { currentProductName = ''; _selectedDevices.clear(); _filteredDevices = List.from(_devices); @@ -113,7 +125,8 @@ class DeviceManagementBloc extends Bloc emit) { + void _onResetSelectedDevices( + ResetSelectedDevices event, Emitter emit) { _selectedDevices.clear(); if (state is DeviceManagementLoaded) { @@ -139,12 +152,14 @@ class DeviceManagementBloc extends Bloc emit) { + void _onSelectedFilterChanged( + SelectedFilterChanged event, Emitter emit) { _selectedIndex = event.selectedIndex; add(FilterDevices(_getFilterFromIndex(_selectedIndex))); } - void _onSelectDevice(SelectDevice event, Emitter emit) { + void _onSelectDevice( + SelectDevice event, Emitter emit) { final selectedUuid = event.selectedDevice.uuid; if (_selectedDevices.any((device) => device.uuid == selectedUuid)) { @@ -155,7 +170,8 @@ class DeviceManagementBloc extends Bloc clonedSelectedDevices = List.from(_selectedDevices); - bool isControlButtonEnabled = _checkIfControlButtonEnabled(clonedSelectedDevices); + bool isControlButtonEnabled = + _checkIfControlButtonEnabled(clonedSelectedDevices); if (state is DeviceManagementLoaded) { emit(DeviceManagementLoaded( @@ -164,7 +180,8 @@ class DeviceManagementBloc extends Bloc emit) { + void _onUpdateSelection( + UpdateSelection event, Emitter emit) { List selectedDevices = []; List devicesToSelectFrom = []; @@ -223,7 +242,8 @@ class DeviceManagementBloc extends Bloc selectedDevices) { if (selectedDevices.length > 1) { - final productTypes = selectedDevices.map((device) => device.productType).toSet(); + final productTypes = + selectedDevices.map((device) => device.productType).toSet(); return productTypes.length == 1; } else if (selectedDevices.length == 1) { return true; @@ -234,8 +254,10 @@ class DeviceManagementBloc extends Bloc device.online == true).length; _offlineCount = _devices.where((device) => device.online == false).length; - _lowBatteryCount = - _devices.where((device) => device.batteryLevel != null && device.batteryLevel! < 20).length; + _lowBatteryCount = _devices + .where((device) => + device.batteryLevel != null && device.batteryLevel! < 20) + .length; } String _getFilterFromIndex(int index) { @@ -251,7 +273,8 @@ class DeviceManagementBloc extends Bloc emit) { + void _onSearchDevices( + SearchDevices event, Emitter emit) { if ((event.community == null || event.community!.isEmpty) && (event.unitName == null || event.unitName!.isEmpty) && (event.productName == null || event.productName!.isEmpty)) { @@ -280,22 +303,33 @@ class DeviceManagementBloc extends Bloc DeviceManagementBloc()..add(FetchDevices(context)), + create: (context) => DeviceManagementBloc(context.read())..add(FetchDevices(context)), ), ], child: WebScaffold( diff --git a/lib/pages/home/view/agreement_and_privacy_dialog.dart b/lib/pages/home/view/agreement_and_privacy_dialog.dart index 67c33984..bbdb7b34 100644 --- a/lib/pages/home/view/agreement_and_privacy_dialog.dart +++ b/lib/pages/home/view/agreement_and_privacy_dialog.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/routes_const.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -162,7 +164,8 @@ class _AgreementAndPrivacyDialogState extends State { children: [ InkWell( onTap: () { - AuthBloc.logout(); + final projectCubit = BlocProvider.of(context); + AuthBloc.logout(context, projectCubit); context.go(RoutesConst.auth); }, child: const Text("Cancel"), diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart index 96e49040..73bc23f3 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart @@ -1,5 +1,6 @@ import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/custom_dialog.dart'; import 'package:syncrow_web/pages/roles_and_permission/model/edit_user_model.dart'; import 'package:syncrow_web/pages/roles_and_permission/model/role_type_model.dart'; @@ -12,9 +13,12 @@ import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model import 'package:syncrow_web/services/space_mana_api.dart'; import 'package:syncrow_web/services/user_permission.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; class UsersBloc extends Bloc { - UsersBloc() : super(UsersInitial()) { + final ProjectCubit projectCubit; + + UsersBloc(this.projectCubit) : super(UsersInitial()) { on(isCompleteBasicsFun); on(_onLoadCommunityAndSpaces); on(searchTreeNode); @@ -74,7 +78,10 @@ class UsersBloc extends Bloc { Future> _fetchSpacesForCommunity( String communityUuid) async { - return await CommunitySpaceManagementApi().getSpaceHierarchy(communityUuid); + final projectUuid = projectCubit.state; + + return await CommunitySpaceManagementApi() + .getSpaceHierarchy(communityUuid, projectUuid ?? TempConst.projectId); } List updatedCommunities = []; @@ -84,8 +91,9 @@ class UsersBloc extends Bloc { LoadCommunityAndSpacesEvent event, Emitter emit) async { try { emit(UsersLoadingState()); - List communities = - await CommunitySpaceManagementApi().fetchCommunities(); + final projectUuid = projectCubit.state; + List communities = await CommunitySpaceManagementApi() + .fetchCommunities(projectUuid ?? TempConst.projectId); communityIds = communities.map((community) => community.uuid).toList(); updatedCommunities = await Future.wait( communities.map((community) async { @@ -328,20 +336,22 @@ class UsersBloc extends Bloc { void _sendInvitUser(SendInviteUsers event, Emitter emit) async { try { + final projectUuid = projectCubit.state; + emit(UsersLoadingState()); List selectedIds = getSelectedIds(updatedCommunities) .where((id) => !communityIds.contains(id)) .toList(); bool res = await UserPermissionApi().sendInviteUser( - email: emailController.text, - firstName: firstNameController.text, - jobTitle: jobTitleController.text, - lastName: lastNameController.text, - phoneNumber: phoneController.text, - roleUuid: roleSelected, - spaceUuids: selectedIds, - ); + email: emailController.text, + firstName: firstNameController.text, + jobTitle: jobTitleController.text, + lastName: lastNameController.text, + phoneNumber: phoneController.text, + roleUuid: roleSelected, + spaceUuids: selectedIds, + projectUuid: projectUuid ?? TempConst.projectId); if (res) { showCustomDialog( @@ -376,16 +386,17 @@ class UsersBloc extends Bloc { List selectedIds = getSelectedIds(updatedCommunities) .where((id) => !communityIds.contains(id)) .toList(); + final projectUuid = projectCubit.state; bool res = await UserPermissionApi().editInviteUser( - userId: event.userId, - firstName: firstNameController.text, - jobTitle: jobTitleController.text, - lastName: lastNameController.text, - phoneNumber: phoneController.text, - roleUuid: roleSelected, - spaceUuids: selectedIds, - ); + userId: event.userId, + firstName: firstNameController.text, + jobTitle: jobTitleController.text, + lastName: lastNameController.text, + phoneNumber: phoneController.text, + roleUuid: roleSelected, + spaceUuids: selectedIds, + projectUuid: projectUuid ?? TempConst.projectId); if (res == true) { showCustomDialog( barrierDismissible: false, @@ -490,8 +501,11 @@ class UsersBloc extends Bloc { emit(UsersLoadingState()); try { + final projectUuid = projectCubit.state; + if (event.uuid?.isNotEmpty ?? false) { - final res = await UserPermissionApi().fetchUserById(event.uuid); + final res = await UserPermissionApi() + .fetchUserById(event.uuid, projectUuid ?? TempConst.projectId); if (res != null) { // Populate the text controllers diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart index 1a487830..4023f9bd 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart'; @@ -23,7 +24,7 @@ class _AddNewUserDialogState extends State { @override Widget build(BuildContext context) { return BlocProvider( - create: (BuildContext context) => UsersBloc() + create: (BuildContext context) => UsersBloc(context.read()) ..add(const LoadCommunityAndSpacesEvent()) ..add(const RoleEvent()), child: BlocConsumer( diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart index b7fc1085..d45e3482 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart'; @@ -21,7 +22,7 @@ class TreeView extends StatelessWidget { final _blocRole = BlocProvider.of(context); debugPrint('TreeView constructed with userId = $userId'); return BlocProvider( - create: (_) => UsersBloc(), + create: (_) => UsersBloc(context.read()), // ..add(const LoadCommunityAndSpacesEvent()), child: BlocConsumer( listener: (context, state) { diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart index 8b6600e0..fdf52c4d 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart'; @@ -24,7 +25,7 @@ class _EditUserDialogState extends State { @override Widget build(BuildContext context) { return BlocProvider( - create: (BuildContext context) => UsersBloc() + create: (BuildContext context) => UsersBloc(context.read()) ..add(const LoadCommunityAndSpacesEvent()) ..add(const RoleEvent()) ..add(GetUserByIdEvent(uuid: widget.userId)), diff --git a/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart b/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart index 713b03f0..2ba3130a 100644 --- a/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart +++ b/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart @@ -1,13 +1,17 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/roles_and_permission/model/roles_user_model.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/bloc/user_table_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/bloc/user_table_state.dart'; import 'package:syncrow_web/services/user_permission.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; class UserTableBloc extends Bloc { - UserTableBloc() : super(TableInitial()) { + final ProjectCubit _projectCubit; + + UserTableBloc(this._projectCubit) : super(TableInitial()) { on(_getUsers); on(_changeUserStatus); on(_toggleSortUsersByNameAsc); @@ -46,10 +50,13 @@ class UserTableBloc extends Bloc { Future _getUsers(GetUsers event, Emitter emit) async { emit(UsersLoadingState()); try { + final projectUuid = _projectCubit.state; + roleTypes.clear(); jobTitle.clear(); createdBy.clear(); - users = await UserPermissionApi().fetchUsers(); + users = await UserPermissionApi() + .fetchUsers(projectUuid ?? TempConst.projectId); users.sort((a, b) { final dateA = _parseDateTime(a.createdDate); final dateB = _parseDateTime(b.createdDate); @@ -96,9 +103,13 @@ class UserTableBloc extends Bloc { Future _changeUserStatus( ChangeUserStatus event, Emitter emit) async { try { + final projectUuid = _projectCubit.state; + emit(UsersLoadingState()); bool res = await UserPermissionApi().changeUserStatusById( - event.userId, event.newStatus == "disabled" ? false : true); + event.userId, + event.newStatus == "disabled" ? false : true, + projectUuid ?? TempConst.projectId); if (res == true) { add(const GetUsers()); } diff --git a/lib/pages/roles_and_permission/view/roles_and_permission_page.dart b/lib/pages/roles_and_permission/view/roles_and_permission_page.dart index 44944ed3..68b586bc 100644 --- a/lib/pages/roles_and_permission/view/roles_and_permission_page.dart +++ b/lib/pages/roles_and_permission/view/roles_and_permission_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_state.dart'; @@ -76,7 +77,7 @@ class RolesAndPermissionPage extends StatelessWidget { ], ), scaffoldBody: BlocProvider( - create: (context) => UserTableBloc()..add(const GetUsers()), + create: (context) => UserTableBloc(context.read())..add(const GetUsers()), child: UsersPage(), ) // _blocRole.tapSelect == false diff --git a/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart b/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart index b05229c4..3a2ef4b0 100644 --- a/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart +++ b/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/routines/models/create_scene_and_autoamtion/create_automation_model.dart'; import 'package:syncrow_web/pages/routines/models/create_scene_and_autoamtion/create_scene_model.dart'; @@ -13,6 +14,7 @@ import 'package:syncrow_web/pages/routines/models/routine_model.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; import 'package:syncrow_web/services/routines_api.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; import 'package:uuid/uuid.dart'; @@ -23,7 +25,9 @@ String spaceId = '25c96044-fadf-44bb-93c7-3c079e527ce6'; String communityId = 'aff21a57-2f91-4e5c-b99b-0182c3ab65a9'; class RoutineBloc extends Bloc { - RoutineBloc() : super(const RoutineState()) { + final ProjectCubit projectCubit; + + RoutineBloc(this.projectCubit) : super(const RoutineState()) { on(_onAddToIfContainer); on(_onAddToThenContainer); on(_onLoadScenes); @@ -54,7 +58,8 @@ class RoutineBloc extends Bloc { TriggerSwitchTabsEvent event, Emitter emit, ) { - emit(state.copyWith(routineTab: event.isRoutineTab, createRoutineView: false)); + emit(state.copyWith( + routineTab: event.isRoutineTab, createRoutineView: false)); add(ResetRoutineState()); if (event.isRoutineTab) { add(LoadScenes(spaceId, communityId)); @@ -80,8 +85,8 @@ class RoutineBloc extends Bloc { final updatedIfItems = List>.from(state.ifItems); // Find the index of the item in teh current itemsList - int index = - updatedIfItems.indexWhere((map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); + int index = updatedIfItems.indexWhere( + (map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); // Replace the map if the index is valid if (index != -1) { updatedIfItems[index] = event.item; @@ -90,18 +95,21 @@ class RoutineBloc extends Bloc { } if (event.isTabToRun) { - emit(state.copyWith(ifItems: updatedIfItems, isTabToRun: true, isAutomation: false)); + emit(state.copyWith( + ifItems: updatedIfItems, isTabToRun: true, isAutomation: false)); } else { - emit(state.copyWith(ifItems: updatedIfItems, isTabToRun: false, isAutomation: true)); + emit(state.copyWith( + ifItems: updatedIfItems, isTabToRun: false, isAutomation: true)); } } - void _onAddToThenContainer(AddToThenContainer event, Emitter emit) { + void _onAddToThenContainer( + AddToThenContainer event, Emitter emit) { final currentItems = List>.from(state.thenItems); // Find the index of the item in teh current itemsList - int index = - currentItems.indexWhere((map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); + int index = currentItems.indexWhere( + (map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); // Replace the map if the index is valid if (index != -1) { currentItems[index] = event.item; @@ -112,22 +120,26 @@ class RoutineBloc extends Bloc { emit(state.copyWith(thenItems: currentItems)); } - void _onAddFunctionsToRoutine(AddFunctionToRoutine event, Emitter emit) { + void _onAddFunctionsToRoutine( + AddFunctionToRoutine event, Emitter emit) { try { if (event.functions.isEmpty) return; - List selectedFunction = List.from(event.functions); + List selectedFunction = + List.from(event.functions); Map> currentSelectedFunctions = Map>.from(state.selectedFunctions); if (currentSelectedFunctions.containsKey(event.uniqueCustomId)) { List currentFunctions = - List.from(currentSelectedFunctions[event.uniqueCustomId] ?? []); + List.from( + currentSelectedFunctions[event.uniqueCustomId] ?? []); List functionCode = []; for (int i = 0; i < selectedFunction.length; i++) { for (int j = 0; j < currentFunctions.length; j++) { - if (selectedFunction[i].functionCode == currentFunctions[j].functionCode) { + if (selectedFunction[i].functionCode == + currentFunctions[j].functionCode) { currentFunctions[j] = selectedFunction[i]; if (!functionCode.contains(currentFunctions[j].functionCode)) { functionCode.add(currentFunctions[j].functionCode); @@ -137,13 +149,15 @@ class RoutineBloc extends Bloc { } for (int i = 0; i < functionCode.length; i++) { - selectedFunction.removeWhere((code) => code.functionCode == functionCode[i]); + selectedFunction + .removeWhere((code) => code.functionCode == functionCode[i]); } - currentSelectedFunctions[event.uniqueCustomId] = List.from(currentFunctions) - ..addAll(selectedFunction); + currentSelectedFunctions[event.uniqueCustomId] = + List.from(currentFunctions)..addAll(selectedFunction); } else { - currentSelectedFunctions[event.uniqueCustomId] = List.from(event.functions); + currentSelectedFunctions[event.uniqueCustomId] = + List.from(event.functions); } emit(state.copyWith(selectedFunctions: currentSelectedFunctions)); @@ -152,17 +166,20 @@ class RoutineBloc extends Bloc { } } - Future _onLoadScenes(LoadScenes event, Emitter emit) async { + Future _onLoadScenes( + LoadScenes event, Emitter emit) async { emit(state.copyWith(isLoading: true, errorMessage: null)); try { + final projectUuid = projectCubit.state; + spaceId = event.spaceId; communityId = event.communityId; List scenes = []; if (communityId.isNotEmpty && spaceId.isNotEmpty) { - scenes = await SceneApi.getScenes(event.spaceId, event.communityId); + scenes = await SceneApi.getScenes(event.spaceId, event.communityId, projectUuid ?? TempConst.projectId); } emit(state.copyWith( scenes: scenes, @@ -178,7 +195,8 @@ class RoutineBloc extends Bloc { } } - Future _onLoadAutomation(LoadAutomation event, Emitter emit) async { + Future _onLoadAutomation( + LoadAutomation event, Emitter emit) async { emit(state.copyWith(isLoading: true, errorMessage: null)); try { @@ -201,14 +219,16 @@ class RoutineBloc extends Bloc { } } - FutureOr _onSearchRoutines(SearchRoutines event, Emitter emit) async { + FutureOr _onSearchRoutines( + SearchRoutines event, Emitter emit) async { emit(state.copyWith(isLoading: true, errorMessage: null)); await Future.delayed(const Duration(seconds: 1)); emit(state.copyWith(isLoading: false, errorMessage: null)); emit(state.copyWith(searchText: event.query)); } - FutureOr _onAddSelectedIcon(AddSelectedIcon event, Emitter emit) { + FutureOr _onAddSelectedIcon( + AddSelectedIcon event, Emitter emit) { emit(state.copyWith(selectedIcon: event.icon)); } @@ -222,7 +242,8 @@ class RoutineBloc extends Bloc { return actions.last['deviceId'] == 'delay'; } - Future _onCreateScene(CreateSceneEvent event, Emitter emit) async { + Future _onCreateScene( + CreateSceneEvent event, Emitter emit) async { try { // Check if first action is delay // if (_isFirstActionDelay(state.thenItems)) { @@ -235,7 +256,8 @@ class RoutineBloc extends Bloc { if (_isLastActionDelay(state.thenItems)) { emit(state.copyWith( - errorMessage: 'A delay condition cannot be the only or the last action', + errorMessage: + 'A delay condition cannot be the only or the last action', isLoading: false, )); return; @@ -308,7 +330,8 @@ class RoutineBloc extends Bloc { } } - Future _onCreateAutomation(CreateAutomationEvent event, Emitter emit) async { + Future _onCreateAutomation( + CreateAutomationEvent event, Emitter emit) async { try { if (state.routineName == null || state.routineName!.isEmpty) { emit(state.copyWith( @@ -329,7 +352,8 @@ class RoutineBloc extends Bloc { if (_isLastActionDelay(state.thenItems)) { emit(state.copyWith( - errorMessage: 'A delay condition cannot be the only or the last action', + errorMessage: + 'A delay condition cannot be the only or the last action', isLoading: false, )); CustomSnackBar.redSnackBar('Cannot have delay as the last action'); @@ -439,17 +463,21 @@ class RoutineBloc extends Bloc { } } - FutureOr _onRemoveDragCard(RemoveDragCard event, Emitter emit) { + FutureOr _onRemoveDragCard( + RemoveDragCard event, Emitter emit) { if (event.isFromThen) { final thenItems = List>.from(state.thenItems); - final selectedFunctions = Map>.from(state.selectedFunctions); + final selectedFunctions = + Map>.from(state.selectedFunctions); thenItems.removeAt(event.index); selectedFunctions.remove(event.key); - emit(state.copyWith(thenItems: thenItems, selectedFunctions: selectedFunctions)); + emit(state.copyWith( + thenItems: thenItems, selectedFunctions: selectedFunctions)); } else { final ifItems = List>.from(state.ifItems); - final selectedFunctions = Map>.from(state.selectedFunctions); + final selectedFunctions = + Map>.from(state.selectedFunctions); ifItems.removeAt(event.index); selectedFunctions.remove(event.key); @@ -460,7 +488,8 @@ class RoutineBloc extends Bloc { isAutomation: false, isTabToRun: false)); } else { - emit(state.copyWith(ifItems: ifItems, selectedFunctions: selectedFunctions)); + emit(state.copyWith( + ifItems: ifItems, selectedFunctions: selectedFunctions)); } } } @@ -472,18 +501,23 @@ class RoutineBloc extends Bloc { )); } - FutureOr _onEffectiveTimeEvent(EffectiveTimePeriodEvent event, Emitter emit) { + FutureOr _onEffectiveTimeEvent( + EffectiveTimePeriodEvent event, Emitter emit) { emit(state.copyWith(effectiveTime: event.effectiveTime)); } - FutureOr _onSetRoutineName(SetRoutineName event, Emitter emit) { + FutureOr _onSetRoutineName( + SetRoutineName event, Emitter emit) { emit(state.copyWith( routineName: event.name, )); } - (List>, List>, Map>) - _createCardData( + ( + List>, + List>, + Map> + ) _createCardData( List actions, List? conditions, Map> currentFunctions, @@ -516,7 +550,8 @@ class RoutineBloc extends Bloc { 'deviceId': condition.entityId, 'title': matchingDevice.name ?? condition.entityId, 'productType': condition.entityType, - 'imagePath': matchingDevice.getDefaultIcon(condition.entityType), + 'imagePath': + matchingDevice.getDefaultIcon(condition.entityType), }; final functions = matchingDevice.functions; @@ -552,8 +587,11 @@ class RoutineBloc extends Bloc { final cardData = { 'entityId': action.entityId, 'uniqueCustomId': const Uuid().v4(), - 'deviceId': action.actionExecutor == 'delay' ? 'delay' : action.entityId, - 'title': action.actionExecutor == 'delay' ? 'Delay' : (matchingDevice.name ?? 'Device'), + 'deviceId': + action.actionExecutor == 'delay' ? 'delay' : action.entityId, + 'title': action.actionExecutor == 'delay' + ? 'Delay' + : (matchingDevice.name ?? 'Device'), 'productType': action.productType, 'imagePath': matchingDevice.getDefaultIcon(action.productType), }; @@ -596,7 +634,8 @@ class RoutineBloc extends Bloc { return (thenItems, ifItems, currentFunctions); } - Future _onGetSceneDetails(GetSceneDetails event, Emitter emit) async { + Future _onGetSceneDetails( + GetSceneDetails event, Emitter emit) async { try { emit(state.copyWith( isLoading: true, @@ -644,10 +683,12 @@ class RoutineBloc extends Bloc { if (!deviceCards.containsKey(deviceId)) { deviceCards[deviceId] = { 'entityId': action.entityId, - 'deviceId': action.actionExecutor == 'delay' ? 'delay' : action.entityId, - 'uniqueCustomId': action.type == 'automation' || action.actionExecutor == 'delay' - ? const Uuid().v4() - : action.entityId, + 'deviceId': + action.actionExecutor == 'delay' ? 'delay' : action.entityId, + 'uniqueCustomId': + action.type == 'automation' || action.actionExecutor == 'delay' + ? const Uuid().v4() + : action.entityId, 'title': action.actionExecutor == 'delay' ? 'Delay' : action.type == 'automation' @@ -682,7 +723,8 @@ class RoutineBloc extends Bloc { ), ); // emit(state.copyWith(automationActionExecutor: action.actionExecutor)); - } else if (action.executorProperty != null && action.actionExecutor != 'delay') { + } else if (action.executorProperty != null && + action.actionExecutor != 'delay') { if (!updatedFunctions.containsKey(uniqueCustomId)) { updatedFunctions[uniqueCustomId] = []; } @@ -754,7 +796,8 @@ class RoutineBloc extends Bloc { } } - FutureOr _onResetRoutineState(ResetRoutineState event, Emitter emit) { + FutureOr _onResetRoutineState( + ResetRoutineState event, Emitter emit) { emit(state.copyWith( ifItems: [], thenItems: [], @@ -784,7 +827,8 @@ class RoutineBloc extends Bloc { if (state.isTabToRun) { SceneApi.deleteScene(unitUuid: spaceId, sceneId: state.sceneId ?? ''); } else { - SceneApi.deleteAutomation(unitUuid: spaceId, automationId: state.automationId ?? ''); + SceneApi.deleteAutomation( + unitUuid: spaceId, automationId: state.automationId ?? ''); } add(LoadScenes(spaceId, communityId)); @@ -813,10 +857,13 @@ class RoutineBloc extends Bloc { // } // } - FutureOr _fetchDevices(FetchDevicesInRoutine event, Emitter emit) async { + FutureOr _fetchDevices( + FetchDevicesInRoutine event, Emitter emit) async { emit(state.copyWith(isLoading: true)); try { - final devices = await DevicesManagementApi().fetchDevices('', ''); + final projectUuid = projectCubit.state; + final devices = await DevicesManagementApi() + .fetchDevices('', '', projectUuid ?? TempConst.projectId); emit(state.copyWith(isLoading: false, devices: devices)); } catch (e) { @@ -824,7 +871,8 @@ class RoutineBloc extends Bloc { } } - FutureOr _onUpdateScene(UpdateScene event, Emitter emit) async { + FutureOr _onUpdateScene( + UpdateScene event, Emitter emit) async { try { // Check if first action is delay // if (_isFirstActionDelay(state.thenItems)) { @@ -838,7 +886,8 @@ class RoutineBloc extends Bloc { if (_isLastActionDelay(state.thenItems)) { emit(state.copyWith( - errorMessage: 'A delay condition cannot be the only or the last action', + errorMessage: + 'A delay condition cannot be the only or the last action', isLoading: false, )); return; @@ -891,7 +940,8 @@ class RoutineBloc extends Bloc { actions: actions, ); - final result = await SceneApi.updateScene(createSceneModel, state.sceneId ?? ''); + final result = + await SceneApi.updateScene(createSceneModel, state.sceneId ?? ''); if (result['success']) { add(ResetRoutineState()); add(LoadScenes(spaceId, communityId)); @@ -910,7 +960,8 @@ class RoutineBloc extends Bloc { } } - FutureOr _onUpdateAutomation(UpdateAutomation event, Emitter emit) async { + FutureOr _onUpdateAutomation( + UpdateAutomation event, Emitter emit) async { try { if (state.routineName == null || state.routineName!.isEmpty) { emit(state.copyWith( @@ -1018,8 +1069,8 @@ class RoutineBloc extends Bloc { actions: actions, ); - final result = - await SceneApi.updateAutomation(createAutomationModel, state.automationId ?? ''); + final result = await SceneApi.updateAutomation( + createAutomationModel, state.automationId ?? ''); if (result['success']) { add(ResetRoutineState()); @@ -1052,7 +1103,8 @@ class RoutineBloc extends Bloc { thenItems: [], )); - final automationDetails = await SceneApi.getAutomationDetails(event.automationId); + final automationDetails = + await SceneApi.getAutomationDetails(event.automationId); final Map> deviceIfCards = {}; final Map> deviceThenCards = {}; @@ -1120,13 +1172,15 @@ class RoutineBloc extends Bloc { ), ); - final deviceId = - action.actionExecutor == 'delay' ? '${action.entityId}_delay' : action.entityId; + final deviceId = action.actionExecutor == 'delay' + ? '${action.entityId}_delay' + : action.entityId; if (!deviceThenCards.containsKey(deviceId)) { deviceThenCards[deviceId] = { 'entityId': action.entityId, - 'deviceId': action.actionExecutor == 'delay' ? 'delay' : action.entityId, + 'deviceId': + action.actionExecutor == 'delay' ? 'delay' : action.entityId, 'uniqueCustomId': const Uuid().v4(), 'title': action.actionExecutor == 'delay' ? 'Delay' @@ -1157,7 +1211,8 @@ class RoutineBloc extends Bloc { updatedFunctions[uniqueCustomId] = []; } - if (action.executorProperty != null && action.actionExecutor != 'delay') { + if (action.executorProperty != null && + action.actionExecutor != 'delay') { final functions = matchingDevice.functions; final functionCode = action.executorProperty!.functionCode; for (var function in functions) { @@ -1199,10 +1254,14 @@ class RoutineBloc extends Bloc { } } - final ifItems = deviceIfCards.values.where((card) => card['type'] == 'condition').toList(); + final ifItems = deviceIfCards.values + .where((card) => card['type'] == 'condition') + .toList(); final thenItems = deviceThenCards.values .where((card) => - card['type'] == 'action' || card['type'] == 'automation' || card['type'] == 'scene') + card['type'] == 'action' || + card['type'] == 'automation' || + card['type'] == 'scene') .toList(); emit(state.copyWith( diff --git a/lib/pages/space_tree/bloc/space_tree_bloc.dart b/lib/pages/space_tree/bloc/space_tree_bloc.dart index 6ac0c0d9..2cb39fc8 100644 --- a/lib/pages/space_tree/bloc/space_tree_bloc.dart +++ b/lib/pages/space_tree/bloc/space_tree_bloc.dart @@ -1,15 +1,18 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.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/space_model.dart'; import 'package:syncrow_web/services/space_mana_api.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; class SpaceTreeBloc extends Bloc { String selectedCommunityId = 'aff21a57-2f91-4e5c-b99b-0182c3ab65a9'; String selectedSpaceId = '25c96044-fadf-44bb-93c7-3c079e527ce6'; + final ProjectCubit projectCubit; - SpaceTreeBloc() : super(const SpaceTreeState()) { + SpaceTreeBloc(this.projectCubit) : super(const SpaceTreeState()) { on(_fetchSpaces); on(_onCommunityExpanded); on(_onSpaceExpanded); @@ -21,12 +24,16 @@ class SpaceTreeBloc extends Bloc { _fetchSpaces(InitialEvent event, Emitter emit) async { emit(SpaceTreeLoadingState()); try { - List communities = await CommunitySpaceManagementApi().fetchCommunities(); + final projectUuid = projectCubit.state; + + List communities = await CommunitySpaceManagementApi() + .fetchCommunities(projectUuid ?? TempConst.projectId); List updatedCommunities = await Future.wait( communities.map((community) async { - List spaces = - await CommunitySpaceManagementApi().getSpaceHierarchy(community.uuid); + List spaces = await CommunitySpaceManagementApi() + .getSpaceHierarchy( + community.uuid, projectUuid ?? TempConst.projectId); return CommunityModel( uuid: community.uuid, @@ -41,15 +48,19 @@ class SpaceTreeBloc extends Bloc { ); emit(state.copyWith( - communitiesList: updatedCommunities, expandedCommunity: [], expandedSpaces: [])); + communitiesList: updatedCommunities, + expandedCommunity: [], + expandedSpaces: [])); } catch (e) { emit(SpaceTreeErrorState('Error loading communities and spaces: $e')); } } - _onCommunityExpanded(OnCommunityExpanded event, Emitter emit) async { + _onCommunityExpanded( + OnCommunityExpanded event, Emitter emit) async { try { - List updatedExpandedCommunityList = List.from(state.expandedCommunities); + List updatedExpandedCommunityList = + List.from(state.expandedCommunities); if (updatedExpandedCommunityList.contains(event.communityId)) { updatedExpandedCommunityList.remove(event.communityId); @@ -81,13 +92,17 @@ class SpaceTreeBloc extends Bloc { } } - _onCommunitySelected(OnCommunitySelected event, Emitter emit) async { + _onCommunitySelected( + OnCommunitySelected event, Emitter emit) async { try { List updatedSelectedCommunities = List.from(state.selectedCommunities.toSet().toList()); - List updatedSelectedSpaces = List.from(state.selectedSpaces.toSet().toList()); - List updatedSoldChecks = List.from(state.soldCheck.toSet().toList()); - Map> communityAndSpaces = Map.from(state.selectedCommunityAndSpaces); + List updatedSelectedSpaces = + List.from(state.selectedSpaces.toSet().toList()); + List updatedSoldChecks = + List.from(state.soldCheck.toSet().toList()); + Map> communityAndSpaces = + Map.from(state.selectedCommunityAndSpaces); List childrenIds = _getAllChildIds(event.children); @@ -118,9 +133,12 @@ class SpaceTreeBloc extends Bloc { try { List updatedSelectedCommunities = List.from(state.selectedCommunities.toSet().toList()); - List updatedSelectedSpaces = List.from(state.selectedSpaces.toSet().toList()); - List updatedSoldChecks = List.from(state.soldCheck.toSet().toList()); - Map> communityAndSpaces = Map.from(state.selectedCommunityAndSpaces); + List updatedSelectedSpaces = + List.from(state.selectedSpaces.toSet().toList()); + List updatedSoldChecks = + List.from(state.soldCheck.toSet().toList()); + Map> communityAndSpaces = + Map.from(state.selectedCommunityAndSpaces); List childrenIds = _getAllChildIds(event.children); bool isChildSelected = false; @@ -140,9 +158,11 @@ class SpaceTreeBloc extends Bloc { updatedSelectedSpaces.addAll(childrenIds); } - List spaces = _getThePathToChild(event.communityId, event.spaceId); + List spaces = + _getThePathToChild(event.communityId, event.spaceId); for (String space in spaces) { - if (!updatedSelectedSpaces.contains(space) && !updatedSoldChecks.contains(space)) { + if (!updatedSelectedSpaces.contains(space) && + !updatedSoldChecks.contains(space)) { updatedSoldChecks.add(space); } } @@ -161,7 +181,8 @@ class SpaceTreeBloc extends Bloc { } updatedSoldChecks.remove(event.spaceId); - List parents = _getThePathToChild(event.communityId, event.spaceId); + List parents = + _getThePathToChild(event.communityId, event.spaceId); if (!_parentSelected(parents, updatedSelectedSpaces)) { updatedSoldChecks.removeWhere(parents.contains); } @@ -200,16 +221,18 @@ class SpaceTreeBloc extends Bloc { // Filter communities and expand only those that match the query filteredCommunity = communities.where((community) { - final containsQueryInCommunity = - community.name.toLowerCase().contains(event.searchQuery.toLowerCase()); - final containsQueryInSpaces = - community.spaces.any((space) => _containsQuery(space, event.searchQuery.toLowerCase())); + final containsQueryInCommunity = community.name + .toLowerCase() + .contains(event.searchQuery.toLowerCase()); + final containsQueryInSpaces = community.spaces.any( + (space) => _containsQuery(space, event.searchQuery.toLowerCase())); return containsQueryInCommunity || containsQueryInSpaces; }).toList(); emit(state.copyWith( - filteredCommunity: filteredCommunity, isSearching: event.searchQuery.isNotEmpty)); + filteredCommunity: filteredCommunity, + isSearching: event.searchQuery.isNotEmpty)); } catch (e) { emit(const SpaceTreeErrorState('Something went wrong')); } @@ -218,8 +241,8 @@ class SpaceTreeBloc extends Bloc { // Helper function to determine if any space or its children match the search query bool _containsQuery(SpaceModel space, String query) { final matchesSpace = space.name.toLowerCase().contains(query); - final matchesChildren = - space.children.any((child) => _containsQuery(child, query)); // Recursive check for children + final matchesChildren = space.children.any((child) => + _containsQuery(child, query)); // Recursive check for children return matchesSpace || matchesChildren; } @@ -233,14 +256,15 @@ class SpaceTreeBloc extends Bloc { return ids; } - bool _anySpacesSelectedInCommunity( - String communityId, List selectedSpaces, List partialCheckedList) { + bool _anySpacesSelectedInCommunity(String communityId, + List selectedSpaces, List partialCheckedList) { bool result = false; for (var community in state.communityList) { if (community.uuid == communityId) { List ids = _getAllChildIds(community.spaces); for (var id in ids) { - result = selectedSpaces.contains(id) || partialCheckedList.contains(id); + result = + selectedSpaces.contains(id) || partialCheckedList.contains(id); if (result) { return result; } @@ -267,7 +291,8 @@ class SpaceTreeBloc extends Bloc { return ids; } - List _getAllParentsIds(SpaceModel child, String spaceId, List listIds) { + List _getAllParentsIds( + SpaceModel child, String spaceId, List listIds) { List ids = listIds; ids.add(child.uuid ?? ''); 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 ee6018e6..fdbdef88 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,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.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'; @@ -14,16 +15,19 @@ import 'package:syncrow_web/services/product_api.dart'; import 'package:syncrow_web/services/space_mana_api.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; import 'package:syncrow_web/utils/constants/action_enum.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; class SpaceManagementBloc extends Bloc { final CommunitySpaceManagementApi _api; final ProductApi _productApi; final SpaceModelManagementApi _spaceModelApi; + final ProjectCubit projectCubit; List? _cachedProducts; - SpaceManagementBloc(this._api, this._productApi, this._spaceModelApi) + SpaceManagementBloc( + this._api, this._productApi, this._spaceModelApi, this.projectCubit) : super(SpaceManagementInitial()) { on(_onLoadCommunityAndSpaces); on(_onUpdateSpacePosition); @@ -45,9 +49,11 @@ class SpaceManagementBloc ) async { final previousState = state; try { + final projectUuid = projectCubit.state; + emit(SpaceManagementLoading()); - final success = - await _api.updateCommunity(event.communityUuid, event.name); + final success = await _api.updateCommunity( + event.communityUuid, event.name, projectUuid ?? TempConst.projectId); if (success) { if (previousState is SpaceManagementLoaded) { final updatedCommunities = @@ -79,6 +85,8 @@ class SpaceManagementBloc Future> fetchSpaceModels( SpaceManagementState previousState) async { try { + final projectUuid = projectCubit.state; + List allSpaces = []; List prevSpaceModels = []; @@ -95,7 +103,8 @@ class SpaceManagementBloc int page = 1; while (hasNext) { - final spaces = await _spaceModelApi.listSpaceModels(page: page); + final spaces = await _spaceModelApi.listSpaceModels( + page: page, projectId: projectUuid ?? TempConst.projectId); if (spaces.isNotEmpty) { allSpaces.addAll(spaces); page++; @@ -103,7 +112,8 @@ class SpaceManagementBloc hasNext = false; } } - prevSpaceModels = await _spaceModelApi.listSpaceModels(page: 1); + prevSpaceModels = await _spaceModelApi.listSpaceModels( + page: 1, projectId: projectUuid ?? TempConst.projectId); } return allSpaces; @@ -132,7 +142,10 @@ class SpaceManagementBloc Future> _fetchSpacesForCommunity( String communityUuid) async { - return await _api.getSpaceHierarchy(communityUuid); + final projectUuid = projectCubit.state; + + return await _api.getSpaceHierarchy( + communityUuid, projectUuid ?? TempConst.projectId); } Future _onNewCommunity( @@ -163,6 +176,8 @@ class SpaceManagementBloc BlankStateEvent event, Emitter emit) async { try { final previousState = state; + final projectUuid = projectCubit.state; + var prevSpaceModels = await fetchSpaceModels(previousState); if (previousState is SpaceManagementLoaded || @@ -176,7 +191,8 @@ class SpaceManagementBloc return; } - final communities = await _api.fetchCommunities(); + final communities = + await _api.fetchCommunities(projectUuid ?? TempConst.projectId); final updatedCommunities = await Future.wait(communities.map((community) async { final spaces = await _fetchSpacesForCommunity(community.uuid); @@ -209,8 +225,11 @@ class SpaceManagementBloc var prevState = state; emit(SpaceManagementLoading()); try { + final projectUuid = projectCubit.state; + _onloadProducts(); - List communities = await _api.fetchCommunities(); + List communities = + await _api.fetchCommunities(projectUuid ?? TempConst.projectId); List updatedCommunities = await Future.wait( communities.map((community) async { @@ -244,8 +263,10 @@ class SpaceManagementBloc ) async { try { emit(SpaceManagementLoading()); + final projectUuid = projectCubit.state; - final success = await _api.deleteCommunity(event.communityUuid); + final success = await _api.deleteCommunity( + event.communityUuid, projectUuid ?? TempConst.projectId); if (success) { add(LoadCommunityAndSpacesEvent()); } else { @@ -270,8 +291,9 @@ class SpaceManagementBloc emit(SpaceManagementLoading()); try { - CommunityModel? newCommunity = - await _api.createCommunity(event.name, event.description); + final projectUuid = projectCubit.state; + CommunityModel? newCommunity = await _api.createCommunity( + event.name, event.description, projectUuid ?? TempConst.projectId); var prevSpaceModels = await fetchSpaceModels(previousState); if (newCommunity != null) { @@ -414,6 +436,7 @@ class SpaceManagementBloc Future> saveSpacesHierarchically( List spaces, String communityUuid) async { final orderedSpaces = flattenHierarchy(spaces); + final projectUuid = projectCubit.state; final parentsToDelete = orderedSpaces.where((space) => space.status == SpaceStatus.deleted && @@ -422,7 +445,8 @@ class SpaceManagementBloc for (var parent in parentsToDelete) { try { if (parent.uuid != null) { - await _api.deleteSpace(communityUuid, parent.uuid!); + await _api.deleteSpace( + communityUuid, parent.uuid!, projectUuid ?? TempConst.projectId); } } catch (e) { rethrow; @@ -435,7 +459,8 @@ class SpaceManagementBloc if (space.uuid != null && space.uuid!.isNotEmpty) { List tagUpdates = []; - final prevSpace = await _api.getSpace(communityUuid, space.uuid!); + final prevSpace = await _api.getSpace( + communityUuid, space.uuid!, projectUuid ?? TempConst.projectId); final List subspaceUpdates = []; final List? prevSubspaces = prevSpace?.subspaces; final List? newSubspaces = space.subspaces; @@ -504,17 +529,17 @@ class SpaceManagementBloc } final response = await _api.updateSpace( - communityId: communityUuid, - spaceId: space.uuid!, - name: space.name, - parentId: space.parent?.uuid, - isPrivate: space.isPrivate, - position: space.position, - icon: space.icon, - subspaces: subspaceUpdates, - tags: tagUpdates, - direction: space.incomingConnection?.direction, - ); + communityId: communityUuid, + spaceId: space.uuid!, + name: space.name, + parentId: space.parent?.uuid, + isPrivate: space.isPrivate, + position: space.position, + icon: space.icon, + subspaces: subspaceUpdates, + tags: tagUpdates, + direction: space.incomingConnection?.direction, + projectId: projectUuid ?? TempConst.projectId); } else { // Call create if the space does not have a UUID final List tagBodyModels = space.tags != null @@ -533,17 +558,17 @@ class SpaceManagementBloc []; final response = await _api.createSpace( - communityId: communityUuid, - name: space.name, - parentId: space.parent?.uuid, - isPrivate: space.isPrivate, - position: space.position, - icon: space.icon, - direction: space.incomingConnection?.direction, - spaceModelUuid: space.spaceModel?.uuid, - tags: tagBodyModels, - subspaces: createSubspaceBodyModels, - ); + communityId: communityUuid, + name: space.name, + parentId: space.parent?.uuid, + isPrivate: space.isPrivate, + position: space.position, + icon: space.icon, + direction: space.incomingConnection?.direction, + spaceModelUuid: space.spaceModel?.uuid, + tags: tagBodyModels, + subspaces: createSubspaceBodyModels, + projectId: projectUuid ?? TempConst.projectId); space.uuid = response?.uuid; } } catch (e) { @@ -583,8 +608,10 @@ class SpaceManagementBloc emit(SpaceManagementLoading()); try { var prevState = state; + final projectUuid = projectCubit.state; - List communities = await _api.fetchCommunities(); + List communities = + await _api.fetchCommunities(projectUuid ?? TempConst.projectId); List updatedCommunities = await Future.wait( communities.map((community) async { 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 3abab9cc..4d03d11f 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 @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.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'; @@ -28,8 +29,12 @@ class SpaceManagementPageState extends State { return MultiBlocProvider( providers: [ BlocProvider( - create: (_) => SpaceManagementBloc(_api, _productApi, _spaceModelApi) - ..add(LoadCommunityAndSpacesEvent()), + create: (_) => SpaceManagementBloc( + _api, + _productApi, + _spaceModelApi, + context.read(), + )..add(LoadCommunityAndSpacesEvent()), ), BlocProvider( create: (_) => CenterBodyBloc(), diff --git a/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart b/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart index d66970e6..626052cb 100644 --- a/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart +++ b/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; @@ -87,6 +88,7 @@ class _LoadedSpaceViewState extends State { child: BlocProvider( create: (context) => SpaceModelBloc( api: SpaceModelManagementApi(), + projectCubit: context.read(), initialSpaceModels: _spaceModels, ), child: SpaceModelPage( diff --git a/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart b/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart index 36efaaa5..bb609084 100644 --- a/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart +++ b/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/create_space_template_body_model.dart'; @@ -8,16 +9,20 @@ import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_model import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_update_model.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; import 'package:syncrow_web/utils/constants/action_enum.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; class CreateSpaceModelBloc extends Bloc { SpaceTemplateModel? _space; final SpaceModelManagementApi _api; + final ProjectCubit _projectCubit; - CreateSpaceModelBloc(this._api) : super(CreateSpaceModelInitial()) { + CreateSpaceModelBloc(this._api, this._projectCubit) + : super(CreateSpaceModelInitial()) { on((event, emit) async { try { + final projectUuid = _projectCubit.state; late SpaceTemplateModel spaceTemplate = event.spaceTemplate; final tagBodyModels = @@ -40,7 +45,8 @@ class CreateSpaceModelBloc tags: tagBodyModels, subspaceModels: subspaceTemplateBodyModels); - final newSpaceTemplate = await _api.createSpaceModel(spaceModelBody); + final newSpaceTemplate = await _api.createSpaceModel( + spaceModelBody, projectUuid ?? TempConst.projectId); spaceTemplate.uuid = newSpaceTemplate?.uuid ?? ''; if (newSpaceTemplate != null) { @@ -201,9 +207,12 @@ class CreateSpaceModelBloc on((event, emit) async { try { + final projectUuid = _projectCubit.state; + if (event.spaceTemplate.uuid != null) { - final prevSpaceModel = - await _api.getSpaceModel(event.spaceTemplate.uuid ?? ''); + final prevSpaceModel = await _api.getSpaceModel( + event.spaceTemplate.uuid ?? '', + projectUuid ?? TempConst.projectId); final newSpaceModel = event.updatedSpaceTemplate; String? spaceModelName; @@ -286,8 +295,8 @@ class CreateSpaceModelBloc tags: tagUpdates, subspaceModels: subspaceUpdates); - final res = await _api.updateSpaceModel( - spaceModelBody, prevSpaceModel?.uuid ?? ''); + final res = await _api.updateSpaceModel(spaceModelBody, + prevSpaceModel?.uuid ?? '', projectUuid ?? TempConst.projectId); if (res != null) { emit(CreateSpaceModelLoaded(newSpaceModel)); diff --git a/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart b/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart index 090dfa13..4464a829 100644 --- a/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart +++ b/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart @@ -1,14 +1,18 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; class SpaceModelBloc extends Bloc { final SpaceModelManagementApi api; + final ProjectCubit projectCubit; SpaceModelBloc({ required this.api, + required this.projectCubit, required List initialSpaceModels, }) : super(SpaceModelLoaded(spaceModels: initialSpaceModels)) { on(_onCreateSpaceModel); @@ -18,10 +22,12 @@ class SpaceModelBloc extends Bloc { Future _onCreateSpaceModel( CreateSpaceModel event, Emitter emit) async { final currentState = state; + if (currentState is SpaceModelLoaded) { try { - final newSpaceModel = - await api.getSpaceModel(event.newSpaceModel.uuid ?? ''); + final projectUuid = projectCubit.state; + final newSpaceModel = await api.getSpaceModel( + event.newSpaceModel.uuid ?? '', projectUuid ?? TempConst.projectId); if (newSpaceModel != null) { final updatedSpaceModels = @@ -40,8 +46,10 @@ class SpaceModelBloc extends Bloc { final currentState = state; if (currentState is SpaceModelLoaded) { try { - final newSpaceModel = - await api.getSpaceModel(event.spaceModelUuid ?? ''); + final projectUuid = projectCubit.state; + + final newSpaceModel = await api.getSpaceModel( + event.spaceModelUuid ?? '', projectUuid ?? TempConst.projectId); if (newSpaceModel != null) { final updatedSpaceModels = currentState.spaceModels.map((model) { return model.uuid == event.spaceModelUuid ? newSpaceModel : model; diff --git a/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart b/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart index dd41903e..5beb1fc1 100644 --- a/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart +++ b/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/buttons/cancel_button.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; @@ -50,7 +51,10 @@ class CreateSpaceModelDialog extends StatelessWidget { width: screenWidth * 0.3, child: BlocProvider( create: (_) { - final bloc = CreateSpaceModelBloc(_spaceModelApi); + final bloc = CreateSpaceModelBloc( + _spaceModelApi, + context.read(), + ); if (spaceModel != null) { bloc.add(UpdateSpaceTemplate(spaceModel!, otherSpaceModels)); } else { diff --git a/lib/services/devices_mang_api.dart b/lib/services/devices_mang_api.dart index 1a8b979e..d671038f 100644 --- a/lib/services/devices_mang_api.dart +++ b/lib/services/devices_mang_api.dart @@ -12,14 +12,14 @@ import 'package:syncrow_web/utils/constants/api_const.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; class DevicesManagementApi { - Future> fetchDevices(String communityId, String spaceId) async { + Future> fetchDevices(String communityId, String spaceId, String projectId) async { try { final response = await HTTPService().get( path: communityId.isNotEmpty && spaceId.isNotEmpty ? ApiEndpoints.getSpaceDevices .replaceAll('{spaceUuid}', spaceId) .replaceAll('{communityUuid}', communityId) - .replaceAll('{projectId}', TempConst.projectId) + .replaceAll('{projectId}', projectId) : ApiEndpoints.getAllDevices, showServerMessage: true, expectedResponseModel: (json) { diff --git a/lib/services/routines_api.dart b/lib/services/routines_api.dart index aae7c453..9360820c 100644 --- a/lib/services/routines_api.dart +++ b/lib/services/routines_api.dart @@ -12,7 +12,8 @@ class SceneApi { static final HTTPService _httpService = HTTPService(); // //create scene - static Future> createScene(CreateSceneModel createSceneModel) async { + static Future> createScene( + CreateSceneModel createSceneModel) async { try { debugPrint('create scene model: ${createSceneModel.toMap()}'); final response = await _httpService.post( @@ -69,14 +70,15 @@ class SceneApi { //get scenes by community id and space id - static Future> getScenes(String spaceId, String communityId, + static Future> getScenes( + String spaceId, String communityId, String projectId, {showInDevice = false}) async { try { final response = await _httpService.get( path: ApiEndpoints.getUnitScenes .replaceAll('{spaceUuid}', spaceId) .replaceAll('{communityUuid}', communityId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), queryParameters: {'showInHomePage': showInDevice}, showServerMessage: false, expectedResponseModel: (json) { @@ -100,7 +102,8 @@ class SceneApi { static Future> getAutomation(String spaceId) async { try { final response = await _httpService.get( - path: ApiEndpoints.getSpaceAutomation.replaceAll('{spaceUuid}', spaceId), + path: + ApiEndpoints.getSpaceAutomation.replaceAll('{spaceUuid}', spaceId), showServerMessage: false, expectedResponseModel: (json) { List scenes = []; @@ -130,10 +133,12 @@ class SceneApi { // } //automation details - static Future getAutomationDetails(String automationId) async { + static Future getAutomationDetails( + String automationId) async { try { final response = await _httpService.get( - path: ApiEndpoints.getAutomationDetails.replaceAll('{automationId}', automationId), + path: ApiEndpoints.getAutomationDetails + .replaceAll('{automationId}', automationId), showServerMessage: false, expectedResponseModel: (json) => RoutineDetailsModel.fromMap(json), ); @@ -148,7 +153,8 @@ class SceneApi { try { final response = await _httpService.put( path: ApiEndpoints.updateScene.replaceAll('{sceneId}', sceneId), - body: createSceneModel.toJson(sceneId.isNotEmpty == true ? sceneId : null), + body: createSceneModel + .toJson(sceneId.isNotEmpty == true ? sceneId : null), expectedResponseModel: (json) { return json; }, @@ -160,11 +166,14 @@ class SceneApi { } //update automation - static updateAutomation(CreateAutomationModel createAutomationModel, String automationId) async { + static updateAutomation( + CreateAutomationModel createAutomationModel, String automationId) async { try { final response = await _httpService.put( - path: ApiEndpoints.updateAutomation.replaceAll('{automationId}', automationId), - body: createAutomationModel.toJson(automationId.isNotEmpty == true ? automationId : null), + path: ApiEndpoints.updateAutomation + .replaceAll('{automationId}', automationId), + body: createAutomationModel + .toJson(automationId.isNotEmpty == true ? automationId : null), expectedResponseModel: (json) { return json; }, @@ -181,7 +190,8 @@ class SceneApi { final response = await _httpService.get( path: ApiEndpoints.getScene.replaceAll('{sceneId}', sceneId), showServerMessage: false, - expectedResponseModel: (json) => RoutineDetailsModel.fromMap(json['data']), + expectedResponseModel: (json) => + RoutineDetailsModel.fromMap(json['data']), ); return response; } catch (e) { @@ -190,7 +200,8 @@ class SceneApi { } //delete Scene - static Future deleteScene({required String unitUuid, required String sceneId}) async { + static Future deleteScene( + {required String unitUuid, required String sceneId}) async { try { final response = await _httpService.delete( path: ApiEndpoints.deleteScene diff --git a/lib/services/space_mana_api.dart b/lib/services/space_mana_api.dart index c4877c98..2361dd1d 100644 --- a/lib/services/space_mana_api.dart +++ b/lib/services/space_mana_api.dart @@ -13,7 +13,8 @@ import 'package:syncrow_web/utils/constants/temp_const.dart'; class CommunitySpaceManagementApi { // Community Management APIs - Future> fetchCommunities({int page = 1}) async { + Future> fetchCommunities(String projectId, + {int page = 1}) async { try { List allCommunities = []; bool hasNext = true; @@ -21,7 +22,7 @@ class CommunitySpaceManagementApi { while (hasNext) { await HTTPService().get( path: ApiEndpoints.getCommunityList - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), queryParameters: {'page': page}, expectedResponseModel: (json) { try { @@ -65,11 +66,10 @@ class CommunitySpaceManagementApi { } Future createCommunity( - String name, String description) async { + String name, String description, String projectId) async { try { final response = await HTTPService().post( - path: ApiEndpoints.createCommunity - .replaceAll('{projectId}', TempConst.projectId), + path: ApiEndpoints.createCommunity.replaceAll('{projectId}', projectId), body: { 'name': name, 'description': description, @@ -85,12 +85,13 @@ class CommunitySpaceManagementApi { } } - Future updateCommunity(String communityId, String name) async { + Future updateCommunity( + String communityId, String name, String projectId) async { try { final response = await HTTPService().put( path: ApiEndpoints.updateCommunity .replaceAll('{communityId}', communityId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), body: { 'name': name, }, @@ -105,12 +106,12 @@ class CommunitySpaceManagementApi { } } - Future deleteCommunity(String communityId) async { + Future deleteCommunity(String communityId, String projectId) async { try { final response = await HTTPService().delete( path: ApiEndpoints.deleteCommunity .replaceAll('{communityId}', communityId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), expectedResponseModel: (json) { return json['success'] ?? false; }, @@ -122,12 +123,13 @@ class CommunitySpaceManagementApi { } } - Future fetchSpaces(String communityId) async { + Future fetchSpaces( + String communityId, String projectId) async { try { final response = await HTTPService().get( path: ApiEndpoints.listSpaces .replaceAll('{communityId}', communityId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), expectedResponseModel: (json) { return SpacesResponse.fromJson(json); }, @@ -148,13 +150,14 @@ class CommunitySpaceManagementApi { } } - Future getSpace(String communityId, String spaceId) async { + Future getSpace( + String communityId, String spaceId, String projectId) async { try { final response = await HTTPService().get( path: ApiEndpoints.getSpace .replaceAll('{communityId}', communityId) .replaceAll('{spaceId}', spaceId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), expectedResponseModel: (json) { return SpaceModel.fromJson(json['data']); }, @@ -176,7 +179,8 @@ class CommunitySpaceManagementApi { String? spaceModelUuid, String? icon, List? tags, - List? subspaces}) async { + List? subspaces, + required String projectId}) async { try { final body = { 'spaceName': name, @@ -199,7 +203,7 @@ class CommunitySpaceManagementApi { final response = await HTTPService().post( path: ApiEndpoints.createSpace .replaceAll('{communityId}', communityId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), body: body, expectedResponseModel: (json) { return SpaceModel.fromJson(json['data']); @@ -212,18 +216,18 @@ class CommunitySpaceManagementApi { } } - Future updateSpace({ - required String communityId, - required spaceId, - required String name, - String? parentId, - String? icon, - String? direction, - bool isPrivate = false, - required Offset position, - List? tags, - List? subspaces, - }) async { + Future updateSpace( + {required String communityId, + required spaceId, + required String name, + String? parentId, + String? icon, + String? direction, + bool isPrivate = false, + required Offset position, + List? tags, + List? subspaces, + required String projectId}) async { try { final body = { 'spaceName': name, @@ -243,7 +247,7 @@ class CommunitySpaceManagementApi { path: ApiEndpoints.updateSpace .replaceAll('{communityId}', communityId) .replaceAll('{spaceId}', spaceId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), body: body, expectedResponseModel: (json) { return json['success'] ?? false; @@ -256,13 +260,14 @@ class CommunitySpaceManagementApi { } } - Future deleteSpace(String communityId, String spaceId) async { + Future deleteSpace( + String communityId, String spaceId, String projectId) async { try { final response = await HTTPService().delete( path: ApiEndpoints.deleteSpace .replaceAll('{communityId}', communityId) .replaceAll('{spaceId}', spaceId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), expectedResponseModel: (json) { return json['success'] ?? false; }, @@ -274,12 +279,13 @@ class CommunitySpaceManagementApi { } } - Future> getSpaceHierarchy(String communityId) async { + Future> getSpaceHierarchy( + String communityId, String projectId) async { try { final response = await HTTPService().get( path: ApiEndpoints.getSpaceHierarchy .replaceAll('{communityId}', communityId) - .replaceAll('{projectId}', TempConst.projectId), + .replaceAll('{projectId}', projectId), expectedResponseModel: (json) { final spaceModels = (json['data'] as List) .map((spaceJson) => SpaceModel.fromJson(spaceJson)) diff --git a/lib/services/space_model_mang_api.dart b/lib/services/space_model_mang_api.dart index eb896432..d9e295e0 100644 --- a/lib/services/space_model_mang_api.dart +++ b/lib/services/space_model_mang_api.dart @@ -5,10 +5,10 @@ import 'package:syncrow_web/utils/constants/api_const.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; class SpaceModelManagementApi { - Future> listSpaceModels({int page = 1}) async { + Future> listSpaceModels( + {required String projectId, int page = 1}) async { final response = await HTTPService().get( - path: ApiEndpoints.listSpaceModels - .replaceAll('{projectId}', TempConst.projectId), + path: ApiEndpoints.listSpaceModels.replaceAll('{projectId}', projectId), queryParameters: {'page': page}, expectedResponseModel: (json) { List jsonData = json['data']; @@ -21,10 +21,9 @@ class SpaceModelManagementApi { } Future createSpaceModel( - CreateSpaceTemplateBodyModel spaceModel) async { + CreateSpaceTemplateBodyModel spaceModel, String projectId) async { final response = await HTTPService().post( - path: ApiEndpoints.createSpaceModel - .replaceAll('{projectId}', TempConst.projectId), + path: ApiEndpoints.createSpaceModel.replaceAll('{projectId}', projectId), showServerMessage: true, body: spaceModel.toJson(), expectedResponseModel: (json) { @@ -34,12 +33,12 @@ class SpaceModelManagementApi { return response; } - - Future updateSpaceModel( - CreateSpaceTemplateBodyModel spaceModel, String spaceModelUuid) async { + Future updateSpaceModel(CreateSpaceTemplateBodyModel spaceModel, + String spaceModelUuid, String projectId) async { final response = await HTTPService().put( path: ApiEndpoints.updateSpaceModel - .replaceAll('{projectId}', TempConst.projectId).replaceAll('{spaceModelUuid}', spaceModelUuid), + .replaceAll('{projectId}', projectId) + .replaceAll('{spaceModelUuid}', spaceModelUuid), body: spaceModel.toJson(), expectedResponseModel: (json) { return json['message']; @@ -48,10 +47,11 @@ class SpaceModelManagementApi { return response; } - Future getSpaceModel(String spaceModelUuid) async { + Future getSpaceModel( + String spaceModelUuid, String projectId) async { final response = await HTTPService().get( path: ApiEndpoints.getSpaceModel - .replaceAll('{projectId}', TempConst.projectId) + .replaceAll('{projectId}', projectId) .replaceAll('{spaceModelUuid}', spaceModelUuid), showServerMessage: true, expectedResponseModel: (json) { diff --git a/lib/services/user_permission.dart b/lib/services/user_permission.dart index e4f097f4..a3fb2d96 100644 --- a/lib/services/user_permission.dart +++ b/lib/services/user_permission.dart @@ -11,10 +11,10 @@ import 'package:syncrow_web/utils/constants/api_const.dart'; class UserPermissionApi { static final HTTPService _httpService = HTTPService(); - Future> fetchUsers() async { + Future> fetchUsers(String projectId) async { try { final response = await _httpService.get( - path: ApiEndpoints.getUsers, + path: ApiEndpoints.getUsers.replaceAll('{projectUuid}', projectId), showServerMessage: true, expectedResponseModel: (json) { debugPrint('fetchUsers Response: $json'); @@ -34,8 +34,9 @@ class UserPermissionApi { path: ApiEndpoints.roleTypes, showServerMessage: true, expectedResponseModel: (json) { - final List fetchedRoles = - (json['data'] as List).map((item) => RoleTypeModel.fromJson(item)).toList(); + final List fetchedRoles = (json['data'] as List) + .map((item) => RoleTypeModel.fromJson(item)) + .toList(); return fetchedRoles; }, ); @@ -47,7 +48,9 @@ class UserPermissionApi { path: ApiEndpoints.permission.replaceAll("roleUuid", roleUuid), showServerMessage: true, expectedResponseModel: (json) { - return (json as List).map((data) => PermissionOption.fromJson(data)).toList(); + return (json as List) + .map((data) => PermissionOption.fromJson(data)) + .toList(); }, ); return response ?? []; @@ -61,6 +64,7 @@ class UserPermissionApi { String? phoneNumber, String? roleUuid, List? spaceUuids, + required String projectUuid, }) async { try { final body = { @@ -70,7 +74,7 @@ class UserPermissionApi { "jobTitle": jobTitle != '' ? jobTitle : null, "phoneNumber": phoneNumber != '' ? phoneNumber : null, "roleUuid": roleUuid, - "projectUuid": "0e62577c-06fa-41b9-8a92-99a21fbaf51c", + "projectUuid": projectUuid, "spaceUuids": spaceUuids, }; final response = await _httpService.post( @@ -121,9 +125,11 @@ class UserPermissionApi { } } - Future fetchUserById(userUuid) async { + Future fetchUserById(userUuid, String projectId) async { final response = await _httpService.get( - path: ApiEndpoints.getUserById.replaceAll("{userUuid}", userUuid), + path: ApiEndpoints.getUserById + .replaceAll("{userUuid}", userUuid) + .replaceAll("{projectId}", projectId), showServerMessage: true, expectedResponseModel: (json) { EditUserModel res = EditUserModel.fromJson(json['data']); @@ -141,6 +147,7 @@ class UserPermissionApi { String? phoneNumber, String? roleUuid, List? spaceUuids, + required String projectUuid, }) async { try { final body = { @@ -149,7 +156,7 @@ class UserPermissionApi { "jobTitle": jobTitle != '' ? jobTitle : " ", "phoneNumber": phoneNumber != '' ? phoneNumber : " ", "roleUuid": roleUuid, - "projectUuid": "0e62577c-06fa-41b9-8a92-99a21fbaf51c", + "projectUuid": projectUuid, "spaceUuids": spaceUuids, }; final response = await _httpService.put( @@ -186,15 +193,16 @@ class UserPermissionApi { } } - Future changeUserStatusById(userUuid, status) async { + Future changeUserStatusById(userUuid, status, String projectUuid) async { try { Map bodya = { "disable": status, - "projectUuid": "0e62577c-06fa-41b9-8a92-99a21fbaf51c" + "projectUuid": projectUuid }; final response = await _httpService.put( - path: ApiEndpoints.changeUserStatus.replaceAll("{invitedUserUuid}", userUuid), + path: ApiEndpoints.changeUserStatus + .replaceAll("{invitedUserUuid}", userUuid), body: bodya, expectedResponseModel: (json) { return json['success']; diff --git a/lib/utils/constants/api_const.dart b/lib/utils/constants/api_const.dart index 80c3c830..ee41cfa0 100644 --- a/lib/utils/constants/api_const.dart +++ b/lib/utils/constants/api_const.dart @@ -95,8 +95,8 @@ abstract class ApiEndpoints { static const String inviteUser = '/invite-user'; static const String checkEmail = '/invite-user/check-email'; - static const String getUsers = '/projects/${projectUuid}/user'; - static const String getUserById = '/projects/${projectUuid}/user/{userUuid}'; + static const String getUsers = '/projects/{projectUuid}/user'; + static const String getUserById = '/projects/{projectUuid}/user/{userUuid}'; static const String editUser = '/invite-user/{inviteUserUuid}'; static const String deleteUser = '/invite-user/{inviteUserUuid}'; static const String changeUserStatus = '/invite-user/{invitedUserUuid}/disable'; diff --git a/lib/utils/user_drop_down_menu.dart b/lib/utils/user_drop_down_menu.dart index 2d740e27..b0028843 100644 --- a/lib/utils/user_drop_down_menu.dart +++ b/lib/utils/user_drop_down_menu.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; import 'package:syncrow_web/pages/auth/model/user_model.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -218,7 +220,10 @@ class _UserDropdownMenuState extends State { ), GestureDetector( onTap: () { - AuthBloc.logout(); + final projectCubit = + BlocProvider.of(context); + + AuthBloc.logout(context, projectCubit); context.go(RoutesConst.auth); }, child: SizedBox(