From 3171916fafe328d79c873c9eb8651eb28209c413 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Thu, 12 Sep 2024 11:21:51 +0300 Subject: [PATCH] curtain batch control design --- .../helper/route_controls_based_code.dart | 12 ++-- .../curtain/bloc/curtain_bloc.dart | 16 +++++ .../curtain/bloc/curtain_event.dart | 11 ++- .../view/curtain_batch_status_view.dart | 68 +++++++++++++++++++ 4 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 lib/pages/device_managment/curtain/view/curtain_batch_status_view.dart 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 ffadb6f8..9bd3db98 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 @@ -3,6 +3,7 @@ import 'package:flutter/material.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'; +import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_batch_status_view.dart'; import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_status_view.dart'; import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart'; import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_control_view.dart'; @@ -84,10 +85,13 @@ mixin RouteControlsBasedCode { // return CeilingSensorControls( // device: device.first, // ); - // case 'CUR': - // return CurtainStatusControls( - // deviceId: device.first.uuid!, - // ); + case 'CUR': + return CurtainBatchStatusView( + devicesIds: devices + .where((e) => (e.productType == 'CUR')) + .map((e) => e.uuid!) + .toList(), + ); // case 'AC': // return AcDeviceControls(device: device.first); default: diff --git a/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart b/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart index 1b2f5864..484e2b80 100644 --- a/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart +++ b/lib/pages/device_managment/curtain/bloc/curtain_bloc.dart @@ -12,6 +12,7 @@ class CurtainBloc extends Bloc { CurtainBloc({required this.deviceId}) : super(CurtainInitial()) { on(_onFetchDeviceStatus); + on(_onFetchBatchStatus); on(_onCurtainControl); } @@ -88,4 +89,19 @@ class CurtainBloc extends Bloc { bool _checkStatus(String command) { return command.toLowerCase() == 'open'; } + + FutureOr _onFetchBatchStatus( + CurtainFetchBatchStatus event, Emitter emit) async { + emit(CurtainStatusLoading()); + try { + final status = + await DevicesManagementApi().getDeviceStatus(event.deviceId); + + deviceStatus = _checkStatus(status.status[0].value); + + emit(CurtainStatusLoaded(deviceStatus)); + } catch (e) { + emit(CurtainError(e.toString())); + } + } } diff --git a/lib/pages/device_managment/curtain/bloc/curtain_event.dart b/lib/pages/device_managment/curtain/bloc/curtain_event.dart index 23bb2e45..98670868 100644 --- a/lib/pages/device_managment/curtain/bloc/curtain_event.dart +++ b/lib/pages/device_managment/curtain/bloc/curtain_event.dart @@ -1,7 +1,5 @@ - import 'package:equatable/equatable.dart'; - sealed class CurtainEvent extends Equatable { const CurtainEvent(); @@ -18,6 +16,15 @@ class CurtainFetchDeviceStatus extends CurtainEvent { List get props => [deviceId]; } +class CurtainFetchBatchStatus extends CurtainEvent { + final String deviceId; + + const CurtainFetchBatchStatus(this.deviceId); + + @override + List get props => [deviceId]; +} + class CurtainControl extends CurtainEvent { final String deviceId; final String code; 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 new file mode 100644 index 00000000..056e1d33 --- /dev/null +++ b/lib/pages/device_managment/curtain/view/curtain_batch_status_view.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/curtain_toggle.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/pages/device_managment/curtain/bloc/curtain_state.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/helpers/responsice_layout_helper/responsive_layout_helper.dart'; + +class CurtainBatchStatusView extends StatelessWidget + with HelperResponsiveLayout { + const CurtainBatchStatusView({super.key, required this.devicesIds}); + + final List devicesIds; + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CurtainBloc(deviceId: devicesIds.first) + ..add(CurtainFetchDeviceStatus(devicesIds.first)), + child: BlocBuilder( + builder: (context, state) { + if (state is CurtainStatusLoading) { + return const Center(child: CircularProgressIndicator()); + } else if (state is CurtainStatusLoaded) { + return _buildStatusControls(context, state.status); + } else if (state is CurtainError || state is CurtainControlError) { + return const Center(child: Text('Error fetching status')); + } else { + return const Center(child: CircularProgressIndicator()); + } + }, + ), + ); + } + + Widget _buildStatusControls(BuildContext context, bool status) { + final isExtraLarge = isExtraLargeScreenSize(context); + final isLarge = isLargeScreenSize(context); + final isMedium = isMediumScreenSize(context); + 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: [ + CurtainToggle( + value: status, + code: 'control', + deviceId: devicesIds.first, + label: 'Curtains', + ), + FirmwareUpdateWidget(deviceId: devicesIds.first, version: 5), + FactoryResetWidget(deviceId: devicesIds.first), + ], + ); + } +}