feat: Enhance error handling in note loading and moving operations with detailed logging

This commit is contained in:
2026-05-20 10:05:47 +02:00
parent d0a985b4ab
commit 34f45a912f
2 changed files with 40 additions and 9 deletions
+26 -6
View File
@@ -133,21 +133,41 @@ class AppDatabase extends _$AppDatabase {
} }
return transaction(() async { return transaction(() async {
if (oldIndex < newIndex) { final List<DbNote> all = await (select(notes)
..where((n) => n.isDeleted.equals(false)))
.get();
final int count = all.length;
if (count == 0) {
return;
}
final int maxIndex = count - 1;
final int safeOld = oldIndex.clamp(0, maxIndex);
final int safeNew = newIndex.clamp(0, maxIndex);
if (safeOld == safeNew) {
return;
}
if (safeOld < safeNew) {
await customStatement( await customStatement(
'UPDATE notes SET sort_index = sort_index - 1 WHERE sort_index > ? AND sort_index <= ? AND is_deleted = 0', 'UPDATE notes SET sort_index = sort_index - 1 WHERE sort_index > ? AND sort_index <= ? AND is_deleted = 0',
[oldIndex, newIndex], [safeOld, safeNew],
); );
} else { } else {
await customStatement( await customStatement(
'UPDATE notes SET sort_index = sort_index + 1 WHERE sort_index >= ? AND sort_index < ? AND is_deleted = 0', 'UPDATE notes SET sort_index = sort_index + 1 WHERE sort_index >= ? AND sort_index < ? AND is_deleted = 0',
[newIndex, oldIndex], [safeNew, safeOld],
); );
} }
await customStatement( await (update(notes)..where((n) => n.id.equals(id))).write(
'UPDATE notes SET sort_index = ?, updated_at = ? WHERE id = ?', NotesCompanion(
[newIndex, DateTime.now().toIso8601String(), id], sortIndex: Value<int>(safeNew),
updatedAt: Value<DateTime>(DateTime.now()),
),
); );
}); });
} }
+12 -1
View File
@@ -102,7 +102,9 @@ class _HomeScreenState extends State<HomeScreen> {
_notes = storedNotes; _notes = storedNotes;
_isLoading = false; _isLoading = false;
}); });
} catch (e) { } catch (e, st) {
// Log the error so we can inspect the root cause before resetting the vault.
debugPrint('Failed to load notes: $e\n$st');
// If loading notes fails (e.g., DB corrupt), notify the app to reset the vault. // If loading notes fails (e.g., DB corrupt), notify the app to reset the vault.
if (widget.onVaultInvalid != null) { if (widget.onVaultInvalid != null) {
await widget.onVaultInvalid!(); await widget.onVaultInvalid!();
@@ -145,8 +147,17 @@ class _HomeScreenState extends State<HomeScreen> {
final Note movedNote = _notes[oldIndex]; final Note movedNote = _notes[oldIndex];
try {
await widget.repository.moveNote(movedNote, newIndex); await widget.repository.moveNote(movedNote, newIndex);
await _loadNotes(); await _loadNotes();
} catch (e, st) {
// Don't let DB errors cause the app to reset the vault automatically.
debugPrint('Failed to move note: $e\n$st');
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error al reordenar la nota: $e')),
);
}
} }
Future<void> _openNoteEditor(Note note) async { Future<void> _openNoteEditor(Note note) async {