import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:syncrow_web/pages/routiens/models/device_functions.dart'; part 'functions_bloc_event.dart'; part 'functions_bloc_state.dart'; class FunctionBloc extends Bloc { FunctionBloc() : super(const FunctionBlocState()) { on(_onInitializeFunctions); on(_onAddFunction); on(_onUpdateFunctions); on(_onUpdateFunctionValue); on(_onUpdateFunctionCondition); on(_onRemoveFunction); } void _onAddFunction(AddFunction event, Emitter emit) { debugPrint('Adding function: ${event.functionData.function}'); final functions = List.from(state.functions); // Find existing function data final existingIndex = functions.indexWhere( (f) => f.function == event.functionData.function, ); // If function exists, preserve its value and condition if (existingIndex != -1) { final existingData = functions[existingIndex]; functions[existingIndex] = DeviceFunctionData( entityId: event.functionData.entityId, function: event.functionData.function, operationName: event.functionData.operationName, value: existingData.value, // Preserve the existing value condition: existingData.condition, // Preserve the existing condition ); } else { functions.add(event.functionData); } debugPrint('Functions after add: $functions'); emit(state.copyWith( functions: functions, selectedFunction: event.functionData.function, )); } void _onUpdateFunctions( UpdateFunction event, Emitter emit) { final functions = state.functions.map((data) { return data.function == event.functionData.function ? event.functionData : data; }).toList(); emit(state.copyWith(functions: functions)); } void _onUpdateFunctionValue( UpdateFunctionValue event, Emitter emit, ) { debugPrint('Updating function value: ${event.function} -> ${event.value}'); // Create a new list to ensure state immutability final functions = List.from(state.functions); // Find the index of the function to update final functionIndex = functions.indexWhere( (data) => data.function == event.function, ); if (functionIndex != -1) { // Update the existing function data while preserving other fields final existingData = functions[functionIndex]; functions[functionIndex] = DeviceFunctionData( entityId: existingData.entityId, function: existingData.function, operationName: existingData.operationName, value: event.value, condition: existingData.condition, ); } else { // If function doesn't exist, add it functions.add(DeviceFunctionData( entityId: '', function: event.function, operationName: '', value: event.value, )); } debugPrint('Functions after update: $functions'); emit(state.copyWith(functions: functions)); } void _onUpdateFunctionCondition( UpdateFunctionCondition event, Emitter emit, ) { final functions = state.functions.map((data) { if (data.function == event.function) { return DeviceFunctionData( entityId: data.entityId, function: data.function, operationName: data.operationName, value: data.value, condition: event.condition, ); } return data; }).toList(); emit(state.copyWith(functions: functions)); } void _onRemoveFunction( RemoveFunction event, Emitter emit) { final functions = state.functions .where((data) => data.function != event.functionCode) .toList(); emit(state.copyWith( functions: functions, selectedFunction: functions.isEmpty ? null : state.selectedFunction, )); } void _onInitializeFunctions( InitializeFunctions event, Emitter emit, ) { emit(state.copyWith(functions: event.functions)); } DeviceFunctionData? getFunction(String functionCode) { return state.functions.firstWhere( (data) => data.function == functionCode, orElse: () => DeviceFunctionData( entityId: '', function: functionCode, operationName: '', value: null, ), ); } }