push ac batch control

This commit is contained in:
ashrafzarkanisala
2024-09-18 12:27:00 +03:00
parent 7c28012d79
commit abb0a58468
26 changed files with 516 additions and 66 deletions

View File

@ -14,13 +14,14 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
Timer? _timer;
AcBloc({required this.deviceId}) : super(AcsInitialState()) {
on<AcFetchDeviceStatus>(_onFetchAcStatus);
on<AcFetchBatchStatus>(_onFetchAcBatchStatus);
on<AcControl>(_onAcControl);
on<AcFetchDeviceStatusEvent>(_onFetchAcStatus);
on<AcFetchBatchStatusEvent>(_onFetchAcBatchStatus);
on<AcControlEvent>(_onAcControl);
on<AcBatchControlEvent>(_onAcBatchControl);
}
FutureOr<void> _onFetchAcStatus(
AcFetchDeviceStatus event, Emitter<AcsState> emit) async {
AcFetchDeviceStatusEvent event, Emitter<AcsState> emit) async {
emit(AcsLoadingState());
try {
final status =
@ -32,7 +33,8 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
}
}
FutureOr<void> _onAcControl(AcControl event, Emitter<AcsState> emit) async {
FutureOr<void> _onAcControl(
AcControlEvent event, Emitter<AcsState> emit) async {
final oldValue = _getValueByCode(event.code);
_updateLocalValue(event.code, event.value, emit);
@ -40,6 +42,7 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
emit(ACStatusLoaded(deviceStatus));
await _runDebounce(
isBatch: false,
deviceId: event.deviceId,
code: event.code,
value: event.value,
@ -49,27 +52,43 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
}
Future<void> _runDebounce({
required String deviceId,
required dynamic deviceId,
required String code,
required dynamic value,
required dynamic oldValue,
required Emitter<AcsState> emit,
required bool isBatch,
}) async {
late String id;
if (deviceId is List) {
id = deviceId.first;
} else {
id = deviceId;
}
if (_timer != null) {
_timer!.cancel();
}
_timer = Timer(const Duration(seconds: 1), () async {
try {
final response = await DevicesManagementApi()
.deviceControl(deviceId, Status(code: code, value: value));
late bool response;
if (isBatch) {
response = await DevicesManagementApi()
.deviceBatchControl(deviceId, code, value);
} else {
response = await DevicesManagementApi()
.deviceControl(deviceId, Status(code: code, value: value));
}
if (!response) {
_revertValueAndEmit(deviceId, code, oldValue, emit);
_revertValueAndEmit(id, code, oldValue, emit);
}
} catch (e) {
if (e is DioException && e.response != null) {
debugPrint('Error response: ${e.response?.data}');
}
_revertValueAndEmit(deviceId, code, oldValue, emit);
_revertValueAndEmit(id, code, oldValue, emit);
}
});
}
@ -78,7 +97,6 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
String deviceId, String code, dynamic oldValue, Emitter<AcsState> emit) {
_updateLocalValue(code, oldValue, emit);
emit(ACStatusLoaded(deviceStatus));
emit(const AcsFailedState(error: 'Failed to control the device.'));
}
void _updateLocalValue(String code, dynamic value, Emitter<AcsState> emit) {
@ -136,15 +154,34 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
}
FutureOr<void> _onFetchAcBatchStatus(
AcFetchBatchStatus event, Emitter<AcsState> emit) async {
AcFetchBatchStatusEvent event, Emitter<AcsState> emit) async {
emit(AcsLoadingState());
try {
final status =
await DevicesManagementApi().getDeviceStatus(event.deviceId);
deviceStatus = AcStatusModel.fromJson(event.deviceId, status.status);
await DevicesManagementApi().getBatchStatus(event.devicesIds);
deviceStatus =
AcStatusModel.fromJson(event.devicesIds.first, status.status);
emit(ACStatusLoaded(deviceStatus));
} catch (e) {
emit(AcsFailedState(error: e.toString()));
}
}
FutureOr<void> _onAcBatchControl(
AcBatchControlEvent event, Emitter<AcsState> emit) async {
final oldValue = _getValueByCode(event.code);
_updateLocalValue(event.code, event.value, emit);
emit(ACStatusLoaded(deviceStatus));
await _runDebounce(
isBatch: true,
deviceId: event.devicesIds,
code: event.code,
value: event.value,
oldValue: oldValue,
emit: emit,
);
}
}