Skip to content

Commit efb6708

Browse files
authored
Merge pull request #297 from its-me-abhishek/delete-complete
Undo Feature for Task Deletion and Completion
2 parents 5174c19 + d69498e commit efb6708

File tree

1 file changed

+80
-92
lines changed

1 file changed

+80
-92
lines changed

lib/widgets/buildTasks.dart

Lines changed: 80 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ class _TasksBuilderState extends State<TasksBuilder> {
3434
late Modify modify;
3535
ScrollController scrollController = ScrollController();
3636
bool showbtn = false;
37+
Task? lastDeletedTask;
38+
Task? lastCompletedTask;
39+
bool isUndoInProgress = false; // track undo action
40+
3741
@override
3842
void initState() {
3943
scrollController.addListener(() {
@@ -72,12 +76,41 @@ class _TasksBuilderState extends State<TasksBuilder> {
7276
modify.save(
7377
modified: () => now,
7478
);
79+
80+
// Show a snackbar with an undo action
7581
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
76-
content: const Text('Task Updated'),
77-
backgroundColor: AppSettings.isDarkMode
78-
? const Color.fromARGB(255, 61, 61, 61)
79-
: const Color.fromARGB(255, 39, 39, 39),
80-
duration: const Duration(seconds: 2)));
82+
content: const Text('Task Updated'),
83+
backgroundColor: AppSettings.isDarkMode
84+
? const Color.fromARGB(255, 61, 61, 61)
85+
: const Color.fromARGB(255, 39, 39, 39),
86+
duration: const Duration(seconds: 2),
87+
action: SnackBarAction(
88+
label: 'Undo',
89+
onPressed: () {
90+
// Undo the task status change
91+
undoChanges();
92+
},
93+
),
94+
));
95+
}
96+
97+
void undoChanges() {
98+
if (isUndoInProgress) {
99+
return; // If undo is already in progress, do nothing
100+
}
101+
isUndoInProgress = true;
102+
ScaffoldMessenger.of(context).removeCurrentSnackBar();
103+
104+
if (lastDeletedTask != null) {
105+
setStatus('pending', lastDeletedTask!.uuid);
106+
lastDeletedTask = null;
107+
}
108+
109+
if (lastCompletedTask != null) {
110+
setStatus('pending', lastCompletedTask!.uuid);
111+
lastCompletedTask = null;
112+
}
113+
isUndoInProgress = false;
81114
}
82115

83116
// final bool darkmode;
@@ -143,50 +176,27 @@ class _TasksBuilderState extends State<TasksBuilder> {
143176
children: [
144177
SlidableAction(
145178
onPressed: (context) {
146-
showDialog(
147-
context: context,
148-
builder: (context) {
149-
return AlertDialog(
150-
title: const Text(
151-
'Do you want to save changes?'),
152-
actions: [
153-
TextButton(
154-
onPressed: () {
155-
setStatus(
156-
'completed', task.uuid);
157-
if (task.due != null) {
158-
DateTime? dtb = task.due;
159-
dtb = dtb!.add(const Duration(
160-
minutes: 1));
161-
final FlutterLocalNotificationsPlugin
162-
flutterLocalNotificationsPlugin =
163-
FlutterLocalNotificationsPlugin();
164-
flutterLocalNotificationsPlugin
165-
.cancel(dtb.day * 100 +
166-
dtb.hour * 10 +
167-
dtb.minute);
168-
if (kDebugMode) {
169-
print("Task due is $dtb");
170-
print(dtb.day * 100 +
171-
dtb.hour * 10 +
172-
dtb.minute);
173-
}
174-
}
175-
176-
Navigator.of(context).pop();
177-
},
178-
child: const Text('Yes'),
179-
),
180-
TextButton(
181-
onPressed: () {
182-
Navigator.of(context).pop();
183-
},
184-
child: const Text('No'),
185-
),
186-
],
187-
);
188-
},
189-
);
179+
// Complete task without confirmation
180+
setStatus('completed', task.uuid);
181+
if (task.due != null) {
182+
DateTime? dtb = task.due;
183+
dtb =
184+
dtb!.add(const Duration(minutes: 1));
185+
final FlutterLocalNotificationsPlugin
186+
flutterLocalNotificationsPlugin =
187+
FlutterLocalNotificationsPlugin();
188+
flutterLocalNotificationsPlugin.cancel(
189+
dtb.day * 100 +
190+
dtb.hour * 10 +
191+
dtb.minute);
192+
if (kDebugMode) {
193+
print("Task due is $dtb");
194+
print(dtb.day * 100 +
195+
dtb.hour * 10 +
196+
dtb.minute);
197+
}
198+
}
199+
lastCompletedTask = task;
190200
},
191201
icon: Icons.done,
192202
label: "COMPLETE",
@@ -199,49 +209,27 @@ class _TasksBuilderState extends State<TasksBuilder> {
199209
children: [
200210
SlidableAction(
201211
onPressed: (context) {
202-
showDialog(
203-
context: context,
204-
builder: (context) {
205-
return AlertDialog(
206-
title: const Text(
207-
'Do you want to save changes?'),
208-
actions: [
209-
TextButton(
210-
onPressed: () {
211-
setStatus('deleted', task.uuid);
212-
if (task.due != null) {
213-
DateTime? dtb = task.due;
214-
dtb = dtb!.add(const Duration(
215-
minutes: 1));
216-
final FlutterLocalNotificationsPlugin
217-
flutterLocalNotificationsPlugin =
218-
FlutterLocalNotificationsPlugin();
219-
flutterLocalNotificationsPlugin
220-
.cancel(dtb.day * 100 +
221-
dtb.hour * 10 +
222-
dtb.minute);
223-
if (kDebugMode) {
224-
print("Task due is $dtb");
225-
print(dtb.day * 100 +
226-
dtb.hour * 10 +
227-
dtb.minute);
228-
}
229-
}
230-
231-
Navigator.of(context).pop();
232-
},
233-
child: const Text('Yes'),
234-
),
235-
TextButton(
236-
onPressed: () {
237-
Navigator.of(context).pop();
238-
},
239-
child: const Text('No'),
240-
),
241-
],
242-
);
243-
},
244-
);
212+
// Delete task without confirmation
213+
setStatus('deleted', task.uuid);
214+
if (task.due != null) {
215+
DateTime? dtb = task.due;
216+
dtb =
217+
dtb!.add(const Duration(minutes: 1));
218+
final FlutterLocalNotificationsPlugin
219+
flutterLocalNotificationsPlugin =
220+
FlutterLocalNotificationsPlugin();
221+
flutterLocalNotificationsPlugin.cancel(
222+
dtb.day * 100 +
223+
dtb.hour * 10 +
224+
dtb.minute);
225+
if (kDebugMode) {
226+
print("Task due is $dtb");
227+
print(dtb.day * 100 +
228+
dtb.hour * 10 +
229+
dtb.minute);
230+
}
231+
}
232+
lastDeletedTask = task;
245233
},
246234
icon: Icons.delete,
247235
label: "DELETE",

0 commit comments

Comments
 (0)