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 fbe4ca7..6ebfcae 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart @@ -1,13 +1,17 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; +import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_bloc.dart'; +import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_event.dart'; import 'package:syncrow_app/features/scene/enum/create_scene_enum.dart'; import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart'; import 'package:syncrow_app/features/scene/helper/scene_operations_data_helper.dart'; import 'package:syncrow_app/features/scene/model/create_automation_model.dart'; import 'package:syncrow_app/features/scene/model/create_scene_model.dart'; import 'package:syncrow_app/features/scene/model/scene_static_function.dart'; +import 'package:syncrow_app/navigation/navigation_service.dart'; import 'package:syncrow_app/services/api/scene_api.dart'; part 'create_scene_event.dart'; @@ -48,7 +52,8 @@ class CreateSceneBloc extends Bloc String conditionRule = 'or'; EffectiveTime? effectiveTime; - FutureOr _onAddSceneTask(AddTaskEvent event, Emitter emit) { + FutureOr _onAddSceneTask( + AddTaskEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { final copyList = List.from(automationTempTasksList); @@ -83,7 +88,8 @@ class CreateSceneBloc extends Bloc } } - void addToTempTaskList(TempHoldSceneTasksEvent event, Emitter emit) { + void addToTempTaskList( + TempHoldSceneTasksEvent event, Emitter emit) { emit(CreateSceneLoading()); bool updated = false; for (var element in tempTasksList) { @@ -137,7 +143,8 @@ class CreateSceneBloc extends Bloc )); } - void addToTempAutomationTaskList(TempHoldSceneTasksEvent event, Emitter emit) { + void addToTempAutomationTaskList( + TempHoldSceneTasksEvent event, Emitter emit) { emit(CreateSceneLoading()); bool updated = false; for (var element in automationTempTasksList) { @@ -159,8 +166,10 @@ class CreateSceneBloc extends Bloc ], comparator: automationComparatorValues[element.code], ); - automationTempTasksList[automationTempTasksList.indexOf(element)] = updatedElement; - automationSelectedValues[updatedElement.code] = event.deviceControlModel.value; + automationTempTasksList[automationTempTasksList.indexOf(element)] = + updatedElement; + automationSelectedValues[updatedElement.code] = + event.deviceControlModel.value; updated = true; break; } @@ -180,10 +189,12 @@ class CreateSceneBloc extends Bloc icon: '', ), ], - comparator: automationComparatorValues[event.deviceControlModel.code] ?? '==', + comparator: + automationComparatorValues[event.deviceControlModel.code] ?? '==', ); automationTempTasksList.add(newElement); - automationSelectedValues[newElement.code] = event.deviceControlModel.value; + automationSelectedValues[newElement.code] = + event.deviceControlModel.value; } emit(AddSceneTask( tasksList: tasksList, @@ -192,7 +203,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _selectedValue(SelectedValueEvent event, Emitter emit) { + FutureOr _selectedValue( + SelectedValueEvent event, Emitter emit) { if (event.isAutomation == true) { automationSelectedValues[event.code] = event.value; automationComparatorValues[event.code] = event.comparator ?? '=='; @@ -220,7 +232,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _removeTaskById(RemoveTaskByIdEvent event, Emitter emit) { + FutureOr _removeTaskById( + RemoveTaskByIdEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { for (var element in automationTasksList) { @@ -293,7 +306,8 @@ class CreateSceneBloc extends Bloc : await SceneApi.createScene(event.createSceneModel!); } else if (event.createAutomationModel != null) { response = event.updateScene - ? await SceneApi.updateAutomation(event.createAutomationModel!, event.sceneId) + ? await SceneApi.updateAutomation( + event.createAutomationModel!, event.sceneId) : await SceneApi.createAutomation(event.createAutomationModel!); } @@ -322,7 +336,8 @@ class CreateSceneBloc extends Bloc } } - FutureOr _clearTaskList(ClearTaskListEvent event, Emitter emit) { + FutureOr _clearTaskList( + ClearTaskListEvent event, Emitter emit) { emit(CreateSceneLoading()); automationTasksList.clear(); tasksList.clear(); @@ -343,13 +358,27 @@ class CreateSceneBloc extends Bloc : await SceneApi.getSceneDetails(event.sceneId); if (response.id.isNotEmpty) { if (event.isAutomation) { - automationTasksList = List.from(getTaskListFunctionsFromApi( - actions: [], isAutomation: true, conditions: response.conditions)); + automationTasksList = List.from( + getTaskListFunctionsFromApi( + actions: [], + isAutomation: true, + conditions: response.conditions)); tasksList = List.from( - getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false)); + getTaskListFunctionsFromApi( + actions: response.actions, isAutomation: false)); conditionRule = response.decisionExpr ?? conditionRule; + if (response.effectiveTime != null) { + BlocProvider.of( + NavigationService.navigatorKey.currentState!.context) + .add(SetCustomTime(response.effectiveTime!.start, + response.effectiveTime!.end)); + BlocProvider.of( + NavigationService.navigatorKey.currentState!.context) + .add(ToggleDay(response.effectiveTime!.loops)); + } + emit(AddSceneTask( automationTasksList: automationTasksList, tasksList: tasksList, @@ -357,7 +386,8 @@ class CreateSceneBloc extends Bloc )); } else { tasksList = List.from( - getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false)); + getTaskListFunctionsFromApi( + actions: response.actions, isAutomation: false)); emit(AddSceneTask( tasksList: tasksList, condition: conditionRule, @@ -371,7 +401,8 @@ class CreateSceneBloc extends Bloc } } - FutureOr _clearTempTaskList(ClearTempTaskListEvent event, Emitter emit) { + FutureOr _clearTempTaskList( + ClearTempTaskListEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { automationTempTasksList.clear(); @@ -420,13 +451,17 @@ class CreateSceneBloc extends Bloc } } - FutureOr _deleteScene(DeleteSceneEvent event, Emitter emit) async { + FutureOr _deleteScene( + DeleteSceneEvent event, Emitter emit) async { emit(DeleteSceneLoading()); try { - final response = sceneType.name == CreateSceneEnum.deviceStatusChanges.name - ? await SceneApi.deleteAutomation(automationId: event.sceneId, unitUuid: event.unitUuid) - : await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid); + final response = + sceneType.name == CreateSceneEnum.deviceStatusChanges.name + ? await SceneApi.deleteAutomation( + automationId: event.sceneId, unitUuid: event.unitUuid) + : await SceneApi.deleteScene( + sceneId: event.sceneId, unitUuid: event.unitUuid); if (response == true) { emit(const DeleteSceneSuccess(true)); } else { @@ -437,7 +472,8 @@ class CreateSceneBloc extends Bloc } } - FutureOr _updateTaskValue(UpdateTaskEvent event, Emitter emit) { + FutureOr _updateTaskValue( + UpdateTaskEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { for (var i = 0; i < automationTasksList.length; i++) { @@ -465,7 +501,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _selectConditionRule(SelectConditionEvent event, Emitter emit) { + FutureOr _selectConditionRule( + SelectConditionEvent event, Emitter emit) { emit(CreateSceneInitial()); if (event.condition.contains('any')) { conditionRule = 'or'; @@ -480,7 +517,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _sceneTypeEvent(SceneTypeEvent event, Emitter emit) { + FutureOr _sceneTypeEvent( + SceneTypeEvent event, Emitter emit) { emit(CreateSceneInitial()); if (event.type == CreateSceneEnum.tabToRun) { diff --git a/lib/features/scene/helper/scene_operations_data_helper.dart b/lib/features/scene/helper/scene_operations_data_helper.dart index 0b0b759..4b75b78 100644 --- a/lib/features/scene/helper/scene_operations_data_helper.dart +++ b/lib/features/scene/helper/scene_operations_data_helper.dart @@ -608,7 +608,9 @@ mixin SceneOperationsDataHelper { 'Human Presence Sensor', Assets.assetsIconsSensors, 'Current Distance', - OperationDialogType.integerSteps, + isAutomation + ? OperationDialogType.integerSteps + : OperationDialogType.countdown, _createCurrentDistanceOptions(), isAutomation, comparator, diff --git a/lib/features/scene/view/scene_tasks_view.dart b/lib/features/scene/view/scene_tasks_view.dart index a41a191..4ac5b4f 100644 --- a/lib/features/scene/view/scene_tasks_view.dart +++ b/lib/features/scene/view/scene_tasks_view.dart @@ -38,7 +38,7 @@ class SceneTasksView extends StatelessWidget { padding: EdgeInsets.zero, actions: [ Visibility( - visible: sceneSettings.sceneType != CreateSceneEnum.none.name, + visible: sceneSettings.sceneType.isNotEmpty, child: SizedBox( width: 40, child: GestureDetector( diff --git a/lib/features/scene/widgets/alert_dialogs/alert_dialog_slider_steps.dart b/lib/features/scene/widgets/alert_dialogs/alert_dialog_slider_steps.dart index a38c71b..3e986e7 100644 --- a/lib/features/scene/widgets/alert_dialogs/alert_dialog_slider_steps.dart +++ b/lib/features/scene/widgets/alert_dialogs/alert_dialog_slider_steps.dart @@ -207,7 +207,7 @@ class _AlertDialogSliderStepsState extends State { : null, onChanged: (value) { setState(() { - groupValue = value; + groupValue = normalizeValue(value); }); context.read().add(SelectedValueEvent( value: _deNormalizeValue(groupValue), @@ -228,6 +228,10 @@ class _AlertDialogSliderStepsState extends State { ); } + double normalizeValue(double value) { + return double.parse(value.toStringAsFixed(1)); + } + double _deNormalizeValue(double? value) { if (widget.taskItem.code == "temp_set" || widget.taskItem.code == "temp_current") { diff --git a/lib/features/scene/widgets/effective_period_setting/effective_period_bottom_sheet.dart b/lib/features/scene/widgets/effective_period_setting/effective_period_bottom_sheet.dart index 747e028..66d7164 100644 --- a/lib/features/scene/widgets/effective_period_setting/effective_period_bottom_sheet.dart +++ b/lib/features/scene/widgets/effective_period_setting/effective_period_bottom_sheet.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_bloc.dart'; import 'package:syncrow_app/features/scene/widgets/effective_period_setting/period_options.dart'; import 'package:syncrow_app/features/scene/widgets/effective_period_setting/repeat_days.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; @@ -14,29 +12,26 @@ class EffectPeriodBottomSheetContent extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocProvider( - create: (context) => EffectPeriodBloc(), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - BodyMedium( - text: 'Effective Period', - fontColor: ColorsManager.primaryColorWithOpacity, - fontWeight: FontsManager.bold, - ), - const Divider( - color: ColorsManager.backgroundColor, - ), - const PeriodOptions( - showCustomTimePicker: EffectPeriodHelper.showCustomTimePicker, - ), - const SizedBox(height: 16), - const RepeatDays(), - const SizedBox(height: 24), - ], - ), + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + BodyMedium( + text: 'Effective Period', + fontColor: ColorsManager.primaryColorWithOpacity, + fontWeight: FontsManager.bold, + ), + const Divider( + color: ColorsManager.backgroundColor, + ), + const PeriodOptions( + showCustomTimePicker: EffectPeriodHelper.showCustomTimePicker, + ), + const SizedBox(height: 16), + const RepeatDays(), + const SizedBox(height: 24), + ], ), ); } 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 41595f8..8cbb450 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 @@ -52,8 +52,13 @@ class ThenAddedTasksContainer extends StatelessWidget operationValue = '0°C'; } } else { - final functionValue = + var functionValue = taskItem.functionValue ?? taskItem.operationalValues.first.value; + + if (functionValue is double) { + functionValue = double.parse(functionValue.toStringAsFixed(1)); + } + operationValue = functionValue.toString(); } return DefaultContainer( diff --git a/lib/my_app.dart b/lib/my_app.dart index 0a253bf..f6d7a5b 100644 --- a/lib/my_app.dart +++ b/lib/my_app.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart'; import 'package:syncrow_app/features/menu/bloc/profile_bloc/profile_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; +import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/smart_scene/smart_scene_select_dart_bloc.dart'; import 'package:syncrow_app/navigation/navigation_service.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; @@ -29,8 +30,10 @@ class MyApp extends StatelessWidget { BlocProvider(create: (context) => CreateSceneBloc()), BlocProvider(create: (context) => SceneBloc()), BlocProvider(create: (context) => ProfileBloc()), - BlocProvider(create: (context) => SmartSceneSelectBloc()), - + BlocProvider(create: (context) => SmartSceneSelectBloc()), + BlocProvider( + create: (context) => EffectPeriodBloc(), + ), ], child: MaterialApp( navigatorKey: NavigationService.navigatorKey,