diff --git a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart index ad6ab58..f314088 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart @@ -24,18 +24,19 @@ class CreateSceneBloc extends Bloc on(_removeTempTaskById); on(_removeFromSelectedValueById); on(_deleteScene); + on(_updateTaskValue); } List tasksList = []; List tempTasksList = []; final Map selectedValues = {}; - FutureOr _onAddSceneTask(AddTaskEvent event, Emitter emit) { + FutureOr _onAddSceneTask( + AddTaskEvent event, Emitter emit) { final copyList = List.from(tempTasksList); tasksList.addAll(copyList); tempTasksList.clear(); selectedValues.clear(); - emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(AddSceneTask(tasksList: tasksList)); } @@ -89,13 +90,15 @@ class CreateSceneBloc extends Bloc emit(AddSceneTask(tasksList: tasksList)); } - FutureOr _selectedValue(SelectedValueEvent event, Emitter emit) { + FutureOr _selectedValue( + SelectedValueEvent event, Emitter emit) { selectedValues[event.code] = event.value; emit(SelectedTaskValueState(value: event.value)); emit(AddSceneTask(tasksList: tasksList)); } - FutureOr _removeTaskById(RemoveTaskByIdEvent event, Emitter emit) { + FutureOr _removeTaskById( + RemoveTaskByIdEvent event, Emitter emit) { emit(CreateSceneLoading()); for (var element in tasksList) { @@ -114,7 +117,6 @@ class CreateSceneBloc extends Bloc if (element.code == event.code) { tempTasksList.remove(element); - emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(AddSceneTask(tasksList: tasksList)); break; @@ -132,6 +134,7 @@ class CreateSceneBloc extends Bloc if (response['success'] == true) { tasksList.clear(); tempTasksList.clear(); + selectedValues.clear(); emit(const CreateSceneWithTasks(success: true)); } else { emit(const CreateSceneError(message: 'Something went wrong')); @@ -142,7 +145,8 @@ class CreateSceneBloc extends Bloc } } - FutureOr _clearTaskList(ClearTaskListEvent event, Emitter emit) { + FutureOr _clearTaskList( + ClearTaskListEvent event, Emitter emit) { tasksList.clear(); emit(AddSceneTask(tasksList: tasksList)); } @@ -154,8 +158,8 @@ class CreateSceneBloc extends Bloc try { final response = await SceneApi.getSceneDetails(event.sceneId); if (response.id.isNotEmpty) { - tasksList = - List.from(getTaskListFunctionsFromApi(actions: response.actions)); + tasksList = List.from( + getTaskListFunctionsFromApi(actions: response.actions)); emit(AddSceneTask( tasksList: tasksList, )); @@ -167,10 +171,10 @@ class CreateSceneBloc extends Bloc } } - FutureOr _clearTempTaskList(ClearTempTaskListEvent event, Emitter emit) { + FutureOr _clearTempTaskList( + ClearTempTaskListEvent event, Emitter emit) { tempTasksList.clear(); selectedValues.clear(); - emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(AddSceneTask(tasksList: tempTasksList)); } @@ -183,11 +187,13 @@ class CreateSceneBloc extends Bloc } } - FutureOr _deleteScene(DeleteSceneEvent event, Emitter emit) async { + FutureOr _deleteScene( + DeleteSceneEvent event, Emitter emit) async { emit(DeleteSceneLoading()); try { - final response = await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid); + final response = await SceneApi.deleteScene( + sceneId: event.sceneId, unitUuid: event.unitUuid); if (response == true) { emit(const DeleteSceneSuccess(true)); } else { @@ -197,4 +203,17 @@ class CreateSceneBloc extends Bloc emit(const DeleteSceneError(message: 'Something went wrong')); } } + + FutureOr _updateTaskValue( + UpdateTaskEvent event, Emitter emit) { + for (var i = 0; i < tasksList.length; i++) { + if (tasksList[i].uniqueCustomId == event.taskId) { + tasksList[i] = tasksList[i].copyWith( + functionValue: event.newValue, + ); + break; + } + } + emit(AddSceneTask(tasksList: tasksList)); + } } diff --git a/lib/features/scene/bloc/create_scene/create_scene_event.dart b/lib/features/scene/bloc/create_scene/create_scene_event.dart index 79f72e1..60fd098 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_event.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_event.dart @@ -42,6 +42,14 @@ class TempHoldSceneTasksEvent extends CreateSceneEvent { ]; } +class UpdateTaskEvent extends CreateSceneEvent { + final String taskId; + final dynamic newValue; + const UpdateTaskEvent({required this.taskId, required this.newValue}); + @override + List get props => [taskId, newValue]; +} + class SelectedValueEvent extends CreateSceneEvent { final dynamic value; final String code; diff --git a/lib/features/scene/helper/scene_logic_helper.dart b/lib/features/scene/helper/scene_logic_helper.dart index 9339d71..616e3fd 100644 --- a/lib/features/scene/helper/scene_logic_helper.dart +++ b/lib/features/scene/helper/scene_logic_helper.dart @@ -80,59 +80,23 @@ mixin SceneLogicHelper { Widget getTheCorrectDialogBody( SceneStaticFunction taskItem, - List? listOfSceneStaticFunction, - int? index, - // List functionOperation ) { - bool checkTaskItemAndOperation() { - return taskItem.code == 'temp_set' || taskItem.code == 'countdown'; - } - - bool checkListAndIndex() { - if (listOfSceneStaticFunction == null || index == null) { - return false; - } - return listOfSceneStaticFunction[index].code == 'temp_set' || - listOfSceneStaticFunction[index].code.contains('countdown') || - listOfSceneStaticFunction[index].code.contains('presence_time'); - } - - if (checkTaskItemAndOperation()) { - if (taskItem.code == 'temp_set') { - return AlertDialogTemperatureBody( - index: index!, - functions: listOfSceneStaticFunction ?? [], - functionValue: taskItem.functionValue, - ); - } else if (taskItem.code == 'countdown') { - return AlertDialogCountdown( - durationValue: taskItem.functionValue, - functionValue: taskItem.functionValue, - function: taskItem, - ); - } - } - - if (checkListAndIndex()) { - if (listOfSceneStaticFunction![index!].code == 'temp_set') { - return AlertDialogTemperatureBody( - index: index, - functions: listOfSceneStaticFunction, - functionValue: taskItem.functionValue, - ); - } else { - return AlertDialogCountdown( - durationValue: listOfSceneStaticFunction[index].functionValue ?? - taskItem.functionValue, - functionValue: taskItem.functionValue, - function: listOfSceneStaticFunction[index], - ); - } + if (taskItem.code.contains('temp_set')) { + return AlertDialogTemperatureBody( + taskItem: taskItem, + functionValue: taskItem.functionValue, + ); + } else if (taskItem.code.contains('countdown') || + taskItem.deviceId.contains('delay')) { + return AlertDialogCountdown( + durationValue: taskItem.functionValue, + functionValue: taskItem.functionValue, + function: taskItem, + ); } return AlertDialogFunctionsOperationsBody( - index: index ?? 0, - functions: listOfSceneStaticFunction ?? [], + taskItem: taskItem, functionValue: taskItem.functionValue, ); } diff --git a/lib/features/scene/helper/scene_operations_data_helper.dart b/lib/features/scene/helper/scene_operations_data_helper.dart index 701419a..5c8cda0 100644 --- a/lib/features/scene/helper/scene_operations_data_helper.dart +++ b/lib/features/scene/helper/scene_operations_data_helper.dart @@ -1171,9 +1171,7 @@ mixin SceneOperationsDataHelper { icon: Assets.assetsTempreture, operationName: 'Set Temperature', code: 'temp_set', - functionValue: executorProperty.functionValue != null - ? ((executorProperty.functionValue! / 10) as double).toInt() - : null, + functionValue: executorProperty.functionValue, operationalValues: [ SceneOperationalValue( icon: Assets.assetsCelsiusDegrees, @@ -1284,6 +1282,27 @@ mixin SceneOperationsDataHelper { required SceneStaticFunction taskItem, }) { List functions = []; + if (deviceId.contains('delay')) { + functions.add( + SceneStaticFunction( + deviceId: taskItem.deviceId, + deviceName: 'delay', + deviceIcon: Assets.delay, + icon: Assets.delay, + operationName: 'delay', + functionValue: taskItem.functionValue, + code: '', + operationalValues: [ + SceneOperationalValue( + icon: '', + description: "", + value: 0, + ), + ], + ), + ); + return functions; + } switch (taskItem.code) { case 'sensitivity': functions.add( @@ -1650,11 +1669,6 @@ mixin SceneOperationsDataHelper { icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), - SceneOperationalValue( - icon: Assets.assetsSceneRefresh, - description: "Reverse Switch", - value: true, - ), ], )); break; @@ -1674,11 +1688,6 @@ mixin SceneOperationsDataHelper { icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), - SceneOperationalValue( - icon: Assets.assetsSceneRefresh, - description: "Reverse Switch", - value: true, - ), ], )); break; @@ -1698,11 +1707,6 @@ mixin SceneOperationsDataHelper { icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), - SceneOperationalValue( - icon: Assets.assetsSceneRefresh, - description: "Reverse Switch", - value: true, - ), ], )); break; diff --git a/lib/features/scene/view/device_functions_view.dart b/lib/features/scene/view/device_functions_view.dart index 070b8a2..cd2b781 100644 --- a/lib/features/scene/view/device_functions_view.dart +++ b/lib/features/scene/view/device_functions_view.dart @@ -137,8 +137,7 @@ class DeviceFunctionsView extends StatelessWidget context.customAlertDialog( alertBody: functions[index].code == 'temp_set' ? AlertDialogTemperatureBody( - index: index, - functions: functions, + taskItem: functions[index], functionValue: functionValues, ) : (functions[index] @@ -156,8 +155,7 @@ class DeviceFunctionsView extends StatelessWidget functionValue: functionValues, ) : AlertDialogFunctionsOperationsBody( - index: index, - functions: functions, + taskItem: functions[index], functionValue: functionValues, ), title: functions[index].operationName, @@ -188,11 +186,6 @@ class DeviceFunctionsView extends StatelessWidget final tempTaskList = context .read() .tempTasksList; - // if (tempTaskList.isEmpty) { - // context - // .read() - // .add(const ClearTempTaskListEvent()); - // } else { for (var element in tempTaskList) { if (element.code == functions[index].code) { context.read().add( @@ -203,7 +196,6 @@ class DeviceFunctionsView extends StatelessWidget code: functions[index].code)); } } - //} Navigator.pop(context); }, ); diff --git a/lib/features/scene/widgets/alert_dialogs/alert_dialog_functions_body.dart b/lib/features/scene/widgets/alert_dialogs/alert_dialog_functions_body.dart index e0ff6a4..bf0246c 100644 --- a/lib/features/scene/widgets/alert_dialogs/alert_dialog_functions_body.dart +++ b/lib/features/scene/widgets/alert_dialogs/alert_dialog_functions_body.dart @@ -9,14 +9,12 @@ import 'package:syncrow_app/features/scene/widgets/scene_list_tile.dart'; class AlertDialogFunctionsOperationsBody extends StatefulWidget { AlertDialogFunctionsOperationsBody({ super.key, - required this.functions, - required this.index, this.functionValue, + required this.taskItem, }); - final List functions; - final int index; dynamic functionValue; + final SceneStaticFunction taskItem; @override State createState() => @@ -30,15 +28,14 @@ class _AlertDialogFunctionsOperationsBodyState super.didChangeDependencies(); final tempTaskList = context.read().tempTasksList; - - if (tempTaskList.isNotEmpty) { for (var element in tempTaskList) { - if (element.code == widget.functions[widget.index].code) { + if (element.code == widget.taskItem.code) { groupValue = element.functionValue; } else { - context.read().add(RemoveFromSelectedValueById( - code: widget.functions[widget.index].code)); + context + .read() + .add(RemoveFromSelectedValueById(code: widget.taskItem.code)); } } } @@ -58,7 +55,7 @@ class _AlertDialogFunctionsOperationsBodyState child: Column( mainAxisSize: MainAxisSize.min, children: [ - ...widget.functions[widget.index].operationalValues.map( + ...widget.taskItem.operationalValues.map( (operation) => BlocBuilder( builder: (context, state) { return SceneListTile( @@ -79,8 +76,7 @@ class _AlertDialogFunctionsOperationsBodyState groupValue = value; }); context.read().add(SelectedValueEvent( - value: value!, - code: widget.functions[widget.index].code)); + value: value!, code: widget.taskItem.code)); }, ), onPressed: () { @@ -88,8 +84,7 @@ class _AlertDialogFunctionsOperationsBodyState groupValue = operation.value; }); context.read().add(SelectedValueEvent( - value: groupValue, - code: widget.functions[widget.index].code)); + value: groupValue, code: widget.taskItem.code)); }, ); }, diff --git a/lib/features/scene/widgets/alert_dialogs/alert_dialog_temperature_body.dart b/lib/features/scene/widgets/alert_dialogs/alert_dialog_temperature_body.dart index c6d569b..fb662ad 100644 --- a/lib/features/scene/widgets/alert_dialogs/alert_dialog_temperature_body.dart +++ b/lib/features/scene/widgets/alert_dialogs/alert_dialog_temperature_body.dart @@ -14,13 +14,15 @@ import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; class AlertDialogTemperatureBody extends StatefulWidget { AlertDialogTemperatureBody({ super.key, - required this.index, - required this.functions, + //required this.index, + // required this.functions, this.functionValue, + required this.taskItem, }); - final List functions; - final int index; + //final List functions; + // final int index; + final SceneStaticFunction taskItem; dynamic functionValue; @override @@ -36,11 +38,12 @@ class _AlertDialogTemperatureBodyState final tempTaskList = context.read().tempTasksList; for (var element in tempTaskList) { - if (element.code == widget.functions[widget.index].code) { + if (element.code == widget.taskItem.code) { temperature = element.functionValue; } else { - context.read().add(RemoveFromSelectedValueById( - code: widget.functions[widget.index].code)); + context + .read() + .add(RemoveFromSelectedValueById(code: widget.taskItem.code)); } } if (widget.functionValue != null) { @@ -63,8 +66,9 @@ class _AlertDialogTemperatureBodyState } }); context.read().add(SelectedValueEvent( - value: temperature * 10, - code: widget.functions[widget.index].code)); + value: temperature * 10, + code: widget.taskItem.code, + )); }, icon: const Icon( Icons.remove, @@ -94,7 +98,7 @@ class _AlertDialogTemperatureBodyState ], ), subtitle: BodyLarge( - text: widget.functions[widget.index].operationalValues[0].description + text: widget.taskItem.operationalValues[0].description .toString(), textAlign: TextAlign.center, ), @@ -107,7 +111,7 @@ class _AlertDialogTemperatureBodyState }); context.read().add(SelectedValueEvent( value: temperature * 10, - code: widget.functions[widget.index].code)); + code: widget.taskItem.code)); }, icon: const Icon( Icons.add, diff --git a/lib/features/scene/widgets/bottom_sheet_widget.dart b/lib/features/scene/widgets/bottom_sheet_widget.dart index 9ef5408..1bbd631 100644 --- a/lib/features/scene/widgets/bottom_sheet_widget.dart +++ b/lib/features/scene/widgets/bottom_sheet_widget.dart @@ -130,9 +130,7 @@ class CustomBottomSheetWidget extends StatelessWidget { }, onDismiss: () { final tempTaskList = context.read().tempTasksList; - // if (tempTaskList.isNotEmpty) { - // context.read().add(const ClearTempTaskListEvent()); - // } else { + for (var element in tempTaskList) { if (element.code == functions[0].code) { context diff --git a/lib/features/scene/widgets/if_then_containers/then_added_tasks.dart b/lib/features/scene/widgets/if_then_containers/then_added_tasks.dart index c1870b1..a50b2a6 100644 --- a/lib/features/scene/widgets/if_then_containers/then_added_tasks.dart +++ b/lib/features/scene/widgets/if_then_containers/then_added_tasks.dart @@ -22,16 +22,15 @@ class ThenAddedTasksContainer extends StatelessWidget required this.taskItem, this.sceneId, this.index, - this.listOfSceneStaticFunction, }); final SceneStaticFunction taskItem; String? sceneId; - List? listOfSceneStaticFunction; int? index; @override Widget build(BuildContext context) { + final createSceneBloc = context.read(); String operationValue = ''; if (taskItem.code.contains('countdown') || taskItem.deviceId.contains('delay')) { @@ -41,38 +40,46 @@ class ThenAddedTasksContainer extends StatelessWidget Duration(seconds: int.tryParse(functionValue.toString()) ?? 0); operationValue = "${duration.inHours}h ${duration.inMinutes.remainder(60)}m "; + } else if (taskItem.code.contains('temp_set')) { + if (taskItem.functionValue != null || taskItem.functionValue != 0) { + operationValue = + '${((taskItem.functionValue / 10) as double).round().toString()}°C'; + } else { + operationValue = '0°C'; + } } else { final functionValue = taskItem.functionValue ?? taskItem.operationalValues.first.value; operationValue = functionValue.toString(); } return DefaultContainer( - onTap: () async { - // List functionOperation = []; - // if (sceneId == null) { - // functionOperation = getOperationsForOneFunction( - // taskItem: taskItem, deviceId: taskItem.deviceId); - // } + onTap: () { + List functionOperation = []; + + /// get the task functions + functionOperation = List.from(getOperationsForOneFunction( + taskItem: taskItem, deviceId: taskItem.deviceId)); + + /// show alert dialog based on type context.customAlertDialog( - alertBody: getTheCorrectDialogBody( - taskItem, - listOfSceneStaticFunction, - index, - ), - title: listOfSceneStaticFunction![index!].operationName, + alertBody: getTheCorrectDialogBody(functionOperation.first), + title: functionOperation.first.operationName, onConfirm: () { - // final selectedValue = context.read().selectedValue; - // context.read().add(TempHoldSceneTasksEvent( - // deviceControlModel: DeviceControlModel( - // deviceId: device.uuid, - // code: functions[index].code, - // value: selectedValue, - // ), - // deviceId: device.uuid ?? '', - // operation: functions[index].operationName, - // icon: device.icon ?? '', - // deviceName: device.name ?? '', - // )); + final savedCode = functionOperation.first.deviceId.contains('delay') + ? 'delay' + : functionOperation.first.code; + final selectedValue = createSceneBloc.selectedValues[savedCode]; + + try { + createSceneBloc.add( + UpdateTaskEvent( + newValue: selectedValue, + taskId: taskItem.uniqueCustomId, + ), + ); + } catch (e) { + debugPrint('Error adding UpdateTaskEvent: $e'); + } Navigator.pop(context); }, ); @@ -115,8 +122,11 @@ class ThenAddedTasksContainer extends StatelessWidget }, child: SceneListTile( padding: EdgeInsets.zero, - assetPath: taskItem.icon, - iconsSize: 32, + leadingWidget: SvgPicture.asset( + taskItem.deviceIcon ?? taskItem.icon, + fit: BoxFit.fill, + ), + minLeadingWidth: 32, titleWidget: BodyMedium( text: taskItem.deviceName, style: context.bodyMedium.copyWith( diff --git a/lib/features/scene/widgets/scene_devices/scene_devices_body.dart b/lib/features/scene/widgets/scene_devices/scene_devices_body.dart index 0eaa7e2..6ee9ab4 100644 --- a/lib/features/scene/widgets/scene_devices/scene_devices_body.dart +++ b/lib/features/scene/widgets/scene_devices/scene_devices_body.dart @@ -41,7 +41,8 @@ class SceneDevicesBody extends StatelessWidget { text: e.name ?? '', textAlign: TextAlign.start, style: context.bodyLarge.copyWith( - color: (tabState is TabSelected) && tabState.roomId == e.id + color: (tabState is TabSelected) && + tabState.roomId == e.id ? ColorsManager.textPrimaryColor : ColorsManager.textPrimaryColor.withOpacity(0.2), ),