fixed space

This commit is contained in:
hannathkadher
2024-10-30 09:56:57 +04:00
parent 5a7ed3ec7c
commit d025da6daf
16 changed files with 114 additions and 76 deletions

View File

@ -1,7 +1,7 @@
import UIKit import UIKit
import Flutter import Flutter
@UIApplicationMain @main
@objc class AppDelegate: FlutterAppDelegate { @objc class AppDelegate: FlutterAppDelegate {
override func application( override func application(
_ application: UIApplication, _ application: UIApplication,

View File

@ -11,7 +11,7 @@ import 'package:syncrow_app/features/app_layout/view/widgets/app_bar_home_dropdo
import 'package:syncrow_app/features/auth/model/user_model.dart'; import 'package:syncrow_app/features/auth/model/user_model.dart';
import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart'; import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart'; import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart'; import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart'; import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
import 'package:syncrow_app/features/menu/view/menu_view.dart'; import 'package:syncrow_app/features/menu/view/menu_view.dart';
import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart';
@ -55,7 +55,8 @@ class HomeCubit extends Cubit<HomeState> {
Future fetchUserInfo() async { Future fetchUserInfo() async {
try { try {
var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); var uuid =
await const FlutterSecureStorage().read(key: UserModel.userUuidKey);
user = await ProfileApi().fetchUserInfo(uuid); user = await ProfileApi().fetchUserInfo(uuid);
emit(HomeUserInfoLoaded(user!)); // Emit state after fetching user info emit(HomeUserInfoLoaded(user!)); // Emit state after fetching user info
} catch (e) { } catch (e) {
@ -76,9 +77,12 @@ class HomeCubit extends Cubit<HomeState> {
selectedSpace = null; selectedSpace = null;
selectedRoom = null; selectedRoom = null;
pageIndex = 0; pageIndex = 0;
OneSignal.User.pushSubscription.removeObserver((stateChanges) => oneSignalSubscriptionObserver); OneSignal.User.pushSubscription
OneSignal.Notifications.removePermissionObserver((permission) => oneSignalPermissionObserver); .removeObserver((stateChanges) => oneSignalSubscriptionObserver);
OneSignal.Notifications.removeClickListener((event) => oneSignalClickListenerObserver); OneSignal.Notifications.removePermissionObserver(
(permission) => oneSignalPermissionObserver);
OneSignal.Notifications.removeClickListener(
(event) => oneSignalClickListenerObserver);
return super.close(); return super.close();
} }
@ -88,7 +92,7 @@ class HomeCubit extends Cubit<HomeState> {
SpaceModel? selectedSpace; SpaceModel? selectedSpace;
RoomModel? selectedRoom; SubSpaceModel? selectedRoom;
PageController devicesPageController = PageController(); PageController devicesPageController = PageController();
@ -120,7 +124,9 @@ class HomeCubit extends Cubit<HomeState> {
return; return;
} }
var userUuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ?? ''; var userUuid =
await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ??
'';
if (userUuid.isNotEmpty) { if (userUuid.isNotEmpty) {
await OneSignal.login(userUuid); await OneSignal.login(userUuid);
} }
@ -128,21 +134,24 @@ class HomeCubit extends Cubit<HomeState> {
await OneSignal.User.pushSubscription.optIn(); await OneSignal.User.pushSubscription.optIn();
//this function will be called once a user is subscribed //this function will be called once a user is subscribed
oneSignalSubscriptionObserver = OneSignal.User.pushSubscription.addObserver((state) async { oneSignalSubscriptionObserver =
OneSignal.User.pushSubscription.addObserver((state) async {
if (state.current.optedIn) { if (state.current.optedIn) {
await _sendSubscriptionId(); await _sendSubscriptionId();
} }
}); });
// Send the player id when a user allows notifications // Send the player id when a user allows notifications
oneSignalPermissionObserver = OneSignal.Notifications.addPermissionObserver((state) async { oneSignalPermissionObserver =
OneSignal.Notifications.addPermissionObserver((state) async {
await _sendSubscriptionId(); await _sendSubscriptionId();
}); });
//check if the player id is sent, if not send it again //check if the player id is sent, if not send it again
await _sendSubscriptionId(); await _sendSubscriptionId();
oneSignalClickListenerObserver = OneSignal.Notifications.addClickListener((event) async { oneSignalClickListenerObserver =
OneSignal.Notifications.addClickListener((event) async {
//Once the user clicks on the notification //Once the user clicks on the notification
}); });
} catch (err) { } catch (err) {
@ -173,7 +182,7 @@ class HomeCubit extends Cubit<HomeState> {
if (index == 0) { if (index == 0) {
unselectRoom(); unselectRoom();
} else { } else {
selectedRoom = selectedSpace!.rooms![index - 1]; selectedRoom = selectedSpace!.subspaces[index - 1];
emitSafe(RoomSelected(selectedRoom!)); emitSafe(RoomSelected(selectedRoom!));
} }
} }
@ -188,7 +197,7 @@ class HomeCubit extends Cubit<HomeState> {
if (index <= 0) { if (index <= 0) {
unselectRoom(); unselectRoom();
} else { } else {
selectedRoom = selectedSpace!.rooms![index - 1]; selectedRoom = selectedSpace!.subspaces[index - 1];
emitSafe(RoomSelected(selectedRoom!)); emitSafe(RoomSelected(selectedRoom!));
} }
} }
@ -229,7 +238,9 @@ class HomeCubit extends Cubit<HomeState> {
Future<bool> joinAUnit(String code) async { Future<bool> joinAUnit(String code) async {
try { try {
var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ?? ''; var uuid =
await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ??
'';
Map<String, String> body = {'userUuid': uuid, 'inviteCode': code}; Map<String, String> body = {'userUuid': uuid, 'inviteCode': code};
final success = await SpacesAPI.joinUnit(body); final success = await SpacesAPI.joinUnit(body);
@ -247,7 +258,7 @@ class HomeCubit extends Cubit<HomeState> {
fetchUnitsByUserId() async { fetchUnitsByUserId() async {
emitSafe(GetSpacesLoading()); emitSafe(GetSpacesLoading());
try { try {
spaces = await SpacesAPI.getUnitsByUserId(); spaces = await SpacesAPI.getSpacesByUserId();
} catch (failure) { } catch (failure) {
emitSafe(GetSpacesError("No units found")); emitSafe(GetSpacesError("No units found"));
return; return;
@ -258,6 +269,7 @@ class HomeCubit extends Cubit<HomeState> {
await fetchRoomsByUnitId(selectedSpace!); await fetchRoomsByUnitId(selectedSpace!);
emitSafe(GetSpacesSuccess(spaces!)); emitSafe(GetSpacesSuccess(spaces!));
} else { } else {
print("here in else");
emitSafe(GetSpacesError("No spaces found")); emitSafe(GetSpacesError("No spaces found"));
} }
} }
@ -265,13 +277,14 @@ class HomeCubit extends Cubit<HomeState> {
fetchRoomsByUnitId(SpaceModel space) async { fetchRoomsByUnitId(SpaceModel space) async {
emitSafe(GetSpaceRoomsLoading()); emitSafe(GetSpaceRoomsLoading());
try { try {
space.rooms = await SpacesAPI.getRoomsBySpaceId(space.id!); space.subspaces =
await SpacesAPI.getSubSpaceBySpaceId(space.community.uuid, space.id);
} catch (failure) { } catch (failure) {
emitSafe(GetSpaceRoomsError(failure.toString())); emitSafe(GetSpaceRoomsError(failure.toString()));
return; return;
} }
if (space.rooms != null && space.rooms!.isNotEmpty) { if (space.subspaces != null && space.subspaces!.isNotEmpty) {
emitSafe(GetSpaceRoomsSuccess(space.rooms!)); emitSafe(GetSpaceRoomsSuccess(space.subspaces!));
} else { } else {
emitSafe(GetSpaceRoomsError("No rooms found")); emitSafe(GetSpaceRoomsError("No rooms found"));
} }
@ -347,7 +360,8 @@ class HomeCubit extends Cubit<HomeState> {
size: 32, size: 32,
), ),
style: ButtonStyle( style: ButtonStyle(
foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor), foregroundColor:
WidgetStateProperty.all(ColorsManager.textPrimaryColor),
), ),
onPressed: () { onPressed: () {
Navigator.pushNamed( Navigator.pushNamed(
@ -368,7 +382,8 @@ class HomeCubit extends Cubit<HomeState> {
NavigationService.navigatorKey.currentContext! NavigationService.navigatorKey.currentContext!
.read<SmartSceneSelectBloc>() .read<SmartSceneSelectBloc>()
.add(const SmartSceneClearEvent()); .add(const SmartSceneClearEvent());
BlocProvider.of<EffectPeriodBloc>(NavigationService.navigatorKey.currentState!.context) BlocProvider.of<EffectPeriodBloc>(
NavigationService.navigatorKey.currentState!.context)
.add(ResetEffectivePeriod()); .add(ResetEffectivePeriod());
}, },
), ),
@ -378,7 +393,8 @@ class HomeCubit extends Cubit<HomeState> {
size: 28, size: 28,
), ),
style: ButtonStyle( style: ButtonStyle(
foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor), foregroundColor:
WidgetStateProperty.all(ColorsManager.textPrimaryColor),
), ),
onPressed: () {}, onPressed: () {},
), ),
@ -411,7 +427,8 @@ class HomeCubit extends Cubit<HomeState> {
}; };
static var bottomNavItems = [ static var bottomNavItems = [
defaultBottomNavBarItem(icon: Assets.assetsIconsDashboard, label: 'Dashboard'), defaultBottomNavBarItem(
icon: Assets.assetsIconsDashboard, label: 'Dashboard'),
// defaultBottomNavBarItem(icon: Assets.assetsIconslayout, label: 'Layout'), // defaultBottomNavBarItem(icon: Assets.assetsIconslayout, label: 'Layout'),
defaultBottomNavBarItem(icon: Assets.assetsIconsDevices, label: 'Devices'), defaultBottomNavBarItem(icon: Assets.assetsIconsDevices, label: 'Devices'),
defaultBottomNavBarItem(icon: Assets.assetsIconsRoutines, label: 'Routine'), defaultBottomNavBarItem(icon: Assets.assetsIconsRoutines, label: 'Routine'),
@ -437,7 +454,8 @@ class HomeCubit extends Cubit<HomeState> {
void updateDevice(String deviceId) async { void updateDevice(String deviceId) async {
try { try {
final response = await DevicesAPI.firmwareDevice(deviceId: deviceId, firmwareVersion: '0'); final response = await DevicesAPI.firmwareDevice(
deviceId: deviceId, firmwareVersion: '0');
if (response['success'] ?? false) { if (response['success'] ?? false) {
CustomSnackBar.displaySnackBar('No updates available'); CustomSnackBar.displaySnackBar('No updates available');
} }
@ -445,7 +463,8 @@ class HomeCubit extends Cubit<HomeState> {
} }
} }
BottomNavigationBarItem defaultBottomNavBarItem({required String icon, required String label}) { BottomNavigationBarItem defaultBottomNavBarItem(
{required String icon, required String label}) {
return BottomNavigationBarItem( return BottomNavigationBarItem(
icon: SvgPicture.asset(icon), icon: SvgPicture.asset(icon),
activeIcon: SvgPicture.asset( activeIcon: SvgPicture.asset(

View File

@ -33,7 +33,7 @@ class GetSpacesError extends HomeError {
class GetSpaceRoomsLoading extends HomeLoading {} class GetSpaceRoomsLoading extends HomeLoading {}
class GetSpaceRoomsSuccess extends HomeSuccess { class GetSpaceRoomsSuccess extends HomeSuccess {
final List<RoomModel> rooms; final List<SubSpaceModel> rooms;
GetSpaceRoomsSuccess(this.rooms); GetSpaceRoomsSuccess(this.rooms);
} }
@ -50,7 +50,7 @@ class SpaceSelected extends HomeState {
} }
class RoomSelected extends HomeState { class RoomSelected extends HomeState {
final RoomModel room; final SubSpaceModel room;
RoomSelected(this.room); RoomSelected(this.room);
} }

View File

@ -1,11 +1,11 @@
import 'package:syncrow_app/features/app_layout/model/community_model.dart'; import 'package:syncrow_app/features/app_layout/model/community_model.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart'; import 'package:syncrow_app/features/devices/model/subspace_model.dart';
class SpaceModel { class SpaceModel {
final String id; final String id;
final String name; final String name;
final Community community; final Community community;
final List<SubSpaceModel> subspaces; late List<SubSpaceModel> subspaces;
SpaceModel({ SpaceModel({
required this.id, required this.id,

View File

@ -27,7 +27,7 @@ class DevicesCubit extends Cubit<DevicesState> {
if (HomeCubit.getInstance().selectedSpace != null && if (HomeCubit.getInstance().selectedSpace != null &&
HomeCubit.getInstance().spaces!.isNotEmpty) { HomeCubit.getInstance().spaces!.isNotEmpty) {
// fetchGroups(HomeCubit.getInstance().selectedSpace!.id!); // fetchGroups(HomeCubit.getInstance().selectedSpace!.id!);
for (var room in HomeCubit.getInstance().selectedSpace!.rooms!) { for (var room in HomeCubit.getInstance().selectedSpace!.subspaces!) {
fetchDevicesByRoomId(room.id!); fetchDevicesByRoomId(room.id!);
} }
fetchGroups(HomeCubit.getInstance().selectedSpace?.id ?? ''); fetchGroups(HomeCubit.getInstance().selectedSpace?.id ?? '');
@ -104,8 +104,8 @@ class DevicesCubit extends Cubit<DevicesState> {
List<DeviceModel> get allDevices { List<DeviceModel> get allDevices {
List<DeviceModel> devices = []; List<DeviceModel> devices = [];
if (HomeCubit.getInstance().selectedSpace != null && if (HomeCubit.getInstance().selectedSpace != null &&
HomeCubit.getInstance().selectedSpace!.rooms != null) { HomeCubit.getInstance().selectedSpace!.subspaces != null) {
for (var room in HomeCubit.getInstance().selectedSpace!.rooms!) { for (var room in HomeCubit.getInstance().selectedSpace!.subspaces!) {
if (room.devices != null) { if (room.devices != null) {
devices.addAll(room.devices!); devices.addAll(room.devices!);
} }
@ -275,7 +275,7 @@ class DevicesCubit extends Cubit<DevicesState> {
deviceId, deviceId,
HomeCubit.getInstance() HomeCubit.getInstance()
.selectedSpace! .selectedSpace!
.rooms! .subspaces!
.indexOf(HomeCubit.getInstance().selectedRoom!), .indexOf(HomeCubit.getInstance().selectedRoom!),
code: control.code); code: control.code);
}); });
@ -308,15 +308,15 @@ class DevicesCubit extends Cubit<DevicesState> {
emitSafe(GetDevicesLoading()); emitSafe(GetDevicesLoading());
int roomIndex = int roomIndex =
HomeCubit.getInstance().selectedSpace!.rooms!.indexWhere((element) => element.id == roomId); HomeCubit.getInstance().selectedSpace!.subspaces!.indexWhere((element) => element.id == roomId);
try { try {
HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices = HomeCubit.getInstance().selectedSpace!.subspaces![roomIndex].devices =
await DevicesAPI.getDevicesByRoomId(roomId); await DevicesAPI.getDevicesByRoomId(roomId);
} catch (e) { } catch (e) {
emitSafe(GetDevicesError(e.toString())); emitSafe(GetDevicesError(e.toString()));
return; return;
} }
final devices = HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices; final devices = HomeCubit.getInstance().selectedSpace!.subspaces![roomIndex].devices;
emitSafe(GetDevicesSuccess(devices)); emitSafe(GetDevicesSuccess(devices));
//get status for each device //get status for each device
@ -333,7 +333,7 @@ class DevicesCubit extends Cubit<DevicesState> {
emitSafe(GetDeviceStatusLoading(code: code)); emitSafe(GetDeviceStatusLoading(code: code));
int deviceIndex = HomeCubit.getInstance() int deviceIndex = HomeCubit.getInstance()
.selectedSpace! .selectedSpace!
.rooms![roomIndex] .subspaces![roomIndex]
.devices! .devices!
.indexWhere((element) => element.uuid == deviceUuid); .indexWhere((element) => element.uuid == deviceUuid);
List<StatusModel> statuses = []; List<StatusModel> statuses = [];
@ -346,7 +346,7 @@ class DevicesCubit extends Cubit<DevicesState> {
emitSafe(GetDeviceStatusError(e.toString())); emitSafe(GetDeviceStatusError(e.toString()));
return; return;
} }
HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices![deviceIndex].status = HomeCubit.getInstance().selectedSpace!.subspaces![roomIndex].devices![deviceIndex].status =
statuses; statuses;
emitSafe(GetDeviceStatusSuccess(code: code)); emitSafe(GetDeviceStatusSuccess(code: code));
} }

View File

@ -78,8 +78,8 @@ class DevicesViewBody extends StatelessWidget {
groupsList: DevicesCubit.getInstance().allCategories ?? [], groupsList: DevicesCubit.getInstance().allCategories ?? [],
), ),
if (HomeCubit.getInstance().selectedSpace != null) if (HomeCubit.getInstance().selectedSpace != null)
if (HomeCubit.getInstance().selectedSpace!.rooms != null) if (HomeCubit.getInstance().selectedSpace!.subspaces != null)
...HomeCubit.getInstance().selectedSpace!.rooms!.map((room) { ...HomeCubit.getInstance().selectedSpace!.subspaces!.map((room) {
return RoomPage( return RoomPage(
room: room, room: room,
); );
@ -95,7 +95,7 @@ class DevicesViewBody extends StatelessWidget {
), ),
child: SmoothPageIndicator( child: SmoothPageIndicator(
controller: HomeCubit.getInstance().devicesPageController, controller: HomeCubit.getInstance().devicesPageController,
count: HomeCubit.getInstance().selectedSpace!.rooms!.length + 1, count: HomeCubit.getInstance().selectedSpace!.subspaces!.length + 1,
effect: const WormEffect( effect: const WormEffect(
paintStyle: PaintingStyle.stroke, paintStyle: PaintingStyle.stroke,
dotHeight: 8, dotHeight: 8,

View File

@ -1,11 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart'; import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/room_page_switch.dart'; import 'package:syncrow_app/features/devices/view/widgets/room_page_switch.dart';
class RoomPage extends StatelessWidget { class RoomPage extends StatelessWidget {
const RoomPage({super.key, required this.room}); const RoomPage({super.key, required this.room});
final RoomModel room; final SubSpaceModel room;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -40,12 +40,12 @@ class RoomsSlider extends StatelessWidget {
), ),
), ),
if (HomeCubit.getInstance().selectedSpace != null) if (HomeCubit.getInstance().selectedSpace != null)
if (HomeCubit.getInstance().selectedSpace!.rooms != null) if (HomeCubit.getInstance().selectedSpace!.subspaces != null)
...HomeCubit.getInstance().selectedSpace!.rooms!.map( ...HomeCubit.getInstance().selectedSpace!.subspaces!.map(
(room) => InkWell( (room) => InkWell(
onTap: () { onTap: () {
HomeCubit.getInstance().roomSliderPageChanged( HomeCubit.getInstance().roomSliderPageChanged(
HomeCubit.getInstance().selectedSpace!.rooms!.indexOf(room)); HomeCubit.getInstance().selectedSpace!.subspaces!.indexOf(room));
}, },
child: TitleMedium( child: TitleMedium(
text: room.name!, text: room.name!,

View File

@ -22,7 +22,7 @@ class ManageUnitBloc extends Bloc<ManageUnitEvent, ManageUnitState> {
void _fetchRoomsAndDevices(FetchRoomsEvent event, Emitter<ManageUnitState> emit) async { void _fetchRoomsAndDevices(FetchRoomsEvent event, Emitter<ManageUnitState> emit) async {
try { try {
emit(LoadingState()); emit(LoadingState());
final roomsList = await SpacesAPI.getRoomsBySpaceId(event.unitId); final roomsList = await SpacesAPI.getSubSpaceBySpaceId(event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList)); emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) { } catch (e) {
emit(const ErrorState(message: 'Something went wrong')); emit(const ErrorState(message: 'Something went wrong'));
@ -94,12 +94,12 @@ class ManageUnitBloc extends Bloc<ManageUnitEvent, ManageUnitState> {
} }
_addNewRoom(AddNewRoom event, Emitter<ManageUnitState> emit) async { _addNewRoom(AddNewRoom event, Emitter<ManageUnitState> emit) async {
Map<String, String> body = {'roomName': event.roomName, 'unitUuid': event.unitId}; Map<String, String> body = {'roomName': event.roomName};
try { try {
emit(LoadingState()); emit(LoadingState());
final response = await HomeCreation.createRoom(body); final response = await HomeCreation.createRoom(body);
if (response['data']['uuid'] != '') { if (response['data']['uuid'] != '') {
final roomsList = await SpacesAPI.getRoomsBySpaceId(event.unitId); final roomsList = await SpacesAPI.getSubSpaceBySpaceId(event.unit.community.uuid, event.unit.id);
allDevices = await HomeManagementAPI.fetchDevicesByUserId(); allDevices = await HomeManagementAPI.fetchDevicesByUserId();
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList)); emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
await HomeCubit.getInstance().fetchUnitsByUserId(); await HomeCubit.getInstance().fetchUnitsByUserId();

View File

@ -1,4 +1,5 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
abstract class ManageUnitEvent extends Equatable { abstract class ManageUnitEvent extends Equatable {
const ManageUnitEvent(); const ManageUnitEvent();
@ -12,12 +13,12 @@ class InitialEvent extends ManageUnitEvent {}
class LoadingEvent extends ManageUnitEvent {} class LoadingEvent extends ManageUnitEvent {}
class FetchRoomsEvent extends ManageUnitEvent { class FetchRoomsEvent extends ManageUnitEvent {
final String unitId; final SpaceModel unit;
const FetchRoomsEvent({required this.unitId}); const FetchRoomsEvent({required this.unit});
@override @override
List<Object> get props => [unitId]; List<Object> get props => [unit];
} }
class FetchDevicesByRoomIdEvent extends ManageUnitEvent { class FetchDevicesByRoomIdEvent extends ManageUnitEvent {
@ -31,12 +32,12 @@ class FetchDevicesByRoomIdEvent extends ManageUnitEvent {
class AddNewRoom extends ManageUnitEvent { class AddNewRoom extends ManageUnitEvent {
final String roomName; final String roomName;
final String unitId; final SpaceModel unit;
const AddNewRoom({required this.roomName, required this.unitId}); const AddNewRoom({required this.roomName, required this.unit});
@override @override
List<Object> get props => [roomName, unitId]; List<Object> get props => [roomName, unit];
} }
class AssignRoomEvent extends ManageUnitEvent { class AssignRoomEvent extends ManageUnitEvent {

View File

@ -1,6 +1,7 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart'; import 'package:syncrow_app/features/devices/model/room_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
abstract class ManageUnitState extends Equatable { abstract class ManageUnitState extends Equatable {
const ManageUnitState(); const ManageUnitState();
@ -14,7 +15,7 @@ class InitialState extends ManageUnitState {}
class LoadingState extends ManageUnitState {} class LoadingState extends ManageUnitState {}
class FetchRoomsState extends ManageUnitState { class FetchRoomsState extends ManageUnitState {
final List<RoomModel> roomsList; final List<SubSpaceModel> roomsList;
final List<DeviceModel> devicesList; final List<DeviceModel> devicesList;
const FetchRoomsState({required this.devicesList, required this.roomsList}); const FetchRoomsState({required this.devicesList, required this.roomsList});

View File

@ -60,7 +60,7 @@ class HomeSettingsView extends StatelessWidget {
onTap: () { onTap: () {
Navigator.of(context).push(CustomPageRoute( Navigator.of(context).push(CustomPageRoute(
builder: (context) => RoomsView( builder: (context) => RoomsView(
unitId: space?.id ?? '', unit: space!,
))); )));
}, },
child: Container( child: Container(

View File

@ -1,5 +1,6 @@
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_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/menu/bloc/manage_unit_bloc/manage_unit_bloc.dart'; import 'package:syncrow_app/features/menu/bloc/manage_unit_bloc/manage_unit_bloc.dart';
import 'package:syncrow_app/features/menu/bloc/manage_unit_bloc/manage_unit_event.dart'; import 'package:syncrow_app/features/menu/bloc/manage_unit_bloc/manage_unit_event.dart';
import 'package:syncrow_app/features/menu/bloc/manage_unit_bloc/manage_unit_state.dart'; import 'package:syncrow_app/features/menu/bloc/manage_unit_bloc/manage_unit_state.dart';
@ -11,14 +12,14 @@ import 'package:syncrow_app/utils/helpers/snack_bar.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class RoomsView extends StatelessWidget { class RoomsView extends StatelessWidget {
final String unitId; final SpaceModel unit;
const RoomsView({super.key, required this.unitId}); const RoomsView({super.key, required this.unit});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
TextEditingController textEditingController = TextEditingController(); TextEditingController textEditingController = TextEditingController();
return BlocProvider( return BlocProvider(
create: (context) => ManageUnitBloc()..add(FetchRoomsEvent(unitId: unitId)), create: (context) => ManageUnitBloc()..add(FetchRoomsEvent(unit:unit )),
child: BlocConsumer<ManageUnitBloc, ManageUnitState>( child: BlocConsumer<ManageUnitBloc, ManageUnitState>(
listener: (context, state) {}, listener: (context, state) {},
builder: (context, state) { builder: (context, state) {
@ -62,7 +63,7 @@ class RoomsView extends StatelessWidget {
MaterialPageRoute( MaterialPageRoute(
builder: (context) => AssignDeviceView( builder: (context) => AssignDeviceView(
roomId: state.roomsList[index].id ?? '', roomId: state.roomsList[index].id ?? '',
unitId: unitId, unitId: unit.id,
)), )),
); );
}, },
@ -100,7 +101,7 @@ class RoomsView extends StatelessWidget {
BlocProvider.of<ManageUnitBloc>(context).add( BlocProvider.of<ManageUnitBloc>(context).add(
AddNewRoom( AddNewRoom(
roomName: textEditingController.text, roomName: textEditingController.text,
unitId: unitId)); unit: unit));
textEditingController.clear(); textEditingController.clear();
}, },
child: const Row( child: const Row(

View File

@ -30,7 +30,7 @@ class _SceneRoomsTabBarDevicesViewState
@override @override
void initState() { void initState() {
rooms = List.from(HomeCubit.getInstance().selectedSpace?.rooms ?? []); rooms = List.from(HomeCubit.getInstance().selectedSpace?.subspaces ?? []);
if (rooms != null) { if (rooms != null) {
if (rooms![0].id != '-1') { if (rooms![0].id != '-1') {
rooms?.insert( rooms?.insert(

View File

@ -148,6 +148,7 @@ class HomeCreation {
} }
} }
static Future<Map<String, dynamic>> assignUserToRoom(Map<String, String> body) async { static Future<Map<String, dynamic>> assignUserToRoom(Map<String, String> body) async {
try { try {
final response = await _httpService.post( final response = await _httpService.post(

View File

@ -1,32 +1,47 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart'; import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/auth/model/user_model.dart'; import 'package:syncrow_app/features/auth/model/user_model.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart'; import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/services/api/api_links_endpoints.dart'; import 'package:syncrow_app/services/api/api_links_endpoints.dart';
import 'package:syncrow_app/services/api/http_service.dart'; import 'package:syncrow_app/services/api/http_service.dart';
class SpacesAPI { class SpacesAPI {
static final HTTPService _httpService = HTTPService(); static final HTTPService _httpService = HTTPService();
static Future<List<SpaceModel>> getUnitsByUserId() async { static Future<List<SpaceModel>> getSpacesByUserId() async {
var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); try {
var uuid =
await const FlutterSecureStorage().read(key: UserModel.userUuidKey);
if (uuid == null) throw Exception("User UUID is missing");
final path = ApiEndpoints.userSpaces.replaceFirst('{userUuid}', uuid);
final response = await _httpService.get( final response = await _httpService.get(
path: "${ApiEndpoints.unitUser}$uuid", path: path,
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) => SpaceModel.fromJsonList(json), expectedResponseModel: (json) => SpaceModel.fromJsonList(json['data']),
); );
return response; return response;
} catch (error) {
print("Error in getSpacesByUserId: $error");
rethrow; // Rethrow the error to be caught by `fetchUnitsByUserId`
}
} }
static Future<List<RoomModel>> getRoomsBySpaceId(String unitId) async { static Future<List<SubSpaceModel>> getSubSpaceBySpaceId(
String communityId, String spaceId) async {
final path = ApiEndpoints.listSubspace
.replaceFirst('{communityUuid}', communityId)
.replaceFirst('{spaceUuid}', spaceId);
final response = await _httpService.get( final response = await _httpService.get(
path: "${ApiEndpoints.unitChild}$unitId", path: path,
queryParameters: {"page": 1, "pageSize": 10}, queryParameters: {"page": 1, "pageSize": 10},
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
List<RoomModel> rooms = []; List<SubSpaceModel> rooms = [];
for (var room in json['children']) { for (var room in json['children']) {
rooms.add(RoomModel.fromJson(room)); rooms.add(SubSpaceModel.fromJson(room));
} }
return rooms; return rooms;
}, },