Add BatchControlDevicesService integration to FlushMountedPresenceSensorBloc and ControlView

This commit is contained in:
Faris Armoush
2025-04-23 10:31:26 +03:00
parent 24130be665
commit b11d4186fb
3 changed files with 95 additions and 1 deletions

View File

@ -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<FlushMountedPresenceSensorEvent, FlushMountedPresenceSensorState> {
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<FlushMountedPresenceSensorFetchStatusEvent>(
_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,

View File

@ -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<FlushMountedPresenceSensorBloc,
FlushMountedPresenceSensorState>(

View File

@ -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<bool> batchControlDevices({
required List<String> uuids,
@ -5,3 +10,81 @@ abstract interface class BatchControlDevicesService {
required Object value,
});
}
class RemoteBatchControlDevicesService implements BatchControlDevicesService {
@override
Future<bool> batchControlDevices({
required List<String> 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<String> uuids, String code, Object value)> _pendingRequests = [];
bool _isProcessing = false;
DebouncedBatchControlDevicesService({
required this.decoratee,
Duration debounceDuration = const Duration(milliseconds: 1500),
}) : _debounceDuration = debounceDuration;
@override
Future<bool> batchControlDevices({
required List<String> 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;
}
}
}