From c84cfd75e42a585ae52021096ac4b40627b0352f Mon Sep 17 00:00:00 2001 From: Abdullah Alassaf Date: Tue, 26 Nov 2024 00:43:35 +0300 Subject: [PATCH] Implemented update card functionlity --- .../bloc/routine_bloc/routine_bloc.dart | 15 +++- .../widgets/routine_dialogs/delay_dialog.dart | 19 ++++- .../widgets/scenes_and_automations.dart | 6 +- .../routiens/widgets/then_container.dart | 78 ++++++++++++------- 4 files changed, 82 insertions(+), 36 deletions(-) diff --git a/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart b/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart index 88414196..053ad934 100644 --- a/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart +++ b/lib/pages/routiens/bloc/routine_bloc/routine_bloc.dart @@ -44,8 +44,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(AddFunctionToRoutine event, Emitter emit) { 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 2bc65b0e..477236fe 100644 --- a/lib/pages/routiens/widgets/then_container.dart +++ b/lib/pages/routiens/widgets/then_container.dart @@ -25,45 +25,73 @@ class ThenContainer extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text('THEN', - style: TextStyle( - fontSize: 18, fontWeight: FontWeight.bold)), + const Text('THEN', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), Wrap( spacing: 8, 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)); + }, + ), ))), ], ), ), ); }, - onWillAccept: (data) => data != null, - onAccept: (data) async { + // onMove: (details) { + // uniqueCustomId = const Uuid().v4(); + // }, + // onWillAccept: (data) => data != null, + onAcceptWithDetails: (data) async { final uniqueCustomId = const Uuid().v4(); - - final mutableData = Map.from(data); + final mutableData = Map.from(data.data); mutableData['uniqueCustomId'] = uniqueCustomId; 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({ @@ -75,13 +103,11 @@ class ThenContainer extends StatelessWidget { return; } - final result = - await DeviceDialogHelper.showDeviceDialog(context, mutableData); + final result = await DeviceDialogHelper.showDeviceDialog(context, mutableData); if (result != null) { context.read().add(AddToThenContainer(mutableData)); - } else if (!['AC', '1G', '2G', '3G'] - .contains(mutableData['productType'])) { + } else if (!['AC', '1G', '2G', '3G'].contains(mutableData['productType'])) { context.read().add(AddToThenContainer(mutableData)); } },