Compare commits

..

17 Commits

Author SHA1 Message Date
2b0e504f05 Refactor device name display in Action and Condition models 2025-04-23 10:07:14 +03:00
a656d5981e Merge pull request #88 from SyncrowIOT/Fix-Save-Display-Condition
Fix save display condition
2025-04-22 15:42:42 +03:00
3f49a18130 remove unused code 2025-04-21 15:19:14 +03:00
a51c4d9679 Refactor device name display in RoomPageSwitch widget 2025-04-21 15:00:31 +03:00
caeed8e73f Merge pull request #87 from SyncrowIOT/FE-Complete-the-Device-Name-as
Refactor device name display in RoomPageSwitch widget
2025-04-21 10:43:22 +03:00
dc5ac9be5b Refactor device name display in RoomPageSwitch widget 2025-04-21 10:36:43 +03:00
5c9b30895f Merge pull request #86 from SyncrowIOT/SP-1286-FE-Add-Device-to-Routine-2-Gang
add tow gang and change gang device ui
2025-04-17 16:29:24 +03:00
06b14a3964 add tow gang and change gang device ui 2025-04-17 16:14:48 +03:00
3c92ea3047 Merge pull request #85 from SyncrowIOT/SP-1285-FE-Add-Device-to-Routine
Sp 1285 fe add device to routine
2025-04-17 10:42:06 +03:00
73d28a1800 Refactor Action class to use type annotations for actionExecutor and entityId 2025-04-17 10:41:01 +03:00
5493ca6fb0 Refactor device filtering logic to improve code readability 2025-04-17 10:38:25 +03:00
7005d8ba83 Refactor device filtering logic and improve code readability
- Extracted the logic for filtering implemented devices into a separate method `_getOnlyImplementedDevices`
- Created a set `allowedDevices` to store the allowed device types
- Updated the filtering logic to use the `allowedDevices` set for checking device types
- Removed unnecessary conditions for filtering devices

Fix nullability issues in `Action` model

- Added null checks for `actionExecutor`, `entityId`, `name`, `type`, and `productType` properties in the `fromJson` method of the `Action` model
- Set default values for `actionExecutor` and `entityId` if they are null
- Updated the type casting for `name`, `type`, and `productType` properties to avoid potential nullability issues
2025-04-17 10:16:10 +03:00
cb79627038 Merge pull request #83 from SyncrowIOT/SP-1397-FE-Create-Routine-SceneRoomsTabBarDevicesView-throws-TabBarController-initialization-error
Sp 1397 fe create routine scene rooms tab bar devices view throws tab bar controller initialization error
2025-04-17 09:47:46 +03:00
1cff69d496 change icon 2025-04-17 09:39:58 +03:00
60df77efad add OneGang product type to routine 2025-04-17 09:32:20 +03:00
9e84048f81 Merge pull request #84 from SyncrowIOT:SP-1416
fixed typo
2025-04-16 20:57:45 +04:00
99adb1c286 fixed typo 2025-04-16 20:57:13 +04:00
12 changed files with 931 additions and 362 deletions

View File

@ -0,0 +1,10 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_7302_4118)">
<path d="M11.1049 10.0001L19.7712 1.33381C20.0763 1.02869 20.0763 0.534007 19.7712 0.228929C19.4661 -0.0761485 18.9714 -0.0761876 18.6663 0.228929L9.99999 8.89524L1.33372 0.228929C1.0286 -0.0761876 0.533915 -0.0761876 0.228837 0.228929C-0.0762401 0.534046 -0.0762792 1.02873 0.228837 1.33381L8.89511 10.0001L0.228837 18.6664C-0.0762792 18.9715 -0.0762792 19.4662 0.228837 19.7713C0.381376 19.9238 0.581337 20.0001 0.781297 20.0001C0.981258 20.0001 1.18118 19.9238 1.33376 19.7713L9.99999 11.105L18.6663 19.7713C18.8188 19.9238 19.0188 20.0001 19.2187 20.0001C19.4187 20.0001 19.6186 19.9238 19.7712 19.7713C20.0763 19.4662 20.0763 18.9715 19.7712 18.6664L11.1049 10.0001Z" fill="#999999"/>
</g>
<defs>
<clipPath id="clip0_7302_4118">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 939 B

View File

@ -0,0 +1,10 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_7302_4149)">
<path d="M19.9969 4.94279C19.986 4.83232 19.943 4.72146 19.8674 4.62924C19.8382 4.59358 20.1367 4.89431 15.4141 0.17176C15.3015 0.0591838 15.1487 8.30277e-05 14.9996 0.00012209C14.6443 0.00012209 2.11177 0.00012209 1.75779 0.00012209C0.788544 0.00012209 0 0.788666 0 1.75791V18.2421C0 19.2113 0.788544 19.9998 1.75779 19.9998H18.2419C19.2112 19.9998 19.9997 19.2113 19.9997 18.2421C19.9998 4.01624 20.0013 4.98771 19.9969 4.94279ZM13.4764 1.17198V5.00005C13.4764 5.32314 13.2136 5.58598 12.8905 5.58598H12.1483V1.17198H13.4764ZM10.9765 1.17198V5.58598H5.54684C5.22376 5.58598 4.96091 5.32314 4.96091 5.00005V1.17198H10.9765ZM13.4764 12.539H4.96091V11.7968C4.96091 11.4738 5.22376 11.2109 5.54684 11.2109H12.8905C13.2136 11.2109 13.4764 11.4738 13.4764 11.7968V12.539ZM4.96091 18.828V13.7109H13.4764V18.828H4.96091ZM18.8279 18.2421C18.8279 18.5651 18.5651 18.828 18.242 18.828H14.6483C14.6483 18.0641 14.6483 12.6676 14.6483 11.7968C14.6483 10.8276 13.8597 10.039 12.8905 10.039H5.54684C4.57759 10.039 3.78905 10.8276 3.78905 11.7968V18.828H1.75783C1.43475 18.828 1.1719 18.5651 1.1719 18.2421V1.75791C1.1719 1.43483 1.43475 1.17198 1.75783 1.17198H3.78905V5.00005C3.78905 5.9693 4.57759 6.75784 5.54684 6.75784H12.8905C13.8597 6.75784 14.6483 5.9693 14.6483 5.00005V1.17198H14.7571L18.8279 5.24278V18.2421Z" fill="#023DFE" fill-opacity="0.6"/>
</g>
<defs>
<clipPath id="clip0_7302_4149">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -169,18 +169,20 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
} }
} }
_getOnlyImplementedDevices(List<DeviceModel> devices) { List<DeviceModel> _getOnlyImplementedDevices(List<DeviceModel> devices) {
List<DeviceModel> implementedDevices = []; const allowedDeviceTypes = {
for (int i = 0; i < devices.length; i++) { DeviceType.AC,
if (devices[i].productType == DeviceType.AC || DeviceType.DoorLock,
devices[i].productType == DeviceType.DoorLock || DeviceType.Gateway,
devices[i].productType == DeviceType.Gateway || DeviceType.WallSensor,
devices[i].productType == DeviceType.WallSensor || DeviceType.CeilingSensor,
devices[i].productType == DeviceType.CeilingSensor || DeviceType.ThreeGang,
devices[i].productType == DeviceType.ThreeGang) { DeviceType.OneGang,
implementedDevices.add(devices[i]); DeviceType.TwoGang
} };
}
return implementedDevices; return devices
.where((device) => allowedDeviceTypes.contains(device.productType))
.toList();
} }
} }

