mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-09 22:57:21 +00:00
Created ControlDeviceService
interface and its remote and debounced implementation.
This commit is contained in:
80
lib/services/control_device_service.dart
Normal file
80
lib/services/control_device_service.dart
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user