diff --git a/lib/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart b/lib/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart index 3bbe428c..4ab6f8e8 100644 --- a/lib/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart +++ b/lib/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart @@ -16,13 +16,14 @@ class LivingRoomBloc extends Bloc { Timer? _timer; LivingRoomBloc({required this.deviceId}) : super(LivingRoomInitial()) { - on(_onFetchDeviceStatus); + on(_onFetchDeviceStatus); on(_livingRoomControl); - on(_livingRoomBatchControl); + on(_livingRoomBatchControl); + on(_livingRoomFetchBatchControl); } - FutureOr _onFetchDeviceStatus( - LivingRoomFetchDeviceStatus event, Emitter emit) async { + FutureOr _onFetchDeviceStatus(LivingRoomFetchDeviceStatusEvent event, + Emitter emit) async { emit(LivingRoomDeviceStatusLoading()); try { final status = @@ -49,28 +50,44 @@ class LivingRoomBloc extends Bloc { value: event.value, oldValue: oldValue, emit: emit, + isBatch: false, ); } Future _runDebounce({ - required String deviceId, + required dynamic deviceId, required String code, required dynamic value, required dynamic oldValue, required Emitter 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) { - _revertValueAndEmit(deviceId, code, oldValue, emit); + _revertValueAndEmit(id, code, oldValue, emit); } }); } @@ -79,7 +96,6 @@ class LivingRoomBloc extends Bloc { Emitter emit) { _updateLocalValue(code, oldValue); emit(LivingRoomDeviceStatusLoaded(deviceStatus)); - emit(const LivingRoomControlError('Failed to control the device.')); } void _updateLocalValue(String code, dynamic value) { @@ -118,19 +134,35 @@ class LivingRoomBloc extends Bloc { } } - FutureOr _livingRoomBatchControl( - LivingRoomFetchBatchStatus event, Emitter emit) async { + FutureOr _livingRoomFetchBatchControl( + LivingRoomFetchBatchEvent event, Emitter emit) async { emit(LivingRoomDeviceStatusLoading()); try { - //TODO: get batch status from api - /// for now sending one id and getting the same value from fetch status final status = - await DevicesManagementApi().getDeviceStatus(event.deviceId); + await DevicesManagementApi().getBatchStatus(event.devicesIds); deviceStatus = - LivingRoomStatusModel.fromJson(event.deviceId, status.status); + LivingRoomStatusModel.fromJson(event.devicesIds.first, status.status); emit(LivingRoomDeviceStatusLoaded(deviceStatus)); } catch (e) { emit(LivingRoomDeviceManagementError(e.toString())); } } + + FutureOr _livingRoomBatchControl( + LivingRoomBatchControl event, Emitter emit) async { + final oldValue = _getValueByCode(event.code); + + _updateLocalValue(event.code, event.value); + + emit(LivingRoomDeviceStatusLoaded(deviceStatus)); + + await _runDebounce( + deviceId: event.devicesIds, + code: event.code, + value: event.value, + oldValue: oldValue, + emit: emit, + isBatch: true, + ); + } } diff --git a/lib/pages/device_managment/three_gang_switch/bloc/living_room_event.dart b/lib/pages/device_managment/three_gang_switch/bloc/living_room_event.dart index 43a5b0c3..a3b0d78b 100644 --- a/lib/pages/device_managment/three_gang_switch/bloc/living_room_event.dart +++ b/lib/pages/device_managment/three_gang_switch/bloc/living_room_event.dart @@ -7,23 +7,23 @@ sealed class LivingRoomEvent extends Equatable { List get props => []; } -class LivingRoomFetchDeviceStatus extends LivingRoomEvent { +class LivingRoomFetchDeviceStatusEvent extends LivingRoomEvent { final String deviceId; - const LivingRoomFetchDeviceStatus(this.deviceId); + const LivingRoomFetchDeviceStatusEvent(this.deviceId); @override List get props => [deviceId]; } //LivingRoomFetchBatchStatus -class LivingRoomFetchBatchStatus extends LivingRoomEvent { - final String deviceId; +class LivingRoomFetchBatchEvent extends LivingRoomEvent { + final List devicesIds; - const LivingRoomFetchBatchStatus(this.deviceId); + const LivingRoomFetchBatchEvent(this.devicesIds); @override - List get props => [deviceId]; + List get props => [devicesIds]; } class LivingRoomControl extends LivingRoomEvent { @@ -39,13 +39,13 @@ class LivingRoomControl extends LivingRoomEvent { } class LivingRoomBatchControl extends LivingRoomEvent { - final List deviceId; + final List devicesIds; final String code; final bool value; const LivingRoomBatchControl( - {required this.deviceId, required this.code, required this.value}); + {required this.devicesIds, required this.code, required this.value}); @override - List get props => [deviceId, code, value]; + List get props => [devicesIds, code, value]; } diff --git a/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart b/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart index daff5e63..f8c40179 100644 --- a/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart +++ b/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart @@ -17,7 +17,7 @@ class LivingRoomBatchControlsView extends StatelessWidget Widget build(BuildContext context) { return BlocProvider( create: (context) => LivingRoomBloc(deviceId: deviceIds.first) - ..add(LivingRoomFetchBatchStatus(deviceIds.first)), + ..add(LivingRoomFetchBatchEvent(deviceIds)), child: BlocBuilder( builder: (context, state) { if (state is LivingRoomDeviceStatusLoading) { @@ -61,7 +61,45 @@ class LivingRoomBatchControlsView extends StatelessWidget code: 'switch_1', deviceId: deviceIds.first, label: 'Wall Light', - onChange: (value) {}, + onChange: (value) { + context.read().add( + LivingRoomBatchControl( + devicesIds: deviceIds, + code: 'switch_1', + value: value, + ), + ); + }, + ), + ToggleWidget( + value: status.switch2, + code: 'switch_2', + deviceId: deviceIds.first, + label: 'Ceiling Light', + onChange: (value) { + context.read().add( + LivingRoomBatchControl( + devicesIds: deviceIds, + code: 'switch_2', + value: value, + ), + ); + }, + ), + ToggleWidget( + value: status.switch3, + code: 'switch_2', + deviceId: deviceIds.first, + label: 'Spotlight', + onChange: (value) { + context.read().add( + LivingRoomBatchControl( + devicesIds: deviceIds, + code: 'switch_3', + value: value, + ), + ); + }, ), FirmwareUpdateWidget( deviceId: deviceIds.first, diff --git a/lib/pages/device_managment/three_gang_switch/view/living_room_device_control.dart b/lib/pages/device_managment/three_gang_switch/view/living_room_device_control.dart index b8226f57..b7f97776 100644 --- a/lib/pages/device_managment/three_gang_switch/view/living_room_device_control.dart +++ b/lib/pages/device_managment/three_gang_switch/view/living_room_device_control.dart @@ -15,7 +15,7 @@ class LivingRoomDeviceControlsView extends StatelessWidget Widget build(BuildContext context) { return BlocProvider( create: (context) => LivingRoomBloc(deviceId: deviceId) - ..add(LivingRoomFetchDeviceStatus(deviceId)), + ..add(LivingRoomFetchDeviceStatusEvent(deviceId)), child: BlocBuilder( builder: (context, state) { if (state is LivingRoomDeviceStatusLoading) {