import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; import 'package:syncrow_app/features/scene/helper/scene_operations_data_helper.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/services/api/scene_api.dart'; part 'create_scene_event.dart'; part 'create_scene_state.dart'; class CreateSceneBloc extends Bloc with SceneOperationsDataHelper { CreateSceneBloc() : super(CreateSceneInitial()) { on(_createSceneWithTasks); on(_onAddSceneTask); on(_selectedValue); on(_removeTaskById); on(_clearTaskList); on(_clearTempTaskList); on(_fetchSceneTasks); on(_onTempHoldSceneTask); on(_removeTempTaskById); on(_removeFromSelectedValueById); on(_deleteScene); } List tasksList = []; List tempTasksList = []; final Map selectedValues = {}; 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)); } FutureOr _onTempHoldSceneTask( TempHoldSceneTasksEvent event, Emitter emit) { bool updated = false; for (var element in tempTasksList) { if (element.code == event.deviceControlModel.code) { // Update the existing function with new values var updatedElement = element.copyWith( operationName: event.operation, deviceName: event.deviceName, icon: event.icon, code: event.deviceControlModel.code ?? '', deviceId: event.deviceId, functionValue: event.deviceControlModel.value, operationalValues: [ SceneOperationalValue( value: event.deviceControlModel.value, icon: '', ), ], ); tempTasksList[tempTasksList.indexOf(element)] = updatedElement; selectedValues[updatedElement.code] = event.deviceControlModel.value; updated = true; break; } } if (!updated) { // Add new function if not found var newElement = SceneStaticFunction( operationName: event.operation, deviceName: event.deviceName, icon: event.icon, code: event.deviceControlModel.code ?? '', deviceId: event.deviceId, functionValue: event.deviceControlModel.value, operationalValues: [ SceneOperationalValue( value: event.deviceControlModel.value, icon: '', ), ], ); tempTasksList.add(newElement); selectedValues[newElement.code] = event.deviceControlModel.value; } emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(AddSceneTask(tasksList: tasksList)); } 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) { emit(CreateSceneLoading()); for (var element in tasksList) { if (element.uniqueCustomId == event.taskId) { tasksList.remove(element); emit(AddSceneTask(tasksList: tasksList)); break; } } } FutureOr _removeTempTaskById( RemoveTempTaskByIdEvent event, Emitter emit) { for (var element in tempTasksList) { if (element.code == event.code) { tempTasksList.remove(element); emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(AddSceneTask(tasksList: tasksList)); break; } } } FutureOr _createSceneWithTasks( CreateSceneWithTasksEvent event, Emitter emit) async { emit(CreateSceneLoading()); try { final response = event.updateScene ? await SceneApi.updateScene(event.createSceneModel, event.sceneId) : await SceneApi.createScene(event.createSceneModel); if (response['success'] == true) { tasksList.clear(); tempTasksList.clear(); emit(const CreateSceneWithTasks(success: true)); } else { emit(const CreateSceneError(message: 'Something went wrong')); } } catch (e) { emit(const CreateSceneError(message: 'Something went wrong')); emit(AddSceneTask(tasksList: tasksList)); } } FutureOr _clearTaskList(ClearTaskListEvent event, Emitter emit) { tasksList.clear(); emit(AddSceneTask(tasksList: tasksList)); } FutureOr _fetchSceneTasks( FetchSceneTasksEvent event, Emitter emit) async { emit(CreateSceneLoading()); try { final response = await SceneApi.getSceneDetails(event.sceneId); if (response.id.isNotEmpty) { tasksList = List.from(getTaskListFunctionsFromApi(actions: response.actions)); emit(AddSceneTask( tasksList: tasksList, )); } else { emit(const CreateSceneError(message: 'Something went wrong')); } } catch (e) { emit(const CreateSceneError(message: 'Something went wrong')); } } FutureOr _clearTempTaskList(ClearTempTaskListEvent event, Emitter emit) { tempTasksList.clear(); selectedValues.clear(); emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(AddSceneTask(tasksList: tempTasksList)); } FutureOr _removeFromSelectedValueById( RemoveFromSelectedValueById event, Emitter emit) { if (selectedValues.containsKey(event.code)) { selectedValues.remove(event.code); emit(const SelectedTaskValueState(value: null)); emit(AddSceneTask(tasksList: tasksList)); } } FutureOr _deleteScene(DeleteSceneEvent event, Emitter emit) async { emit(DeleteSceneLoading()); try { final response = await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid); if (response == true) { emit(const DeleteSceneSuccess(true)); } else { emit(const DeleteSceneError(message: 'Something went wrong')); } } catch (e) { emit(const DeleteSceneError(message: 'Something went wrong')); } } }