mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 07:07:19 +00:00
86 lines
2.2 KiB
Dart
86 lines
2.2 KiB
Dart
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,
|
|
required String code,
|
|
required Object value,
|
|
});
|
|
}
|
|
|
|
final 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 _pendingRequests = <(List<String> uuids, String code, Object value)>[];
|
|
var _isProcessing = false;
|
|
|
|
DebouncedBatchControlDevicesService({
|
|
required this.decoratee,
|
|
this.debounceDuration = const Duration(milliseconds: 1500),
|
|
});
|
|
|
|
@override
|
|
Future<bool> batchControlDevices({
|
|
required List<String> uuids,
|
|
required String code,
|
|
required Object value,
|
|
}) async {
|
|
_pendingRequests.add((uuids, code, value));
|
|
|
|
if (_isProcessing) 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;
|
|
}
|
|
}
|
|
}
|