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.
This commit is contained in:
Mohammad Salameh
2024-04-22 10:14:11 +03:00
parent 072a043aaa
commit 00e3c13d03
2 changed files with 182 additions and 180 deletions

View File

@ -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<ParameterDialog> {
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),
),
),
),
],
)
],
),
),
);
}
}

View File

@ -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<ParameterControlDialog> {
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),
),
),
),
],
)
],
),
),
);
}
}