import 'package:flutter/material.dart'; import 'package:flutter/widgets.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/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/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(isAutomation: isAutomation)); 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: () { if (isAutomation) { final automationSelectedValue = context.read().automationSelectedValues; for (var element in device.functions) { if (automationSelectedValue.containsKey(element.code)) { context.read().add(RemoveTempTaskByIdEvent( code: element.code!, isAutomation: true)); context.read().add( RemoveFromSelectedValueById( code: element.code!, isAutomation: true)); } } } else { 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: () { if (isAutomation) { _showAutomationDialog( context, functions[index], device, ); } else { _showTabToRunDialog( context, functions[index], device, ); } }, ); }, ), index != functions.length - 1 ? SizedBox( width: context.width * 0.8, child: const LightDivider()) : const SizedBox(), ], ), ); }, )); } void _showTabToRunDialog( BuildContext context, SceneStaticFunction function, DeviceModel device, ) { final functionValues = context.read().selectedValues[function.code]; context.customAlertDialog( alertBody: getTheCorrectDialogBody( function, functionValues, ), title: function.operationName, onConfirm: () { final selectedValue = context.read().selectedValues[function.code]; if (selectedValue == null) { return; } context.read().add(TempHoldSceneTasksEvent( deviceControlModel: DeviceControlModel( deviceId: device.uuid, code: function.code, value: selectedValue, ), deviceId: device.uuid ?? '', operation: function.operationName, icon: device.icon ?? '', deviceName: device.name ?? '', uniqueId: function.uniqueCustomId, operationType: function.operationDialogType, )); Navigator.pop(context); }, onDismiss: () { final tempTaskList = context.read().tempTasksList; for (var element in tempTaskList) { if (element.code == function.code) { context .read() .add(RemoveTempTaskByIdEvent(code: function.code)); context .read() .add(RemoveFromSelectedValueById(code: function.code)); } } Navigator.pop(context); }, ); } void _showAutomationDialog( BuildContext context, SceneStaticFunction function, DeviceModel device) { final automationFunctionValues = context.read().automationSelectedValues[function.code]; context.customAlertDialog( alertBody: getTheCorrectDialogBody( function, automationFunctionValues, ), title: function.operationName, onConfirm: () { final automationFunctionValues = context .read() .automationSelectedValues[function.code]; if (automationFunctionValues == null) { return; } context.read().add(TempHoldSceneTasksEvent( deviceControlModel: DeviceControlModel( deviceId: device.uuid, code: function.code, value: automationFunctionValues, ), deviceId: device.uuid ?? '', operation: function.operationName, icon: device.icon ?? '', deviceName: device.name ?? '', uniqueId: function.uniqueCustomId, operationType: function.operationDialogType, isAutomation: true, )); Navigator.pop(context); }, onDismiss: () { final automationTempTaskList = context.read().automationTempTasksList; for (var element in automationTempTaskList) { if (element.code == function.code) { context.read().add(RemoveTempTaskByIdEvent( code: function.code, isAutomation: true)); context.read().add(RemoveFromSelectedValueById( code: function.code, isAutomation: true)); } } Navigator.pop(context); }, ); } }