From d1bb7b129ffce822e507d3cad65de9ddefa5f6a1 Mon Sep 17 00:00:00 2001 From: mohammad Date: Wed, 23 Apr 2025 10:46:56 +0300 Subject: [PATCH] Refactor widget lifecycle methods for temperature control and presence sensor --- .../ac/view/control_list/current_temp.dart | 10 +++- .../view/ceiling_sensor_controls.dart | 34 ++++++++------ .../sensors_widgets/presense_nobody_time.dart | 10 ++++ .../wall_sensor/bloc/wall_bloc.dart | 46 +++++++++++-------- .../wall_sensor/bloc/wall_event.dart | 6 +++ 5 files changed, 72 insertions(+), 34 deletions(-) diff --git a/lib/pages/device_managment/ac/view/control_list/current_temp.dart b/lib/pages/device_managment/ac/view/control_list/current_temp.dart index 7618846c..fdd51164 100644 --- a/lib/pages/device_managment/ac/view/control_list/current_temp.dart +++ b/lib/pages/device_managment/ac/view/control_list/current_temp.dart @@ -60,7 +60,15 @@ class _CurrentTempState extends State { ); }); } - + @override + void didUpdateWidget(CurrentTemp oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.tempSet != widget.tempSet) { + setState(() { + _adjustedValue = _initialAdjustedValue(widget.tempSet); + }); + } + } @override void dispose() { _debounce?.cancel(); 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 845c326b..36b676e9 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 @@ -16,7 +16,8 @@ import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dar import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class CeilingSensorControlsView extends StatelessWidget with HelperResponsiveLayout { +class CeilingSensorControlsView extends StatelessWidget + with HelperResponsiveLayout { const CeilingSensorControlsView({super.key, required this.device}); final AllDevicesModel device; @@ -31,29 +32,35 @@ class CeilingSensorControlsView extends StatelessWidget with HelperResponsiveLay ..add(CeilingInitialEvent(device.uuid ?? '')), child: BlocBuilder( builder: (context, state) { - if (state is CeilingLoadingInitialState || state is CeilingReportsLoadingState) { + if (state is CeilingLoadingInitialState || + state is CeilingReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is CeilingUpdateState) { - return _buildGridView( - context, state.ceilingSensorModel, isExtraLarge, isLarge, isMedium); + return _buildGridView(context, state.ceilingSensorModel, + isExtraLarge, isLarge, isMedium); } else if (state is CeilingReportsState) { return ReportsTable( report: state.deviceReport, onRowTap: (index) {}, onClose: () { - context.read().add(BackToCeilingGridViewEvent()); + context + .read() + .add(BackToCeilingGridViewEvent()); }, ); } else if (state is ShowCeilingDescriptionState) { return DescriptionView( description: state.description, onClose: () { - context.read().add(BackToCeilingGridViewEvent()); + context + .read() + .add(BackToCeilingGridViewEvent()); }, ); } else if (state is CeilingReportsFailedState) { final model = context.read().deviceStatus; - return _buildGridView(context, model, isExtraLarge, isLarge, isMedium); + return _buildGridView( + context, model, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -61,8 +68,8 @@ class CeilingSensorControlsView extends StatelessWidget with HelperResponsiveLay ); } - Widget _buildGridView(BuildContext context, CeilingSensorModel model, bool isExtraLarge, - bool isLarge, bool isMedium) { + Widget _buildGridView(BuildContext context, CeilingSensorModel model, + bool isExtraLarge, bool isLarge, bool isMedium) { return GridView( padding: const EdgeInsets.symmetric(horizontal: 50), shrinkWrap: true, @@ -143,8 +150,8 @@ class CeilingSensorControlsView extends StatelessWidget with HelperResponsiveLay ), GestureDetector( onTap: () { - context.read().add( - GetCeilingDeviceReportsEvent(code: 'presence_state', deviceUuid: device.uuid!)); + context.read().add(GetCeilingDeviceReportsEvent( + code: 'presence_state', deviceUuid: device.uuid!)); }, child: const PresenceStaticWidget( icon: Assets.illuminanceRecordIcon, @@ -153,9 +160,8 @@ class CeilingSensorControlsView extends StatelessWidget with HelperResponsiveLay ), GestureDetector( onTap: () { - context - .read() - .add(GetCeilingDeviceReportsEvent(code: '', deviceUuid: device.uuid!)); + context.read().add(GetCeilingDeviceReportsEvent( + code: '', deviceUuid: device.uuid!)); }, child: const PresenceStaticWidget( icon: Assets.helpDescriptionIcon, diff --git a/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart b/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart index 4e64ee1e..9cc23505 100644 --- a/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart +++ b/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart @@ -84,6 +84,16 @@ class _PresenceUpdateDataState extends State { } } + @override + void didUpdateWidget(PresenceNoBodyTime oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.value != widget.value) { + setState(() { + _currentValue = widget.value; + }); + } + } + @override Widget build(BuildContext context) { return DeviceControlsContainer( diff --git a/lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart b/lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart index ea2813d7..3c144142 100644 --- a/lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart +++ b/lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart @@ -21,6 +21,7 @@ class WallSensorBloc extends Bloc { on(_showDescription); on(_backToGridView); on(_onFactoryReset); + on(_onRealtimeUpdate); } void _fetchWallSensorStatus( @@ -30,7 +31,7 @@ class WallSensorBloc extends Bloc { var response = await DevicesManagementApi().getDeviceStatus(deviceId); deviceStatus = WallSensorModel.fromJson(response.status); emit(WallSensorUpdateState(wallSensorModel: deviceStatus)); - _listenToChanges(emit, deviceId); + _listenToChanges(deviceId); } catch (e) { emit(WallSensorFailedState(error: e.toString())); return; @@ -52,28 +53,27 @@ class WallSensorBloc extends Bloc { } } - _listenToChanges(Emitter emit, deviceId) { - try { - DatabaseReference ref = - FirebaseDatabase.instance.ref('device-status/$deviceId'); - Stream stream = ref.onValue; + void _listenToChanges(String deviceId) { + DatabaseReference ref = + FirebaseDatabase.instance.ref('device-status/$deviceId'); + ref.onValue.listen((DatabaseEvent event) { + final data = event.snapshot.value as Map?; + if (data == null) return; - stream.listen((DatabaseEvent event) { - Map usersMap = - event.snapshot.value as Map; - List statusList = []; + final statusList = (data['status'] as List?) + ?.map((e) => Status(code: e['code'], value: e['value'])) + .toList(); - usersMap['status'].forEach((element) { - statusList - .add(Status(code: element['code'], value: element['value'])); - }); - - deviceStatus = WallSensorModel.fromJson(statusList); - emit(WallSensorLoadingNewSate(wallSensorModel: deviceStatus)); - }); - } catch (_) {} + if (statusList != null) { + final updatedDeviceStatus = WallSensorModel.fromJson(statusList); + if (!isClosed) { + add(WallSensorRealtimeUpdateEvent(updatedDeviceStatus)); + } + } + }); } + void _changeValue( WallSensorChangeValueEvent event, Emitter emit) async { emit(WallSensorLoadingNewSate(wallSensorModel: deviceStatus)); @@ -195,4 +195,12 @@ class WallSensorBloc extends Bloc { emit(WallSensorFailedState(error: e.toString())); } } + + void _onRealtimeUpdate( + WallSensorRealtimeUpdateEvent event, + Emitter emit, + ) { + deviceStatus = event.deviceStatus; + emit(WallSensorUpdateState(wallSensorModel: deviceStatus)); + } } diff --git a/lib/pages/device_managment/wall_sensor/bloc/wall_event.dart b/lib/pages/device_managment/wall_sensor/bloc/wall_event.dart index 17d85d43..fd71d7d4 100644 --- a/lib/pages/device_managment/wall_sensor/bloc/wall_event.dart +++ b/lib/pages/device_managment/wall_sensor/bloc/wall_event.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_reset_model.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/model/wall_sensor_model.dart'; abstract class WallSensorEvent extends Equatable { const WallSensorEvent(); @@ -70,3 +71,8 @@ class WallSensorFactoryResetEvent extends WallSensorEvent { required this.factoryReset, }); } + +class WallSensorRealtimeUpdateEvent extends WallSensorEvent { + final WallSensorModel deviceStatus; + const WallSensorRealtimeUpdateEvent(this.deviceStatus); +}