From 00e3c13d03967589d289e25d068a7531ba8db62d Mon Sep 17 00:00:00 2001 From: Mohammad Salameh Date: Mon, 22 Apr 2024 10:14:11 +0300 Subject: [PATCH] Add ParameterControlDialog for managing sensor parameters This commit adds a new ParameterControlDialog widget to manage sensor parameters in the presence sensors feature. The dialog allows users to adjust sensitivity settings for ceiling sensors. --- .../ceiling_sensor_interface.dart | 189 +----------------- .../parameter_control_dialog.dart | 173 ++++++++++++++++ 2 files changed, 182 insertions(+), 180 deletions(-) create mode 100644 lib/features/devices/view/widgets/presence_sensors/parameter_control_dialog.dart diff --git a/lib/features/devices/view/widgets/presence_sensors/ceiling_sensor_interface.dart b/lib/features/devices/view/widgets/presence_sensors/ceiling_sensor_interface.dart index 40c7ac6..590c234 100644 --- a/lib/features/devices/view/widgets/presence_sensors/ceiling_sensor_interface.dart +++ b/lib/features/devices/view/widgets/presence_sensors/ceiling_sensor_interface.dart @@ -1,16 +1,11 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart'; -import 'package:syncrow_app/features/devices/model/device_control_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; -import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart'; import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/helpers/misc_string_helpers.dart'; @@ -18,6 +13,8 @@ import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart'; import 'package:syncrow_app/utils/resource_manager/font_manager.dart'; +import 'wall_sensor_interface.dart'; + class CeilingSensorInterface extends StatelessWidget { const CeilingSensorInterface({super.key, required this.ceilingSensor}); @@ -67,24 +64,26 @@ class CeilingSensorInterface extends StatelessWidget { if ((ceilingSensor.isOnline ?? false) == false) { return; } + String controlCode = 'sensitivity'; showDialog( context: context, - builder: (context) => ParameterDialog( + builder: (context) => ParameterControlDialog( title: 'Sensitivity', sensor: ceilingSensor, + controlCode: controlCode, value: ceilingSensor.status - .firstWhere((element) => - element.code == 'sensitivity') + .firstWhere( + (element) => element.code == controlCode) .value as int, min: ceilingSensor.functions .firstWhere((element) => - element.code == 'sensitivity') + element.code == controlCode) .values ?.min ?? 0, max: ceilingSensor.functions .firstWhere((element) => - element.code == 'sensitivity') + element.code == controlCode) .values ?.max ?? 0, @@ -258,173 +257,3 @@ var ceilingSensorButtons = [ 'page': null, }, ]; - -class ParameterDialog extends StatefulWidget { - final String title; - final DeviceModel sensor; - final int value; - final int min; - final int max; - - const ParameterDialog({ - super.key, - required this.title, - required this.sensor, - required this.value, - required this.min, - required this.max, - }); - - @override - _ParameterDialogState createState() => _ParameterDialogState(); -} - -class _ParameterDialogState extends State { - late int _value; - - @override - void initState() { - super.initState(); - _value = widget.value; - } - - @override - Widget build(BuildContext context) { - return Dialog( - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(20), - ), - padding: const EdgeInsets.only(top: 20), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - BodyMedium( - text: widget.title, - style: context.bodyMedium.copyWith( - color: ColorsManager.primaryColorWithOpacity, - fontWeight: FontsManager.extraBold, - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 15, - horizontal: 50, - ), - child: Container( - height: 1, - width: double.infinity, - color: ColorsManager.greyColor, - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 10, - ), - child: TitleMedium( - text: _value.toString(), - style: context.titleMedium.copyWith( - color: Colors.black, - fontWeight: FontsManager.bold, - ), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - IconButton( - onPressed: () { - setState(() { - _value = (_value - 1).clamp(widget.min, widget.max); - }); - }, - icon: const Icon( - Icons.remove, - color: Colors.grey, - ), - ), - Slider( - value: _value.toDouble(), - onChanged: (value) { - setState(() { - _value = value.toInt(); - }); - }, - min: widget.min.toDouble(), - max: widget.max.toDouble(), - label: _value.toString(), - inactiveColor: ColorsManager.greyColor, - ), - IconButton( - onPressed: () { - setState(() { - _value = (_value + 1).clamp(widget.min, widget.max); - }); - }, - icon: const Icon( - Icons.add, - color: Colors.grey, - ), - ), - ], - ), - Container( - height: 1, - width: double.infinity, - color: ColorsManager.greyColor, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - InkWell( - onTap: () { - Navigator.pop(context); - }, - child: Center( - child: BodyMedium( - text: 'Cancel', - style: context.bodyMedium - .copyWith(color: ColorsManager.greyColor), - ), - ), - ), - Container( - height: 50, - width: 1, - color: ColorsManager.greyColor, - ), - InkWell( - onTap: () { - Navigator.pop(context, _value); - if (widget.sensor.isOnline == null) { - return; - } - if (!widget.sensor.isOnline!) { - debugPrint('Device is offline'); - return; - } - - DevicesCubit.getInstance().deviceControl( - DeviceControlModel( - deviceId: widget.sensor.id, - code: 'sensitivity', - value: widget.value), - widget.sensor.id ?? ''); - }, - child: Center( - child: BodyMedium( - text: 'Confirm', - style: context.bodyMedium.copyWith( - color: ColorsManager.primaryColorWithOpacity), - ), - ), - ), - ], - ) - ], - ), - ), - ); - } -} diff --git a/lib/features/devices/view/widgets/presence_sensors/parameter_control_dialog.dart b/lib/features/devices/view/widgets/presence_sensors/parameter_control_dialog.dart new file mode 100644 index 0000000..1d22095 --- /dev/null +++ b/lib/features/devices/view/widgets/presence_sensors/parameter_control_dialog.dart @@ -0,0 +1,173 @@ +part of 'wall_sensor_interface.dart'; + +class ParameterControlDialog extends StatefulWidget { + final String title; + final DeviceModel sensor; + final int value; + final int min; + final int max; + final String controlCode; + + const ParameterControlDialog({ + super.key, + required this.title, + required this.sensor, + required this.value, + required this.min, + required this.max, + required this.controlCode, + }); + + @override + ParameterControlDialogState createState() => ParameterControlDialogState(); +} + +class ParameterControlDialogState extends State { + late int _value; + + @override + void initState() { + super.initState(); + _value = widget.value; + } + + @override + Widget build(BuildContext context) { + return Dialog( + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.only(top: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + BodyMedium( + text: widget.title, + style: context.bodyMedium.copyWith( + color: ColorsManager.primaryColorWithOpacity, + fontWeight: FontsManager.extraBold, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 15, + horizontal: 50, + ), + child: Container( + height: 1, + width: double.infinity, + color: ColorsManager.greyColor, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + child: TitleMedium( + text: _value.toString(), + style: context.titleMedium.copyWith( + color: Colors.black, + fontWeight: FontsManager.bold, + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + onPressed: () { + setState(() { + _value = (_value - 1).clamp(widget.min, widget.max); + }); + }, + icon: const Icon( + Icons.remove, + color: Colors.grey, + ), + ), + Slider( + value: _value.toDouble(), + onChanged: (value) { + setState(() { + _value = value.toInt(); + }); + }, + min: widget.min.toDouble(), + max: widget.max.toDouble(), + label: _value.toString(), + inactiveColor: ColorsManager.greyColor, + ), + IconButton( + onPressed: () { + setState(() { + _value = (_value + 1).clamp(widget.min, widget.max); + }); + }, + icon: const Icon( + Icons.add, + color: Colors.grey, + ), + ), + ], + ), + Container( + height: 1, + width: double.infinity, + color: ColorsManager.greyColor, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Center( + child: BodyMedium( + text: 'Cancel', + style: context.bodyMedium + .copyWith(color: ColorsManager.greyColor), + ), + ), + ), + Container( + height: 50, + width: 1, + color: ColorsManager.greyColor, + ), + InkWell( + onTap: () { + Navigator.pop(context, _value); + if (widget.sensor.isOnline == null) { + return; + } + if (!widget.sensor.isOnline!) { + debugPrint('Device is offline'); + return; + } + + DevicesCubit.getInstance().deviceControl( + DeviceControlModel( + deviceId: widget.sensor.id, + code: widget.controlCode, + value: widget.value), + widget.sensor.id ?? ''); + }, + child: Center( + child: BodyMedium( + text: 'Confirm', + style: context.bodyMedium.copyWith( + color: ColorsManager.primaryColorWithOpacity), + ), + ), + ), + ], + ) + ], + ), + ), + ); + } +}