Created ControlDeviceService interface and its remote and debounced implementation.

This commit is contained in:
Faris Armoush
2025-04-23 10:22:41 +03:00
parent 177a4711fe
commit 05b3180510

View File

@ -0,0 +1,80 @@
import 'dart:developer';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
import 'package:syncrow_web/services/api/http_service.dart';
import 'package:syncrow_web/utils/constants/api_const.dart';
abstract interface class ControlDeviceService {
Future<bool> controlDevice({
required String deviceUuid,
required Status status,
});
}
final class RemoteControlDeviceService implements ControlDeviceService {
@override
Future<bool> controlDevice({
required String deviceUuid,
required Status status,
}) async {
try {
final response = await HTTPService().post(
path: ApiEndpoints.deviceControl.replaceAll('{uuid}', deviceUuid),
body: status.toMap(),
showServerMessage: true,
expectedResponseModel: (json) {
return (json['success'] as bool?) ?? false;
},
);
return response;
} catch (e) {
log('Error fetching $e', name: 'ControlDeviceService');
return false;
}
}
}
final class DebouncedControlDeviceService implements ControlDeviceService {
final ControlDeviceService decoratee;
final Duration _debounceDuration;
final List<(String deviceUuid, Status status)> _pendingRequests = [];
bool _isProcessing = false;
DebouncedControlDeviceService({
required this.decoratee,
Duration debounceDuration = const Duration(milliseconds: 1500),
}) : _debounceDuration = debounceDuration;
@override
Future<bool> controlDevice({
required String deviceUuid,
required Status status,
}) async {
_pendingRequests.add((deviceUuid, status));
if (_isProcessing) {
log(
'Request added to queue',
name: 'DebouncedControlDeviceService',
);
return false;
}
_isProcessing = true;
await Future.delayed(_debounceDuration);
final lastRequest = _pendingRequests.last;
_pendingRequests.clear();
try {
final ( lastRequestDeviceUuid, lastRequestStatus) = lastRequest;
return decoratee.controlDevice(
deviceUuid: lastRequestDeviceUuid,
status: lastRequestStatus,
);
} finally {
_isProcessing = false;
}
}
}