diff --git a/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_bloc.dart b/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_bloc.dart index d7720937..98cfa977 100644 --- a/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_bloc.dart +++ b/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_bloc.dart @@ -8,6 +8,7 @@ import 'package:syncrow_web/pages/device_managment/all_devices/models/device_rep import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_reset_model.dart'; import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/models/flush_mounted_presence_sensor_model.dart'; +import 'package:syncrow_web/services/batch_control_devices_service.dart'; import 'package:syncrow_web/services/control_device_service.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; @@ -18,11 +19,13 @@ class FlushMountedPresenceSensorBloc extends Bloc { final String deviceId; final ControlDeviceService controlDeviceService; + final BatchControlDevicesService batchControlDevicesService; late FlushMountedPresenceSensorModel deviceStatus; FlushMountedPresenceSensorBloc({ required this.deviceId, required this.controlDeviceService, + required this.batchControlDevicesService, }) : super(FlushMountedPresenceSensorInitialState()) { on( _onFlushMountedPresenceSensorFetchStatusEvent, @@ -193,7 +196,11 @@ class FlushMountedPresenceSensorBloc }) async { try { if (isBatch) { - await DevicesManagementApi().deviceBatchControl(deviceId, code, value); + await batchControlDevicesService.batchControlDevices( + uuids: deviceId, + code: code, + value: value, + ); } else { await controlDeviceService.controlDevice( deviceUuid: deviceId, diff --git a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart index 5a355067..c02b4141 100644 --- a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart +++ b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart @@ -9,6 +9,7 @@ import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presen import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_update_data.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/description_view.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dart'; +import 'package:syncrow_web/services/batch_control_devices_service.dart'; import 'package:syncrow_web/services/control_device_service.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; @@ -30,6 +31,9 @@ class FlushMountedPresenceSensorControlView extends StatelessWidget controlDeviceService: DebouncedControlDeviceService( decoratee: RemoteControlDeviceService(), ), + batchControlDevicesService: DebouncedBatchControlDevicesService( + decoratee: RemoteBatchControlDevicesService(), + ), )..add(FlushMountedPresenceSensorFetchStatusEvent()), child: BlocBuilder( diff --git a/lib/services/batch_control_devices_service.dart b/lib/services/batch_control_devices_service.dart index 3049ec7e..c8d0bfc2 100644 --- a/lib/services/batch_control_devices_service.dart +++ b/lib/services/batch_control_devices_service.dart @@ -1,3 +1,8 @@ +import 'dart:developer'; + +import 'package:syncrow_web/services/api/http_service.dart'; +import 'package:syncrow_web/utils/constants/api_const.dart'; + abstract interface class BatchControlDevicesService { Future batchControlDevices({ required List uuids, @@ -5,3 +10,81 @@ abstract interface class BatchControlDevicesService { required Object value, }); } + +class RemoteBatchControlDevicesService implements BatchControlDevicesService { + @override + Future batchControlDevices({ + required List uuids, + required String code, + required Object value, + }) async { + try { + final body = { + 'devicesUuid': uuids, + 'code': code, + 'value': value, + 'operationType': 'COMMAND', + }; + + final response = await HTTPService().post( + path: ApiEndpoints.deviceBatchControl, + body: body, + showServerMessage: true, + expectedResponseModel: (json) => (json['success'] as bool?) ?? false, + ); + + return response; + } catch (e) { + log('Error fetching $e', name: 'BatchControlDevicesService'); + return false; + } + } +} + +final class DebouncedBatchControlDevicesService + implements BatchControlDevicesService { + final BatchControlDevicesService decoratee; + final Duration _debounceDuration; + final List<(List uuids, String code, Object value)> _pendingRequests = []; + bool _isProcessing = false; + + DebouncedBatchControlDevicesService({ + required this.decoratee, + Duration debounceDuration = const Duration(milliseconds: 1500), + }) : _debounceDuration = debounceDuration; + + @override + Future batchControlDevices({ + required List uuids, + required String code, + required Object value, + }) async { + _pendingRequests.add((uuids, code, value)); + + if (_isProcessing) { + log( + 'Request added to queue', + name: 'DebouncedBatchControlDevicesService', + ); + return false; + } + + _isProcessing = true; + + await Future.delayed(_debounceDuration); + + final lastRequest = _pendingRequests.last; + _pendingRequests.clear(); + + try { + final (lastRequestUuids, lastRequestCode, lastRequestValue) = lastRequest; + return decoratee.batchControlDevices( + uuids: lastRequestUuids, + code: lastRequestCode, + value: lastRequestValue, + ); + } finally { + _isProcessing = false; + } + } +}