View File

@ -76,21 +76,38 @@ class RoomPageSwitch extends StatelessWidget {
: const SizedBox(), : const SizedBox(),
], ],
), ),
Flexible( LayoutBuilder(
child: FittedBox( builder: (context, constraints) {
child: Column( final text = device.name ?? "";
crossAxisAlignment: CrossAxisAlignment.start, final textPainter = TextPainter(
children: [ text: TextSpan(
Text( text: text,
device.name ?? "",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: context.bodyLarge.copyWith( style: context.bodyLarge.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 20, fontSize: 20,
color: Colors.grey, color: Colors.grey,
), ),
), ),
maxLines: 1,
textDirection: TextDirection.ltr,
);
textPainter.layout(maxWidth: constraints.maxWidth);
final exceeded = textPainter.didExceedMaxLines;
return Text(
exceeded ? '${text.substring(0, 10)}...' : text,
style: context.bodyLarge.copyWith(
fontWeight: FontWeight.bold,
fontSize: 20,
color: Colors.grey,
),
overflow: TextOverflow.clip,
maxLines: 1,
);
},
),
Text( Text(
device.subspace!.subspaceName ?? '', device.subspace!.subspaceName ?? '',
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
@ -103,10 +120,6 @@ class RoomPageSwitch extends StatelessWidget {
], ],
), ),
), ),
),
],
),
),
); );
} }
} }
@ -119,7 +132,6 @@ Future<void> showDeviceInterface(
required BuildContext context, required BuildContext context,
required isAllDevices, required isAllDevices,
List<DeviceModel>? allDevices}) async { List<DeviceModel>? allDevices}) async {
print('object-----${device.uuid} ${device.name}');
final devicesCubit = context.read<DevicesCubit>(); final devicesCubit = context.read<DevicesCubit>();

View File

@ -0,0 +1,78 @@
import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart';
import 'package:syncrow_app/features/scene/model/scene_static_function.dart';
import 'package:syncrow_app/generated/assets.dart';
class OneGangHelperFunctions {
static List<SceneStaticFunction> oneGangHelperFunctions(
String deviceId, String deviceName, functionValue) {
return [
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'Light Switch',
code: 'switch_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'Light CountDown',
code: 'countdown_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
];
}
static List<SceneStaticFunction> oneGangAutomationFunctions(
String deviceId, String deviceName, functionValue) {
return [
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'Light Switch',
code: 'switch_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'Light CountDown',
code: 'countdown_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.integerSteps,
operationalValues: [
SceneOperationalValue(
icon: '',
description: "sec",
value: 0.0,
minValue: 0,
maxValue: 43200,
stepValue: 1,
),
],
),
];
}
}

View File

@ -10,7 +10,7 @@ class ThreeGangHelperFunctions {
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
operationName: 'Light 1 Switch', operationName: 'L - Light Switch',
code: 'switch_1', code: 'switch_1',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.onOff, operationDialogType: OperationDialogType.onOff,
@ -21,11 +21,23 @@ class ThreeGangHelperFunctions {
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
], ],
), ),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'L - Light Countdown',
code: 'countdown_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
operationName: 'Light 2 Switch', operationName: 'M - Light Switch',
code: 'switch_2', code: 'switch_2',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.onOff, operationDialogType: OperationDialogType.onOff,
@ -36,11 +48,23 @@ class ThreeGangHelperFunctions {
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
], ],
), ),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'M - Light Countdown',
code: 'countdown_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
operationName: 'Light 3 Switch', operationName: 'R - Light Switch',
code: 'switch_3', code: 'switch_3',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.onOff, operationDialogType: OperationDialogType.onOff,
@ -55,31 +79,7 @@ class ThreeGangHelperFunctions {
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
operationName: 'Light 1 CountDown', operationName: 'R - Light Countdown',
code: 'countdown_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'Light 2 CountDown',
code: 'countdown_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'Light 3 CountDown',
code: 'countdown_3', code: 'countdown_3',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.countdown, operationDialogType: OperationDialogType.countdown,
@ -97,7 +97,7 @@ class ThreeGangHelperFunctions {
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
operationName: 'Light 1 Switch', operationName: 'L - Light Switch',
code: 'switch_1', code: 'switch_1',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.onOff, operationDialogType: OperationDialogType.onOff,
@ -108,41 +108,11 @@ class ThreeGangHelperFunctions {
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
], ],
), ),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'Light 2 Switch',
code: 'switch_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'Light 3 Switch',
code: 'switch_3',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
operationName: 'Light 1 CountDown', operationName: 'L - Light Countdown',
code: 'countdown_1', code: 'countdown_1',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.integerSteps, operationDialogType: OperationDialogType.integerSteps,
@ -157,11 +127,26 @@ class ThreeGangHelperFunctions {
), ),
], ],
), ),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'M - Light Switch',
code: 'switch_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
operationName: 'Light 2 CountDown', operationName: 'M - Light Countdown',
code: 'countdown_2', code: 'countdown_2',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.integerSteps, operationDialogType: OperationDialogType.integerSteps,
@ -176,11 +161,26 @@ class ThreeGangHelperFunctions {
), ),
], ],
), ),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'R - Light Switch',
code: 'switch_3',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: deviceId,
deviceName: deviceName, deviceName: deviceName,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
operationName: 'Light 3 CountDown', operationName: 'R - Light Countdown',
code: 'countdown_3', code: 'countdown_3',
functionValue: functionValue, functionValue: functionValue,
operationDialogType: OperationDialogType.integerSteps, operationDialogType: OperationDialogType.integerSteps,

