mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2026-10-25 22:47:54 +00:00
Bug fixes
This commit is contained in:
@@ -25,12 +25,12 @@ part 'devices_state.dart';
|
||||
class DevicesCubit extends Cubit<DevicesState> {
|
||||
Future<void> _initializeDevices(SpaceModel selectedSpace) async {
|
||||
// Fetch devices for each room in the selected space
|
||||
for (var room in selectedSpace.subspaces ?? []) {
|
||||
for (var room in selectedSpace.subspaces) {
|
||||
await fetchDevicesByRoomId(selectedSpace, room.id!);
|
||||
}
|
||||
|
||||
// Fetch groups based on the selected space ID
|
||||
await fetchGroups(selectedSpace.id ?? '');
|
||||
await fetchGroups(selectedSpace.id);
|
||||
}
|
||||
|
||||
DevicesCubit._() : super(DevicesInitial()) {
|
||||
@@ -111,9 +111,8 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
// Getter to retrieve all devices from HomeCubit
|
||||
List<DeviceModel> get allDevices {
|
||||
List<DeviceModel> devices = [];
|
||||
if (HomeCubit.getInstance().selectedSpace != null &&
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces != null) {
|
||||
for (var room in HomeCubit.getInstance().selectedSpace!.subspaces!) {
|
||||
if (HomeCubit.getInstance().selectedSpace != null) {
|
||||
for (var room in HomeCubit.getInstance().selectedSpace!.subspaces) {
|
||||
if (room.devices != null) {
|
||||
devices.addAll(room.devices!);
|
||||
}
|
||||
@@ -278,15 +277,15 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
if (response['success'] ?? false) {
|
||||
emitSafe(DeviceControlSuccess(code: control.code));
|
||||
//this delay is to give tuya server time to update the status
|
||||
Future.delayed(const Duration(milliseconds: 400), () {
|
||||
fetchDevicesStatues(
|
||||
deviceId,
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces!
|
||||
.indexOf(HomeCubit.getInstance().selectedRoom!),
|
||||
code: control.code);
|
||||
});
|
||||
// Future.delayed(const Duration(milliseconds: 400), () {
|
||||
fetchDevicesStatues(
|
||||
deviceId,
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces
|
||||
.indexOf(HomeCubit.getInstance().selectedRoom!),
|
||||
code: control.code);
|
||||
// });
|
||||
} else {
|
||||
emitSafe(DeviceControlError('Failed to control the device'));
|
||||
}
|
||||
@@ -317,20 +316,17 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
emitSafe(GetDevicesLoading());
|
||||
int roomIndex = HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces!
|
||||
.subspaces
|
||||
.indexWhere((element) => element.id == roomId);
|
||||
try {
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces![roomIndex].devices =
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces[roomIndex].devices =
|
||||
await DevicesAPI.getDevicesByRoomId(
|
||||
communityUuid: unit!.community.uuid,
|
||||
spaceUuid: unit.id,
|
||||
roomId: roomId);
|
||||
communityUuid: unit!.community.uuid, spaceUuid: unit.id, roomId: roomId);
|
||||
} catch (e) {
|
||||
emitSafe(GetDevicesError(e.toString()));
|
||||
return;
|
||||
}
|
||||
final devices =
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces![roomIndex].devices;
|
||||
final devices = HomeCubit.getInstance().selectedSpace!.subspaces[roomIndex].devices;
|
||||
emitSafe(GetDevicesSuccess(devices));
|
||||
|
||||
//get status for each device
|
||||
@@ -347,7 +343,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
emitSafe(GetDeviceStatusLoading(code: code));
|
||||
int deviceIndex = HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces![roomIndex]
|
||||
.subspaces[roomIndex]
|
||||
.devices!
|
||||
.indexWhere((element) => element.uuid == deviceUuid);
|
||||
List<StatusModel> statuses = [];
|
||||
@@ -360,11 +356,8 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
emitSafe(GetDeviceStatusError(e.toString()));
|
||||
return;
|
||||
}
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces![roomIndex]
|
||||
.devices![deviceIndex]
|
||||
.status = statuses;
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces[roomIndex].devices![deviceIndex].status =
|
||||
statuses;
|
||||
emitSafe(GetDeviceStatusSuccess(code: code));
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,7 @@ class PowerClampSwitch extends PowerClampEvent {
|
||||
final bool switchD;
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
const PowerClampSwitch(
|
||||
{required this.switchD, this.deviceId = '', this.productId = ''});
|
||||
const PowerClampSwitch({required this.switchD, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [switchD, deviceId, productId];
|
||||
@@ -26,8 +25,8 @@ class PowerClampUpdated extends PowerClampEvent {}
|
||||
class FetchEnergyData extends PowerClampEvent {}
|
||||
|
||||
class SelectDateEvent extends PowerClampEvent {
|
||||
BuildContext context;
|
||||
SelectDateEvent({required this.context});
|
||||
final BuildContext context;
|
||||
const SelectDateEvent({required this.context});
|
||||
}
|
||||
|
||||
class PowerClampInitial extends PowerClampEvent {
|
||||
@@ -108,12 +107,9 @@ class StopTimer extends PowerClampEvent {}
|
||||
|
||||
class OnClose extends PowerClampEvent {}
|
||||
|
||||
|
||||
class FilterRecordsByDateEvent extends PowerClampEvent {
|
||||
final DateTime selectedDate;
|
||||
final String viewType; // 'Day', 'Month', 'Year'
|
||||
|
||||
const FilterRecordsByDateEvent(
|
||||
{required this.selectedDate, required this.viewType});
|
||||
const FilterRecordsByDateEvent({required this.selectedDate, required this.viewType});
|
||||
}
|
||||
|
||||
|
||||
@@ -13,13 +13,14 @@ import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart';
|
||||
import 'package:syncrow_app/utils/context_extension.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||
|
||||
class DevicesViewPage extends StatelessWidget {
|
||||
const DevicesViewPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocProvider(
|
||||
create: (context) => SceneBloc(), // Initialize your SceneBloc here
|
||||
create: (context) => SceneBloc(), // Initialize your SceneBloc here
|
||||
child: DevicesViewBody(),
|
||||
);
|
||||
}
|
||||
@@ -42,75 +43,74 @@ class DevicesViewBody extends StatelessWidget {
|
||||
return HomeCubit.getInstance().spaces?.isEmpty ?? true
|
||||
? const CreateUnitWidget()
|
||||
: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
TitleMedium(
|
||||
text: StringsManager.devices,
|
||||
style: context.titleMedium.copyWith(
|
||||
fontSize: 25,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height*0.1,
|
||||
child: const SceneView(pageType: true,)
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
const RoomsSlider(),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
|
||||
Expanded(
|
||||
child: PageView(
|
||||
|
||||
controller: HomeCubit.getInstance().devicesPageController,
|
||||
onPageChanged: (index) {
|
||||
HomeCubit.getInstance().devicesPageChanged(index);
|
||||
},
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
WizardPage(
|
||||
groupsList: DevicesCubit.getInstance().allCategories ?? [],
|
||||
Row(
|
||||
children: [
|
||||
TitleMedium(
|
||||
text: StringsManager.devices,
|
||||
style: context.titleMedium.copyWith(
|
||||
fontSize: 25,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
if (HomeCubit.getInstance().selectedSpace != null)
|
||||
if (HomeCubit.getInstance().selectedSpace!.subspaces != null)
|
||||
...HomeCubit.getInstance().selectedSpace!.subspaces!.map((room) {
|
||||
return RoomPage(
|
||||
room: room,
|
||||
);
|
||||
},
|
||||
)
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height * 0.1,
|
||||
child: const SceneView(
|
||||
pageType: true,
|
||||
)),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
const RoomsSlider(),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: PageView(
|
||||
controller: HomeCubit.getInstance().devicesPageController,
|
||||
onPageChanged: (index) {
|
||||
HomeCubit.getInstance().devicesPageChanged(index);
|
||||
},
|
||||
children: [
|
||||
WizardPage(
|
||||
groupsList: DevicesCubit.getInstance().allCategories ?? [],
|
||||
),
|
||||
if (HomeCubit.getInstance().selectedSpace != null)
|
||||
...HomeCubit.getInstance().selectedSpace!.subspaces.map(
|
||||
(room) {
|
||||
return RoomPage(
|
||||
room: room,
|
||||
);
|
||||
},
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
HomeCubit.getInstance().selectedSpace != null
|
||||
? Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 7,
|
||||
),
|
||||
child: SmoothPageIndicator(
|
||||
controller: HomeCubit.getInstance().devicesPageController,
|
||||
count: HomeCubit.getInstance().selectedSpace!.subspaces.length + 1,
|
||||
effect: const WormEffect(
|
||||
paintStyle: PaintingStyle.stroke,
|
||||
dotHeight: 8,
|
||||
dotWidth: 8,
|
||||
),
|
||||
),
|
||||
)
|
||||
: const Center(
|
||||
child: BodyLarge(text: 'No Home Found'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
HomeCubit.getInstance().selectedSpace != null
|
||||
? Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 7,
|
||||
),
|
||||
child: SmoothPageIndicator(
|
||||
controller: HomeCubit.getInstance().devicesPageController,
|
||||
count: HomeCubit.getInstance().selectedSpace!.subspaces!.length + 1,
|
||||
effect: const WormEffect(
|
||||
paintStyle: PaintingStyle.stroke,
|
||||
dotHeight: 8,
|
||||
dotWidth: 8,
|
||||
),
|
||||
),
|
||||
)
|
||||
: const Center(
|
||||
child: BodyLarge(text: 'No Home Found'),
|
||||
),
|
||||
],
|
||||
);
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:syncrow_app/features/devices/model/room_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/room_page_switch.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
@@ -52,9 +51,7 @@ class _RoomPageState extends State<RoomPage> {
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Search',
|
||||
hintStyle: const TextStyle(
|
||||
color: ColorsManager.textGray,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w400),
|
||||
color: ColorsManager.textGray, fontSize: 16, fontWeight: FontWeight.w400),
|
||||
prefixIcon: Container(
|
||||
padding: const EdgeInsets.all(5.0),
|
||||
margin: const EdgeInsets.all(10.0),
|
||||
|
||||
@@ -39,29 +39,23 @@ class RoomsSlider extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
if (HomeCubit.getInstance().selectedSpace != null)
|
||||
if (HomeCubit.getInstance().selectedSpace!.subspaces != null)
|
||||
...HomeCubit.getInstance().selectedSpace!.subspaces!.map(
|
||||
(room) => InkWell(
|
||||
onTap: () {
|
||||
HomeCubit.getInstance().roomSliderPageChanged(
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces!
|
||||
.indexOf(room));
|
||||
},
|
||||
child: TitleMedium(
|
||||
text: room.name!,
|
||||
style: context.titleMedium.copyWith(
|
||||
fontSize: 25,
|
||||
color:
|
||||
HomeCubit.getInstance().selectedRoom == room
|
||||
? ColorsManager.textPrimaryColor
|
||||
: ColorsManager.textPrimaryColor
|
||||
.withOpacity(.2),
|
||||
),
|
||||
...HomeCubit.getInstance().selectedSpace!.subspaces.map(
|
||||
(room) => InkWell(
|
||||
onTap: () {
|
||||
HomeCubit.getInstance().roomSliderPageChanged(
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces.indexOf(room));
|
||||
},
|
||||
child: TitleMedium(
|
||||
text: room.name!,
|
||||
style: context.titleMedium.copyWith(
|
||||
fontSize: 25,
|
||||
color: HomeCubit.getInstance().selectedRoom == room
|
||||
? ColorsManager.textPrimaryColor
|
||||
: ColorsManager.textPrimaryColor.withOpacity(.2),
|
||||
),
|
||||
),
|
||||
)
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -40,13 +40,10 @@ class SceneListview extends StatelessWidget {
|
||||
sceneName: scene.name,
|
||||
),
|
||||
);
|
||||
context
|
||||
.read<SmartSceneSelectBloc>()
|
||||
.add(const SmartSceneClearEvent());
|
||||
context.read<SmartSceneSelectBloc>().add(const SmartSceneClearEvent());
|
||||
|
||||
BlocProvider.of<CreateSceneBloc>(context).add(
|
||||
FetchSceneTasksEvent(
|
||||
sceneId: scene.id, isAutomation: false));
|
||||
BlocProvider.of<CreateSceneBloc>(context)
|
||||
.add(FetchSceneTasksEvent(sceneId: scene.id, isAutomation: false));
|
||||
|
||||
/// the state to set the scene type must be after the fetch
|
||||
BlocProvider.of<CreateSceneBloc>(context)
|
||||
@@ -59,15 +56,13 @@ class SceneListview extends StatelessWidget {
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: scene.iconInBytes != null &&
|
||||
scene.iconInBytes.isNotEmpty
|
||||
child: scene.iconInBytes.isNotEmpty
|
||||
? Image.memory(
|
||||
scene.iconInBytes,
|
||||
height: 32,
|
||||
width: 32,
|
||||
fit: BoxFit.fill,
|
||||
errorBuilder: (context, error, stackTrace) =>
|
||||
Image.asset(
|
||||
errorBuilder: (context, error, stackTrace) => Image.asset(
|
||||
Assets.assetsIconsLogo,
|
||||
height: 32,
|
||||
width: 32,
|
||||
|
||||
Reference in New Issue
Block a user