import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart'; import 'package:syncrow_app/features/scene/helper/scene_logic_helper.dart'; import 'package:syncrow_app/features/scene/helper/scene_operations_data_helper.dart'; import 'package:syncrow_app/features/scene/model/scene_static_function.dart'; import 'package:syncrow_app/features/scene/widgets/alert_dialogs/alert_dialog_countdown.dart'; import 'package:syncrow_app/features/scene/widgets/alert_dialogs/alert_dialog_functions_body.dart'; import 'package:syncrow_app/features/scene/widgets/alert_dialogs/alert_dialog_temperature_body.dart'; import 'package:syncrow_app/features/scene/widgets/scene_list_tile.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; import 'package:syncrow_app/features/shared_widgets/light_divider.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; import 'package:syncrow_app/navigation/routing_constants.dart'; import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; class DeviceFunctionsView extends StatelessWidget with SceneOperationsDataHelper, SceneLogicHelper { const DeviceFunctionsView({super.key}); @override Widget build(BuildContext context) { /// this whole widget needs a refactor later /// /// static functions based on type final device = (ModalRoute.of(context)?.settings.arguments as Map)['device'] as DeviceModel; final isAutomation = (ModalRoute.of(context)?.settings.arguments as Map)['isAutomationDeviceStatus'] as bool; /// static custom functions based on type /// used for now until later backend fixes List functions = []; if (device.functions.isNotEmpty) { functions = getFunctionsWithIcons( type: device.productType, functions: device.functions, deviceId: device.uuid ?? '', deviceName: device.name ?? '', isAutomation: isAutomation, ); } return DefaultScaffold( title: getTitle(type: device.productType), actions: [ TextButton( onPressed: () { context.read().add(AddTaskEvent()); Navigator.popUntil(context, (route) { return route.settings.name == Routes.sceneTasksRoute; }); }, child: BodyMedium( text: 'Save', fontWeight: FontWeight.normal, fontColor: ColorsManager.secondaryColor.withOpacity(0.6), ), ), ], leading: TextButton( onPressed: () { final selectedValue = context.read().selectedValues; for (var element in device.functions) { if (selectedValue.containsKey(element.code)) { context .read() .add(RemoveTempTaskByIdEvent(code: element.code!)); context .read() .add(RemoveFromSelectedValueById(code: element.code!)); } } Navigator.pop(context); }, child: BodyMedium( text: 'Cancel', fontWeight: FontWeight.normal, fontColor: ColorsManager.textPrimaryColor.withOpacity(0.6), ), ), leadingWidth: 80, padding: EdgeInsets.zero, child: ListView.builder( shrinkWrap: true, itemCount: functions.length, padding: const EdgeInsets.only(top: 24.0), itemBuilder: (context, index) { return DefaultContainer( padding: index == 0 ? const EdgeInsets.only(top: 8) : index == functions.length - 1 ? const EdgeInsets.only(bottom: 8) : EdgeInsets.zero, margin: EdgeInsets.zero, borderRadius: index == 0 ? const BorderRadius.only( topLeft: Radius.circular(20), topRight: Radius.circular(20)) : index == functions.length - 1 ? const BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20)) : BorderRadius.zero, child: Column( mainAxisSize: MainAxisSize.min, children: [ BlocBuilder( builder: (context, state) { return SceneListTile( iconsSize: 22, minLeadingWidth: 20, assetPath: functions[index].icon, titleString: functions[index].operationName, trailingWidget: const Row( mainAxisSize: MainAxisSize.min, children: [ /// selected value or the default value // BodyMedium(text: ), Icon( Icons.arrow_forward_ios_rounded, color: ColorsManager.greyColor, size: 16, ), ], ), onPressed: () { final functionValues = context .read() .selectedValues[functions[index].code]; context.customAlertDialog( alertBody: functions[index].operationDialogType == OperationDialogType.temperature ? AlertDialogTemperatureBody( taskItem: functions[index], functionValue: functionValues, ) : ((functions[index].operationDialogType == OperationDialogType.countdown) || (functions[index].operationDialogType == OperationDialogType.countdown)) ? AlertDialogCountdown( durationValue: functions[index] .operationalValues .first .value, function: functions[index], functionValue: functionValues, ) : AlertDialogFunctionsOperationsBody( taskItem: functions[index], functionValue: functionValues, ), title: functions[index].operationName, onConfirm: () { final selectedValue = context .read() .selectedValues[functions[index].code]; if (selectedValue == null) { return; } 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 ?? '', uniqueId: functions[index].uniqueCustomId, )); Navigator.pop(context); }, onDismiss: () { final tempTaskList = context.read().tempTasksList; for (var element in tempTaskList) { if (element.code == functions[index].code) { context.read().add( RemoveTempTaskByIdEvent( code: functions[index].code)); context.read().add( RemoveFromSelectedValueById( code: functions[index].code)); } } Navigator.pop(context); }, ); }, ); }, ), index != functions.length - 1 ? SizedBox( width: context.width * 0.8, child: const LightDivider()) : const SizedBox(), ], ), ); }, )); } }