refactor function tap handlers to use RoutineTapFunctionHelper for improved code reuse and readability, and to remove code duplication.

This commit is contained in:
Faris Armoush
2025-04-24 10:25:41 +03:00
parent 2c684a9495
commit c03b8f290c
8 changed files with 149 additions and 152 deletions

View File

@ -9,6 +9,7 @@ import 'package:syncrow_web/pages/routines/models/ac/ac_operational_value.dart';
import 'package:syncrow_web/pages/routines/models/device_functions.dart'; import 'package:syncrow_web/pages/routines/models/device_functions.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart';
@ -76,30 +77,23 @@ class ACHelper {
acFunctions: acFunctions, acFunctions: acFunctions,
device: device, device: device,
onFunctionSelected: (functionCode, operationName) { onFunctionSelected: (functionCode, operationName) {
context.read<FunctionBloc>().add( RoutineTapFunctionHelper.onTapFunction(
SelectFunction( context,
functionCode: functionCode, functionCode: functionCode,
operationName: operationName, functionOperationName: operationName,
), functionValueDescription:
); selectedFunctionData.valueDescription,
if (functionCode == 'temp_set' || deviceUuid: device?.uuid,
functionCode == 'temp_current') { codesToAddIntoFunctionsWithDefaultValue: [
context.read<FunctionBloc>().add( 'temp_set',
AddFunction( 'temp_current',
functionData: DeviceFunctionData( ],
entityId: device?.uuid ?? '', defaultValue: functionCode == 'temp_set'
functionCode: functionCode,
operationName: operationName,
value: functionCode == 'temp_set'
? 200 ? 200
: -100, : functionCode == 'temp_current'
condition: '==', ? -100
valueDescription: selectedFunctionData : 0,
.valueDescription,
),
),
); );
}
}, },
), ),
), ),

View File

@ -135,6 +135,7 @@ class _CeilingSensorDialogState extends State<CeilingSensorDialog> {
cpsFunctions: _cpsFunctions, cpsFunctions: _cpsFunctions,
device: widget.device, device: widget.device,
selectedFunctionData: selectedFunctionData, selectedFunctionData: selectedFunctionData,
dialogType: widget.dialogType,
), ),
if (state.selectedFunction != null) if (state.selectedFunction != null)
Expanded( Expanded(

View File

@ -1,11 +1,9 @@
import 'package:flutter/material.dart'; 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/all_devices/models/devices_model.dart';
import 'package:syncrow_web/pages/routines/bloc/functions_bloc/functions_bloc_bloc.dart';
import 'package:syncrow_web/pages/routines/models/ceiling_presence_sensor_functions.dart'; import 'package:syncrow_web/pages/routines/models/ceiling_presence_sensor_functions.dart';
import 'package:syncrow_web/pages/routines/models/device_functions.dart'; import 'package:syncrow_web/pages/routines/models/device_functions.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialog_function_list_tile.dart'; import 'package:syncrow_web/pages/routines/widgets/routine_dialog_function_list_tile.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart'; import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
class CpsFunctionsList extends StatelessWidget { class CpsFunctionsList extends StatelessWidget {
@ -13,12 +11,14 @@ class CpsFunctionsList extends StatelessWidget {
required this.cpsFunctions, required this.cpsFunctions,
required this.device, required this.device,
required this.selectedFunctionData, required this.selectedFunctionData,
required this.dialogType,
super.key, super.key,
}); });
final List<CpsFunctions> cpsFunctions; final List<CpsFunctions> cpsFunctions;
final AllDevicesModel? device; final AllDevicesModel? device;
final DeviceFunctionData? selectedFunctionData; final DeviceFunctionData? selectedFunctionData;
final String dialogType;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -36,29 +36,28 @@ class CpsFunctionsList extends StatelessWidget {
return RoutineDialogFunctionListTile( return RoutineDialogFunctionListTile(
iconPath: function.icon, iconPath: function.icon,
operationName: function.operationName, operationName: function.operationName,
onTap: () { onTap: () => RoutineTapFunctionHelper.onTapFunction(
context.read<FunctionBloc>().add( context,
SelectFunction(
functionCode: function.code, functionCode: function.code,
operationName: function.operationName, functionOperationName: function.operationName,
functionValueDescription: selectedFunctionData?.valueDescription,
deviceUuid: device?.uuid,
codesToAddIntoFunctionsWithDefaultValue: [
'static_max_dis',
'presence_reference',
'moving_reference',
'perceptual_boundary',
'moving_boundary',
'moving_rigger_time',
'moving_static_time',
'none_body_time',
'moving_max_dis',
'moving_range',
'presence_range',
if (dialogType == "IF") 'sensitivity',
],
), ),
); );
if (!CeilingSensorHelper.toggleCodes.contains(function.code)) {
context.read<FunctionBloc>().add(
AddFunction(
functionData: DeviceFunctionData(
entityId: device?.uuid ?? '',
functionCode: function.code,
operationName: function.operationName,
value: 0,
condition: '==',
valueDescription: selectedFunctionData?.valueDescription,
),
),
);
}
},
);
}, },
), ),
); );

View File

