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, required String code, 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; } } }