diff --git a/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart b/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart index 80a00094..068f8c89 100644 --- a/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart +++ b/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart @@ -12,6 +12,7 @@ import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_cont import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_batch_control.dart'; import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_view.dart'; import 'package:syncrow_web/pages/device_managment/main_door_sensor/view/main_door_control_view.dart'; +import 'package:syncrow_web/pages/device_managment/main_door_sensor/view/main_door_sensor_batch_view.dart'; import 'package:syncrow_web/pages/device_managment/one_gang_switch/view/wall_light_batch_control.dart'; import 'package:syncrow_web/pages/device_managment/one_gang_switch/view/wall_light_device_control.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart'; @@ -76,7 +77,9 @@ mixin RouteControlsBasedCode { WPS: CPS: AC: - CUR: + CUR: + WH: + DS: */ Widget routeBatchControlsWidgets({required List devices}) { @@ -148,7 +151,13 @@ mixin RouteControlsBasedCode { .map((e) => e.uuid!) .toList(), ); - + case 'DS': + return MainDoorSensorBatchView( + devicesIds: devices + .where((e) => (e.productType == 'DS')) + .map((e) => e.uuid!) + .toList(), + ); default: return const SizedBox(); } diff --git a/lib/pages/device_managment/all_devices/models/devices_model.dart b/lib/pages/device_managment/all_devices/models/devices_model.dart index e81b7695..b706dad3 100644 --- a/lib/pages/device_managment/all_devices/models/devices_model.dart +++ b/lib/pages/device_managment/all_devices/models/devices_model.dart @@ -63,6 +63,7 @@ class AllDevicesModel { int? updateTime; String? uuid; int? batteryLevel; + String? productName; AllDevicesModel({ this.room, @@ -90,6 +91,7 @@ class AllDevicesModel { this.updateTime, this.uuid, this.batteryLevel, + this.productName, }); AllDevicesModel.fromJson(Map json) { room = (json['room'] != null && (json['room'] is Map)) @@ -121,6 +123,7 @@ class AllDevicesModel { updateTime = int.tryParse(json['updateTime']?.toString() ?? ''); uuid = json['uuid']?.toString(); batteryLevel = int.tryParse(json['battery']?.toString() ?? ''); + productName = json['productName']?.toString(); } String _getDefaultIcon(String? productType) { @@ -182,6 +185,7 @@ class AllDevicesModel { data['updateTime'] = updateTime; data['uuid'] = uuid; data['battery'] = batteryLevel; + data['productName'] = productName; return data; } @@ -214,6 +218,7 @@ class AllDevicesModel { other.timeZone == timeZone && other.updateTime == updateTime && other.uuid == uuid && + other.productName == productName && other.batteryLevel == batteryLevel; } @@ -243,6 +248,7 @@ class AllDevicesModel { timeZone.hashCode ^ updateTime.hashCode ^ uuid.hashCode ^ + productName.hashCode ^ batteryLevel.hashCode; } } diff --git a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart index 46dc5bbd..242c8d5e 100644 --- a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart +++ b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart @@ -165,7 +165,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { data: devicesToShow.map((device) { return [ device.name ?? '', - device.categoryName ?? '', + device.productName ?? '', device.uuid ?? '', device.unit?.name ?? '', device.room?.name ?? '', diff --git a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart index a6e60c8f..d1dc54a2 100644 --- a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart +++ b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart @@ -73,7 +73,7 @@ class CeilingSensorBatchControlView extends StatelessWidget value: model.sensitivity.toDouble(), title: 'Sensitivity:', minValue: 1, - maxValue: 5, + maxValue: 10, steps: 1, action: (int value) { context.read().add( diff --git a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart index e2048ab4..ecf0afae 100644 --- a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart +++ b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart @@ -112,7 +112,7 @@ class CeilingSensorControlsView extends StatelessWidget value: model.sensitivity.toDouble(), title: 'Sensitivity:', minValue: 1, - maxValue: 5, + maxValue: 10, steps: 1, action: (int value) { context.read().add( diff --git a/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart b/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart index 4efd76fc..abbd48dd 100644 --- a/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart +++ b/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart @@ -15,26 +15,24 @@ class DoorLockBatchControlView extends StatelessWidget @override Widget build(BuildContext context) { - final isExtraLarge = isExtraLargeScreenSize(context); - final isLarge = isLargeScreenSize(context); - final isMedium = isMediumScreenSize(context); - return SizedBox( - child: GridView( - padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 20), - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: isLarge || isExtraLarge || isMedium ? 2 : 1, - mainAxisExtent: 140, - crossAxisSpacing: 12, - mainAxisSpacing: 12, - ), - children: [ - FirmwareUpdateWidget( + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 170, + height: 140, + child: FirmwareUpdateWidget( deviceId: devicesIds.first, version: 12, ), - FactoryResetWidget( + ), + const SizedBox( + width: 12, + ), + SizedBox( + width: 170, + height: 140, + child: FactoryResetWidget( callFactoryReset: () { BlocProvider.of(context).add( DoorLockFactoryReset( @@ -44,8 +42,8 @@ class DoorLockBatchControlView extends StatelessWidget ); }, ), - ], - ), + ), + ], ); } } diff --git a/lib/pages/device_managment/gateway/view/gateway_batch_control.dart b/lib/pages/device_managment/gateway/view/gateway_batch_control.dart index 8679a78f..cb85b7d9 100644 --- a/lib/pages/device_managment/gateway/view/gateway_batch_control.dart +++ b/lib/pages/device_managment/gateway/view/gateway_batch_control.dart @@ -14,10 +14,6 @@ class GatewayBatchControlView extends StatelessWidget @override Widget build(BuildContext context) { - final isExtraLarge = isExtraLargeScreenSize(context); - final isLarge = isLargeScreenSize(context); - final isMedium = isMediumScreenSize(context); - return BlocProvider( create: (context) => GateWayBloc()..add(GatWayById(gatewayIds.first)), child: BlocBuilder( @@ -25,28 +21,31 @@ class GatewayBatchControlView extends StatelessWidget if (state is GatewayLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is UpdateGatewayState) { - return GridView( - padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 20), - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: isLarge || isExtraLarge || isMedium ? 2 : 1, - mainAxisExtent: 140, - crossAxisSpacing: 12, - mainAxisSpacing: 12, - ), + return Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - FirmwareUpdateWidget(deviceId: gatewayIds.first, version: 2), - FactoryResetWidget( - callFactoryReset: () { - context.read().add( - GateWayFactoryReset( - deviceId: gatewayIds.first, - factoryReset: - FactoryResetModel(devicesUuid: gatewayIds), - ), - ); - }, + SizedBox( + width: 170, + height: 140, + child: FirmwareUpdateWidget( + deviceId: gatewayIds.first, version: 2)), + const SizedBox( + width: 12, + ), + SizedBox( + width: 170, + height: 140, + child: FactoryResetWidget( + callFactoryReset: () { + context.read().add( + GateWayFactoryReset( + deviceId: gatewayIds.first, + factoryReset: + FactoryResetModel(devicesUuid: gatewayIds), + ), + ); + }, + ), ), ], ); diff --git a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart index 71a4b699..933ce28b 100644 --- a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart +++ b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart @@ -15,6 +15,7 @@ class MainDoorSensorBloc on(_onControl); on(_onFetchBatchStatus); on(_fetchReports); + on(_factoryReset); } late MainDoorSensorStatusModel deviceStatus; @@ -137,4 +138,22 @@ class MainDoorSensorBloc _timer?.cancel(); return super.close(); } + + FutureOr _factoryReset(MainDoorSensorFactoryReset event, + Emitter emit) async { + emit(MainDoorSensorLoadingState()); + try { + final response = await DevicesManagementApi().factoryReset( + event.factoryReset, + event.deviceId, + ); + if (!response) { + emit(MainDoorSensorFailedState(error: 'Failed')); + } else { + add(MainDoorSensorFetchDeviceEvent(event.deviceId)); + } + } catch (e) { + emit(MainDoorSensorFailedState(error: e.toString())); + } + } } diff --git a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart index 40bec02c..c2864333 100644 --- a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart +++ b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart @@ -1,5 +1,7 @@ import 'package:equatable/equatable.dart'; +import '../../all_devices/models/factory_reset_model.dart'; + class MainDoorSensorEvent extends Equatable { @override List get props => []; @@ -61,3 +63,11 @@ class MainDoorSensorReportsEvent extends MainDoorSensorEvent { required this.from, required this.to}); } + +class MainDoorSensorFactoryReset extends MainDoorSensorEvent { + final String deviceId; + final FactoryResetModel factoryReset; + + MainDoorSensorFactoryReset( + {required this.deviceId, required this.factoryReset}); +} diff --git a/lib/pages/device_managment/main_door_sensor/view/main_door_sensor_batch_view.dart b/lib/pages/device_managment/main_door_sensor/view/main_door_sensor_batch_view.dart new file mode 100644 index 00000000..0cacc0be --- /dev/null +++ b/lib/pages/device_managment/main_door_sensor/view/main_door_sensor_batch_view.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_reset_model.dart'; +import 'package:syncrow_web/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart'; + +class MainDoorSensorBatchView extends StatelessWidget { + const MainDoorSensorBatchView({super.key, required this.devicesIds}); + + final List devicesIds; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 170, + height: 140, + child: FirmwareUpdateWidget( + deviceId: devicesIds.first, + version: 12, + ), + ), + const SizedBox( + width: 12, + ), + SizedBox( + width: 170, + height: 140, + child: FactoryResetWidget( + callFactoryReset: () { + BlocProvider.of(context).add( + MainDoorSensorFactoryReset( + deviceId: devicesIds.first, + factoryReset: FactoryResetModel(devicesUuid: devicesIds), + ), + ); + }, + ), + ), + ], + ); + } +} diff --git a/lib/pages/device_managment/shared/batch_control/factory_reset.dart b/lib/pages/device_managment/shared/batch_control/factory_reset.dart index 3153cd48..ea8f833c 100644 --- a/lib/pages/device_managment/shared/batch_control/factory_reset.dart +++ b/lib/pages/device_managment/shared/batch_control/factory_reset.dart @@ -56,7 +56,11 @@ class _FactoryResetWidgetState extends State { backgroundColor: ColorsManager.greyColor, child: Text( 'Cancel', - style: context.textTheme.bodyMedium, + style: context.textTheme.bodyMedium!.copyWith( + color: ColorsManager.blackColor, + fontWeight: FontWeight.w400, + fontSize: 12, + ), ), ), ), @@ -69,8 +73,10 @@ class _FactoryResetWidgetState extends State { backgroundColor: ColorsManager.red, child: Text( 'Reset', - style: context.textTheme.bodyMedium! - .copyWith(color: ColorsManager.whiteColors), + style: context.textTheme.bodyMedium!.copyWith( + color: ColorsManager.whiteColors, + fontWeight: FontWeight.w400, + fontSize: 12), ), ), ), diff --git a/lib/pages/device_managment/shared/device_batch_control_dialog.dart b/lib/pages/device_managment/shared/device_batch_control_dialog.dart index 8b87a964..84d822e6 100644 --- a/lib/pages/device_managment/shared/device_batch_control_dialog.dart +++ b/lib/pages/device_managment/shared/device_batch_control_dialog.dart @@ -37,7 +37,7 @@ class DeviceBatchControlDialog extends StatelessWidget Column( children: [ Text( - devices.first.categoryName ?? 'Device Control', + getBatchDialogName(devices.first), style: context.textTheme.titleLarge!.copyWith( color: ColorsManager.dialogBlueTitle, fontWeight: FontWeight.bold, @@ -65,7 +65,7 @@ class DeviceBatchControlDialog extends StatelessWidget ), ), child: IconButton( - padding: EdgeInsets.all(1), + padding: const EdgeInsets.all(1), icon: const Icon( Icons.close, color: Colors.grey, @@ -92,3 +92,42 @@ class DeviceBatchControlDialog extends StatelessWidget ); } } + +String getBatchDialogName(AllDevicesModel device) { + /* +3G: + 1G: + 2G: + GW: + DL: + WPS: + CPS: + AC: + CUR: + WH: + */ + switch (device.productType) { + case '1G': + return "Smart Light Switch"; + case '2G': + return "2Gang Light"; + case '3G': + return "Living Room"; + case 'GW': + return "GateWay"; + case 'DL': + return "Door Lock"; + case 'WPS': + return "White Presence Sensor"; + case 'CPS': + return "Black Presence Sensor"; + case 'CUR': + return "Smart Curtains"; + case 'WH': + return "Smart Water Hater"; + case 'AC': + return "Smart AC"; + default: + return device.categoryName ?? 'Device Control'; + } +} diff --git a/lib/pages/device_managment/shared/device_control_dialog.dart b/lib/pages/device_managment/shared/device_control_dialog.dart index acf1578c..ba37203e 100644 --- a/lib/pages/device_managment/shared/device_control_dialog.dart +++ b/lib/pages/device_managment/shared/device_control_dialog.dart @@ -87,7 +87,7 @@ class DeviceControlDialog extends StatelessWidget with RouteControlsBasedCode { children: [ TableRow( children: [ - _buildInfoRow('Product Name:', device.categoryName ?? 'N/A'), + _buildInfoRow('Product Name:', device.productName ?? 'N/A'), _buildInfoRow('Device ID:', device.uuid ?? ''), ], ), @@ -131,7 +131,7 @@ class DeviceControlDialog extends StatelessWidget with RouteControlsBasedCode { 'Last Offline Date and Time:', formatDateTime( DateTime.fromMillisecondsSinceEpoch( - ((device.activeTime ?? 0) * 1000), + ((device.updateTime ?? 0) * 1000), ), ), ), diff --git a/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart b/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart index 5e855208..66078d60 100644 --- a/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart +++ b/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart @@ -96,7 +96,7 @@ class WallSensorBatchControlView extends StatelessWidget minValue: 10, maxValue: 10000, steps: 1, - description: 'hr', + description: 'sec', action: (int value) => context.read().add(WallSensorBatchControlEvent( deviceIds: devicesIds, diff --git a/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart b/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart index 4f789477..f0ff7591 100644 --- a/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart +++ b/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart @@ -135,7 +135,7 @@ class WallSensorControlsView extends StatelessWidget minValue: 10, maxValue: 10000, steps: 1, - description: 'hr', + description: 'sec', action: (int value) => context.read().add(WallSensorChangeValueEvent( code: 'no_one_time', diff --git a/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart b/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart index 023faa7a..0a5b2895 100644 --- a/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart +++ b/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart @@ -76,7 +76,8 @@ class WaterHeaterBloc extends Bloc { final currentState = state as WaterHeaterDeviceStatusLoaded; final updatedDays = List.from(currentState.selectedDays); updatedDays[event.index] = event.value; - emit(currentState.copyWith(selectedDays: updatedDays)); + emit(currentState.copyWith( + selectedDays: updatedDays, selectedTime: currentState.selectedTime)); } FutureOr _updateFunctionOn( @@ -84,7 +85,8 @@ class WaterHeaterBloc extends Bloc { Emitter emit, ) { final currentState = state as WaterHeaterDeviceStatusLoaded; - emit(currentState.copyWith(functionOn: event.isOn)); + emit(currentState.copyWith( + functionOn: event.isOn, selectedTime: currentState.selectedTime)); } FutureOr _updateScheduleEvent(