@@ -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