From 0c530e9ea604fe78de21fdd0b9f1ae6fbf916355 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Mon, 23 Sep 2024 08:32:49 +0300 Subject: [PATCH] push water heater batch control view --- assets/icons/water_heater.svg | 22 +++++ .../helper/route_controls_based_code.dart | 11 ++- .../water_heater/bloc/water_heater_bloc.dart | 73 ++++++++++++++-- .../water_heater/bloc/water_heater_event.dart | 35 +++++--- .../view/water_heater_batch_control.dart | 87 +++++++++++++++++++ .../view/water_heater_device_control.dart | 4 +- lib/utils/constants/assets.dart | 3 + 7 files changed, 217 insertions(+), 18 deletions(-) create mode 100644 assets/icons/water_heater.svg create mode 100644 lib/pages/device_managment/water_heater/view/water_heater_batch_control.dart diff --git a/assets/icons/water_heater.svg b/assets/icons/water_heater.svg new file mode 100644 index 00000000..aa58e3fc --- /dev/null +++ b/assets/icons/water_heater.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart b/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart index 5065ec31..80a00094 100644 --- a/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart +++ b/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart @@ -20,6 +20,7 @@ import 'package:syncrow_web/pages/device_managment/two_gang_switch/view/wall_lig import 'package:syncrow_web/pages/device_managment/two_gang_switch/view/wall_light_device_control.dart'; import 'package:syncrow_web/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart'; import 'package:syncrow_web/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart'; +import 'package:syncrow_web/pages/device_managment/water_heater/view/water_heater_batch_control.dart'; import 'package:syncrow_web/pages/device_managment/water_heater/view/water_heater_device_control.dart'; mixin RouteControlsBasedCode { @@ -56,7 +57,7 @@ mixin RouteControlsBasedCode { case 'AC': return AcDeviceControlsView(device: device); case 'WH': - return WaterHeaterDeviceControl( + return WaterHeaterDeviceControlView( device: device, ); case 'DS': @@ -140,6 +141,14 @@ mixin RouteControlsBasedCode { .where((e) => (e.productType == 'AC')) .map((e) => e.uuid!) .toList()); + case 'WH': + return WaterHEaterBatchControlView( + deviceIds: devices + .where((e) => (e.productType == 'WH')) + .map((e) => e.uuid!) + .toList(), + ); + default: return const SizedBox(); } diff --git a/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart b/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart index 1eb88912..2e84c011 100644 --- a/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart +++ b/lib/pages/device_managment/water_heater/bloc/water_heater_bloc.dart @@ -17,6 +17,8 @@ class WaterHeaterBloc extends Bloc { WaterHeaterBloc() : super(WaterHeaterInitial()) { on(_fetchWaterHeaterStatus); on(_controlWaterHeater); + on(_batchFetchWaterHeater); + on(_batchControlWaterHeater); on(_updateScheduleEvent); on(_stopScheduleEvent); on(_onDecrementCountdown); @@ -145,6 +147,7 @@ class WaterHeaterBloc extends Bloc { value: event.value, oldValue: oldValue, emit: emit, + isBatch: false, ); if (success) { @@ -395,19 +398,29 @@ class WaterHeaterBloc extends Bloc { // } Future _runDebounce({ - required String deviceId, + required dynamic deviceId, required String code, required dynamic value, required dynamic oldValue, required Emitter emit, + required bool isBatch, }) async { try { + late bool status; await Future.delayed(const Duration(milliseconds: 500)); - final status = await DevicesManagementApi().deviceControl( - deviceId, - Status(code: code, value: value), - ); + if (isBatch) { + status = await DevicesManagementApi().deviceBatchControl( + deviceId, + code, + value, + ); + } else { + status = await DevicesManagementApi().deviceControl( + deviceId, + Status(code: code, value: value), + ); + } if (!status) { _revertValue(code, oldValue, emit.call); @@ -580,4 +593,54 @@ class WaterHeaterBloc extends Bloc { } } } + + FutureOr _batchFetchWaterHeater(FetchWaterHeaterBatchStatusEvent event, + Emitter emit) async { + emit(WaterHeaterLoadingState()); + + try { + final status = + await DevicesManagementApi().getBatchStatus(event.devicesUuid); + deviceStatus = WaterHeaterStatusModel.fromJson( + event.devicesUuid.first, status.status); + + emit(WaterHeaterDeviceStatusLoaded(deviceStatus)); + } catch (e) { + emit(WaterHeaterDeviceStatusLoaded(deviceStatus)); + } + } + + FutureOr _batchControlWaterHeater(ControlWaterHeaterBatchEvent event, + Emitter emit) async { + if (state is WaterHeaterDeviceStatusLoaded) { + final currentState = state as WaterHeaterDeviceStatusLoaded; + + final oldValue = _getValueByCode(event.code); + + _updateLocalValue(event.code, event.value); + + emit(currentState.copyWith( + status: deviceStatus, + )); + + final success = await _runDebounce( + deviceId: event.devicesUuid, + code: event.code, + value: event.value, + oldValue: oldValue, + emit: emit, + isBatch: true, + ); + + if (success) { + if (event.code == "switch_1") { + emit(currentState.copyWith( + status: deviceStatus, + )); + } + } else { + _updateLocalValue(event.code, oldValue); + } + } + } } diff --git a/lib/pages/device_managment/water_heater/bloc/water_heater_event.dart b/lib/pages/device_managment/water_heater/bloc/water_heater_event.dart index bc0909ab..e2e718ae 100644 --- a/lib/pages/device_managment/water_heater/bloc/water_heater_event.dart +++ b/lib/pages/device_managment/water_heater/bloc/water_heater_event.dart @@ -52,15 +52,6 @@ final class WaterHeaterFetchStatusEvent extends WaterHeaterEvent { List get props => [deviceId]; } -final class WaterHeaterFetchBatchStatusEvent extends WaterHeaterEvent { - final String deviceId; - - const WaterHeaterFetchBatchStatusEvent(this.deviceId); - - @override - List get props => [deviceId]; -} - final class DecrementCountdownEvent extends WaterHeaterEvent {} final class AddScheduleEvent extends WaterHeaterEvent { @@ -106,7 +97,8 @@ final class UpdateScheduleEntryEvent extends WaterHeaterEvent { }); @override - List get props => [category, functionOn, deviceId, scheduleId, index]; + List get props => + [category, functionOn, deviceId, scheduleId, index]; } class GetSchedulesEvent extends WaterHeaterEvent { @@ -165,3 +157,26 @@ class UpdateFunctionOnEvent extends WaterHeaterEvent { @override List get props => [isOn]; } + +class FetchWaterHeaterBatchStatusEvent extends WaterHeaterEvent { + final List devicesUuid; + const FetchWaterHeaterBatchStatusEvent({required this.devicesUuid}); + + @override + List get props => [devicesUuid]; +} + +class ControlWaterHeaterBatchEvent extends WaterHeaterEvent { + final List devicesUuid; + final String code; + final dynamic value; + + const ControlWaterHeaterBatchEvent({ + required this.devicesUuid, + required this.code, + required this.value, + }); + + @override + List get props => [devicesUuid, code, value]; +} diff --git a/lib/pages/device_managment/water_heater/view/water_heater_batch_control.dart b/lib/pages/device_managment/water_heater/view/water_heater_batch_control.dart new file mode 100644 index 00000000..cc62adfd --- /dev/null +++ b/lib/pages/device_managment/water_heater/view/water_heater_batch_control.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart'; +import 'package:syncrow_web/pages/device_managment/shared/toggle_widget.dart'; +import 'package:syncrow_web/pages/device_managment/water_heater/bloc/water_heater_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/water_heater/models/water_heater_status_model.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; + +class WaterHEaterBatchControlView extends StatelessWidget + with HelperResponsiveLayout { + const WaterHEaterBatchControlView({super.key, required this.deviceIds}); + + final List deviceIds; + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => WaterHeaterBloc() + ..add(FetchWaterHeaterBatchStatusEvent(devicesUuid: deviceIds)), + child: BlocBuilder( + builder: (context, state) { + if (state is WaterHeaterLoadingState) { + return const Center(child: CircularProgressIndicator()); + } else if (state is WaterHeaterDeviceStatusLoaded) { + return _buildStatusControls(context, state.status); + } else if (state is WaterHeaterBatchFailedState) { + return const Center(child: Text('Error fetching status')); + } else { + return const Center(child: CircularProgressIndicator()); + } + }, + ), + ); + } + + Widget _buildStatusControls( + BuildContext context, WaterHeaterStatusModel status) { + final isExtraLarge = isExtraLargeScreenSize(context); + final isLarge = isLargeScreenSize(context); + final isMedium = isMediumScreenSize(context); + return SizedBox( + child: GridView( + padding: const EdgeInsets.symmetric(horizontal: 50), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: isLarge || isExtraLarge + ? 3 + : isMedium + ? 2 + : 1, + mainAxisExtent: 140, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + ), + children: [ + ToggleWidget( + value: status.heaterSwitch, + code: 'switch_1', + deviceId: deviceIds.first, + label: 'Water Heater', + icon: Assets.waterHeater, + onChange: (value) { + context.read().add( + ControlWaterHeaterBatchEvent( + devicesUuid: deviceIds, + code: 'switch_1', + value: value, + ), + ); + }, + ), + FirmwareUpdateWidget( + deviceId: deviceIds.first, + version: 12, + ), + FactoryResetWidget( + callFactoryReset: () {}, + ), + ], + ), + ); + } +} diff --git a/lib/pages/device_managment/water_heater/view/water_heater_device_control.dart b/lib/pages/device_managment/water_heater/view/water_heater_device_control.dart index c3f9d360..57f7444d 100644 --- a/lib/pages/device_managment/water_heater/view/water_heater_device_control.dart +++ b/lib/pages/device_managment/water_heater/view/water_heater_device_control.dart @@ -12,9 +12,9 @@ import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class WaterHeaterDeviceControl extends StatelessWidget +class WaterHeaterDeviceControlView extends StatelessWidget with HelperResponsiveLayout { - const WaterHeaterDeviceControl({super.key, required this.device}); + const WaterHeaterDeviceControlView({super.key, required this.device}); final AllDevicesModel device; diff --git a/lib/utils/constants/assets.dart b/lib/utils/constants/assets.dart index 719cc21c..4ad6ba2f 100644 --- a/lib/utils/constants/assets.dart +++ b/lib/utils/constants/assets.dart @@ -163,4 +163,7 @@ class Assets { //assets/icons/open_close_records.svg static const String openCloseRecords = 'assets/icons/open_close_records.svg'; + + //assets/icons/water_heater.svg + static const String waterHeater = 'assets/icons/water_heater.svg'; }