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 e38ac582..81405451 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 @@ -9,6 +9,7 @@ import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_batch_st 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'; +import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart'; import 'package:syncrow_web/pages/device_managment/garage_door/view/garage_door_batch_control_view.dart'; import 'package:syncrow_web/pages/device_managment/garage_door/view/garage_door_control_view.dart'; import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_batch_control.dart'; @@ -104,6 +105,9 @@ mixin RouteControlsBasedCode { ); case 'SOS': return SosDeviceControlsView(device: device); + + case 'NCPS': + return FlushMountedPresenceSensorControlView(device: device); default: return const SizedBox(); } diff --git a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart new file mode 100644 index 00000000..5a355067 --- /dev/null +++ b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart @@ -0,0 +1,225 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; +import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/models/flush_mounted_presence_sensor_model.dart'; +import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_display_data.dart'; +import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_static_widget.dart'; +import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_status.dart'; +import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_update_data.dart'; +import 'package:syncrow_web/pages/device_managment/shared/table/description_view.dart'; +import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dart'; +import 'package:syncrow_web/services/control_device_service.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; + +class FlushMountedPresenceSensorControlView extends StatelessWidget + with HelperResponsiveLayout { + const FlushMountedPresenceSensorControlView({super.key, required this.device}); + + final AllDevicesModel device; + + @override + Widget build(BuildContext context) { + final isExtraLarge = isExtraLargeScreenSize(context); + final isLarge = isLargeScreenSize(context); + final isMedium = isMediumScreenSize(context); + return BlocProvider( + create: (context) => FlushMountedPresenceSensorBloc( + deviceId: device.uuid!, + controlDeviceService: DebouncedControlDeviceService( + decoratee: RemoteControlDeviceService(), + ), + )..add(FlushMountedPresenceSensorFetchStatusEvent()), + child: BlocBuilder( + builder: (context, state) { + if (state is FlushMountedPresenceSensorLoadingInitialState || + state is FlushMountedPresenceSensorDeviceReportsLoadingState) { + return const Center(child: CircularProgressIndicator()); + } else if (state is FlushMountedPresenceSensorUpdateState) { + return _buildGridView( + context, state.model, isExtraLarge, isLarge, isMedium); + } else if (state is FlushMountedPresenceSensorDeviceReportsState) { + return ReportsTable( + report: state.deviceReport, + thirdColumnTitle: + state.code == 'illuminance_value' ? "Value" : 'Status', + thirdColumnDescription: + state.code == 'illuminance_value' ? "Lux" : null, + onRowTap: (index) {}, + onClose: () { + context + .read() + .add(FlushMountedPresenceSensorBackToGridViewEvent()); + }, + ); + } else if (state is FlushMountedPresenceSensorShowDescriptionState) { + return DescriptionView( + description: state.description, + onClose: () { + context + .read() + .add(FlushMountedPresenceSensorBackToGridViewEvent()); + }, + ); + } else if (state is FlushMountedPresenceSensorDeviceReportsFailedState) { + final model = + context.read().deviceStatus; + return _buildGridView( + context, + model, + isExtraLarge, + isLarge, + isMedium, + ); + } + return const Center( + child: Text('Error fetching status', textAlign: TextAlign.center), + ); + }, + ), + ); + } + + Widget _buildGridView( + BuildContext context, + FlushMountedPresenceSensorModel model, + bool isExtraLarge, + bool isLarge, + bool isMedium, + ) { + 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: [ + PresenceState( + value: model.presenceState, + ), + PresenceDisplayValue( + value: model.illuminance.toString(), + postfix: 'Lux', + description: 'Illuminance Value', + ), + PresenceUpdateData( + value: model.sensitivity.toDouble(), + title: 'Sensitivity:', + minValue: 0, + maxValue: 9, + steps: 1, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codeSensitivity, + value: value, + ), + ), + ), + PresenceUpdateData( + value: (model.nearDetection).toDouble(), + title: 'Nearest Detect Dist:', + description: 'm', + minValue: 0.0, + maxValue: 950, + steps: 10, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codeNearDetection, + value: (value).toInt(), + ), + ), + ), + PresenceUpdateData( + value: (model.farDetection).toDouble(), + title: 'Max Detect Dist:', + description: 'm', + minValue: 0.0, + maxValue: 950, + steps: 10, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codeFarDetection, + value: (value).toInt(), + ), + ), + ), + PresenceUpdateData( + value: (model.presenceDelay.toDouble()), + title: 'Trigger Level:', + minValue: 0, + maxValue: 3, + steps: 1, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codePresenceDelay, + value: value, + ), + ), + ), + PresenceUpdateData( + value: (model.occurDistReduce.toDouble()), + title: 'Indent Level:', + minValue: 0, + maxValue: 3, + steps: 1, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codeOccurDistReduce, + value: value, + ), + ), + ), + PresenceUpdateData( + value: (model.sensiReduce.toDouble()), + title: 'Target Confirm Time:', + description: 's', + minValue: 0, + maxValue: 3, + steps: 1, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codeSensiReduce, + value: value, + ), + ), + ), + PresenceUpdateData( + value: ((model.noneDelay).toDouble()), + description: 's', + title: 'Disappe Delay:', + minValue: 0, + maxValue: 3000, + steps: 10, + action: (int value) => context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codeNoneDelay, + value: value, + ), + ), + ), + GestureDetector( + onTap: () => context.read().add( + FlushMountedPresenceSensorGetDeviceReportsEvent( + code: 'presence_state', + deviceUuid: device.uuid!, + ), + ), + child: const PresenceStaticWidget( + icon: Assets.presenceRecordIcon, + description: 'Presence Record', + ), + ), + ], + ); + } +}