@ -0,0 +1,46 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/routines/bloc/functions_bloc/functions_bloc_bloc.dart';
import 'package:syncrow_web/pages/routines/models/device_functions.dart';
abstract final class RoutineTapFunctionHelper {
const RoutineTapFunctionHelper._();
static void onTapFunction(
BuildContext context, {
required String functionCode,
required String functionOperationName,
required String? functionValueDescription,
required String? deviceUuid,
required List<String> codesToAddIntoFunctionsWithDefaultValue,
int defaultValue = 0,
}) {
final functionsBloc = context.read<FunctionBloc>();
functionsBloc.add(
SelectFunction(
functionCode: functionCode,
operationName: functionOperationName,
),
);
final addedFunctions = functionsBloc.state.addedFunctions;
final isFunctionAlreadyAdded = addedFunctions.any(
(e) => e.functionCode == functionCode,
);
final shouldAddFunction =
codesToAddIntoFunctionsWithDefaultValue.contains(functionCode);
if (!isFunctionAlreadyAdded && shouldAddFunction) {
context.read<FunctionBloc>().add(
AddFunction(
functionData: DeviceFunctionData(
entityId: deviceUuid ?? '',
functionCode: functionCode,
operationName: functionOperationName,
value: defaultValue,
condition: '==',
valueDescription: functionValueDescription,
),
),
);
}
}
}

View File

@ -11,6 +11,7 @@ import 'package:syncrow_web/pages/routines/models/gang_switches/one_gang_switch/
import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart'; import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart';
@ -86,31 +87,19 @@ class OneGangSwitchHelper {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () { onTap: () =>
context RoutineTapFunctionHelper.onTapFunction(
.read<FunctionBloc>() context,
.add(SelectFunction(
functionCode: function.code, functionCode: function.code,
operationName: function.operationName, functionOperationName:
));
if (function.code == 'countdown_1') {
context.read<FunctionBloc>().add(
AddFunction(
functionData: DeviceFunctionData(
entityId: device?.uuid ?? '',
functionCode: function.code,
operationName:
function.operationName, function.operationName,
value: 0, functionValueDescription:
condition: '==', selectedFunctionData.valueDescription,
valueDescription: deviceUuid: device?.uuid,
selectedFunctionData codesToAddIntoFunctionsWithDefaultValue: [
.valueDescription, 'countdown_1',
],
), ),
),
);
}
},
); );
}, },
), ),

View File

@ -10,6 +10,7 @@ import 'package:syncrow_web/pages/routines/models/gang_switches/base_switch_func
import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart'; import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart';
@ -85,33 +86,21 @@ class ThreeGangSwitchHelper {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () { onTap: () =>
context RoutineTapFunctionHelper.onTapFunction(
.read<FunctionBloc>() context,
.add(SelectFunction(
functionCode: function.code, functionCode: function.code,
operationName: function.operationName, functionOperationName:
));
if (function.code == 'countdown_1' ||
function.code == 'countdown_2' ||
function.code == 'countdown_3') {
context.read<FunctionBloc>().add(
AddFunction(
functionData: DeviceFunctionData(
entityId: device?.uuid ?? '',
functionCode: function.code,
operationName:
function.operationName, function.operationName,
value: 0, functionValueDescription:
condition: '==', selectedFunctionData.valueDescription,
valueDescription: deviceUuid: device?.uuid,
selectedFunctionData codesToAddIntoFunctionsWithDefaultValue: [
.valueDescription, 'countdown_1',
'countdown_2',
'countdown_3',
],
), ),
),
);
}
},
); );
}, },
), ),

View File

@ -10,6 +10,7 @@ import 'package:syncrow_web/pages/routines/models/gang_switches/base_switch_func
import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart'; import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart';
@ -85,32 +86,20 @@ class TwoGangSwitchHelper {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () { onTap: () =>
context RoutineTapFunctionHelper.onTapFunction(
.read<FunctionBloc>() context,
.add(SelectFunction(
functionCode: function.code, functionCode: function.code,
operationName: function.operationName, functionOperationName:
));
if (function.code == 'countdown_1' ||
function.code == 'countdown_2') {
context.read<FunctionBloc>().add(
AddFunction(
functionData: DeviceFunctionData(
entityId: device?.uuid ?? '',
functionCode: function.code,
operationName:
function.operationName, function.operationName,
value: 0, functionValueDescription:
condition: '==', selectedFunctionData.valueDescription,
valueDescription: deviceUuid: device?.uuid,
selectedFunctionData codesToAddIntoFunctionsWithDefaultValue: [
.valueDescription, 'countdown_1',
'countdown_2',
],
), ),
),
);
}
},
); );
}, },
), ),

View File

@ -8,6 +8,7 @@ import 'package:syncrow_web/pages/routines/models/device_functions.dart';
import 'package:syncrow_web/pages/routines/models/wps/wps_functions.dart'; import 'package:syncrow_web/pages/routines/models/wps/wps_functions.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/wall_sensor/wps_value_selector_widget.dart'; import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/wall_sensor/wps_value_selector_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart';
@ -159,30 +160,19 @@ class _WallPresenceSensorState extends State<WallPresenceSensor> {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () { onTap: () => RoutineTapFunctionHelper.onTapFunction(
context.read<FunctionBloc>().add( context,
SelectFunction(
functionCode: function.code, functionCode: function.code,
operationName: function.operationName, functionOperationName: function.operationName,
functionValueDescription: selectedFunctionData.valueDescription,
deviceUuid: widget.device?.uuid,
codesToAddIntoFunctionsWithDefaultValue: [
'dis_current',
'presence_time',
'illuminance_value',
],
), ),
); );
if (['dis_current', 'presence_time', 'illuminance_value']
.contains(function.code)) {
context.read<FunctionBloc>().add(
AddFunction(
functionData: DeviceFunctionData(
entityId: widget.device?.uuid ?? '',
functionCode: function.code,
operationName: function.operationName,
value: 0,
condition: '==',
valueDescription: selectedFunctionData.valueDescription,
),
),
);
}
},
);
}, },
), ),
); );