From 222331f107db3d9c27facd1208a83ed1e62615b0 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Thu, 12 Sep 2024 11:49:57 +0300 Subject: [PATCH] ac batch control design --- .../device_managment/ac/bloc/ac_bloc.dart | 14 +++ .../device_managment/ac/bloc/ac_event.dart | 9 ++ .../ac/view/ac_device_batch_control.dart | 88 +++++++++++++++++++ .../helper/route_controls_based_code.dart | 8 +- 4 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 lib/pages/device_managment/ac/view/ac_device_batch_control.dart diff --git a/lib/pages/device_managment/ac/bloc/ac_bloc.dart b/lib/pages/device_managment/ac/bloc/ac_bloc.dart index 5d147439..ab9cc265 100644 --- a/lib/pages/device_managment/ac/bloc/ac_bloc.dart +++ b/lib/pages/device_managment/ac/bloc/ac_bloc.dart @@ -15,6 +15,7 @@ class AcBloc extends Bloc { AcBloc({required this.deviceId}) : super(AcsInitialState()) { on(_onFetchAcStatus); + on(_onFetchAcBatchStatus); on(_onAcControl); } @@ -133,4 +134,17 @@ class AcBloc extends Bloc { return null; } } + + FutureOr _onFetchAcBatchStatus( + AcFetchBatchStatus event, Emitter emit) async { + emit(AcsLoadingState()); + try { + final status = + await DevicesManagementApi().getDeviceStatus(event.deviceId); + deviceStatus = AcStatusModel.fromJson(event.deviceId, status.status); + emit(ACStatusLoaded(deviceStatus)); + } catch (e) { + emit(AcsFailedState(error: e.toString())); + } + } } diff --git a/lib/pages/device_managment/ac/bloc/ac_event.dart b/lib/pages/device_managment/ac/bloc/ac_event.dart index 400c8136..ab743b47 100644 --- a/lib/pages/device_managment/ac/bloc/ac_event.dart +++ b/lib/pages/device_managment/ac/bloc/ac_event.dart @@ -16,6 +16,15 @@ class AcFetchDeviceStatus extends AcsEvent { List get props => [deviceId]; } +class AcFetchBatchStatus extends AcsEvent { + final String deviceId; + + const AcFetchBatchStatus(this.deviceId); + + @override + List get props => [deviceId]; +} + class AcControl extends AcsEvent { final String deviceId; final String code; diff --git a/lib/pages/device_managment/ac/view/ac_device_batch_control.dart b/lib/pages/device_managment/ac/view/ac_device_batch_control.dart new file mode 100644 index 00000000..3dcd72b1 --- /dev/null +++ b/lib/pages/device_managment/ac/view/ac_device_batch_control.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; +import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_state.dart'; +import 'package:syncrow_web/pages/device_managment/ac/view/control_list/ac_mode.dart'; +import 'package:syncrow_web/pages/device_managment/ac/view/control_list/ac_toggle.dart'; +import 'package:syncrow_web/pages/device_managment/ac/view/control_list/current_temp.dart'; +import 'package:syncrow_web/pages/device_managment/ac/view/control_list/fan_speed.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/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; + +class AcDeviceBatchControl extends StatelessWidget with HelperResponsiveLayout { + const AcDeviceBatchControl({super.key, required this.devicesIds}); + + final List devicesIds; + + @override + Widget build(BuildContext context) { + final isExtraLarge = isExtraLargeScreenSize(context); + final isLarge = isLargeScreenSize(context); + final isMedium = isMediumScreenSize(context); + return BlocProvider( + create: (context) => AcBloc(deviceId: devicesIds.first) + ..add(AcFetchBatchStatus(devicesIds.first)), + child: BlocBuilder( + builder: (context, state) { + if (state is ACStatusLoaded) { + return 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: [ + AcToggle( + value: state.status.acSwitch, + code: 'switch', + deviceId: devicesIds.first, + ), + CurrentTemp( + currentTemp: state.status.currentTemp, + tempSet: state.status.tempSet, + code: 'temp_set', + deviceId: devicesIds.first, + ), + AcMode( + value: state.status.acMode, + code: 'mode', + deviceId: devicesIds.first, + ), + FanSpeedControl( + value: state.status.acFanSpeed, + code: 'level', + deviceId: devicesIds.first, + ), + AcToggle( + value: state.status.childLock, + code: 'child_lock', + deviceId: devicesIds.first, + description: 'Child Lock', + icon: + state.status.childLock ? Assets.childLock : Assets.unlock, + ), + FirmwareUpdateWidget(deviceId: devicesIds.first, version: 5), + FactoryResetWidget(deviceId: devicesIds.first), + ], + ); + } else if (state is AcsLoadingState) { + return const Center(child: CircularProgressIndicator()); + } else { + return const Center(child: Text('Error fetching status')); + } + }, + ), + ); + } +} 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 9bd3db98..c8518754 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 @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/device_managment/ac/view/ac_device_batch_control.dart'; import 'package:syncrow_web/pages/device_managment/ac/view/ac_device_control.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart'; @@ -92,8 +93,11 @@ mixin RouteControlsBasedCode { .map((e) => e.uuid!) .toList(), ); - // case 'AC': - // return AcDeviceControls(device: device.first); + case 'AC': + return AcDeviceBatchControl(devicesIds: devices + .where((e) => (e.productType == 'AC')) + .map((e) => e.uuid!) + .toList()); default: return const SizedBox(); }