diff --git a/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart b/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart index 076c6cfd..5eb6bd4c 100644 --- a/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart +++ b/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart @@ -46,9 +46,19 @@ class RoutineBloc extends Bloc { void _onAddToThenContainer( AddToThenContainer event, Emitter emit) { - final updatedThenItems = List>.from(state.thenItems) - ..add(event.item); - emit(state.copyWith(thenItems: updatedThenItems)); + final currentItems = List>.from(state.thenItems); + + // Find the index of the item in teh current itemsList + int index = currentItems.indexWhere( + (map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); + // Replace the map if the index is valid + if (index != -1) { + currentItems[index] = event.item; + } else { + currentItems.add(event.item); + } + + emit(state.copyWith(thenItems: currentItems)); } void _onAddFunctionsToRoutine( diff --git a/lib/pages/routiens/widgets/routine_dialogs/delay_dialog.dart b/lib/pages/routiens/widgets/routine_dialogs/delay_dialog.dart index 1191ac58..6195a931 100644 --- a/lib/pages/routiens/widgets/routine_dialogs/delay_dialog.dart +++ b/lib/pages/routiens/widgets/routine_dialogs/delay_dialog.dart @@ -8,13 +8,25 @@ import 'package:syncrow_web/pages/routiens/widgets/dialog_header.dart'; class DelayHelper { static Future?> showDelayPickerDialog( - BuildContext context, String uniqueCustomId) async { + BuildContext context, Map data) async { int hours = 0; int minutes = 0; return showDialog?>( context: context, builder: (BuildContext context) { + final routineBloc = context.read(); + int totalSec = 0; + + final selectedFunctionData = + routineBloc.state.selectedFunctions[data['uniqueCustomId']] ?? []; + + if (selectedFunctionData.isNotEmpty) { + totalSec = selectedFunctionData[0].value; + // Convert seconds to hours and minutes + hours = totalSec ~/ 3600; + minutes = (totalSec % 3600) ~/ 60; + } return AlertDialog( contentPadding: EdgeInsets.zero, content: Container( @@ -31,8 +43,7 @@ class DelayHelper { Expanded( child: CupertinoTimerPicker( mode: CupertinoTimerPickerMode.hm, - initialTimerDuration: - Duration(hours: hours, minutes: minutes), + initialTimerDuration: Duration(hours: hours, minutes: minutes), onTimerDurationChanged: (Duration newDuration) { hours = newDuration.inHours; minutes = newDuration.inMinutes % 60; @@ -54,7 +65,7 @@ class DelayHelper { value: totalSeconds, ) ], - uniqueCustomId, + data['uniqueCustomId'], )); Navigator.pop(context, { diff --git a/lib/pages/routiens/widgets/scenes_and_automations.dart b/lib/pages/routiens/widgets/scenes_and_automations.dart index 7a26979c..746795af 100644 --- a/lib/pages/routiens/widgets/scenes_and_automations.dart +++ b/lib/pages/routiens/widgets/scenes_and_automations.dart @@ -34,11 +34,9 @@ class _ScenesAndAutomationsState extends State { children: scenes.asMap().entries.map((entry) { final scene = entry.value; if (state.searchText != null && state.searchText!.isNotEmpty) { - return scene.name - .toLowerCase() - .contains(state.searchText!.toLowerCase()) + return scene.name.toLowerCase().contains(state.searchText!.toLowerCase()) ? DraggableCard( - imagePath: Assets.logo, + imagePath: scene.icon ?? Assets.loginLogo, title: scene.name, deviceData: { 'deviceId': scene.id, diff --git a/lib/pages/routiens/widgets/then_container.dart b/lib/pages/routiens/widgets/then_container.dart index e7d01e07..a5e4e60b 100644 --- a/lib/pages/routiens/widgets/then_container.dart +++ b/lib/pages/routiens/widgets/then_container.dart @@ -35,20 +35,59 @@ class ThenContainer extends StatelessWidget { runSpacing: 8, children: List.generate( state.thenItems.length, - (index) => DraggableCard( - imagePath: - state.thenItems[index]['imagePath'] ?? '', - title: state.thenItems[index]['title'] ?? '', - deviceData: state.thenItems[index], - padding: const EdgeInsets.symmetric( - horizontal: 4, vertical: 8), - isFromThen: true, - isFromIf: false, - onRemove: () { - context.read().add( - RemoveDragCard( - index: index, isFromThen: true)); + (index) => GestureDetector( + onTap: () async { + if (state.thenItems[index]['deviceId'] == + 'delay') { + final result = await DelayHelper + .showDelayPickerDialog( + context, state.thenItems[index]); + + if (result != null) { + context + .read() + .add(AddToThenContainer({ + ...state.thenItems[index], + 'imagePath': Assets.delay, + 'title': 'Delay', + })); + } + return; + } + + final result = await DeviceDialogHelper + .showDeviceDialog( + context, state.thenItems[index]); + + if (result != null) { + context.read().add( + AddToThenContainer( + state.thenItems[index])); + } else if (!['AC', '1G', '2G', '3G'] + .contains(state.thenItems[index] + ['productType'])) { + context.read().add( + AddToThenContainer( + state.thenItems[index])); + } }, + child: DraggableCard( + imagePath: state.thenItems[index] + ['imagePath'] ?? + '', + title: + state.thenItems[index]['title'] ?? '', + deviceData: state.thenItems[index], + padding: const EdgeInsets.symmetric( + horizontal: 4, vertical: 8), + isFromThen: true, + isFromIf: false, + onRemove: () { + context.read().add( + RemoveDragCard( + index: index, isFromThen: true)); + }, + ), ))), ], ), @@ -69,10 +108,9 @@ class ThenContainer extends StatelessWidget { return data.data['deviceId'] != null; }, - onAccept: (data) async { + onAcceptWithDetails: (data) async { final uniqueCustomId = const Uuid().v4(); - - final mutableData = Map.from(data); + final mutableData = Map.from(data.data); mutableData['uniqueCustomId'] = uniqueCustomId; if (mutableData['type'] == 'scene') { @@ -98,8 +136,8 @@ class ThenContainer extends StatelessWidget { } if (mutableData['deviceId'] == 'delay') { - final result = await DelayHelper.showDelayPickerDialog( - context, mutableData['uniqueCustomId']); + final result = + await DelayHelper.showDelayPickerDialog(context, mutableData); if (result != null) { context.read().add(AddToThenContainer({