push batch door sensor, design bugs

This commit is contained in:
ashrafzarkanisala
2024-10-02 01:41:15 +03:00
parent 0d49ad5106
commit 9dbf4b0540
16 changed files with 195 additions and 60 deletions

View File

@ -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';
@ -77,6 +78,8 @@ mixin RouteControlsBasedCode {
CPS:
AC:
CUR:
WH:
DS:
*/
Widget routeBatchControlsWidgets({required List<AllDevicesModel> 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();
}

View File

@ -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<String, dynamic> 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;
}
}

View File

@ -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 ?? '',

View File

@ -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<CeilingSensorBloc>().add(

View File

@ -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<CeilingSensorBloc>().add(

View File

@ -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<DoorLockBloc>(context).add(
DoorLockFactoryReset(
@ -44,8 +42,8 @@ class DoorLockBatchControlView extends StatelessWidget
);
},
),
],
),
),
],
);
}
}

View File

@ -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<GateWayBloc, GateWayState>(
@ -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<GateWayBloc>().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<GateWayBloc>().add(
GateWayFactoryReset(
deviceId: gatewayIds.first,
factoryReset:
FactoryResetModel(devicesUuid: gatewayIds),
),
);
},
),
),
],
);

View File

@ -15,6 +15,7 @@ class MainDoorSensorBloc
on<MainDoorSensorControl>(_onControl);
on<MainDoorSensorFetchBatchEvent>(_onFetchBatchStatus);
on<MainDoorSensorReportsEvent>(_fetchReports);
on<MainDoorSensorFactoryReset>(_factoryReset);
}
late MainDoorSensorStatusModel deviceStatus;
@ -137,4 +138,22 @@ class MainDoorSensorBloc
_timer?.cancel();
return super.close();
}
FutureOr<void> _factoryReset(MainDoorSensorFactoryReset event,
Emitter<MainDoorSensorState> 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()));
}
}
}

View File

@ -1,5 +1,7 @@
import 'package:equatable/equatable.dart';
import '../../all_devices/models/factory_reset_model.dart';
class MainDoorSensorEvent extends Equatable {
@override
List<Object?> 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});
}

View File

@ -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<String> 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<MainDoorSensorBloc>(context).add(
MainDoorSensorFactoryReset(
deviceId: devicesIds.first,
factoryReset: FactoryResetModel(devicesUuid: devicesIds),
),
);
},
),
),
],
);
}
}

View File

@ -56,7 +56,11 @@ class _FactoryResetWidgetState extends State<FactoryResetWidget> {
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<FactoryResetWidget> {
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),
),
),
),

View File

@ -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';
}
}

View File

@ -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),
),
),
),

View File

@ -96,7 +96,7 @@ class WallSensorBatchControlView extends StatelessWidget
minValue: 10,
maxValue: 10000,
steps: 1,
description: 'hr',
description: 'sec',
action: (int value) =>
context.read<WallSensorBloc>().add(WallSensorBatchControlEvent(
deviceIds: devicesIds,

View File

@ -135,7 +135,7 @@ class WallSensorControlsView extends StatelessWidget
minValue: 10,
maxValue: 10000,
steps: 1,
description: 'hr',
description: 'sec',
action: (int value) =>
context.read<WallSensorBloc>().add(WallSensorChangeValueEvent(
code: 'no_one_time',

View File

@ -76,7 +76,8 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
final currentState = state as WaterHeaterDeviceStatusLoaded;
final updatedDays = List<bool>.from(currentState.selectedDays);
updatedDays[event.index] = event.value;
emit(currentState.copyWith(selectedDays: updatedDays));
emit(currentState.copyWith(
selectedDays: updatedDays, selectedTime: currentState.selectedTime));
}
FutureOr<void> _updateFunctionOn(
@ -84,7 +85,8 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
Emitter<WaterHeaterState> emit,
) {
final currentState = state as WaterHeaterDeviceStatusLoaded;
emit(currentState.copyWith(functionOn: event.isOn));
emit(currentState.copyWith(
functionOn: event.isOn, selectedTime: currentState.selectedTime));
}
FutureOr<void> _updateScheduleEvent(