View File

@ -0,0 +1,139 @@
import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart';
import 'package:syncrow_app/features/scene/model/scene_static_function.dart';
import 'package:syncrow_app/generated/assets.dart';
class TowGangHelperFunctions {
static List<SceneStaticFunction> towGangHelperFunctions(
String deviceId, String deviceName, functionValue) {
return [
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'L - Light Switch',
code: 'switch_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'L - Light CountDown',
code: 'countdown_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'R - Light Switch',
code: 'switch_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'R - Light CountDown',
code: 'countdown_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.countdown,
operationalValues: [
SceneOperationalValue(icon: '', value: 0),
],
),
];
}
static List<SceneStaticFunction> towGangAutomationFunctions(
String deviceId, String deviceName, functionValue) {
return [
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'L - Light Switch',
code: 'switch_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'R - Light CountDown',
code: 'countdown_1',
functionValue: functionValue,
operationDialogType: OperationDialogType.integerSteps,
operationalValues: [
SceneOperationalValue(
icon: '',
description: "sec",
value: 0.0,
minValue: 0,
maxValue: 43200,
stepValue: 1,
),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsAcPower,
operationName: 'R - Light Switch',
code: 'switch_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.onOff,
operationalValues: [
SceneOperationalValue(
icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
],
),
SceneStaticFunction(
deviceId: deviceId,
deviceName: deviceName,
icon: Assets.assetsLightCountdown,
operationName: 'R - Light CountDown',
code: 'countdown_2',
functionValue: functionValue,
operationDialogType: OperationDialogType.integerSteps,
operationalValues: [
SceneOperationalValue(
icon: '',
description: "sec",
value: 0.0,
minValue: 0,
maxValue: 43200,
stepValue: 1,
),
],
),
];
}
}

View File

