From eedb9371d0747474d3dd5fc499f6679f90acfe3f Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Tue, 26 Aug 2025 10:21:22 +0200 Subject: [PATCH] keep undo history for tabs --- .../features/tabs/data/database/daos/tab.dart | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/app/lib/features/geckoview/features/tabs/data/database/daos/tab.dart b/app/lib/features/geckoview/features/tabs/data/database/daos/tab.dart index 660c6190..befe7a8d 100644 --- a/app/lib/features/geckoview/features/tabs/data/database/daos/tab.dart +++ b/app/lib/features/geckoview/features/tabs/data/database/daos/tab.dart @@ -30,6 +30,9 @@ part 'tab.g.dart'; @DriftAccessor() class TabDao extends DatabaseAccessor with _$TabDaoMixin { + final _undoHistory = {}; + Timer? _clearHistoryTimer; + TabDao(super.db); UpdateStatement _updateByIdStatement(String id) => @@ -207,7 +210,20 @@ class TabDao extends DatabaseAccessor with _$TabDaoMixin { Future syncTabs({required List retainTabIds}) { return db.transaction(() async { - await (db.tab.delete()..where((t) => t.id.isNotIn(retainTabIds))).go(); + final deleted = + await (db.tab.delete()..where((t) => t.id.isNotIn(retainTabIds))) + .goAndReturn(); + + if (deleted.isNotEmpty) { + _clearHistoryTimer?.cancel(); + + _undoHistory.addAll({for (final tab in deleted) tab.id: tab}); + + _clearHistoryTimer = Timer(const Duration(seconds: 5), () { + //Dont keep things in memory + _undoHistory.clear(); + }); + } var currentOrderKey = await db.containerDao .generateLeadingOrderKey(null) @@ -215,11 +231,13 @@ class TabDao extends DatabaseAccessor with _$TabDaoMixin { await db.tab.insertAll( retainTabIds.map((id) { - final insertable = TabCompanion.insert( - id: id, - orderKey: currentOrderKey, - timestamp: DateTime.now(), - ); + final insertable = + _undoHistory[id] ?? + TabCompanion.insert( + id: id, + orderKey: currentOrderKey, + timestamp: DateTime.now(), + ); currentOrderKey = LexoRank.parse(currentOrderKey).genPrev().value;