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,
);
}
}

View File

@ -7,30 +7,30 @@ sealed class AcsEvent extends Equatable {
List<Object> get props => [];
}
class AcFetchDeviceStatus extends AcsEvent {
class AcFetchDeviceStatusEvent extends AcsEvent {
final String deviceId;
const AcFetchDeviceStatus(this.deviceId);
const AcFetchDeviceStatusEvent(this.deviceId);
@override
List<Object> get props => [deviceId];
}
class AcFetchBatchStatus extends AcsEvent {
final String deviceId;
class AcFetchBatchStatusEvent extends AcsEvent {
final List<String> devicesIds;
const AcFetchBatchStatus(this.deviceId);
const AcFetchBatchStatusEvent(this.devicesIds);
@override
List<Object> get props => [deviceId];
List<Object> get props => [devicesIds];
}
class AcControl extends AcsEvent {
class AcControlEvent extends AcsEvent {
final String deviceId;
final String code;
final dynamic value;
const AcControl({
const AcControlEvent({
required this.deviceId,
required this.code,
required this.value,
@ -39,3 +39,18 @@ class AcControl extends AcsEvent {
@override
List<Object> get props => [deviceId, code, value];
}
class AcBatchControlEvent extends AcsEvent {
final List<String> devicesIds;
final String code;
final dynamic value;
const AcBatchControlEvent({
required this.devicesIds,
required this.code,
required this.value,
});
@override
List<Object> get props => [devicesIds, code, value];
}

View File

@ -22,6 +22,16 @@ class ACStatusLoaded extends AcsState {
List<Object> get props => [status, timestamp];
}
class AcBatchStatusLoaded extends AcsState {
final AcStatusModel status;
final DateTime timestamp;
AcBatchStatusLoaded(this.status) : timestamp = DateTime.now();
@override
List<Object> get props => [status, timestamp];
}
class AcsFailedState extends AcsState {
final String error;