Skip to content

Commit f8fabb9

Browse files
authored
Fix: Consistent Undo Duration Implementation Across All Deletion Methods (#763)
* changes1 * changes2
1 parent f7ad404 commit f8fabb9

File tree

3 files changed

+196
-105
lines changed

3 files changed

+196
-105
lines changed

lib/app/modules/home/controllers/home_controller.dart

Lines changed: 101 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -490,16 +490,107 @@ class HomeController extends GetxController {
490490

491491
// Delete alarms mentioned in the selected alarm set
492492
Future<void> deleteAlarms() async {
493-
for (var alarm in selectedAlarmSet) {
494-
var alarmId = alarm.first;
495-
var isSharedAlarmEnabled = alarm.second;
496-
497-
isSharedAlarmEnabled
498-
? await FirestoreDb.deleteAlarm(
499-
userModel.value,
500-
alarmId,
501-
)
502-
: await IsarDb.deleteAlarm(alarmId);
493+
try {
494+
if (selectedAlarmSet.isEmpty) {
495+
Get.snackbar(
496+
'Error',
497+
'No alarms selected for deletion',
498+
snackPosition: SnackPosition.BOTTOM,
499+
backgroundColor: Colors.red,
500+
colorText: Colors.white,
501+
);
502+
return;
503+
}
504+
505+
int successCount = 0;
506+
List<AlarmModel> deletedAlarms = [];
507+
508+
for (var alarm in selectedAlarmSet) {
509+
var alarmId = alarm.first;
510+
var isSharedAlarmEnabled = alarm.second;
511+
512+
try {
513+
if (isSharedAlarmEnabled) {
514+
515+
AlarmModel? alarmToDelete = await FirestoreDb.getAlarm(userModel.value, alarmId);
516+
if (alarmToDelete != null) {
517+
deletedAlarms.add(alarmToDelete);
518+
await FirestoreDb.deleteAlarm(userModel.value, alarmId);
519+
successCount++;
520+
}
521+
} else {
522+
523+
AlarmModel? alarmToDelete = await IsarDb.getAlarm(alarmId);
524+
if (alarmToDelete != null) {
525+
deletedAlarms.add(alarmToDelete);
526+
await IsarDb.deleteAlarm(alarmId);
527+
successCount++;
528+
}
529+
}
530+
} catch (e) {
531+
debugPrint('Error deleting alarm: $e');
532+
continue;
533+
}
534+
}
535+
536+
if (successCount > 0) {
537+
if (Get.isSnackbarOpen) {
538+
Get.closeAllSnackbars();
539+
}
540+
541+
Get.snackbar(
542+
'Success',
543+
'$successCount ${successCount == 1 ? 'alarm' : 'alarms'} deleted',
544+
duration: Duration(seconds: duration.toInt()),
545+
snackPosition: SnackPosition.BOTTOM,
546+
backgroundColor: Colors.green,
547+
colorText: Colors.white,
548+
margin: const EdgeInsets.symmetric(
549+
horizontal: 10,
550+
vertical: 15,
551+
),
552+
mainButton: TextButton(
553+
onPressed: () async {
554+
555+
for (var alarm in deletedAlarms) {
556+
if (alarm.isSharedAlarmEnabled) {
557+
await FirestoreDb.addAlarm(userModel.value, alarm);
558+
} else {
559+
await IsarDb.addAlarm(alarm);
560+
}
561+
}
562+
563+
refreshTimer = true;
564+
refreshUpcomingAlarms();
565+
},
566+
child: Text(
567+
'Undo',
568+
style: TextStyle(color: Colors.white),
569+
),
570+
),
571+
);
572+
573+
574+
selectedAlarmSet.clear();
575+
numberOfAlarmsSelected.value = 0;
576+
} else {
577+
Get.snackbar(
578+
'Error',
579+
'No alarms were deleted',
580+
snackPosition: SnackPosition.BOTTOM,
581+
backgroundColor: Colors.red,
582+
colorText: Colors.white,
583+
);
584+
}
585+
} catch (e) {
586+
debugPrint('Error in deleteAlarms: $e');
587+
Get.snackbar(
588+
'Error',
589+
'Failed to delete alarms',
590+
snackPosition: SnackPosition.BOTTOM,
591+
backgroundColor: Colors.red,
592+
colorText: Colors.white,
593+
);
503594
}
504595
}
505596

lib/app/modules/home/views/home_view.dart

Lines changed: 80 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -364,49 +364,79 @@ class HomeView extends GetView<HomeController> {
364364
),
365365
Obx(
366366
() => InkWell(
367-
onTap:
368-
() async {
369-
// Deleting the alarms
370-
await controller
371-
.deleteAlarms();
367+
onTap: () async {
368+
if (controller.numberOfAlarmsSelected.value > 0) {
369+
370+
bool confirm = await Get.defaultDialog(
371+
title: 'Confirmation'.tr,
372+
titleStyle: Theme.of(context).textTheme.displaySmall,
373+
backgroundColor: themeController.secondaryBackgroundColor.value,
374+
content: Column(
375+
children: [
376+
Text(
377+
'Delete ${controller.numberOfAlarmsSelected.value} selected alarms?'.tr,
378+
style: Theme.of(context).textTheme.bodyMedium,
379+
textAlign: TextAlign.center,
380+
),
381+
Padding(
382+
padding: const EdgeInsets.only(top: 20),
383+
child: Row(
384+
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
385+
children: [
386+
TextButton(
387+
onPressed: () => Get.back(result: false),
388+
style: ButtonStyle(
389+
backgroundColor: MaterialStateProperty.all(
390+
kprimaryTextColor.withOpacity(0.5),
391+
),
392+
),
393+
child: Text(
394+
'Cancel'.tr,
395+
style: Theme.of(context).textTheme.displaySmall!,
396+
),
397+
),
398+
TextButton(
399+
onPressed: () => Get.back(result: true),
400+
style: ButtonStyle(
401+
backgroundColor: MaterialStateProperty.all(kprimaryColor),
402+
),
403+
child: Text(
404+
'Delete'.tr,
405+
style: Theme.of(context).textTheme.displaySmall!.copyWith(
406+
color: kprimaryBackgroundColor,
407+
),
408+
),
409+
),
410+
],
411+
),
412+
),
413+
],
414+
),
415+
);
372416

373-
// Closing the multiple select mode
374-
controller
375-
.inMultipleSelectMode
376-
.value = false;
377-
controller
378-
.isAnyAlarmHolded
379-
.value = false;
380-
controller
381-
.isAllAlarmsSelected
382-
.value = false;
383-
controller
384-
.numberOfAlarmsSelected
385-
.value = 0;
386-
controller
387-
.selectedAlarmSet
388-
.clear();
389-
// After deleting alarms, refreshing to schedule latest one
390-
controller
391-
.refreshTimer =
392-
true;
393-
controller
394-
.refreshUpcomingAlarms();
417+
if (confirm == true) {
418+
419+
await controller.deleteAlarms();
420+
421+
// Closing the multiple select mode
422+
controller.inMultipleSelectMode.value = false;
423+
controller.isAnyAlarmHolded.value = false;
424+
controller.isAllAlarmsSelected.value = false;
425+
controller.numberOfAlarmsSelected.value = 0;
426+
controller.selectedAlarmSet.clear();
427+
428+
429+
controller.refreshTimer = true;
430+
controller.refreshUpcomingAlarms();
431+
}
432+
}
395433
},
396-
child: Icon(
434+
child: Icon(
397435
Icons.delete,
398-
color: controller
399-
.numberOfAlarmsSelected
400-
.value >
401-
0
436+
color: controller.numberOfAlarmsSelected.value > 0
402437
? Colors.red
403-
: themeController.primaryTextColor.value.withOpacity(
404-
0.75,
405-
),
406-
size: 27 *
407-
controller
408-
.scalingFactor
409-
.value,
438+
: themeController.primaryTextColor.value.withOpacity(0.75),
439+
size: 27 * controller.scalingFactor.value,
410440
),
411441
),
412442
),
@@ -531,29 +561,18 @@ class HomeView extends GetView<HomeController> {
531561
context,
532562
);
533563
if (userConfirmed) {
534-
if (alarm
535-
.isSharedAlarmEnabled ==
536-
true) {
537-
await FirestoreDb
538-
.deleteAlarm(
539-
controller
540-
.userModel.value,
541-
alarm.firestoreId!,
542-
);
543-
} else {
544-
await IsarDb.deleteAlarm(
545-
alarm.isarId,
546-
);
547-
}
548-
} else {
549-
// do not delete on dismiss
550-
Get.offNamedUntil(
551-
'/bottom-navigation-bar',
552-
(route) =>
553-
route.settings.name ==
554-
'/splash-screen',
564+
await controller.swipeToDeleteAlarm(
565+
controller.userModel.value,
566+
alarm,
555567
);
556568
}
569+
570+
Get.offNamedUntil(
571+
'/bottom-navigation-bar',
572+
(route) =>
573+
route.settings.name ==
574+
'/splash-screen',
575+
);
557576
},
558577
key: ValueKey(alarms[index]),
559578
background: Container(
@@ -972,7 +991,7 @@ class HomeView extends GetView<HomeController> {
972991
Get.snackbar(
973992
'Alarm deleted',
974993
'The alarm has been deleted.',
975-
duration: const Duration(seconds: 4),
994+
duration: Duration(seconds: controller.duration.toInt()),
976995
snackPosition: SnackPosition.BOTTOM,
977996
margin: const EdgeInsets.symmetric(
978997
horizontal: 10,

0 commit comments

Comments
 (0)