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 controlDevice({ required String deviceUuid, required Status status, }); } final class RemoteControlDeviceService implements ControlDeviceService { @override Future 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; DebouncedControlDeviceService({ required this.decoratee, this.debounceDuration = const Duration(milliseconds: 1500), }); final _pendingRequests = <(String deviceUuid, Status status)>[]; var _isProcessing = false; @override Future controlDevice({ required String deviceUuid, required Status status, }) async { _pendingRequests.add((deviceUuid, status)); if (_isProcessing) 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; } } }