@ -6,16 +6,19 @@ import 'package:syncrow_app/features/scene/helper/functions_per_device/ac_functi
import 'package:syncrow_app/features/scene/helper/functions_per_device/door_lock_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/door_lock_functions.dart';
import 'package:syncrow_app/features/scene/helper/functions_per_device/gateway_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/gateway_functions.dart';
import 'package:syncrow_app/features/scene/helper/functions_per_device/human_presence_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/human_presence_functions.dart';
import 'package:syncrow_app/features/scene/helper/functions_per_device/one_gang_functions.dart';
import 'package:syncrow_app/features/scene/helper/functions_per_device/presence_sensor.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/presence_sensor.dart';
import 'package:syncrow_app/features/scene/helper/functions_per_device/three_gang_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/three_gang_functions.dart';
import 'package:syncrow_app/features/scene/helper/functions_per_device/tow_gang_helper_functions.dart';
import 'package:syncrow_app/features/scene/model/scene_details_model.dart'; import 'package:syncrow_app/features/scene/model/scene_details_model.dart';
import 'package:syncrow_app/features/scene/model/scene_static_function.dart'; import 'package:syncrow_app/features/scene/model/scene_static_function.dart';
import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart';
mixin SceneOperationsDataHelper { mixin SceneOperationsDataHelper {
final Map<DeviceType, Function(List<FunctionModel>, String, String, dynamic, bool)> _functionMap = final Map<DeviceType,
{ Function(List<FunctionModel>, String, String, dynamic, bool)>
_functionMap = {
DeviceType.LightBulb: lightBulbFunctions, DeviceType.LightBulb: lightBulbFunctions,
DeviceType.CeilingSensor: ceilingSensorFunctions, DeviceType.CeilingSensor: ceilingSensorFunctions,
DeviceType.WallSensor: wallSensorFunctions, DeviceType.WallSensor: wallSensorFunctions,
@ -24,6 +27,8 @@ mixin SceneOperationsDataHelper {
DeviceType.Curtain: curtainFunctions, DeviceType.Curtain: curtainFunctions,
DeviceType.ThreeGang: threeGangFunctions, DeviceType.ThreeGang: threeGangFunctions,
DeviceType.Gateway: gatewayFunctions, DeviceType.Gateway: gatewayFunctions,
DeviceType.OneGang: oneGangFunctions,
DeviceType.TwoGang: towGangFunctions,
}; };
final Map<DeviceType, String> _titleMap = { final Map<DeviceType, String> _titleMap = {
@ -35,8 +40,39 @@ mixin SceneOperationsDataHelper {
DeviceType.Curtain: 'Curtain Functions', DeviceType.Curtain: 'Curtain Functions',
DeviceType.ThreeGang: '3G Light Switch Functions', DeviceType.ThreeGang: '3G Light Switch Functions',
DeviceType.Gateway: 'Gateway Functions', DeviceType.Gateway: 'Gateway Functions',
DeviceType.OneGang: '1G Light Switch Conditions',
DeviceType.TwoGang: '2G Light Switch Conditions',
}; };
//one gang functions
static List<SceneStaticFunction> oneGangFunctions(
List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) {
return OneGangHelperFunctions.oneGangAutomationFunctions(
deviceId, deviceName, functionValue);
}
return OneGangHelperFunctions.oneGangHelperFunctions(
deviceId, deviceName, functionValue);
}
static List<SceneStaticFunction> towGangFunctions(
List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) {
return TowGangHelperFunctions.towGangAutomationFunctions(
deviceId, deviceName, functionValue);
}
return TowGangHelperFunctions.towGangHelperFunctions(
deviceId, deviceName, functionValue);
}
List<SceneStaticFunction> getFunctionsWithIcons({ List<SceneStaticFunction> getFunctionsWithIcons({
DeviceType? type, DeviceType? type,
required List<FunctionModel> functions, required List<FunctionModel> functions,
@ -45,16 +81,22 @@ mixin SceneOperationsDataHelper {
required bool isAutomation, required bool isAutomation,
}) { }) {
final functionValue = null; final functionValue = null;
return _functionMap[type]?.call(functions, deviceId, deviceName, functionValue, isAutomation) ?? return _functionMap[type]?.call(
lightBulbFunctions(functions, deviceId, deviceName, functionValue, isAutomation); functions, deviceId, deviceName, functionValue, isAutomation) ??
lightBulbFunctions(
functions, deviceId, deviceName, functionValue, isAutomation);
} }
String getTitle({DeviceType? type}) { String getTitle({DeviceType? type}) {
return _titleMap[type] ?? ''; return _titleMap[type] ?? '';
} }
static List<SceneStaticFunction> ceilingSensorFunctions(List<FunctionModel> functions, static List<SceneStaticFunction> ceilingSensorFunctions(
String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) { if (isAutomation) {
return PresenceSensorHelperFunctions.automationPresenceSensorFunctions( return PresenceSensorHelperFunctions.automationPresenceSensorFunctions(
deviceId, deviceName, functionValue); deviceId, deviceName, functionValue);
@ -63,22 +105,35 @@ mixin SceneOperationsDataHelper {
deviceId, deviceName, functionValue); deviceId, deviceName, functionValue);
} }
static List<SceneStaticFunction> curtainFunctions(List<FunctionModel> functions, String deviceId, static List<SceneStaticFunction> curtainFunctions(
String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
return []; return [];
} }
static List<SceneStaticFunction> doorLockFunctions(List<FunctionModel> functions, String deviceId, static List<SceneStaticFunction> doorLockFunctions(
String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) { if (isAutomation) {
return DoorLockHelperFunctions.doorLockAutomationFunctions( return DoorLockHelperFunctions.doorLockAutomationFunctions(
deviceId, deviceName, functionValue); deviceId, deviceName, functionValue);
} }
return DoorLockHelperFunctions.doorLockTapToRunFunctions(deviceId, deviceName, functionValue); return DoorLockHelperFunctions.doorLockTapToRunFunctions(
deviceId, deviceName, functionValue);
} }
static List<SceneStaticFunction> wallSensorFunctions(List<FunctionModel> functions, static List<SceneStaticFunction> wallSensorFunctions(
String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) { if (isAutomation) {
return HumanPresenceHelperFunctions.automationHumanPresenceFunctions( return HumanPresenceHelperFunctions.automationHumanPresenceFunctions(
deviceId, deviceName, functionValue); deviceId, deviceName, functionValue);
@ -87,31 +142,51 @@ mixin SceneOperationsDataHelper {
deviceId, deviceName, functionValue); deviceId, deviceName, functionValue);
} }
static List<SceneStaticFunction> lightBulbFunctions(List<FunctionModel> functions, static List<SceneStaticFunction> lightBulbFunctions(
String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
return []; return [];
} }
static List<SceneStaticFunction> gatewayFunctions(List<FunctionModel> functions, String deviceId, static List<SceneStaticFunction> gatewayFunctions(
String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
return GatewayHelperFunctions.tabToRunGatewayFunctions(deviceId, deviceName, functionValue); String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
return GatewayHelperFunctions.tabToRunGatewayFunctions(
deviceId, deviceName, functionValue);
} }
static List<SceneStaticFunction> threeGangFunctions(List<FunctionModel> functions, static List<SceneStaticFunction> threeGangFunctions(
String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) { if (isAutomation) {
return ThreeGangHelperFunctions.threeGangAutomationFunctions( return ThreeGangHelperFunctions.threeGangAutomationFunctions(
deviceId, deviceName, functionValue); deviceId, deviceName, functionValue);
} }
return ThreeGangHelperFunctions.threeGangHelperFunctions(deviceId, deviceName, functionValue); return ThreeGangHelperFunctions.threeGangHelperFunctions(
deviceId, deviceName, functionValue);
} }
static List<SceneStaticFunction> acFunctions(List<FunctionModel> functions, String deviceId, static List<SceneStaticFunction> acFunctions(
String deviceName, dynamic functionValue, bool isAutomation) { List<FunctionModel> functions,
String deviceId,
String deviceName,
dynamic functionValue,
bool isAutomation) {
if (isAutomation) { if (isAutomation) {
return ACFunctionsHelper.automationAcFunctions(deviceId, deviceName, functionValue); return ACFunctionsHelper.automationAcFunctions(
deviceId, deviceName, functionValue);
} }
return ACFunctionsHelper.tabToRunAcFunctions(deviceId, deviceName, functionValue); return ACFunctionsHelper.tabToRunAcFunctions(
deviceId, deviceName, functionValue);
} }
List<SceneStaticFunction> getTaskListFunctionsFromApi({ List<SceneStaticFunction> getTaskListFunctionsFromApi({
@ -149,8 +224,12 @@ mixin SceneOperationsDataHelper {
SceneStaticFunction( SceneStaticFunction(
deviceId: action.entityId, deviceId: action.entityId,
deviceName: action.name.toString(), deviceName: action.name.toString(),
deviceIcon: action.type == 'automation' ? Assets.player : Assets.handClickIcon, deviceIcon: action.type == 'automation'
icon: action.type == 'automation' ? Assets.player : Assets.handClickIcon, ? Assets.player
: Assets.handClickIcon,
icon: action.type == 'automation'
? Assets.player
: Assets.handClickIcon,
operationName: action.type.toString(), operationName: action.type.toString(),
operationDialogType: OperationDialogType.onOff, operationDialogType: OperationDialogType.onOff,
functionValue: action.actionExecutor, functionValue: action.actionExecutor,
@ -170,7 +249,8 @@ mixin SceneOperationsDataHelper {
), ),
); );
} else { } else {
functions.add(_mapExecutorPropertyToSceneFunction(action, isAutomation)); functions
.add(_mapExecutorPropertyToSceneFunction(action, isAutomation));
} }
} }
@ -179,6 +259,8 @@ mixin SceneOperationsDataHelper {
for (var condition in conditions) { for (var condition in conditions) {
// Create a dummy Action from Condition to reuse _mapExecutorPropertyToSceneFunction // Create a dummy Action from Condition to reuse _mapExecutorPropertyToSceneFunction
Action dummyAction = Action( Action dummyAction = Action(
deviceName: condition.deviceName,
productType: condition.productType,
actionExecutor: 'device_report', actionExecutor: 'device_report',
entityId: condition.entityId, entityId: condition.entityId,
executorProperty: ExecutorProperty( executorProperty: ExecutorProperty(
@ -206,7 +288,9 @@ mixin SceneOperationsDataHelper {
}) { }) {
final executorProperty = action.executorProperty; final executorProperty = action.executorProperty;
final Map<String, SceneStaticFunction Function(Action, bool, String?, String?)> functionMap = { final Map<String,
SceneStaticFunction Function(Action, bool, String?, String?)>
functionMap = {
'sensitivity': _createSensitivityFunction, 'sensitivity': _createSensitivityFunction,
'normal_open_switch': _createNormalOpenSwitchFunction, 'normal_open_switch': _createNormalOpenSwitchFunction,
'unlock_fingerprint': _createUnlockFingerprintFunction, 'unlock_fingerprint': _createUnlockFingerprintFunction,
@ -282,14 +366,16 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createSensitivityFunction( SceneStaticFunction _createSensitivityFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Sensitivity', 'Sensitivity',
isAutomation ? OperationDialogType.integerSteps : OperationDialogType.listOfOptions, isAutomation
? OperationDialogType.integerSteps
: OperationDialogType.listOfOptions,
isAutomation ? _createIntegerStepsOptions() : _createSensitivityOptions(), isAutomation ? _createIntegerStepsOptions() : _createSensitivityOptions(),
isAutomation, isAutomation,
comparator, comparator,
@ -297,11 +383,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createNormalOpenSwitchFunction( SceneStaticFunction _createNormalOpenSwitchFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Set Door lock Normal Open', 'Set Door lock Normal Open',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -351,11 +437,11 @@ mixin SceneOperationsDataHelper {
]; ];
} }
SceneStaticFunction _createUnlockFingerprintFunction( SceneStaticFunction _createUnlockFingerprintFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Fingerprint Unlock', 'Fingerprint Unlock',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -366,11 +452,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createUnlockPasswordFunction( SceneStaticFunction _createUnlockPasswordFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Password Unlock', 'Password Unlock',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -381,11 +467,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createUnlockCardFunction( SceneStaticFunction _createUnlockCardFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Card Unlock', 'Card Unlock',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -396,11 +482,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createAlarmLockFunction( SceneStaticFunction _createAlarmLockFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Lock Alarm', 'Lock Alarm',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -411,11 +497,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createUnlockRequestFunction( SceneStaticFunction _createUnlockRequestFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Remote Unlock Request', 'Remote Unlock Request',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -426,11 +512,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createResidualElectricityFunction( SceneStaticFunction _createResidualElectricityFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Residual Electricity', 'Residual Electricity',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -441,11 +527,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createReverseLockFunction( SceneStaticFunction _createReverseLockFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Double Lock', 'Double Lock',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -456,11 +542,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createUnlockAppFunction( SceneStaticFunction _createUnlockAppFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Remote Unlock Via App', 'Remote Unlock Via App',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -471,11 +557,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createHijackFunction( SceneStaticFunction _createHijackFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Hijack Alarm', 'Hijack Alarm',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -486,11 +572,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createDoorbellFunction( SceneStaticFunction _createDoorbellFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Doorbell', 'Doorbell',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -501,11 +587,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createUnlockTemporaryFunction( SceneStaticFunction _createUnlockTemporaryFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'WIFI LOCK PRO', action.deviceName,
Assets.assetsIconsDoorLock, Assets.assetsIconsDoorLock,
'Temporary Password Unlock', 'Temporary Password Unlock',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -516,11 +602,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createFarDetectionFunction( SceneStaticFunction _createFarDetectionFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Far Detection', 'Far Detection',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -531,11 +617,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createMotionSensitivityFunction( SceneStaticFunction _createMotionSensitivityFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Motion Detection Sensitivity', 'Motion Detection Sensitivity',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -546,11 +632,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createMotionlessSensitivityFunction( SceneStaticFunction _createMotionlessSensitivityFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Motionless Detection Sensitivity', 'Motionless Detection Sensitivity',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -561,11 +647,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createIndicatorFunction( SceneStaticFunction _createIndicatorFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Indicator', 'Indicator',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -576,11 +662,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createPresenceTimeFunction( SceneStaticFunction _createPresenceTimeFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Nobody Time', 'Nobody Time',
OperationDialogType.countdown, OperationDialogType.countdown,
@ -591,11 +677,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createPresenceStateFunction( SceneStaticFunction _createPresenceStateFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Presence State', 'Presence State',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -606,14 +692,16 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createDisCurrentFunction( SceneStaticFunction _createDisCurrentFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Current Distance', 'Current Distance',
isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation
? OperationDialogType.integerSteps
: OperationDialogType.countdown,
_createCurrentDistanceOptions(), _createCurrentDistanceOptions(),
isAutomation, isAutomation,
comparator, comparator,
@ -621,11 +709,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createIlluminanceValueFunction( SceneStaticFunction _createIlluminanceValueFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Illuminance Value', 'Illuminance Value',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -636,11 +724,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createCheckingResultFunction( SceneStaticFunction _createCheckingResultFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Human Presence Sensor', action.deviceName,
Assets.assetsIconsSensors, Assets.assetsIconsSensors,
'Self-Test Result', 'Self-Test Result',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -651,11 +739,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createSwitchFunction( SceneStaticFunction _createSwitchFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Smart AC Thermostat - Grey - Model A', action.deviceName,
Assets.assetsIconsAC, Assets.assetsIconsAC,
'Power', 'Power',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -666,26 +754,30 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createTempSetFunction( SceneStaticFunction _createTempSetFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Smart AC Thermostat - Grey - Model A', action.deviceName,
Assets.assetsIconsAC, Assets.assetsIconsAC,
'Set Temperature', 'Set Temperature',
isAutomation ? OperationDialogType.integerSteps : OperationDialogType.temperature, isAutomation
isAutomation ? _createAutomationTemperatureOptions() : _createTemperatureOptions(), ? OperationDialogType.integerSteps
: OperationDialogType.temperature,
isAutomation
? _createAutomationTemperatureOptions()
: _createTemperatureOptions(),
isAutomation, isAutomation,
comparator, comparator,
uniqueCustomId, uniqueCustomId,
); );
} }
SceneStaticFunction _createTempCurrentFunction( SceneStaticFunction _createTempCurrentFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Smart AC Thermostat - Grey - Model A', action.deviceName,
Assets.assetsIconsAC, Assets.assetsIconsAC,
'Current Temperature', 'Current Temperature',
OperationDialogType.integerSteps, OperationDialogType.integerSteps,
@ -696,11 +788,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createModeFunction( SceneStaticFunction _createModeFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Smart AC Thermostat - Grey - Model A', action.deviceName,
Assets.assetsIconsAC, Assets.assetsIconsAC,
'Mode', 'Mode',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -711,11 +803,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createLevelFunction( SceneStaticFunction _createLevelFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Smart AC Thermostat - Grey - Model A', action.deviceName,
Assets.assetsIconsAC, Assets.assetsIconsAC,
'Fan Speed', 'Fan Speed',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -726,11 +818,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createChildLockFunction( SceneStaticFunction _createChildLockFunction(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Smart AC Thermostat - Grey - Model A', action.deviceName,
Assets.assetsIconsAC, Assets.assetsIconsAC,
'Child Lock', 'Child Lock',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -741,11 +833,13 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createSwitch1Function( SceneStaticFunction _createSwitch1Function(Action action, bool isAutomation,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { String? comparator, String? uniqueCustomId) {
switch (action.productType) {
case "3G":
return _createSceneFunction( return _createSceneFunction(
action, action,
'3 Gang Button Switch L-L', action.deviceName,
Assets.assetsIcons3GangSwitch, Assets.assetsIcons3GangSwitch,
'Light 1 Switch', 'Light 1 Switch',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -754,13 +848,52 @@ mixin SceneOperationsDataHelper {
comparator, comparator,
uniqueCustomId, uniqueCustomId,
); );
} case "2G":
SceneStaticFunction _createSwitch2Function(
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'3 Gang Button Switch L-L', action.deviceName,
Assets.twoGang,
'Light 1 Switch',
OperationDialogType.onOff,
_createOnOffOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
case "1G":
return _createSceneFunction(
action,
action.deviceName,
Assets.oneGang,
'Light 1 Switch',
OperationDialogType.onOff,
_createOnOffOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
default:
return _createSceneFunction(
action,
'None',
Assets.assetsRemoteUnlockReq,
'None',
OperationDialogType.onOff,
_createOnOffOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
}
}
SceneStaticFunction _createSwitch2Function(Action action, bool isAutomation,
String? comparator, String? uniqueCustomId) {
switch (action.productType) {
case "3G":
return _createSceneFunction(
action,
action.deviceName,
Assets.assetsIcons3GangSwitch, Assets.assetsIcons3GangSwitch,
'Light 2 Switch', 'Light 2 Switch',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -769,13 +902,38 @@ mixin SceneOperationsDataHelper {
comparator, comparator,
uniqueCustomId, uniqueCustomId,
); );
} case "2G":
SceneStaticFunction _createSwitch3Function(
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'3 Gang Button Switch L-L', action.deviceName,
Assets.twoGang,
'Light 2 Switch',
OperationDialogType.onOff,
_createOnOffOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
default:
return _createSceneFunction(
action,
action.deviceName,
Assets.oneGang,
'Light Switch',
OperationDialogType.onOff,
_createOnOffOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
}
}
SceneStaticFunction _createSwitch3Function(Action action, bool isAutomation,
String? comparator, String? uniqueCustomId) {
return _createSceneFunction(
action,
action.deviceName,
Assets.assetsIcons3GangSwitch, Assets.assetsIcons3GangSwitch,
'Light 3 Switch', 'Light 3 Switch',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -786,56 +944,138 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createCountdown1Function( SceneStaticFunction _createCountdown1Function(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
switch (action.productType) {
case "3G":
return _createSceneFunction( return _createSceneFunction(
action, action,
'3 Gang Button Switch L-L', action.deviceName,
Assets.assetsIcons3GangSwitch, Assets.assetsIcons3GangSwitch,
'Light 1 CountDown', 'Light 1 CountDown',
isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation
isAutomation ? _createAutomationCountDownOptions() : _createCountdownOptions(), ? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
case "2G":
return _createSceneFunction(
action,
action.deviceName,
Assets.twoGang,
'Light 1 CountDown',
isAutomation
? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
default:
return _createSceneFunction(
action,
action.deviceName,
Assets.oneGang,
'Light CountDown',
isAutomation
? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation, isAutomation,
comparator, comparator,
uniqueCustomId, uniqueCustomId,
); );
} }
}
SceneStaticFunction _createCountdown2Function( SceneStaticFunction _createCountdown2Function(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
switch (action.productType) {
case "3G":
return _createSceneFunction( return _createSceneFunction(
action, action,
'3 Gang Button Switch L-L', action.deviceName,
Assets.assetsIcons3GangSwitch, Assets.assetsIcons3GangSwitch,
'Light 2 CountDown', 'Light 2 CountDown',
isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation
isAutomation ? _createAutomationCountDownOptions() : _createCountdownOptions(), ? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
case "2G":
return _createSceneFunction(
action,
action.deviceName,
Assets.twoGang,
'Light 2 CountDown',
isAutomation
? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation,
comparator,
uniqueCustomId,
);
default:
return _createSceneFunction(
action,
action.deviceName,
Assets.oneGang,
'Light CountDown',
isAutomation
? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation, isAutomation,
comparator, comparator,
uniqueCustomId, uniqueCustomId,
); );
} }
}
SceneStaticFunction _createCountdown3Function( SceneStaticFunction _createCountdown3Function(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'3 Gang Button Switch L-L', action.deviceName,
Assets.assetsIcons3GangSwitch, Assets.assetsIcons3GangSwitch,
'Light 3 CountDown', 'Light 3 CountDown',
isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation
isAutomation ? _createAutomationCountDownOptions() : _createCountdownOptions(), ? OperationDialogType.integerSteps
: OperationDialogType.countdown,
isAutomation
? _createAutomationCountDownOptions()
: _createCountdownOptions(),
isAutomation, isAutomation,
comparator, comparator,
uniqueCustomId, uniqueCustomId,
); );
} }
SceneStaticFunction _createSwitchAlarmSoundFunction( SceneStaticFunction _createSwitchAlarmSoundFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Gateway', action.deviceName,
Assets.assetsIconsGateway, Assets.assetsIconsGateway,
'Switch Alarm Sound', 'Switch Alarm Sound',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -846,11 +1086,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createMasterStateFunction( SceneStaticFunction _createMasterStateFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Gateway', action.deviceName,
Assets.assetsIconsGateway, Assets.assetsIconsGateway,
'Master State', 'Master State',
OperationDialogType.listOfOptions, OperationDialogType.listOfOptions,
@ -861,11 +1101,11 @@ mixin SceneOperationsDataHelper {
); );
} }
SceneStaticFunction _createFactoryResetFunction( SceneStaticFunction _createFactoryResetFunction(Action action,
Action action, bool isAutomation, String? comparator, String? uniqueCustomId) { bool isAutomation, String? comparator, String? uniqueCustomId) {
return _createSceneFunction( return _createSceneFunction(
action, action,
'Gateway', action.deviceName,
Assets.assetsIconsGateway, Assets.assetsIconsGateway,
'Factory Reset', 'Factory Reset',
OperationDialogType.onOff, OperationDialogType.onOff,
@ -1180,8 +1420,12 @@ mixin SceneOperationsDataHelper {
uniqueCustomId: taskItem.uniqueCustomId, uniqueCustomId: taskItem.uniqueCustomId,
deviceId: taskItem.deviceId, deviceId: taskItem.deviceId,
deviceName: taskItem.deviceName.toString(), deviceName: taskItem.deviceName.toString(),
deviceIcon: taskItem.operationName == 'automation' ? Assets.player : Assets.handClickIcon, deviceIcon: taskItem.operationName == 'automation'
icon: taskItem.operationName == 'automation' ? Assets.player : Assets.handClickIcon, ? Assets.player
: Assets.handClickIcon,
icon: taskItem.operationName == 'automation'
? Assets.player
: Assets.handClickIcon,
operationName: taskItem.operationName, operationName: taskItem.operationName,
operationDialogType: OperationDialogType.onOff, operationDialogType: OperationDialogType.onOff,
functionValue: taskItem.functionValue == 'rule_enable' ? true : false, functionValue: taskItem.functionValue == 'rule_enable' ? true : false,
@ -1204,6 +1448,8 @@ mixin SceneOperationsDataHelper {
return [ return [
_mapExecutorPropertyToSceneFunction( _mapExecutorPropertyToSceneFunction(
Action( Action(
deviceName: taskItem.deviceName,
productType: '',
entityId: deviceId, entityId: deviceId,
executorProperty: ExecutorProperty( executorProperty: ExecutorProperty(
functionCode: taskItem.code, functionCode: taskItem.code,

View File

@ -74,6 +74,9 @@ class Action {
ExecutorProperty? executorProperty; ExecutorProperty? executorProperty;
String? name; String? name;
String? type; String? type;
final String productType;
final String deviceName;
Action({ Action({
required this.actionExecutor, required this.actionExecutor,
@ -81,6 +84,8 @@ class Action {
this.executorProperty, this.executorProperty,
this.name, this.name,
this.type, this.type,
required this.productType,
required this.deviceName,
}); });
String toRawJson() => json.encode(toJson()); String toRawJson() => json.encode(toJson());
@ -88,10 +93,12 @@ class Action {
static Action? fromJson(Map<String, dynamic> json) { static Action? fromJson(Map<String, dynamic> json) {
if (json['name'] != null && json['type'] != null) { if (json['name'] != null && json['type'] != null) {
return Action( return Action(
actionExecutor: json["actionExecutor"], actionExecutor: json["actionExecutor"] as String,
entityId: json["entityId"], entityId: json["entityId"] as String,
name: json['name'], name: json['name'] as String?,
type: json['type'], type: json['type'] as String?,
productType: json['productType'] as String,
deviceName: json['deviceName'] as String,
); );
} }
if (json["executorProperty"] == null) { if (json["executorProperty"] == null) {
@ -99,9 +106,11 @@ class Action {
} }
return Action( return Action(
actionExecutor: json["actionExecutor"], actionExecutor: json["actionExecutor"] as String,
entityId: json["entityId"], entityId: json["entityId"] as String,
executorProperty: ExecutorProperty.fromJson(json["executorProperty"]), executorProperty: ExecutorProperty.fromJson(json["executorProperty"]),
productType: json['productType'] as String,
deviceName: json['deviceName'] as String,
); );
} }
@ -142,12 +151,16 @@ class Condition {
final String entityId; final String entityId;
final String entityType; final String entityType;
final Expr expr; final Expr expr;
final String productType;
final String deviceName;
Condition({ Condition({
required this.code, required this.code,
required this.entityId, required this.entityId,
required this.entityType, required this.entityType,
required this.expr, required this.expr,
required this.productType,
required this.deviceName,
}); });
factory Condition.fromRawJson(String str) => factory Condition.fromRawJson(String str) =>
@ -160,6 +173,8 @@ class Condition {
entityId: json["entityId"], entityId: json["entityId"],
entityType: json["entityType"], entityType: json["entityType"],
expr: Expr.fromJson(json["expr"]), expr: Expr.fromJson(json["expr"]),
productType: json['productType'] as String,
deviceName: json['deviceName'] as String,
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/devices/model/device_control_model.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/devices/model/device_model.dart';
import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart';
@ -11,11 +12,10 @@ 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_container.dart';
import 'package:syncrow_app/features/shared_widgets/default_scaffold.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/light_divider.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/navigation/navigate_to_route.dart'; import 'package:syncrow_app/navigation/navigate_to_route.dart';
import 'package:syncrow_app/navigation/routing_constants.dart'; import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class DeviceFunctionsView extends StatelessWidget class DeviceFunctionsView extends StatelessWidget
@ -51,22 +51,14 @@ class DeviceFunctionsView extends StatelessWidget
.add(AddTaskEvent(isAutomation: isAutomation)); .add(AddTaskEvent(isAutomation: isAutomation));
navigateToRoute(context, Routes.sceneTasksRoute); navigateToRoute(context, Routes.sceneTasksRoute);
}, },
child: BodyMedium( child: SvgPicture.asset(Assets.saveRoutinesIcon),
text: 'Save',
fontWeight: FontWeight.normal,
fontColor: ColorsManager.secondaryColor.withOpacity(0.6),
),
), ),
], ],
leading: TextButton( leading: TextButton(
onPressed: () { onPressed: () {
_cancelOperation(context, device, isAutomation); _cancelOperation(context, device, isAutomation);
}, },
child: BodyMedium( child: SvgPicture.asset(Assets.cancelIcon),
text: 'Cancel',
fontWeight: FontWeight.normal,
fontColor: ColorsManager.textPrimaryColor.withOpacity(0.6),
),
), ),
leadingWidth: 80, leadingWidth: 80,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
@ -75,6 +67,63 @@ class DeviceFunctionsView extends StatelessWidget
itemCount: functions.length, itemCount: functions.length,
padding: const EdgeInsets.only(top: 24.0), padding: const EdgeInsets.only(top: 24.0),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (device.productType!.name.toString() == 'ThreeGang' ||
device.productType!.name.toString() == 'TwoGang') {
final bool isFirstInPair = index % 2 == 0;
final bool isLastInPair =
index % 2 == 1 || index == functions.length - 1;
final bool isLastItem = index == functions.length - 1;
return Column(mainAxisSize: MainAxisSize.min, children: [
if (isFirstInPair && index != 0) const SizedBox(height: 16),
DefaultContainer(
padding: EdgeInsets.only(
top: isFirstInPair ? 8 : 0,
bottom: isLastInPair ? 8 : 0,
),
margin: EdgeInsets.zero,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(isFirstInPair ? 20 : 0),
topRight: Radius.circular(isFirstInPair ? 20 : 0),
bottomLeft: Radius.circular(isLastInPair ? 20 : 0),
bottomRight: Radius.circular(isLastInPair ? 20 : 0),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
BlocBuilder<CreateSceneBloc, CreateSceneState>(
builder: (context, state) {
return SceneListTile(
iconsSize: 22,
minLeadingWidth: 20,
assetPath: functions[index].icon,
titleString: functions[index].operationName,
trailingWidget: const 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);
}
},
);
},
),
if (isFirstInPair && !isLastItem)
SizedBox(
width: context.width * 0.8,
child: const LightDivider(),
),
],
),
)
]);
} else {
return DefaultContainer( return DefaultContainer(
padding: index == 0 padding: index == 0
? const EdgeInsets.only(top: 8) ? const EdgeInsets.only(top: 8)
@ -82,13 +131,23 @@ class DeviceFunctionsView extends StatelessWidget
? const EdgeInsets.only(bottom: 8) ? const EdgeInsets.only(bottom: 8)
: EdgeInsets.zero, : EdgeInsets.zero,
margin: EdgeInsets.zero, margin: EdgeInsets.zero,
borderRadius: index == 0 borderRadius: index == 0 && index == functions.length - 1
? const BorderRadius.only( ? const BorderRadius.only(
topLeft: Radius.circular(20), topRight: Radius.circular(20)) topLeft: Radius.circular(20),
topRight: Radius.circular(20),
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
)
: index == 0
? const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
)
: index == functions.length - 1 : index == functions.length - 1
? const BorderRadius.only( ? const BorderRadius.only(
bottomLeft: Radius.circular(20), bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20)) bottomRight: Radius.circular(20),
)
: BorderRadius.zero, : BorderRadius.zero,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -113,28 +172,22 @@ class DeviceFunctionsView extends StatelessWidget
onPressed: () { onPressed: () {
if (isAutomation) { if (isAutomation) {
_showAutomationDialog( _showAutomationDialog(
context, context, functions[index], device);
functions[index],
device,
);
} else { } else {
_showTabToRunDialog( _showTabToRunDialog(
context, context, functions[index], device);
functions[index],
device,
);
} }
}, },
); );
}, }),
),
index != functions.length - 1 index != functions.length - 1
? SizedBox( ? SizedBox(
width: context.width * 0.8, child: const LightDivider()) width: context.width * 0.8,
child: const LightDivider())
: const SizedBox(), : const SizedBox(),
], ],
), ));
); }
}, },
), ),
); );

View File

@ -1142,5 +1142,9 @@ class Assets {
static const String toggleSwitchSmall = 'assets/icons/toggleSwitchSmall.svg'; static const String toggleSwitchSmall = 'assets/icons/toggleSwitchSmall.svg';
static const String offToggleSwitchSmall = 'assets/icons/offToggleSwitchSmall.svg'; static const String offToggleSwitchSmall = 'assets/icons/offToggleSwitchSmall.svg';
static const String saveRoutinesIcon = 'assets/icons/save_routines_icon.svg';
static const String cancelIcon = 'assets/icons/cancel_icon.svg';
} }

View File

@ -11,7 +11,7 @@ abstract class ApiEndpoints {
static const String sendOtp = '/authentication/user/send-otp'; static const String sendOtp = '/authentication/user/send-otp';
static const String verifyOtp = '/authentication/user/verify-otp'; static const String verifyOtp = '/authentication/user/verify-otp';
static const String forgetPassword = '/authentication/user/forget-password'; static const String forgetPassword = '/authentication/user/forget-password';
static const String clientLogin = 'client/token'; static const String clientLogin = '/client/token';
////////////////////////////////////// Spaces /////////////////////////////////////// ////////////////////////////////////// Spaces ///////////////////////////////////////
///Community Module ///Community Module