From fd09db6835a60ccaef9d789b346d1da2895e020e Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Wed, 18 Sep 2024 13:15:43 +0300 Subject: [PATCH] push ceiling sensor batch control --- .../ceiling_sensor/bloc/bloc.dart | 68 ++++++++++++++++--- .../ceiling_sensor/bloc/event.dart | 32 ++++++++- .../ceiling_sensor/bloc/state.dart | 9 +++ .../model/ceiling_sensor_model.dart | 25 +++++++ .../view/ceiling_sensor_batch_control.dart | 18 ++--- .../view/ceiling_sensor_controls.dart | 2 +- lib/services/devices_mang_api.dart | 2 +- 7 files changed, 132 insertions(+), 24 deletions(-) diff --git a/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart b/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart index 055c21b1..ba8e4114 100644 --- a/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart +++ b/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart @@ -14,8 +14,9 @@ class CeilingSensorBloc extends Bloc { CeilingSensorBloc({required this.deviceId}) : super(CeilingInitialState()) { on(_fetchCeilingSensorStatus); - on(_fetchCeilingSensorBatchControl); + on(_fetchCeilingSensorBatchControl); on(_changeValue); + on(_onBatchControl); on(_getDeviceReports); on(_showDescription); on(_backToGridView); @@ -25,7 +26,8 @@ class CeilingSensorBloc extends Bloc { CeilingInitialEvent event, Emitter emit) async { emit(CeilingLoadingInitialState()); try { - var response = await DevicesManagementApi().getDeviceStatus(deviceId); + var response = await DevicesManagementApi() + .getDeviceStatus(event.deviceId); deviceStatus = CeilingSensorModel.fromJson(response.status); emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); // _listenToChanges(); @@ -68,34 +70,76 @@ class CeilingSensorBloc extends Bloc { } emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); await _runDeBouncer( - deviceId: deviceId, code: event.code, value: event.value, emit: emit); + deviceId: deviceId, + code: event.code, + value: event.value, + emit: emit, + isBatch: false, + ); + } + + Future _onBatchControl( + CeilingBatchControlEvent event, Emitter emit) async { + emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus)); + if (event.code == 'sensitivity') { + deviceStatus.sensitivity = event.value; + } else if (event.code == 'none_body_time') { + deviceStatus.noBodyTime = event.value; + } else if (event.code == 'moving_max_dis') { + deviceStatus.maxDistance = event.value; + } else if (event.code == 'scene') { + deviceStatus.spaceType = getSpaceType(event.value); + } + emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); + await _runDeBouncer( + deviceId: event.deviceIds, + code: event.code, + value: event.value, + emit: emit, + isBatch: true, + ); } _runDeBouncer({ - required String deviceId, + required dynamic deviceId, required String code, required dynamic value, required Emitter emit, + required bool isBatch, }) { + late String id; + + if (deviceId is List) { + id = deviceId.first; + } else { + id = deviceId; + } + if (_timer != null) { _timer!.cancel(); } _timer = Timer(const Duration(seconds: 1), () async { try { - final response = await DevicesManagementApi() - .deviceControl(deviceId, Status(code: code, value: value)); + late bool response; + if (isBatch) { + response = await DevicesManagementApi() + .deviceBatchControl(deviceId, code, value); + } else { + response = await DevicesManagementApi() + .deviceControl(deviceId, Status(code: code, value: value)); + } if (!response) { - add(CeilingInitialEvent()); + add(CeilingInitialEvent(id)); } if (response == true && code == 'scene') { emit(CeilingLoadingInitialState()); await Future.delayed(const Duration(seconds: 1)); - add(CeilingInitialEvent()); + add(CeilingInitialEvent(id)); } } catch (_) { await Future.delayed(const Duration(milliseconds: 500)); - add(CeilingInitialEvent()); + add(CeilingInitialEvent(id)); } }); } @@ -131,10 +175,12 @@ class CeilingSensorBloc extends Bloc { } FutureOr _fetchCeilingSensorBatchControl( - CeilingBatchControlEvent event, Emitter emit) async { + CeilingFetchDeviceStatusEvent event, + Emitter emit) async { emit(CeilingLoadingInitialState()); try { - var response = await DevicesManagementApi().getDeviceStatus(deviceId); + var response = + await DevicesManagementApi().getBatchStatus(event.devicesIds); deviceStatus = CeilingSensorModel.fromJson(response.status); emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); } catch (e) { diff --git a/lib/pages/device_managment/ceiling_sensor/bloc/event.dart b/lib/pages/device_managment/ceiling_sensor/bloc/event.dart index d445578e..c1efa47c 100644 --- a/lib/pages/device_managment/ceiling_sensor/bloc/event.dart +++ b/lib/pages/device_managment/ceiling_sensor/bloc/event.dart @@ -7,9 +7,37 @@ abstract class CeilingSensorEvent extends Equatable { List get props => []; } -class CeilingInitialEvent extends CeilingSensorEvent {} +class CeilingInitialEvent extends CeilingSensorEvent { + final String deviceId; + const CeilingInitialEvent(this.deviceId); -class CeilingBatchControlEvent extends CeilingSensorEvent {} + @override + List get props => [deviceId]; +} + +class CeilingFetchDeviceStatusEvent extends CeilingSensorEvent { + final List devicesIds; + + const CeilingFetchDeviceStatusEvent(this.devicesIds); + + @override + List get props => [devicesIds]; +} + +class CeilingBatchControlEvent extends CeilingSensorEvent { + final List deviceIds; + final String code; + final dynamic value; + + const CeilingBatchControlEvent({ + required this.deviceIds, + required this.code, + required this.value, + }); + + @override + List get props => [deviceIds, code, value]; +} class CeilingChangeValueEvent extends CeilingSensorEvent { final dynamic value; diff --git a/lib/pages/device_managment/ceiling_sensor/bloc/state.dart b/lib/pages/device_managment/ceiling_sensor/bloc/state.dart index 0bd7e4ed..d9144474 100644 --- a/lib/pages/device_managment/ceiling_sensor/bloc/state.dart +++ b/lib/pages/device_managment/ceiling_sensor/bloc/state.dart @@ -66,3 +66,12 @@ class ShowCeilingDescriptionState extends CeilingSensorState { @override List get props => [description]; } + +class CeilingBatchControlSuccessState extends CeilingSensorState { + final CeilingSensorModel ceilingSensorModel; + + const CeilingBatchControlSuccessState({required this.ceilingSensorModel}); + + @override + List get props => [ceilingSensorModel]; +} diff --git a/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart b/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart index a79cbc19..18149990 100644 --- a/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart +++ b/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; class CeilingSensorModel { @@ -91,6 +92,30 @@ class CeilingSensorModel { spaceType: _spaceType, ); } + + CeilingSensorModel copyWith({ + String? presenceState, + int? sensitivity, + String? checkingResult, + int? presenceRange, + int? sportsPara, + String? bodyMovement, + String? noBodyTime, + int? maxDistance, + SpaceTypes? spaceType, + }) { + return CeilingSensorModel( + presenceState: presenceState ?? this.presenceState, + sensitivity: sensitivity ?? this.sensitivity, + checkingResult: checkingResult ?? this.checkingResult, + presenceRange: presenceRange ?? this.presenceRange, + sportsPara: sportsPara ?? this.sportsPara, + bodyMovement: bodyMovement ?? this.bodyMovement, + noBodyTime: noBodyTime ?? this.noBodyTime, + maxDistance: maxDistance ?? this.maxDistance, + spaceType: spaceType ?? this.spaceType, + ); + } } enum SpaceTypes { 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 5511c0bc..f95852a5 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 @@ -24,7 +24,7 @@ class CeilingSensorBatchControlView extends StatelessWidget final isMedium = isMediumScreenSize(context); return BlocProvider( create: (context) => CeilingSensorBloc(deviceId: devicesIds.first) - ..add(CeilingBatchControlEvent()), + ..add(CeilingFetchDeviceStatusEvent(devicesIds)), child: BlocBuilder( builder: (context, state) { if (state is CeilingLoadingInitialState || @@ -33,10 +33,6 @@ class CeilingSensorBatchControlView extends StatelessWidget } else if (state is CeilingUpdateState) { return _buildGridView(context, state.ceilingSensorModel, isExtraLarge, isLarge, isMedium); - } else if (state is CeilingReportsFailedState) { - final model = context.read().deviceStatus; - return _buildGridView( - context, model, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -65,7 +61,8 @@ class CeilingSensorBatchControlView extends StatelessWidget description: 'Space Type', value: model.spaceType, action: (String value) => context.read().add( - CeilingChangeValueEvent( + CeilingBatchControlEvent( + deviceIds: devicesIds, code: 'scene', value: value, ), @@ -79,7 +76,8 @@ class CeilingSensorBatchControlView extends StatelessWidget steps: 1, action: (int value) { context.read().add( - CeilingChangeValueEvent( + CeilingBatchControlEvent( + deviceIds: devicesIds, code: 'sensitivity', value: value, ), @@ -94,7 +92,8 @@ class CeilingSensorBatchControlView extends StatelessWidget steps: 50, description: 'm', action: (int value) => context.read().add( - CeilingChangeValueEvent( + CeilingBatchControlEvent( + deviceIds: devicesIds, code: 'moving_max_dis', value: value, ), @@ -105,7 +104,8 @@ class CeilingSensorBatchControlView extends StatelessWidget title: 'Nobody Time:', description: '', action: (String value) => context.read().add( - CeilingChangeValueEvent( + CeilingBatchControlEvent( + deviceIds: devicesIds, code: 'nobody_time', value: value, ), 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 1f4d58f9..e2048ab4 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 @@ -29,7 +29,7 @@ class CeilingSensorControlsView extends StatelessWidget final isMedium = isMediumScreenSize(context); return BlocProvider( create: (context) => CeilingSensorBloc(deviceId: device.uuid ?? '') - ..add(CeilingInitialEvent()), + ..add(CeilingInitialEvent(device.uuid ?? '')), child: BlocBuilder( builder: (context, state) { if (state is CeilingLoadingInitialState || diff --git a/lib/services/devices_mang_api.dart b/lib/services/devices_mang_api.dart index 03ddf6ca..4be915a2 100644 --- a/lib/services/devices_mang_api.dart +++ b/lib/services/devices_mang_api.dart @@ -79,7 +79,7 @@ class DevicesManagementApi { body: body, showServerMessage: true, expectedResponseModel: (json) { - return json['success'] ?? false; + return (json['successResults'] as List).isNotEmpty ; }, );