From 619d964cd7a4e65eccfca8bcf574424fcafa74e4 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Wed, 18 Sep 2024 15:08:43 +0300 Subject: [PATCH] push curtain batch control --- lib/pages/common/curtain_toggle.dart | 15 ++---- .../curtain/bloc/curtain_bloc.dart | 47 ++++++++++++++++--- .../curtain/bloc/curtain_event.dart | 18 +++++-- .../view/curtain_batch_status_view.dart | 9 +++- .../curtain/view/curtain_status_view.dart | 9 ++++ .../shared/table/report_table.dart | 1 + 6 files changed, 77 insertions(+), 22 deletions(-) diff --git a/lib/pages/common/curtain_toggle.dart b/lib/pages/common/curtain_toggle.dart index 371f8833..a44822c3 100644 --- a/lib/pages/common/curtain_toggle.dart +++ b/lib/pages/common/curtain_toggle.dart @@ -1,9 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_web/pages/device_managment/curtain/bloc/curtain_bloc.dart'; -import 'package:syncrow_web/pages/device_managment/curtain/bloc/curtain_event.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -12,6 +9,7 @@ class CurtainToggle extends StatelessWidget { final String code; final String deviceId; final String label; + final Null Function(dynamic value) onChanged; const CurtainToggle({ super.key, @@ -19,6 +17,7 @@ class CurtainToggle extends StatelessWidget { required this.code, required this.deviceId, required this.label, + required this.onChanged, }); @override @@ -54,15 +53,7 @@ class CurtainToggle extends StatelessWidget { child: CupertinoSwitch( value: value, activeColor: ColorsManager.dialogBlueTitle, - onChanged: (newValue) { - context.read().add( - CurtainControl( - deviceId: deviceId, - code: code, - value: newValue, - ), - ); - }, + onChanged: onChanged, ), ), ], diff --git a/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart b/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart index 484e2b80..eb031552 100644 --- a/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart +++ b/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart @@ -14,6 +14,7 @@ class CurtainBloc extends Bloc { on(_onFetchDeviceStatus); on(_onFetchBatchStatus); on(_onCurtainControl); + on(_onCurtainBatchControl); } FutureOr _onFetchDeviceStatus( @@ -45,16 +46,26 @@ class CurtainBloc extends Bloc { value: event.value, oldValue: oldValue, emit: emit, + isBatch: false, ); } Future _runDebounce({ - required String deviceId, + required dynamic deviceId, required String code, required bool value, required bool 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(); } @@ -62,14 +73,20 @@ class CurtainBloc extends Bloc { try { final controlValue = value ? 'open' : 'close'; - final response = await DevicesManagementApi() - .deviceControl(deviceId, Status(code: code, value: controlValue)); + late bool response; + if (isBatch) { + response = await DevicesManagementApi() + .deviceBatchControl(deviceId, code, controlValue); + } else { + response = await DevicesManagementApi() + .deviceControl(deviceId, Status(code: code, value: controlValue)); + } if (!response) { - _revertValueAndEmit(deviceId, oldValue, emit); + _revertValueAndEmit(id, oldValue, emit); } } catch (e) { - _revertValueAndEmit(deviceId, oldValue, emit); + _revertValueAndEmit(id, oldValue, emit); } }); } @@ -95,7 +112,7 @@ class CurtainBloc extends Bloc { emit(CurtainStatusLoading()); try { final status = - await DevicesManagementApi().getDeviceStatus(event.deviceId); + await DevicesManagementApi().getBatchStatus(event.devicesIds); deviceStatus = _checkStatus(status.status[0].value); @@ -104,4 +121,22 @@ class CurtainBloc extends Bloc { emit(CurtainError(e.toString())); } } + + FutureOr _onCurtainBatchControl( + CurtainBatchControl event, Emitter emit) async { + final oldValue = deviceStatus; + + _updateLocalValue(event.value, emit); + + emit(CurtainStatusLoaded(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/curtain/bloc/curtain_event.dart b/lib/pages/device_managment/curtain/bloc/curtain_event.dart index 98670868..8ef85145 100644 --- a/lib/pages/device_managment/curtain/bloc/curtain_event.dart +++ b/lib/pages/device_managment/curtain/bloc/curtain_event.dart @@ -17,12 +17,12 @@ class CurtainFetchDeviceStatus extends CurtainEvent { } class CurtainFetchBatchStatus extends CurtainEvent { - final String deviceId; + final List devicesIds; - const CurtainFetchBatchStatus(this.deviceId); + const CurtainFetchBatchStatus(this.devicesIds); @override - List get props => [deviceId]; + List get props => [devicesIds]; } class CurtainControl extends CurtainEvent { @@ -36,3 +36,15 @@ class CurtainControl extends CurtainEvent { @override List get props => [deviceId, code, value]; } + +class CurtainBatchControl extends CurtainEvent { + final List devicesIds; + final String code; + final bool value; + + const CurtainBatchControl( + {required this.devicesIds, required this.code, required this.value}); + + @override + List get props => [devicesIds, code, value]; +} diff --git a/lib/pages/device_managment/curtain/view/curtain_batch_status_view.dart b/lib/pages/device_managment/curtain/view/curtain_batch_status_view.dart index 27a71e89..ec1a0076 100644 --- a/lib/pages/device_managment/curtain/view/curtain_batch_status_view.dart +++ b/lib/pages/device_managment/curtain/view/curtain_batch_status_view.dart @@ -18,7 +18,7 @@ class CurtainBatchStatusView extends StatelessWidget Widget build(BuildContext context) { return BlocProvider( create: (context) => CurtainBloc(deviceId: devicesIds.first) - ..add(CurtainFetchDeviceStatus(devicesIds.first)), + ..add(CurtainFetchBatchStatus(devicesIds)), child: BlocBuilder( builder: (context, state) { if (state is CurtainStatusLoading) { @@ -59,6 +59,13 @@ class CurtainBatchStatusView extends StatelessWidget code: 'control', deviceId: devicesIds.first, label: 'Curtains', + onChanged: (value) { + context.read().add(CurtainBatchControl( + devicesIds: devicesIds, + code: 'control', + value: value, + )); + }, ), FirmwareUpdateWidget(deviceId: devicesIds.first, version: 5), FactoryResetWidget(deviceId: devicesIds.first), diff --git a/lib/pages/device_managment/curtain/view/curtain_status_view.dart b/lib/pages/device_managment/curtain/view/curtain_status_view.dart index 7e1eed1d..2afe49f4 100644 --- a/lib/pages/device_managment/curtain/view/curtain_status_view.dart +++ b/lib/pages/device_managment/curtain/view/curtain_status_view.dart @@ -58,6 +58,15 @@ class CurtainStatusControlsView extends StatelessWidget code: 'control', deviceId: deviceId, label: 'Curtains', + onChanged: (value) { + context.read().add( + CurtainControl( + deviceId: deviceId, + code: 'control', + value: value, + ), + ); + }, ), const SizedBox.shrink(), ], diff --git a/lib/pages/device_managment/shared/table/report_table.dart b/lib/pages/device_managment/shared/table/report_table.dart index 3cddef37..7dda10e1 100644 --- a/lib/pages/device_managment/shared/table/report_table.dart +++ b/lib/pages/device_managment/shared/table/report_table.dart @@ -4,6 +4,7 @@ import 'package:syncrow_web/pages/device_managment/all_devices/models/device_rep import 'package:syncrow_web/pages/device_managment/shared/table/table_cell_widget.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/table_header.dart'; +// ignore: must_be_immutable class ReportsTable extends StatelessWidget { final DeviceReport report; final String? thirdColumnTitle;