Add bloc closure handling and improve device status updates in AcBloc

This commit is contained in:
mohammad
2025-06-25 14:45:10 +03:00
parent 487c5a894b
commit f38ac58442

View File

@ -16,6 +16,7 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
final ControlDeviceService controlDeviceService; final ControlDeviceService controlDeviceService;
final BatchControlDevicesService batchControlDevicesService; final BatchControlDevicesService batchControlDevicesService;
Timer? _countdownTimer; Timer? _countdownTimer;
bool _isBlocClosed = false;
AcBloc({ AcBloc({
required this.deviceId, required this.deviceId,
@ -45,7 +46,8 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
) async { ) async {
emit(AcsLoadingState()); emit(AcsLoadingState());
try { try {
final status = await DevicesManagementApi().getDeviceStatus(event.deviceId); final status =
await DevicesManagementApi().getDeviceStatus(event.deviceId);
deviceStatus = AcStatusModel.fromJson(event.deviceId, status.status); deviceStatus = AcStatusModel.fromJson(event.deviceId, status.status);
if (deviceStatus.countdown1 != 0) { if (deviceStatus.countdown1 != 0) {
final totalMinutes = deviceStatus.countdown1 * 6; final totalMinutes = deviceStatus.countdown1 * 6;
@ -68,12 +70,13 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
} }
} }
void _listenToChanges(deviceId) { StreamSubscription<DatabaseEvent>? _deviceStatusSubscription;
void _listenToChanges(String deviceId) {
try { try {
final ref = FirebaseDatabase.instance.ref('device-status/$deviceId'); final ref = FirebaseDatabase.instance.ref('device-status/$deviceId');
final stream = ref.onValue; _deviceStatusSubscription =
ref.onValue.listen((DatabaseEvent event) async {
stream.listen((DatabaseEvent event) async {
if (event.snapshot.value == null) return; if (event.snapshot.value == null) return;
Map<dynamic, dynamic> usersMap = Map<dynamic, dynamic> usersMap =
@ -82,11 +85,15 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
List<Status> statusList = []; List<Status> statusList = [];
usersMap['status'].forEach((element) { usersMap['status'].forEach((element) {
statusList.add(Status(code: element['code'], value: element['value'])); statusList
.add(Status(code: element['code'], value: element['value']));
}); });
deviceStatus = AcStatusModel.fromJson(usersMap['productUuid'], statusList); deviceStatus =
if (!isClosed) { AcStatusModel.fromJson(usersMap['productUuid'], statusList);
print('Device status updated: ${deviceStatus.acSwitch}');
if (!_isBlocClosed) {
add(AcStatusUpdated(deviceStatus)); add(AcStatusUpdated(deviceStatus));
} }
}); });
@ -106,15 +113,14 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
Emitter<AcsState> emit, Emitter<AcsState> emit,
) async { ) async {
emit(AcsLoadingState()); emit(AcsLoadingState());
_updateDeviceFunctionFromCode(event.code, event.value);
emit(ACStatusLoaded(status: deviceStatus));
try { try {
final success = await controlDeviceService.controlDevice( final success = await controlDeviceService.controlDevice(
deviceUuid: event.deviceId, deviceUuid: event.deviceId,
status: Status(code: event.code, value: event.value), status: Status(code: event.code, value: event.value),
); );
_updateDeviceFunctionFromCode(event.code, event.value);
emit(ACStatusLoaded(status: deviceStatus));
if (!success) { if (!success) {
emit(const AcsFailedState(error: 'Failed to control device')); emit(const AcsFailedState(error: 'Failed to control device'));
} }
@ -129,8 +135,10 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
) async { ) async {
emit(AcsLoadingState()); emit(AcsLoadingState());
try { try {
final status = await DevicesManagementApi().getBatchStatus(event.devicesIds); final status =
deviceStatus = AcStatusModel.fromJson(event.devicesIds.first, status.status); await DevicesManagementApi().getBatchStatus(event.devicesIds);
deviceStatus =
AcStatusModel.fromJson(event.devicesIds.first, status.status);
emit(ACStatusLoaded(status: deviceStatus)); emit(ACStatusLoaded(status: deviceStatus));
} catch (e) { } catch (e) {
emit(AcsFailedState(error: e.toString())); emit(AcsFailedState(error: e.toString()));
@ -293,13 +301,17 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
totalSeconds--; totalSeconds--;
scheduledHours = totalSeconds ~/ 3600; scheduledHours = totalSeconds ~/ 3600;
scheduledMinutes = (totalSeconds % 3600) ~/ 60; scheduledMinutes = (totalSeconds % 3600) ~/ 60;
add(UpdateTimerEvent()); if (!_isBlocClosed) {
add(UpdateTimerEvent());
}
} else { } else {
_countdownTimer?.cancel(); _countdownTimer?.cancel();
timerActive = false; timerActive = false;
scheduledHours = 0; scheduledHours = 0;
scheduledMinutes = 0; scheduledMinutes = 0;
add(TimerCompletedEvent()); if (!_isBlocClosed) {
add(TimerCompletedEvent());
}
} }
}); });
} }
@ -326,7 +338,9 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
_startCountdownTimer( _startCountdownTimer(
emit, emit,
); );
add(UpdateTimerEvent()); if (!_isBlocClosed) {
add(UpdateTimerEvent());
}
} }
} }
@ -370,6 +384,9 @@ class AcBloc extends Bloc<AcsEvent, AcsState> {
@override @override
Future<void> close() { Future<void> close() {
add(OnClose()); add(OnClose());
_countdownTimer?.cancel();
_deviceStatusSubscription?.cancel();
_isBlocClosed = true;
return super.close(); return super.close();
} }
} }