From 6f2e2e2d4ace5a5aceb29d8f18d94c95cae498e5 Mon Sep 17 00:00:00 2001 From: mohammad Date: Sun, 2 Mar 2025 17:55:26 +0300 Subject: [PATCH] Check all the devices working with real time --- .../widgets/device_managment_body.dart | 1 - .../curtain/bloc/curtain_bloc.dart | 67 +++++++++------- .../curtain/bloc/curtain_event.dart | 4 + .../door_lock/bloc/door_lock_bloc.dart | 36 +++++++++ .../door_lock/bloc/door_lock_event.dart | 8 ++ .../bloc/main_door_sensor_bloc.dart | 35 +++++++- .../bloc/main_door_sensor_event.dart | 8 ++ .../bloc/one_gang_glass_switch_bloc.dart | 80 +++++++++++++++---- .../bloc/one_gang_glass_switch_event.dart | 5 ++ .../bloc/wall_light_switch_bloc.dart | 1 + .../bloc/two_gang_glass_switch_bloc.dart | 77 +++++++++++++----- .../two_gang_glass_switch_control_view.dart | 37 ++++----- 12 files changed, 274 insertions(+), 85 deletions(-) diff --git a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart index b49e5086..907e5390 100644 --- a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart +++ b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart @@ -8,7 +8,6 @@ import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_mo import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_search_filters.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_batch_control_dialog.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_control_dialog.dart'; -import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/pages/space_tree/view/space_tree_view.dart'; import 'package:syncrow_web/utils/format_date_time.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; diff --git a/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart b/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart index f4bedd1c..251d999f 100644 --- a/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart +++ b/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart @@ -17,6 +17,7 @@ class CurtainBloc extends Bloc { on(_onCurtainControl); on(_onCurtainBatchControl); on(_onFactoryReset); + on(_onStatusUpdated); } FutureOr _onFetchDeviceStatus( @@ -25,7 +26,7 @@ class CurtainBloc extends Bloc { try { final status = await DevicesManagementApi().getDeviceStatus(event.deviceId); - + _listenToChanges(event.deviceId); deviceStatus = _checkStatus(status.status[0].value); emit(CurtainStatusLoaded(deviceStatus)); @@ -33,36 +34,48 @@ class CurtainBloc extends Bloc { emit(CurtainError(e.toString())); } } - // _listenToChanges(deviceId) { - // try { - // DatabaseReference ref = - // FirebaseDatabase.instance.ref('device-status/$deviceId'); - // Stream stream = ref.onValue; - // stream.listen((DatabaseEvent event) { - // Map usersMap = - // event.snapshot.value as Map; + void _listenToChanges(String deviceId) { + try { + DatabaseReference ref = + FirebaseDatabase.instance.ref('device-status/$deviceId'); + Stream stream = ref.onValue; - // List statusList = []; - // usersMap['status'].forEach((element) { - // statusList - // .add(Status(code: element['code'], value: element['value'])); - // }); + stream.listen((DatabaseEvent event) { + final data = event.snapshot.value as Map?; + if (data == null) return; - // deviceStatus = - // GarageDoorStatusModel.fromJson(usersMap['productUuid'], statusList); - // if (!isClosed) { - // add(StatusUpdated(deviceStatus)); - // } - // }); - // } catch (_) {} - // } - - // void _onStatusUpdated(StatusUpdated event, Emitter emit) { - // deviceStatus = event.deviceStatus; - // emit(GarageDoorLoadedState(status: deviceStatus)); - // } + List statusList = []; + if (data['status'] != null) { + for (var element in data['status']) { + statusList.add( + Status( + code: element['code'].toString(), + value: element['value'].toString(), + ), + ); + } + } + if (statusList.isNotEmpty) { + bool newStatus = _checkStatus(statusList[0].value); + if (newStatus != deviceStatus) { + deviceStatus = newStatus; + if (!isClosed) { + add(StatusUpdated(deviceStatus)); + } + } + } + }); + } catch (e) { + emit(CurtainError('Failed to listen to changes: $e')); + } + } + void _onStatusUpdated(StatusUpdated event, Emitter emit) { + emit(CurtainStatusLoading()); + deviceStatus = event.deviceStatus; + emit(CurtainStatusLoaded(deviceStatus)); + } FutureOr _onCurtainControl( CurtainControl event, Emitter emit) async { diff --git a/lib/pages/device_managment/curtain/bloc/curtain_event.dart b/lib/pages/device_managment/curtain/bloc/curtain_event.dart index 7236016c..dd6700f9 100644 --- a/lib/pages/device_managment/curtain/bloc/curtain_event.dart +++ b/lib/pages/device_managment/curtain/bloc/curtain_event.dart @@ -60,3 +60,7 @@ class CurtainFactoryReset extends CurtainEvent { @override List get props => [deviceId, factoryReset]; } +class StatusUpdated extends CurtainEvent { + final bool deviceStatus; + const StatusUpdated(this.deviceStatus); +} \ No newline at end of file diff --git a/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart b/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart index c50203f3..f83ced1a 100644 --- a/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart +++ b/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart @@ -1,6 +1,7 @@ // ignore_for_file: invalid_use_of_visible_for_testing_member import 'dart:async'; +import 'package:firebase_database/firebase_database.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/pages/device_managment/door_lock/bloc/door_lock_event.dart'; @@ -18,6 +19,39 @@ class DoorLockBloc extends Bloc { //on(_onDoorLockControl); on(_updateLock); on(_onFactoryReset); + on(_onStatusUpdated); + } + + _listenToChanges(deviceId) { + try { + DatabaseReference ref = + FirebaseDatabase.instance.ref('device-status/$deviceId'); + Stream stream = ref.onValue; + + stream.listen((DatabaseEvent event) { + Map usersMap = + event.snapshot.value as Map; + + List statusList = []; + usersMap['status'].forEach((element) { + statusList + .add(Status(code: element['code'], value: element['value'])); + }); + + deviceStatus = + DoorLockStatusModel.fromJson(usersMap['productUuid'], statusList); + if (!isClosed) { + add(StatusUpdated(deviceStatus)); + } + }); + } catch (_) {} + } + + void _onStatusUpdated(StatusUpdated event, Emitter emit) { + emit(DoorLockStatusLoading()); + + deviceStatus = event.deviceStatus; + emit(DoorLockStatusLoaded(deviceStatus)); } FutureOr _onFetchDeviceStatus( @@ -28,6 +62,8 @@ class DoorLockBloc extends Bloc { await DevicesManagementApi().getDeviceStatus(event.deviceId); deviceStatus = DoorLockStatusModel.fromJson(event.deviceId, status.status); + _listenToChanges(event.deviceId); + emit(DoorLockStatusLoaded(deviceStatus)); } catch (e) { emit(DoorLockControlError(e.toString())); diff --git a/lib/pages/device_managment/door_lock/bloc/door_lock_event.dart b/lib/pages/device_managment/door_lock/bloc/door_lock_event.dart index 54fa1ddf..3f28724e 100644 --- a/lib/pages/device_managment/door_lock/bloc/door_lock_event.dart +++ b/lib/pages/device_managment/door_lock/bloc/door_lock_event.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_reset_model.dart'; +import 'package:syncrow_web/pages/device_managment/door_lock/models/door_lock_status_model.dart'; sealed class DoorLockEvent extends Equatable { const DoorLockEvent(); @@ -51,3 +52,10 @@ class DoorLockFactoryReset extends DoorLockEvent { @override List get props => [deviceId, factoryReset]; } + +class StatusUpdated extends DoorLockEvent { + final DoorLockStatusModel deviceStatus; + const StatusUpdated(this.deviceStatus); + @override + List get props => [deviceStatus]; +} diff --git a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart index 933ce28b..493e3037 100644 --- a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart +++ b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:dio/dio.dart'; +import 'package:firebase_database/firebase_database.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; @@ -16,6 +17,7 @@ class MainDoorSensorBloc on(_onFetchBatchStatus); on(_fetchReports); on(_factoryReset); + on(_onStatusUpdated); } late MainDoorSensorStatusModel deviceStatus; @@ -28,7 +30,7 @@ class MainDoorSensorBloc final status = await DevicesManagementApi() .getDeviceStatus(event.deviceId) .then((value) => value.status); - + _listenToChanges(event.deviceId); deviceStatus = MainDoorSensorStatusModel.fromJson(event.deviceId, status); emit(MainDoorSensorDeviceStatusLoaded(deviceStatus)); } catch (e) { @@ -156,4 +158,35 @@ class MainDoorSensorBloc emit(MainDoorSensorFailedState(error: e.toString())); } } + + _listenToChanges(deviceId) { + try { + DatabaseReference ref = + FirebaseDatabase.instance.ref('device-status/$deviceId'); + Stream stream = ref.onValue; + + stream.listen((DatabaseEvent event) { + Map usersMap = + event.snapshot.value as Map; + + List statusList = []; + usersMap['status'].forEach((element) { + statusList + .add(Status(code: element['code'], value: element['value'])); + }); + + deviceStatus = MainDoorSensorStatusModel.fromJson( + usersMap['productUuid'], statusList); + if (!isClosed) { + add(StatusUpdated(deviceStatus)); + } + }); + } catch (_) {} + } + + void _onStatusUpdated( + StatusUpdated event, Emitter emit) { + deviceStatus = event.deviceStatus; + emit(MainDoorSensorDeviceStatusLoaded(deviceStatus)); + } } diff --git a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart index c2864333..569cfa11 100644 --- a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart +++ b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart @@ -1,4 +1,5 @@ import 'package:equatable/equatable.dart'; +import 'package:syncrow_web/pages/device_managment/main_door_sensor/models/main_door_status_model.dart'; import '../../all_devices/models/factory_reset_model.dart'; @@ -71,3 +72,10 @@ class MainDoorSensorFactoryReset extends MainDoorSensorEvent { MainDoorSensorFactoryReset( {required this.deviceId, required this.factoryReset}); } + +class StatusUpdated extends MainDoorSensorEvent { + final MainDoorSensorStatusModel deviceStatus; + StatusUpdated(this.deviceStatus); + @override + List get props => [deviceStatus]; +} diff --git a/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_bloc.dart b/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_bloc.dart index eb72eecd..12aeaa88 100644 --- a/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_bloc.dart +++ b/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_bloc.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; +import 'package:firebase_database/firebase_database.dart'; import 'package:meta/meta.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_reset_model.dart'; @@ -10,33 +11,71 @@ import 'package:syncrow_web/services/devices_mang_api.dart'; part 'one_gang_glass_switch_event.dart'; part 'one_gang_glass_switch_state.dart'; -class OneGangGlassSwitchBloc extends Bloc { +class OneGangGlassSwitchBloc + extends Bloc { OneGangGlassStatusModel deviceStatus; Timer? _timer; OneGangGlassSwitchBloc({required String deviceId}) - : deviceStatus = OneGangGlassStatusModel(uuid: deviceId, switch1: false, countDown: 0), + : deviceStatus = OneGangGlassStatusModel( + uuid: deviceId, switch1: false, countDown: 0), super(OneGangGlassSwitchInitial()) { on(_onFetchDeviceStatus); on(_onControl); on(_onBatchControl); on(_onFetchBatchStatus); on(_onFactoryReset); + on(_onStatusUpdated); } - Future _onFetchDeviceStatus( - OneGangGlassSwitchFetchDeviceEvent event, Emitter emit) async { + Future _onFetchDeviceStatus(OneGangGlassSwitchFetchDeviceEvent event, + Emitter emit) async { emit(OneGangGlassSwitchLoading()); try { - final status = await DevicesManagementApi().getDeviceStatus(event.deviceId); - deviceStatus = OneGangGlassStatusModel.fromJson(event.deviceId, status.status); + final status = + await DevicesManagementApi().getDeviceStatus(event.deviceId); + _listenToChanges(event.deviceId); + deviceStatus = + OneGangGlassStatusModel.fromJson(event.deviceId, status.status); emit(OneGangGlassSwitchStatusLoaded(deviceStatus)); } catch (e) { emit(OneGangGlassSwitchError(e.toString())); } } - Future _onControl(OneGangGlassSwitchControl event, Emitter emit) async { + _listenToChanges(deviceId) { + try { + DatabaseReference ref = + FirebaseDatabase.instance.ref('device-status/$deviceId'); + Stream stream = ref.onValue; + + stream.listen((DatabaseEvent event) { + Map usersMap = + event.snapshot.value as Map; + + List statusList = []; + usersMap['status'].forEach((element) { + statusList + .add(Status(code: element['code'], value: element['value'])); + }); + + deviceStatus = OneGangGlassStatusModel.fromJson( + usersMap['productUuid'], statusList); + if (!isClosed) { + add(StatusUpdated(deviceStatus)); + } + }); + } catch (_) {} + } + + void _onStatusUpdated( + StatusUpdated event, Emitter emit) { + deviceStatus = event.deviceStatus; + emit(OneGangGlassSwitchStatusLoaded(deviceStatus)); + } + + Future _onControl(OneGangGlassSwitchControl event, + Emitter emit) async { final oldValue = _getValueByCode(event.code); _updateLocalValue(event.code, event.value); @@ -52,10 +91,12 @@ class OneGangGlassSwitchBloc extends Bloc _onFactoryReset(OneGangGlassFactoryResetEvent event, Emitter emit) async { + Future _onFactoryReset(OneGangGlassFactoryResetEvent event, + Emitter emit) async { emit(OneGangGlassSwitchLoading()); try { - final response = await DevicesManagementApi().factoryReset(event.factoryReset, event.deviceId); + final response = await DevicesManagementApi() + .factoryReset(event.factoryReset, event.deviceId); if (!response) { emit(OneGangGlassSwitchError('Failed to reset device')); } else { @@ -66,7 +107,8 @@ class OneGangGlassSwitchBloc extends Bloc _onBatchControl(OneGangGlassSwitchBatchControl event, Emitter emit) async { + Future _onBatchControl(OneGangGlassSwitchBatchControl event, + Emitter emit) async { final oldValue = _getValueByCode(event.code); _updateLocalValue(event.code, event.value); @@ -83,11 +125,14 @@ class OneGangGlassSwitchBloc extends Bloc _onFetchBatchStatus( - OneGangGlassSwitchFetchBatchStatusEvent event, Emitter emit) async { + OneGangGlassSwitchFetchBatchStatusEvent event, + Emitter emit) async { emit(OneGangGlassSwitchLoading()); try { - final status = await DevicesManagementApi().getBatchStatus(event.deviceIds); - deviceStatus = OneGangGlassStatusModel.fromJson(event.deviceIds.first, status.status); + final status = + await DevicesManagementApi().getBatchStatus(event.deviceIds); + deviceStatus = OneGangGlassStatusModel.fromJson( + event.deviceIds.first, status.status); emit(OneGangGlassSwitchStatusLoaded(deviceStatus)); } catch (e) { emit(OneGangGlassSwitchError(e.toString())); @@ -117,9 +162,11 @@ class OneGangGlassSwitchBloc extends Bloc emit) { + void _revertValueAndEmit(String deviceId, String code, bool oldValue, + Emitter emit) { _updateLocalValue(code, oldValue); emit(OneGangGlassSwitchStatusLoaded(deviceStatus)); } diff --git a/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_event.dart b/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_event.dart index 83d9b7b9..c652e31a 100644 --- a/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_event.dart +++ b/lib/pages/device_managment/one_g_glass_switch/bloc/one_gang_glass_switch_event.dart @@ -39,6 +39,11 @@ class OneGangGlassSwitchFetchBatchStatusEvent extends OneGangGlassSwitchEvent { OneGangGlassSwitchFetchBatchStatusEvent(this.deviceIds); } +class StatusUpdated extends OneGangGlassSwitchEvent { + final OneGangGlassStatusModel deviceStatus; + StatusUpdated(this.deviceStatus); +} + class OneGangGlassFactoryResetEvent extends OneGangGlassSwitchEvent { final FactoryResetModel factoryReset; final String deviceId; diff --git a/lib/pages/device_managment/one_gang_switch/bloc/wall_light_switch_bloc.dart b/lib/pages/device_managment/one_gang_switch/bloc/wall_light_switch_bloc.dart index db5ceddb..c2038330 100644 --- a/lib/pages/device_managment/one_gang_switch/bloc/wall_light_switch_bloc.dart +++ b/lib/pages/device_managment/one_gang_switch/bloc/wall_light_switch_bloc.dart @@ -17,6 +17,7 @@ class WallLightSwitchBloc on(_onFetchBatchStatus); on(_onBatchControl); on(_onFactoryReset); + on(_onStatusUpdated); } late WallLightStatusModel deviceStatus; diff --git a/lib/pages/device_managment/two_g_glass_switch/bloc/two_gang_glass_switch_bloc.dart b/lib/pages/device_managment/two_g_glass_switch/bloc/two_gang_glass_switch_bloc.dart index 90afaacb..406821da 100644 --- a/lib/pages/device_managment/two_g_glass_switch/bloc/two_gang_glass_switch_bloc.dart +++ b/lib/pages/device_managment/two_g_glass_switch/bloc/two_gang_glass_switch_bloc.dart @@ -44,6 +44,37 @@ class TwoGangGlassSwitchBloc } } + void _listenToChanges(String deviceId) { + try { + DatabaseReference ref = + FirebaseDatabase.instance.ref('device-status/$deviceId'); + ref.onValue.listen((DatabaseEvent event) { + if (event.snapshot.value == null) return; + + Map data = + event.snapshot.value as Map; + List statusList = []; + + data['status'].forEach((element) { + statusList + .add(Status(code: element['code'], value: element['value'])); + }); + + // Parse the new status and add the event + final updatedStatus = + TwoGangGlassStatusModel.fromJson(data['productUuid'], statusList); + if (!isClosed) { + add(StatusUpdated(updatedStatus)); + } + }); + } catch (e) { + // Handle errors and emit an error state if necessary + if (!isClosed) { + // add(TwoGangGlassSwitchError('Error listening to updates: $e')); + } + } + } + Future _onControl(TwoGangGlassSwitchControl event, Emitter emit) async { final oldValue = _getValueByCode(event.code); @@ -179,34 +210,36 @@ class TwoGangGlassSwitchBloc return super.close(); } - _listenToChanges(deviceId) { - try { - DatabaseReference ref = - FirebaseDatabase.instance.ref('device-status/$deviceId'); - Stream stream = ref.onValue; + // _listenToChanges(deviceId) { + // try { + // DatabaseReference ref = + // FirebaseDatabase.instance.ref('device-status/$deviceId'); + // Stream stream = ref.onValue; - stream.listen((DatabaseEvent event) { - Map usersMap = - event.snapshot.value as Map; + // stream.listen((DatabaseEvent event) { + // Map usersMap = + // event.snapshot.value as Map; - List statusList = []; - usersMap['status'].forEach((element) { - statusList - .add(Status(code: element['code'], value: element['value'])); - }); + // List statusList = []; + // usersMap['status'].forEach((element) { + // statusList + // .add(Status(code: element['code'], value: element['value'])); + // }); - deviceStatus = TwoGangGlassStatusModel.fromJson( - usersMap['productUuid'], statusList); - if (!isClosed) { - add(StatusUpdated(deviceStatus)); - } - }); - } catch (_) {} - } + // deviceStatus = TwoGangGlassStatusModel.fromJson( + // usersMap['productUuid'], statusList); + // if (!isClosed) { + // add(StatusUpdated(deviceStatus)); + // } + // }); + // } catch (_) {} + // } void _onStatusUpdated( StatusUpdated event, Emitter emit) { + // Update the local deviceStatus with the new status from the event deviceStatus = event.deviceStatus; - emit(TwoGangGlassSwitchBatchStatusLoaded(deviceStatus)); + // Emit the new state with the updated status + emit(TwoGangGlassSwitchStatusLoaded(deviceStatus)); } } diff --git a/lib/pages/device_managment/two_g_glass_switch/view/two_gang_glass_switch_control_view.dart b/lib/pages/device_managment/two_g_glass_switch/view/two_gang_glass_switch_control_view.dart index 72f69763..cca794e9 100644 --- a/lib/pages/device_managment/two_g_glass_switch/view/two_gang_glass_switch_control_view.dart +++ b/lib/pages/device_managment/two_g_glass_switch/view/two_gang_glass_switch_control_view.dart @@ -6,7 +6,8 @@ import 'package:syncrow_web/pages/device_managment/two_g_glass_switch/models/two import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class TwoGangGlassSwitchControlView extends StatelessWidget with HelperResponsiveLayout { +class TwoGangGlassSwitchControlView extends StatelessWidget + with HelperResponsiveLayout { final String deviceId; const TwoGangGlassSwitchControlView({required this.deviceId, super.key}); @@ -14,25 +15,25 @@ class TwoGangGlassSwitchControlView extends StatelessWidget with HelperResponsiv @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => - TwoGangGlassSwitchBloc(deviceId: deviceId)..add(TwoGangGlassSwitchFetchDeviceEvent(deviceId)), - child: BlocBuilder( - builder: (context, state) { - if (state is TwoGangGlassSwitchLoading) { - return const Center(child: CircularProgressIndicator()); - } else if (state is TwoGangGlassSwitchStatusLoaded) { - return _buildStatusControls(context, state.status); - } else if (state is TwoGangGlassSwitchError) { - return const Center(child: Text('Error fetching status')); - } else { - return const Center(child: CircularProgressIndicator()); - } - }, - ), - ); + create: (context) => TwoGangGlassSwitchBloc(deviceId: deviceId) + ..add(TwoGangGlassSwitchFetchDeviceEvent(deviceId)), + child: BlocBuilder( + builder: (context, state) { + if (state is TwoGangGlassSwitchLoading) { + return const Center(child: CircularProgressIndicator()); + } else if (state is TwoGangGlassSwitchStatusLoaded) { + return _buildStatusControls(context, state.status); + } else if (state is TwoGangGlassSwitchError) { + return Center(child: Text(state.message)); + } else { + return const Center(child: CircularProgressIndicator()); + } + }, + )); } - Widget _buildStatusControls(BuildContext context, TwoGangGlassStatusModel status) { + Widget _buildStatusControls( + BuildContext context, TwoGangGlassStatusModel status) { final isExtraLarge = isExtraLargeScreenSize(context); final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context);